agent-device 0.21.24 → 0.21.25

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 (379) hide show
  1. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.24.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -3
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +47 -103
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  20. package/dist/src/absence-observation-errors.js +1 -0
  21. package/dist/src/adapter.js +1 -1
  22. package/dist/src/adb-executor.js +2 -2
  23. package/dist/src/adb-failure.js +2 -2
  24. package/dist/src/agent-browser-lifecycle.js +1 -1
  25. package/dist/src/agent-browser-process-record.js +1 -1
  26. package/dist/src/agent-browser-provider.js +1 -1
  27. package/dist/src/agent-browser-tool.js +1 -1
  28. package/dist/src/agent-device-client.js +2 -2
  29. package/dist/src/android-adb.js +1 -1
  30. package/dist/src/android-input-ownership.js +1 -1
  31. package/dist/src/android-system-surface-disclosure.js +1 -0
  32. package/dist/src/android-text-entry.js +1 -0
  33. package/dist/src/android.js +1 -1
  34. package/dist/src/app-backend.js +1 -1
  35. package/dist/src/app-helpers.js +1 -1
  36. package/dist/src/app-launch.js +1 -1
  37. package/dist/src/app-lifecycle.js +4 -3
  38. package/dist/src/app-lifecycle2.js +2 -2
  39. package/dist/src/app-log-files.js +1 -1
  40. package/dist/src/app-log-reconnect.js +1 -1
  41. package/dist/src/app-log-runtime2.js +3 -3
  42. package/dist/src/app-resolution-facade.js +1 -1
  43. package/dist/src/app-resolution.js +2 -2
  44. package/dist/src/apple-runner-platform.js +1 -1
  45. package/dist/src/artifact-download.js +1 -1
  46. package/dist/src/auth.js +1 -1
  47. package/dist/src/aws-device-farm-connection.js +1 -1
  48. package/dist/src/back-mode.js +1 -1
  49. package/dist/src/boot-diagnostics.js +1 -1
  50. package/dist/src/browserstack-connection.js +1 -1
  51. package/dist/src/capture-disclosure.js +1 -0
  52. package/dist/src/cli-config.js +1 -1
  53. package/dist/src/cli-help.js +17 -14
  54. package/dist/src/cli-output.js +1 -1
  55. package/dist/src/cli-runner.js +3 -1
  56. package/dist/src/cli.js +3 -3
  57. package/dist/src/client-companion-tunnel.js +1 -1
  58. package/dist/src/client-metro.js +1 -1
  59. package/dist/src/client-types.d.ts +8 -2
  60. package/dist/src/code-signature-cache.js +1 -1
  61. package/dist/src/code-signature.js +1 -1
  62. package/dist/src/command-metadata.js +73 -1
  63. package/dist/src/command-policy.js +1 -0
  64. package/dist/src/command-schema.js +3 -3
  65. package/dist/src/command-surface.js +1 -1
  66. package/dist/src/command-tools.js +2 -2
  67. package/dist/src/connection-runtime.js +1 -1
  68. package/dist/src/connection-verification.js +1 -1
  69. package/dist/src/connection.js +3 -3
  70. package/dist/src/contracts.js +1 -1
  71. package/dist/src/daemon-client-lease-beat.js +1 -1
  72. package/dist/src/daemon-client-lifecycle.js +1 -1
  73. package/dist/src/daemon-client-liveness-probe.js +1 -1
  74. package/dist/src/daemon-policy-file.js +1 -1
  75. package/dist/src/daemon-registration-owner.js +1 -1
  76. package/dist/src/daemon-registration.js +1 -1
  77. package/dist/src/daemon-resolution.js +3 -1
  78. package/dist/src/debug-symbols-facade.js +1 -1
  79. package/dist/src/device-claim-inspection.js +1 -1
  80. package/dist/src/device-input-state.d.ts +5 -3
  81. package/dist/src/device-inventory-context.js +1 -1
  82. package/dist/src/device-readiness-runtime.js +1 -1
  83. package/dist/src/device-release.js +1 -1
  84. package/dist/src/device-shell.js +1 -1
  85. package/dist/src/device.js +3 -1
  86. package/dist/src/devicectl.js +1 -1
  87. package/dist/src/diagnostics.js +1 -1
  88. package/dist/src/doctor-facade.js +1 -1
  89. package/dist/src/durable-capture-resource.js +1 -1
  90. package/dist/src/durable-resource.js +1 -1
  91. package/dist/src/engine-eval-script.js +1 -1
  92. package/dist/src/error.js +1 -1
  93. package/dist/src/exec.js +1 -1
  94. package/dist/src/expo-dev-client-launch.js +1 -0
  95. package/dist/src/file.js +3 -1
  96. package/dist/src/find.js +1 -1
  97. package/dist/src/finders.js +1 -1
  98. package/dist/src/generic-settle.js +1 -1
  99. package/dist/src/generic.js +1 -1
  100. package/dist/src/gesture-plan.js +1 -1
  101. package/dist/src/gesture-runtime.js +1 -1
  102. package/dist/src/harmonyos.js +1 -1
  103. package/dist/src/hdc.js +1 -1
  104. package/dist/src/helper.js +2 -2
  105. package/dist/src/human-control.js +1 -1
  106. package/dist/src/ime-rebind.js +1 -1
  107. package/dist/src/ime-state.js +1 -1
  108. package/dist/src/index.d.ts +1 -1
  109. package/dist/src/index.js +1 -1
  110. package/dist/src/input-actions.js +1 -1
  111. package/dist/src/input-actions2.js +2 -2
  112. package/dist/src/install-source-network-transport.js +1 -1
  113. package/dist/src/install-source2.js +1 -1
  114. package/dist/src/interaction-error.js +1 -0
  115. package/dist/src/interaction-positionals.js +1 -1
  116. package/dist/src/interaction.js +1 -1
  117. package/dist/src/interaction2.js +1 -1
  118. package/dist/src/interactor-operation-catalog.js +1 -1
  119. package/dist/src/interactor.js +5 -5
  120. package/dist/src/interactor2.js +1 -1
  121. package/dist/src/internal/bin.js +1 -1
  122. package/dist/src/internal/daemon.js +5 -1
  123. package/dist/src/internal/png-worker.js +1 -1
  124. package/dist/src/inventory.js +2 -2
  125. package/dist/src/inventory6.js +1 -1
  126. package/dist/src/io.d.ts +2 -2
  127. package/dist/src/ios-client.js +1 -1
  128. package/dist/src/ios-settings.js +1 -1
  129. package/dist/src/ios-snapshot-acquisition.js +1 -1
  130. package/dist/src/ios-snapshot-adapter.js +1 -1
  131. package/dist/src/ios-snapshot-engine.js +1 -1
  132. package/dist/src/ios-snapshot-runtime.js +1 -1
  133. package/dist/src/keyed-lock.js +1 -1
  134. package/dist/src/launch-confirmation.js +1 -1
  135. package/dist/src/lease.js +1 -1
  136. package/dist/src/limrun-runtime-dependencies.js +1 -1
  137. package/dist/src/limrun.d.ts +2 -10
  138. package/dist/src/limrun.js +1 -1
  139. package/dist/src/linux.js +1 -1
  140. package/dist/src/load.js +1 -1
  141. package/dist/src/local-interactor-operation-set.js +1 -1
  142. package/dist/src/log-stream.js +9 -9
  143. package/dist/src/mechanics.js +16 -16
  144. package/dist/src/metro.js +1 -1
  145. package/dist/src/metro2.js +1 -1
  146. package/dist/src/mobile-snapshot-semantics.js +1 -1
  147. package/dist/src/observability.js +1 -1
  148. package/dist/src/open-target-resolution.js +1 -1
  149. package/dist/src/output-path.js +1 -1
  150. package/dist/src/overlay.js +1 -3
  151. package/dist/src/perf-facade.js +1 -1
  152. package/dist/src/perf-runtime-operation-builder.js +1 -1
  153. package/dist/src/perf-runtime.js +1 -1
  154. package/dist/src/physical-device-control.js +1 -1
  155. package/dist/src/platform-request-scope.js +1 -1
  156. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  157. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  158. package/dist/src/platform-runtime-apple-resources.js +1 -0
  159. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  160. package/dist/src/platform-runtime-daemon-services.js +1 -0
  161. package/dist/src/platform-runtime-host.js +1 -1
  162. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  163. package/dist/src/platform-runtime-open-target.js +1 -1
  164. package/dist/src/platform-runtime-operation-host.js +4 -4
  165. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  166. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  167. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  168. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  169. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  170. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  171. package/dist/src/platform-runtime-unavailable.js +1 -1
  172. package/dist/src/platform-runtime.js +1 -1
  173. package/dist/src/platform-runtime2.js +1 -1
  174. package/dist/src/plugin.js +1 -1
  175. package/dist/src/png-crop-bytes.js +1 -1
  176. package/dist/src/png-resize.js +1 -0
  177. package/dist/src/png-worker-client.js +1 -1
  178. package/dist/src/png-worker-contract.js +1 -1
  179. package/dist/src/process-entry.js +1 -1
  180. package/dist/src/process.js +1 -1
  181. package/dist/src/provider-credential-fingerprint.js +1 -1
  182. package/dist/src/provider-device-admission.js +1 -1
  183. package/dist/src/provider-policy.js +1 -1
  184. package/dist/src/provider-webdriver.js +1 -1
  185. package/dist/src/proxy.js +2 -2
  186. package/dist/src/quality-warnings.js +1 -1
  187. package/dist/src/react-native-overlay2.js +3 -0
  188. package/dist/src/react-native.js +1 -1
  189. package/dist/src/record-runtime.js +1 -1
  190. package/dist/src/record-trace.js +1 -1
  191. package/dist/src/recording.js +2 -2
  192. package/dist/src/register-builtins.js +1 -1
  193. package/dist/src/remote-config-core.js +1 -1
  194. package/dist/src/replay-backend-registry.js +1 -0
  195. package/dist/src/replay-divergence.js +1 -1
  196. package/dist/src/replay-maestro-backend.js +117 -0
  197. package/dist/src/replay-script-selection.js +1 -0
  198. package/dist/src/replay.js +1 -3
  199. package/dist/src/replay2.js +1 -0
  200. package/dist/src/reporting.js +3 -3
  201. package/dist/src/request-cancel.js +1 -1
  202. package/dist/src/request-providers.js +1 -1
  203. package/dist/src/request-runtime-binding.js +1 -1
  204. package/dist/src/result-serialization.js +1 -1
  205. package/dist/src/retry.js +1 -1
  206. package/dist/src/runner-cache-retention.js +1 -1
  207. package/dist/src/runner-cache-trim.js +1 -1
  208. package/dist/src/runner-client.js +1 -1
  209. package/dist/src/runner-dev-tools-security.js +1 -1
  210. package/dist/src/runner-device-readiness.js +1 -1
  211. package/dist/src/runner-device-set.js +1 -1
  212. package/dist/src/runner-error-classification.js +3 -3
  213. package/dist/src/runner-exchange.js +1 -1
  214. package/dist/src/runner-lease.js +1 -1
  215. package/dist/src/runner-operations-facade.js +1 -1
  216. package/dist/src/runner-retention.js +1 -0
  217. package/dist/src/runner-start-budget.js +1 -1
  218. package/dist/src/runner-startup-transport.js +1 -0
  219. package/dist/src/runner-toolchain-probe.js +1 -1
  220. package/dist/src/runner.js +2 -1
  221. package/dist/src/runtime-command-surface.js +1 -0
  222. package/dist/src/runtime-deployment.js +1 -1
  223. package/dist/src/runtime-factory.js +1 -0
  224. package/dist/src/runtime-session.js +1 -0
  225. package/dist/src/runtime-transport-hints.js +1 -1
  226. package/dist/src/runtime.js +2 -1
  227. package/dist/src/runtime10.js +2 -1
  228. package/dist/src/runtime2.js +5 -2
  229. package/dist/src/runtime3.js +1 -5
  230. package/dist/src/runtime4.js +5 -1
  231. package/dist/src/runtime5.js +1 -5
  232. package/dist/src/runtime6.js +1 -1
  233. package/dist/src/runtime7.js +1 -1
  234. package/dist/src/runtime8.js +1 -1
  235. package/dist/src/runtime9.js +1 -1
  236. package/dist/src/screenshot-image.js +1 -1
  237. package/dist/src/screenshot-runtime.js +1 -0
  238. package/dist/src/screenshot3.js +5 -5
  239. package/dist/src/sdk-batch-runner.js +2 -2
  240. package/dist/src/sdk-batch.js +1 -1
  241. package/dist/src/sdk-contracts.js +2 -2
  242. package/dist/src/sdk-finders.js +1 -1
  243. package/dist/src/sdk-io.d.ts +4 -2
  244. package/dist/src/sdk-selectors.d.ts +4 -5
  245. package/dist/src/sdk-selectors.js +1 -1
  246. package/dist/src/selection.js +0 -0
  247. package/dist/src/selector-pipeline-policy.js +1 -1
  248. package/dist/src/selector-runtime.js +1 -1
  249. package/dist/src/selectors.js +1 -1
  250. package/dist/src/server.js +2 -2
  251. package/dist/src/session-allocation.js +1 -1
  252. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  253. package/dist/src/session-runtime-admission.js +1 -0
  254. package/dist/src/session.js +1 -1
  255. package/dist/src/session2.js +5 -5
  256. package/dist/src/settings.js +1 -1
  257. package/dist/src/settings2.js +1 -1
  258. package/dist/src/simctl-settings.js +1 -1
  259. package/dist/src/simulator.js +1 -1
  260. package/dist/src/snapshot-chrome.js +1 -0
  261. package/dist/src/snapshot-desktop-projection.js +1 -1
  262. package/dist/src/snapshot-evidence.js +1 -0
  263. package/dist/src/snapshot-node-lookup.js +1 -0
  264. package/dist/src/snapshot-occlusion.js +1 -0
  265. package/dist/src/snapshot-quality-verdict.js +1 -0
  266. package/dist/src/snapshot-runtime-binding.js +1 -1
  267. package/dist/src/snapshot-runtime.js +1 -1
  268. package/dist/src/snapshot-state.js +1 -1
  269. package/dist/src/snapshot.js +1 -1
  270. package/dist/src/snapshot2.js +1 -1
  271. package/dist/src/snapshot3.js +1 -1
  272. package/dist/src/src.js +5 -1
  273. package/dist/src/src2.js +1 -1
  274. package/dist/src/src3.js +2 -1
  275. package/dist/src/store.js +1 -1
  276. package/dist/src/surface-snapshot2.js +1 -1
  277. package/dist/src/target-evidence-tree.js +1 -0
  278. package/dist/src/target-evidence.js +1 -1
  279. package/dist/src/text-entry-focus.js +1 -1
  280. package/dist/src/tool-provider2.js +1 -1
  281. package/dist/src/touch-runtime.js +1 -1
  282. package/dist/src/touch-runtime2.js +1 -1
  283. package/dist/src/tree.js +1 -1
  284. package/dist/src/tv-remote.js +1 -1
  285. package/dist/src/type-text-runtime.js +1 -1
  286. package/dist/src/undici.js +8 -8
  287. package/dist/src/update-check.js +1 -1
  288. package/dist/src/vars.js +2 -0
  289. package/dist/src/version.js +1 -1
  290. package/dist/src/video.js +2 -2
  291. package/dist/src/wait.js +1 -0
  292. package/dist/src/web.js +1 -1
  293. package/dist/src/web2.js +1 -1
  294. package/package.json +9 -11
  295. package/server.json +2 -2
  296. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk +0 -0
  297. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +0 -1
  298. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk +0 -0
  299. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +0 -1
  300. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.manifest.json +0 -16
  301. package/dist/src/adb-transport.js +0 -1
  302. package/dist/src/alert-runtime.js +0 -1
  303. package/dist/src/app-deployment-resolution.js +0 -2
  304. package/dist/src/app-inventory-contract.js +0 -1
  305. package/dist/src/app-log-session-resource.js +0 -1
  306. package/dist/src/application-lifecycle-runtime.js +0 -1
  307. package/dist/src/auth-session.js +0 -1
  308. package/dist/src/browserstack-device-features.js +0 -1
  309. package/dist/src/browserstack.js +0 -1
  310. package/dist/src/cache.js +0 -1
  311. package/dist/src/capture.js +0 -1
  312. package/dist/src/catalog.js +0 -1
  313. package/dist/src/click-button.js +0 -1
  314. package/dist/src/client-metro-companion.js +0 -1
  315. package/dist/src/client-options.js +0 -3
  316. package/dist/src/daemon-client-transport.js +0 -1
  317. package/dist/src/daemon-http.js +0 -1
  318. package/dist/src/device-rotation.js +0 -1
  319. package/dist/src/device-session.js +0 -3
  320. package/dist/src/device2.js +0 -1
  321. package/dist/src/device3.js +0 -3
  322. package/dist/src/dispatch-resolve.js +0 -4
  323. package/dist/src/format.js +0 -2
  324. package/dist/src/gesture-plan-types.js +0 -1
  325. package/dist/src/host.js +0 -1
  326. package/dist/src/ime-settings-record.js +0 -1
  327. package/dist/src/interaction-ref-policy.js +0 -1
  328. package/dist/src/interactor-operation-binding.js +0 -1
  329. package/dist/src/keyboard-actions.js +0 -1
  330. package/dist/src/lease-context.js +0 -1
  331. package/dist/src/lease-registry-scope.js +0 -1
  332. package/dist/src/lease-scope.js +0 -1
  333. package/dist/src/managed-device-scope.js +0 -1
  334. package/dist/src/manifest.js +0 -1
  335. package/dist/src/observe-until.js +0 -1
  336. package/dist/src/output-common.js +0 -5
  337. package/dist/src/owner-identity.js +0 -3
  338. package/dist/src/path-resolution.js +0 -1
  339. package/dist/src/perf-runtime-plan.js +0 -1
  340. package/dist/src/platform-runtime-app-log-process.js +0 -1
  341. package/dist/src/platform-runtime-managed-owner.js +0 -1
  342. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  343. package/dist/src/png.js +0 -1
  344. package/dist/src/provider-session-ownership.js +0 -2
  345. package/dist/src/providers.js +0 -1
  346. package/dist/src/registry.js +0 -68
  347. package/dist/src/remote-connection-state.js +0 -1
  348. package/dist/src/request-admission.js +0 -1
  349. package/dist/src/request-cancellation.js +0 -1
  350. package/dist/src/request-progress-protocol.js +0 -1
  351. package/dist/src/runner-cache-metadata.js +0 -2
  352. package/dist/src/runner-disposal.js +0 -1
  353. package/dist/src/runner-session-types.js +0 -1
  354. package/dist/src/runtime-admission.js +0 -1
  355. package/dist/src/runtime11.js +0 -2
  356. package/dist/src/screen-recording-resource-recovery.js +0 -1
  357. package/dist/src/screenshot-result.js +0 -1
  358. package/dist/src/script.js +0 -1
  359. package/dist/src/scroll-command.js +0 -1
  360. package/dist/src/scroll-gesture.js +0 -1
  361. package/dist/src/scroll-indicator.js +0 -1
  362. package/dist/src/session-artifact-paths.js +0 -1
  363. package/dist/src/session-paths.js +0 -1
  364. package/dist/src/session-repair-tombstone.js +0 -1
  365. package/dist/src/session-snapshot.js +0 -1
  366. package/dist/src/snapshot-private-evidence.js +0 -1
  367. package/dist/src/snapshot4.js +0 -1
  368. package/dist/src/src4.js +0 -1
  369. package/dist/src/src5.js +0 -1
  370. package/dist/src/src6.js +0 -1
  371. package/dist/src/src7.js +0 -2
  372. package/dist/src/src8.js +0 -115
  373. package/dist/src/string-enum.js +0 -1
  374. package/dist/src/success-text.js +0 -1
  375. package/dist/src/transport.js +0 -3
  376. package/dist/src/ttl-memo.js +0 -1
  377. package/dist/src/verified-file.js +0 -1
  378. package/dist/src/window-state.js +0 -1
  379. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
@@ -1 +1,2 @@
1
- import{C as e,D as t,F as n,K as r,N as i,P as a,S as o,x as s,y as c,z as l}from"./sdk-contracts.js";import{m as u}from"./capture.js";import{i as d,t as f}from"./snapshot-capture-annotations.js";import{r as p}from"./snapshot-private-evidence.js";import{r as m}from"./diagnostics.js";import"./diagnostics2.js";import{An as h,Bn as g,Br as _,Cn as v,Cr as y,Dn as ee,En as te,Fn as ne,Fr as re,Hn as ie,Ir as ae,Jn as oe,Jr as b,Kn as se,Mn as ce,Mr as le,Nr as ue,Or as x,Pr as de,Qn as fe,Rr as S,Un as pe,Ur as me,Vn as he,Vr as ge,Xn as _e,Xr as ve,Yn as C,_r as ye,ei as be,fn as xe,gr as Se,hr as Ce,kn as we,qn as Te,ur as Ee,wn as w,zn as De}from"./sdk-batch.js";import{r as T}from"./success-text.js";import{_ as Oe,a as ke,c as Ae,f as je,g as Me,h as Ne,i as Pe,m as Fe,n as Ie,o as E,p as Le,r as Re,s as ze,u as Be}from"./overlay.js";import{n as Ve,t as He}from"./mobile-snapshot-semantics.js";import{i as Ue}from"./retry.js";import"./retry2.js";import{i as D,n as O,t as We}from"./rect-center.js";import{l as k,n as Ge}from"./android-input-ownership.js";import{a as Ke,n as qe,t as Je}from"./gesture-plan.js";import{t as Ye}from"./android-snapshot-quality.js";import{n as Xe,r as Ze}from"./android-system-chrome.js";import{t as Qe}from"./observe-until.js";import{n as $e,t as A}from"./selector-pipeline-policy.js";import{i as et}from"./ios-system-surface.js";import{c as tt,n as nt,o as rt,r as it,s as j}from"./quality-warnings.js";import{r as at}from"./png.js";import{a as ot,n as st,o as ct}from"./png-worker-client.js";import{n as lt}from"./ios-snapshot-acquisition.js";import{createHash as ut}from"node:crypto";import{promises as M}from"node:fs";import dt from"node:path";function ft(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function pt(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=C(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function mt(e,t,n,r){return e.filter(e=>{if(!oe(C(e),n))return!1;let i=pt(e,t,Math.max(r.length,1));return!i.broken&&Te(i.chain,r)})}const ht=2500,gt=5e3,_t=1500,vt=[250,400,600];function yt(e){return e===`press`||e===`click`||e===`back`||e===`open`}function bt(e){return e.map(e=>[e.depth??0,e.type??``,e.label??``,e.value??``,e.identifier??``,e.enabled===!1?`disabled`:`enabled`,e.hittable===!0?`hittable`:`not-hittable`].join(`|`))}function xt(e,t){return e<12?!1:t<=Math.floor(e*.2)}function St(e,t,n){return n.interactiveOnly&&e.snapshot.nodes.length===0&&e.rawNodeCount!==void 0&&e.rawNodeCount>=12?`empty-interactive`:n.mode===`ref-refresh`?null:xt(t.baselineCount,e.snapshot.nodes.length)?Ct(e.snapshot)?null:`sharp-drop`:t.routeComparable&&yt(t.action)&&wt(t.baselineSignatures,e.snapshot.nodes)?`stuck-route`:null}function Ct(e){return e.nodes.some(e=>e.hittable===!0||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())}function wt(e,t){if(!e||e.length===0)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=bt(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),c=Math.max(3,Math.floor(n*.15));return a>=Math.floor(n*.9)&&o<=c&&s<=c}async function Tt(e){let t=e.window.markedAt+e.retry.retryBudgetMs,n=await e.capture(),r=e.classify(n),i=0;for(let a of e.retry.delaysMs){if(!r)break;let o=t-Date.now();if(o<=0)break;await Ue(Math.min(a,o)),n=await e.capture(),i+=1,r=e.classify(n)}r||e.onTrustworthyCapture?.();let a=i>0||r?{action:e.window.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0;return{...n,annotations:{...n.annotations,...d({freshness:a})}}}const Et=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Dt={strippedIndexes:new Set,refs:new Set};function Ot(e){let t=new Set(e.filter(e=>S(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Dt;let n=new Map(e.map(e=>[e.index,e])),r=Nt(e,n,t),i=new Set(r),a=Vt(e,n,r);for(let t of Nt(e,n,a))i.add(t);for(let o of kt(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function kt(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=jt(t,n,r);if(o.size===0)return a;let s=Mt(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&At(n,t,o)&&a.add(n.index);return a}function At(e,t,n){if(!e.rect)return!1;let r=Ht(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function jt(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=Ht(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Mt(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function Nt(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)Ut(i,t,n)&&r.add(i.index);return r}function Pt(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Xe(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ze(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ft(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(Ge).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:It(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Dt:{strippedIndexes:o,refs:s}}function It(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&Pt(e,t)).map(e=>e.index))}function Lt(e,t){let n=Ot(e),r=Ft(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Rt(e,t){let{strippedIndexes:n}=Lt(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function zt(e,t){return Lt(e,t).refs}function Bt(e){return Ot(e).refs}function Vt(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||S(n.type??``)!==`keyboard`)continue;let i=Ht(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Et.has(S(e.type??``))&&!n.has(e.index)&&Ut(e,t,a))&&r.delete(i)}return r}function Ht(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(S(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function Ut(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const Wt={intervalMs:200,budgetMs:1500,minPolls:2},Gt=Wt.budgetMs+2e3;function Kt({kind:e,gesture:t}){let n=[t.action,...t.positionals].join(` `).trim();return e===`unsettled`?`The surface was still changing after ${n} when this tree was read, so it may not match where the surface comes to rest: an element missing from it is not proof of absence.`:`${n} produced no visible change: the tree still matches its pre-gesture state. Either the container is already at its edge, or it ignores synthesized scrolls — a raw drag moves such lists: swipe x1 y1 x2 y2 (start inside the list).`}function qt(e,t){return{kind:e,gesture:{action:t.action,positionals:t.positionals}}}function Jt(e){let{needsBaselineDistrust:t,baselineSignature:n,quietSignature:r,elapsedMs:i,distrustCapMs:a}=e;return!t||!n?.length||e.classifyBaselineEvidence(n,r)!==`unchanged`?`trust`:i<a?`distrust`:`accept-stale`}async function Yt(e){let{pending:t,needsBaselineDistrust:n,hooks:r,clock:i}=e,a=()=>i?.now()??Date.now(),o=a(),s=0,c=t.baselineSignature,l=t.baselineBackend,u=!1,d=!1,f,p=e=>(f?.value===e||(f={value:e,...r.readSurface(e)}),f),h=await Qe({...e.initial===void 0?{}:{initial:e.initial},capture:()=>r.capture(),schedule:Wt,...i?{clock:i}:{},verdict:(e,i)=>{s+=1;let f=p(e);if(i===void 0)return{kind:`continue`};let h=p(i);if(d=r.signaturesStable(h.signature,f.signature),!d)return{kind:`continue`};let g=a()-o;if(c&&l!==f.backend)return m({level:`debug`,phase:`post_gesture_snapshot_baseline_rebased`,data:{action:t.action,from:l,to:f.backend,attempts:s}}),c=f.signature,l=f.backend,u=!0,{kind:`continue`};let _=Jt({needsBaselineDistrust:n,baselineSignature:c,quietSignature:f.signature,elapsedMs:g,distrustCapMs:Gt,classifyBaselineEvidence:r.classifyBaselineEvidence});return _===`distrust`?{kind:`continue`,budgetMs:Gt}:(Xt(_,t.action,s,g),{kind:`done`,result:Zt(_,t,f,r,u)})}});if(h.kind===`done`)return h.result;if(h.kind===`failed`)throw h.error;m({level:`warn`,phase:`post_gesture_snapshot_stabilization_timeout`,data:{action:t.action,attempts:s,durationMs:h.waitedMs,lastPairAgreed:d}});let g=h.last;return d?{value:g}:{value:g,postGestureOutcome:qt(`unsettled`,t)}}function Xt(e,t,n,r){if(e===`accept-stale`){m({level:`warn`,phase:`post_gesture_snapshot_stale_accept`,data:{action:t,attempts:n,durationMs:r,matchedPreGestureBaseline:!0}});return}m({level:n>2?`info`:`debug`,phase:`post_gesture_snapshot_stabilized`,data:{action:t,attempts:n,durationMs:r}})}function Zt(e,t,n,r,i){if(e!==`accept-stale`)return{value:n.value};let a=t.baselineSignature;return a!==void 0&&r.surfacesIdentical(a,n.signature)?{value:n.value,postGestureOutcome:qt(`no-effect`,t)}:(m({level:`info`,phase:`post_gesture_no_effect_vetoed`,data:{action:t.action,backend:n.backend,...i?{reason:`baseline_rebased`}:{reason:`surface_divergence`,...a===void 0?{}:r.summarizeDivergence(a,n.signature)}}}),{value:n.value})}function Qt(e,t,n,r){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>r)throw new a(`INVALID_ARGS`,`${t} must be an integer between ${n} and ${r}`);return e}function $t(e,t,n){let r=Number(e[0]),i=Number(e[1]);if(Number.isNaN(r)||Number.isNaN(i))throw new a(`INVALID_ARGS`,t,n);return{x:r,y:i}}function en(e){return{backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??tn(),policy:e.policy??on(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal}}function tn(e=[]){let t=new Map(e.map(e=>[e.name,nn(e)]));return{get:e=>nn(t.get(e)),set:e=>{t.set(e.name,nn(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>nn(e))}}function nn(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:rn(e.metadata)}:{}}}function rn(e){try{return structuredClone(e)}catch{return{...e}}}function an(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function on(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}const sn=new WeakMap;function cn(e,t){un(e)&&sn.set(e,t)}function ln(e){return un(e)?sn.get(e):void 0}function un(e){return typeof e==`object`&&!!e||typeof e==`function`}function N(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function P(e){return e.clock?.now()??Date.now()}async function dn(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function fn(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function F(e){return e&&typeof e==`object`?e:void 0}async function I(e,t,n){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=t.session??`default`,i=await e.sessions.get(r);if(!i)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(N(e,t),{interactiveOnly:n,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:P(e)};return await e.sessions.set({...i,snapshot:s}),{snapshot:s}}function pn(e){let t=Buffer.alloc(16);for(let n of e)hn(t,mn(n));return{digest:`ax1:${ut(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function mn(e){return ut(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function hn(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function gn(e){let{digest:t,nodeCount:n}=pn(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=_n(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function _n(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function L(e){return{nodes:e.nodes,...e.iosSystemSurfaceBundleId?{surfaceBundleId:e.iosSystemSurfaceBundleId}:{}}}function vn(e,t){if(!e||e.surfaceBundleId===t.surfaceBundleId)return;let n={from:e.surfaceBundleId??`app`,to:t.surfaceBundleId??`app`};return{...n,disclosure:et(n)}}function yn(e,t){let n=gn(e.nodes),r=vn(t,e);if(r)return{...n,changedFromBefore:!0,surfaceChange:r};let i=t!==void 0&&n.digest!==gn(t.nodes).digest;return{...n,changedFromBefore:i}}function bn(e){return`${e.disclosure} The settled tree and the pre-action tree describe different surfaces (${e.from} → ${e.to}), so no settled diff or refs are shown; take a snapshot to read the current surface.`}function xn(e,t){let n=o(e.type??`Element`),r=Le(e,n),i=Me(e).join(`,`),a=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,e.actions?JSON.stringify(e.actions):``].join(`|`)}function Sn(e,t,n={}){let r=Tn(wn(e,n),wn(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Cn(e,t={}){return wn(e,t).length}function wn(e,t){return t.flatten?e.map(e=>({text:Ne(e,0,!1),comparable:xn(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):je(e).map(e=>({text:e.text,comparable:xn(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Tn(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Dn(a,i,s)?R(a,i+1):R(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return En(o,e,t,n,r)}}return[]}function En(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Dn(i,c,r)?c+1:c-1,u=R(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Dn(e,t,n){return t===-n||t!==n&&R(e,t-1)<R(e,t+1)}function R(e,t){return e.get(t)??0}function On(e,t){return e.find(e=>me(e,t))??null}function z(e,t){let n=de(e);return n&&ae(n)?n:kn(e,t)}function kn(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=de(e);if(!t||!ae(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function An(e){return e===`text`||e===`label`||e===`any`}function jn(e,t,n,r){if(!(r||e===`web`))return An(t)?n:void 0}function Mn(e){return new a(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function Nn(e,t){let n=t??`default`,r=await e.sessions.get(n);if(!r)throw new a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let i=r.refFrameSnapshot??r.snapshot;if(!i)throw new a(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:n,session:r,snapshot:i}}async function B(e,t,n={updateSession:!0}){let r=e.backend.captureSnapshot;if(!r)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,o=await e.sessions.get(i),s=Pn(await r(N(e,t),{interactiveOnly:n.interactiveOnly??!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects,...n.preferredBackend?{preferredBackend:n.preferredBackend}:{},...n.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:n.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),n.updateSession&&o&&!j(s.snapshotQuality)&&await e.sessions.set({...o,snapshot:s}),{sessionName:i,session:o,snapshot:s}}function Pn(e,t){return e.snapshot?Fn(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:P(t)}}function Fn(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function In(e,t,n){if(e.backend.readText){let r=await e.backend.readText(N(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Oe(n)}function Ln(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,r.invalidRefMessage);let o=s(e,i)??(r.fallbackLabel.length>0?On(e,r.fallbackLabel):null);if(!o)throw new a(`COMMAND_FAILED`,r.notFoundMessage,{reason:E.refNotFound,ref:i,hint:w});return{ref:i,node:o}}function Rn(e,t){let{diagnostics:n=[],unique:r=!0,dispatched:i,...o}=t,s=new a(`COMMAND_FAILED`,te(e,n,{unique:r}),{...o,reason:E.selectorNotFound,hint:h(n)});return i===void 0?s:l(s,i)}function zn(e,t,n){let{command:r,...i}=n;return new a(`AMBIGUOUS_MATCH`,`Selector matched ${t.length} elements: ${e}`,{...i,...Fe(t),command:r,selector:e,hint:`Narrow the selector with role/id/longer text, or act on a printed candidate with a command that takes refs, such as press.`})}function Bn(e){let{outcome:t,selectorExpression:n,command:r,details:i}=e;return t.kind===`ambiguous`?zn(t.selector,t.matchedNodes,{command:r,...i}):Rn(n,{command:r,unique:!0,...i})}async function Vn(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function Hn(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Un(e.nodes):e.nodes).map(Kn);return n.sort((e,t)=>Jn(e).localeCompare(Jn(t))),{captureBackend:t,nodes:n}}function Un(e){let t=x(e);return e.filter(e=>le(e)||t.isVisibleOnScreen(e))}function Wn(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function Gn(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function Kn(e){return{identity:`${e.type??``}#${qn(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function qn(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Jn(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Yn=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Xn(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=P(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=tt(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;P(e)<o;){let c=await rr(e,t,o-P(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Zn(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Hn(c.snapshot);_=$n({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=tt(c.snapshot.snapshotQuality);let y=P(e),ee=tr({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=nr({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await dn(e,t);continue}if(!Wn(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let te=nr({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(te<=0)break;await dn(e,te)}return{settled:!1,stalled:!1,waitedMs:P(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Zn(e,t,n){if(!e||!t||!Qn(t.backend,n))return;let r=t.nodes.some(le),i=e.length<=5;if(!(!r&&!i))return Hn({...t,nodes:e})}function Qn(e,t){return e===`xctest`||e===void 0&&t===`ios`}function $n(e){return e.requestedQuietMs<500||!Gn(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function er(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function tr(e){if(!(e.resetRequested!==!0||e.alreadyReset||!er(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function nr(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function rr(e,t,n,r){let i=await Vn(e,t,n,async n=>await B(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const ir=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,ar=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function or(e,t,n){return await cr(e,t,{...n,baseline:await dr(e,t,n.resolved),actionPoint:n.resolved.point})}const sr=async(e,t)=>(await cr(e,t,t)).observation;async function cr(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await lr(e,t,n,a,await Xn(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baseline.nodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function lr(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?ar:ir}};let{stored:o,session:s}=await wr(e,t,i.lastCapture),c=L(i.lastCapture.snapshot),l=c.nodes,u=vn(n.baseline,c);return{observation:{...a,...u?{surfaceChange:u}:{},...i.settled&&o&&!u?gr(n.baseline.nodes,l,n.actionPoint,s?.appBundleId):{},...Sr(i,o,l.length,u)},settledCapture:c}}function ur(e,t){if(e)return yn(e,t)}async function dr(e,t,n){let r=await e.sessions.get(t.session??`default`);return fr(n,r)??mr(n.preAction)??pr(r)}function fr(e,t){if(e.kind!==`ref`)return;let n=t?.refFrameSnapshot;return n?mr(L(n)):void 0}function pr(e){let t=e?.refFrameSnapshot??e?.snapshot;return t?L(t):{nodes:[]}}function mr(e){return e?.nodes.length?e:void 0}function hr(e,t,n){let r=Sn(Rt(e,n),Rt(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=xr(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function gr(e,t,n,r){let i=hr(e,t,r);return{diff:i,..._r(i,t,n,r)}}function _r(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=zt(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!vr(o.get(e),n))?{}:br(t,i,r)}function vr(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const yr=new Set([`application`,`window`]);function br(e,t,n){let r=zt(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!yr.has(o(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=o(e.type??`Element`),n=Le(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function xr(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function Sr(e,t,n,r){let i=Cr(e,t,n).hint;if(!r)return i===void 0?{}:{hint:i};let a=bn(r);return{hint:i===void 0?a:`${a} ${i}`}}function Cr(e,t,n){return e.stalled?{hint:ar}:e.settled?t?n<5?{hint:Yn}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:ir}}async function wr(e,t,n){if(j(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function Tr(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function Er(e,t,n,r,i){let a=await Dr(e,t,n,i);return kr({...r,...a})}async function Dr(e,t,n,r){if(r.settle!==void 0){let i=await or(e,t,{...r.settle,resolved:n}),a=r.verify?ur(i.settledCapture,n.preAction):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await Or(e,t,n);return i?{evidence:i}:{}}async function Or(e,t,n){try{return yn(L((await I(e,t,!0)).snapshot),n.preAction)}catch{return}}function kr(e){let t=e;if(t.targetHittable!==!1||!Ar(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function Ar(e){if(e.evidence?.changedFromBefore===!0||e.settle?.surfaceChange!==void 0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function jr(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ee(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?Nr(a):a.matchedNodes.length>1?Mr(a):Nr(a)}let a=we(e,t,{...r,...v({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:Mr(a.firstMatch):{kind:`none`}}function Mr(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Nr(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function Pr(e,t,n){let r=ee(e,y(t),n);return r?{...r,selector:r.selector.raw}:null}function Fr(e,t,n,r){let i=jr(e,y(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function Ir(e){return e}function Lr(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const Rr=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function V(e){return[e.type,e.role,e.subrole].map(e=>S(e??``)).some(e=>e===`tab`||Rr.some(t=>e.includes(t)))}function zr(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=ii(e);if(!Br(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Xr(e,n,r).node;for(let n of t.slice(1))if(Xr(e,n,r).node.index!==i.index){let e=Hr(t,r);return e?{kind:`equivalent`,node:e}:{kind:`ambiguous`,candidates:t}}return{kind:`equivalent`,node:i}}function Br(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Vr(i,a,t)&&!Vr(a,i,t))return!1}return!0}function Vr(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Hr(e,t){if(e.length<2||!Br(e,t.nodesByIndex)||e.some(e=>e.hittable!==void 0))return null;let n=e.reduce((e,t)=>(t.depth??0)>(e.depth??0)?t:e);if(!V(n)||!e.every(e=>e===n||!V(e)))return null;let r=O(n.rect);return r&&e.every(e=>Kr(O(e.rect),r))?n:null}function Ur(e){return[e.type,e.role,e.subrole].map(e=>S(e??``)).some(e=>e.includes(`accessibilityelement`))}function Wr(e,t){if(e.length<2||!Br(e,t.nodesByIndex)||e.some(e=>V(e)))return null;let n=e.reduce((e,t)=>(t.depth??0)<(e.depth??0)?t:e),r=n.label?.trim();if(!r)return null;let i=O(n.rect);return i&&e.every(e=>(e===n||Ur(e))&&e.label?.trim()===r&&Kr(O(e.rect),i))?n:null}function Gr(e,t){let n=ii(e);return Hr(t,n)??Wr(t,n)}function Kr(e,t){return e?Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1:!1}function qr(e,t){if(!t?.rect||!e.rect||!le(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function Jr(e,t){return Xr(e,t)}function Yr(e){let t=ii(e);return n=>Xr(e,n,t)}function Xr(e,t,n){return k(t)?{node:t,reason:`covered`}:Zr(e,t,n)??Qr(t)??$r(e,t,n)??{node:t,reason:`original`}}function Zr(e,t,n){let r=ti(e,t,n);return r?.rect&&D(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Qr(e){return V(e)&&e.rect&&D(e.rect)?{node:e,reason:`semantic-target`}:null}function $r(e,t,n){let r=ei(e,t,n);return!r?.rect||k(r)||!D(r.rect)?null:ni(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function ei(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?ge(e,t,n.nodesByIndex,e=>r(e)?e:null):_(e,t,r)}function ti(e,t,n){let r=O(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||k(e))return!1;let t=O(e.rect);return t?We(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function ni(e,t,n,r){let i=O(e.rect),a=O(t.rect);if(!i||!a)return!1;if(ri(t)&&!We(i,a))return!0;let o=ue(n,i,r?.viewportRootRects);return!o||!ai(a,o)?!1:!We(i,a)}function ri(e){let t=S(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function ii(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(le(i)){let e=O(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function ai(e,t){let n=Lr(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function H(e,t,n,r,i={}){let a=Fr(ui(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`resolved`)return await si(e,t,{node:a.resolution.node,selector:a.resolution.selector,selectorIndex:a.resolution.selectorIndex,matches:a.resolution.matches,matchedNodes:a.matchedNodes},i);let o=oi(t,a);return o?await si(e,t,o,i):a}function oi(e,t){let n=Gr(e,t.matchedNodes);return n?{node:n,selector:t.selector,selectorIndex:t.selectorIndex,matches:t.matchedNodes.length,matchedNodes:t.matchedNodes}:null}async function si(e,t,n,r){let i=await li(e,t,n.node,r);return i.kind===`occluded`?{kind:`occluded`,node:i.node,selector:n.selector}:{...n,kind:`target`,node:i.node}}function ci(e,t,n,r){let i=ui(e,t);return{candidates:i,list:Pr(i,n,{...r,requireRect:e.resolution.requireRect})}}async function li(e,t,n,r={}){r.onResolved?.(n,t);let i=di(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||k(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await fi(e,t,i.node,r)}}function ui(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!k(e)):t}function di(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=Jr(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&qr(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function fi(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function pi(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);if(!(`defaultTimeoutMs`in e.poll))throw Error(`selector pipeline row polls under a caller-capped readiness budget, not a caller-default one`);return e.poll}const mi=Object.freeze({reason:`tap_keyboard_occludes_target`,hint:"The visible keyboard covers this target, so the tap would land on a key instead of on it. End editing first: tap the app's own Done/Cancel/close control, or run `keyboard enter` when submitting is what you want (`keyboard dismiss` works only when the keyboard exposes its own dismiss key). This reads the snapshot the command measured against, so if the keyboard closed since it was taken, run `snapshot -i` and retry."}),hi=new Set([`keyboard`,`key`]);function gi(e){return hi.has(S(e.type??``))||Ge(e)}const _i=new Set([`UIKeyboardDockItemButton`,`UIAccessibilityElementKBKey`]);function vi(e){return gi(e)||_i.has(e.role??``)}function yi(e,t,n){return n.has(e.index)||Si(t,n,e.index).length>0}function bi(e){return e!==null&&ve(e)}function U(e){return e.flatMap(e=>ve(e.rect)?[e.rect]:[])}function xi(e,t){let n=new Map(e.map(e=>[e.index,e.parentIndex])),r=new Set(t.map(e=>e.index)),i=new Set;for(let e of t)for(let t of Si(n,r,e.index))i.add(t);return i}function Si(e,t,n){let r=[],i=new Set,a=e.get(n);for(;typeof a==`number`&&!i.has(a);)i.add(a),t.has(a)&&r.push(a),a=e.get(a);return r}function Ci(e){let t=e.map(e=>[e.x,e.x+e.width]).sort((e,t)=>e[0]-t[0]),n=t[0]?.[1]??0;for(let[e,r]of t){if(e-n>2)return!1;n=Math.max(n,r)}return!0}function wi(e){let t=Math.min(...e.anchorRects.map(e=>e.y)),n=Math.min(...e.anchorRects.map(e=>e.x)),r=Math.max(...e.anchorRects.map(e=>e.x+e.width)),i=e.viewport.y+e.viewport.height;return e.reportedBottom<i-80||r-n<=e.reportedBottom-t?null:{x:n,y:t,width:r-n,height:i-t}}function Ti(e){let t=U(e.anchorNodes.filter(t=>!e.planeIndices.has(t.index)));return Ci(t.length>0?t:e.anchorRects)}function Ei(e){let t=e.filter(vi),n=xi(e,t);return U(t.filter(e=>!n.has(e.index)))}function Di(e,t){let n=e.filter(gi),r=U(n);if(r.length===0||!bi(t))return null;let i=e.filter(vi),a=U(i);if(a.length===0)return null;let o=wi({anchorRects:r,reportedBottom:Math.max(...a.map(e=>e.y+e.height)),viewport:t});if(!o)return null;let s=xi(e,i);return Ti({anchorNodes:n,anchorRects:r,planeIndices:s})?{frame:o,controlRects:U(i.filter(e=>!s.has(e.index)))}:null}function Oi(e){if(e.keyboard?.kind===`absent`)return{kind:`no-keyboard`};let t=e.keyboard?.kind===`visible`?{frame:e.keyboard.frame,controlRects:Ei(e.nodes)}:Di(e.nodes,e.viewport);if(!t)return e.nodes.some(gi)?{kind:`undetermined`}:{kind:`no-keyboard`};if(!e.node)return ki(e.point,t);let n=new Map(e.nodes.map(e=>[e.index,e.parentIndex])),r=new Set(e.nodes.filter(vi).map(e=>e.index));return yi(e.node,n,r)?{kind:`clear`,surface:t}:b(t.frame,e.point.x,e.point.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function ki(e,t){return t.controlRects.some(t=>b(t,e.x,e.y))?{kind:`clear`,surface:t}:b(t.frame,e.x,e.y)?{kind:`occluded`,surface:t}:{kind:`clear`,surface:t}}function Ai(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}function ji(e){let t=e.node.rect;if(!t||!e.tapPoint)return;let n=Oi({nodes:e.nodes,viewport:x(e.nodes).resolveViewport(t),point:e.tapPoint,node:e.node,...e.keyboard?{keyboard:e.keyboard}:{}});if(n.kind===`occluded`)throw Pi({label:e.label,action:e.action,ref:e.node.ref,targetRect:t,surface:n.surface})}function Mi(e){let t=Oi({nodes:e.nodes,viewport:e.viewport,point:e.point,...e.keyboard?{keyboard:e.keyboard}:{}});if(t.kind===`occluded`)return Ni(e.point,t.surface)}function Ni(e,t){return`(${e.x}, ${e.y}) is behind the visible keyboard, so this tap lands on the keyboard rather than anything under it (${mi.reason}; keyboard frame ${Math.round(t.frame.y)}..${Math.round(t.frame.y+t.frame.height)}). `+mi.hint}function Pi(e){return l(new a(`COMMAND_FAILED`,`${e.label} is behind the visible keyboard and cannot ${Ai(e.action)} safely`,{...mi,ref:`@${e.ref}`,rect:e.targetRect,keyboardFrame:e.surface.frame}),`no`)}function Fi(e){return l(new a(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${Ai(e.action)} safely`,{reason:E.targetCovered,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked}),`no`)}async function Ii(e){let t=await li(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw Fi({label:e.label,node:t.node,action:e.action});let n=e.resolveTapPoint(t.node);return ji({nodes:e.nodes,node:t.node,action:e.action,label:e.label,...e.keyboard?{keyboard:e.keyboard}:{},tapPoint:n}),{node:t.node,tapPoint:n}}async function Li(e,t,n,r,i,{action:a}){return await Bi(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${zi(e,i)} then retry ${a} with the same selector. --until checks the selector between passes, so it stops on the target rather than sailing past it. If it is inside a closed drawer or another tab, open that container first.`})}async function Ri(e,n,r,i,a,{action:o}){return await Bi(e,n,r,i,{message:`Ref ${a} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:t(a)},hint:e=>`${zi(e,null)} then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function zi(e,t){return e?t?`Run scroll ${e} --until '${t}' to bring it on screen,`:`Scroll ${e} toward it,`:`Scroll toward it,`}async function Bi(e,t,n,r,i){let o=x(r),s=n.rect?o.resolveEffectiveViewport(n):null;if(!n.rect||!s||o.isVisibleOnScreen(n))return n;let c=o.resolveViewport(n.rect),u=await e.backend.confirmOffscreenTargetVisible?.(N(e,t),n,c);if(u)return{...n,rect:u};let d=Ve(n,o);throw l(new a(`COMMAND_FAILED`,i.message,{...i.details,rect:n.rect,viewport:s,...d?{scrollDirection:d}:{},hint:i.hint(d)}),`no`)}function Vi(e,t,n,r){let{candidates:i,list:o}=ci(r,e,t,{platform:n}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=zr(i,s);if(l.kind===`ambiguous`)throw new a(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,...Fe(l.candidates)});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}async function Hi(t,n,r,i){let a=await I(t,n,i.requireInteractive),o=Vi(a.snapshot.nodes,r,t.backend.platform,i.pipeline);if((!o||!o.node.rect)&&i.requireInteractive){let s=a.snapshot;a=await I(t,n,!1),e(s,a.snapshot),o=Vi(a.snapshot.nodes,r,t.backend.platform,i.pipeline)}return{capture:a,resolved:o}}async function Ui(e){let{runtime:t,nodes:n,selectorExpression:r,action:i}=e,a=await H(A.coveredDiagnosis,n,r,{platform:t.backend.platform});if(a.kind===`occluded`)return Fi({label:`Selector ${a.selector}`,node:a.node,action:i,selector:a.selector})}async function Wi(e){let{runtime:t,nodes:n,selectorExpression:r,action:i,resolved:a}=e;return await Ui({runtime:t,nodes:n,selectorExpression:r,action:i})||Rn(r,{diagnostics:a?.diagnostics??[],unique:!0,dispatched:`no`})}async function Gi(t,n,r,i,o){let s=await Hi(t,n,r,i);if(o&&e(o.snapshot,s.capture.snapshot),s.resolved?.node.rect)return s;let c=s.capture.snapshot.snapshotQuality;if(j(c))throw l(new a(`COMMAND_FAILED`,`Selector ${r} was not found in a sparse capture; the tree cannot prove it absent`,{reason:E.captureSparse,snapshotQuality:c,hint:`Re-run after the screen settles, or capture a snapshot to inspect the tree.`}),`no`);let u=await Ui({runtime:t,nodes:s.capture.snapshot.nodes,selectorExpression:r,action:i.action});if(u)throw u;return s}async function Ki(e,t,n,r){if(r.last===void 0&&r.lastError!==void 0)return r.lastError;let i={polls:r.polls.length,waitedMs:r.waitedMs,end:r.kind},a=await Wi({runtime:e,nodes:r.last?.capture.snapshot.nodes??[],selectorExpression:t,action:n.action,resolved:r.last?.resolved??null});return a.details={...a.details,readiness:i},a}async function qi(e,t,n,r,i){let a=t.signal??e.signal,o,s=await Qe({capture:async i=>{let a=await Gi(e,{...t,signal:i},n,r,o);return o=a.capture,a},verdict:e=>e.resolved&&e.resolved.node.rect?{kind:`done`,result:{capture:e.capture,resolved:e.resolved}}:{kind:`continue`},schedule:{...i,captureDeadline:`cancel`},rideOut:Ye,...a?{signal:a}:{},...e.clock?{clock:e.clock}:{},phase:`interaction_target_readiness`});if(s.kind===`done`)return s.polls.length>1?{...s.result,readiness:{polls:s.polls.length,waitedMs:s.waitedMs}}:s.result;throw s.kind===`failed`?Ji(s.error,s):await Ki(e,n,r,s)}function Ji(e,t){if(!(e instanceof a)||e.details?.reason!==E.captureSparse)return e;let n={polls:t.polls.length,waitedMs:t.waitedMs,end:`sparse`};return e.details={...e.details,readiness:n},e}const W={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,readinessExhausted:`wait_readiness_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Yi=[`runner-start`,`target-discovery`];function Xi(e){let t=e?.readinessPhase;return Yi.find(e=>e===t)}const Zi=`replay_target_guard_mismatch`,Qi=W.landmarkIdentityMismatch;function $i(e,t,n,r,i){if(!n)return;let o=C(e),s=_e(e,t);if(!(se(o,n.identity)&&fe(s,n.structural)))throw l(new a(`COMMAND_FAILED`,`${r} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Zi,observed:o,observedStructural:s,expected:n.identity,expectedStructural:n.structural,...i?{targetRole:i}:{}}),`no`)}function ea(e,t,n){$i(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}function ta(e){return e.hittable===!0||V(e)}function na(e,t){let n=pe(C(e),t);return n.id!==void 0||n.label!==void 0?!1:he(e.value)===null}function ra(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function ia(e,t){let n=ft(t);return t.filter(t=>t.index!==e.index&&ra(t,e,n)).sort((e,t)=>e.index-t.index)}function aa(e,t){let n=D(e.rect);return!n||!t.rect?!1:b(t.rect,n.x,n.y)}function oa(e,t){if(!na(e,t))return e;let n=ia(e,t);if(n.some(ta))return e;let r=n.find(e=>C(e).label!==void 0);return!r||!aa(r,e)?e:r}function sa(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}const ca={source:`ref`,phase:`pre-action`,kind:`exact`},la={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function ua(e,t,n){return{ref:e,node:t,resolution:n===`exact`?ca:la}}const da={source:`runtime`,phase:`pre-action`,kind:`unique`};function fa(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:pa(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>pa(e,t))}:da}function pa(e,t){let n=S(e.type??``),r=z(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:sa(n,256)}:{},...r===void 0?{}:{label:sa(r,256)}}}function ma(e,t,n,r,i){let a=n.nodes;return{node:t,selectorChain:g(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:a}),refLabel:z(t,a),...ga(t,r),preAction:n,resolution:i,...ha(e,t,a,r)}}function ha(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=oa(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:g(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:z(i,n)}}}function ga(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function _a(e,t,n={}){let r=O(t.rect),i=D(r??void 0);if(!r||!i)return{kind:`invalid`};let a=va(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?ba(e,t):null,r),s=o?xa(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function va(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>ya(e,t,r)).filter(V).flatMap(e=>{let t=O(e.rect);if(!t||We(t,n))return[];let r=ba(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function ya(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function ba(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function xa(e,t,n,r){let i=Ea(e),a=wa(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=wa(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!b(t,s.x,s.y))return[];let c=Sa(s,e,n,r,i);return c?[c]:[]})).sort(Ca)[0]?.point??null}function Sa(e,t,n,r,i){let a=Ta(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function Ca(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function wa(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function Ta(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function Ea(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}function Da(e,t,n){let r=x(t),i=_a(t,e,{bounds:[r.resolveEffectiveViewport(e),e.rect?r.resolveViewport(e.rect):null].filter(e=>e!==null)});if(i.kind===`resolved`)return i.point;throw i.kind===`invalid`?l(new a(`COMMAND_FAILED`,n.invalidMessage,{reason:E.targetBoundsInvalid,...Oa(n.blockedTargetDetails)}),`no`):l(new a(`COMMAND_FAILED`,`${n.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...n.blockedTargetDetails,competitorRefs:i.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:i.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`}),`no`)}function Oa(e){return`ref`in e?{ref:t(e.ref)??e.ref}:e}function ka(e,n){let r=t(e.ref);if(!r)throw new a(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let i=t(n.ref),o=n.node.ref?t(n.node.ref):null;if(i!==r||o!==r||!n.nodes.includes(n.node))throw new a(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{tree:{nodes:n.nodes,...n.iosSystemSurfaceBundleId?{surfaceBundleId:n.iosSystemSurfaceBundleId}:{}},...n.keyboard?{keyboard:n.keyboard}:{},resolved:ua(r,n.node,`exact`)}}async function Aa(e,t,n){let r=await Ma(e,t,n);return{tree:L(r.snapshot),...r.snapshot.keyboard?{keyboard:r.snapshot.keyboard}:{},resolved:r.resolved}}async function ja(e,n,r,i){let{tree:a,keyboard:o,resolved:s}=i.preresolvedTarget?ka(r,i.preresolvedTarget):await Aa(e,n,r),c=a.nodes,{node:l,tapPoint:u}=await Ii({policy:i.pipeline,nodes:c,...o?{keyboard:o}:{},node:s.node,action:i.action,label:`Ref ${r.ref}`,hooks:{onResolved:(e,t)=>ea(e,t,i),offscreen:async(t,a)=>await Ri(e,n,t,a,r.ref,i)},resolveTapPoint:e=>Da(e,c,{invalidMessage:`Ref ${r.ref} has no usable bounds`,blockedTargetLabel:`Ref ${r.ref}`,blockedTargetDetails:{ref:`@${t(r.ref)??e.ref}`}})});return{kind:`ref`,point:u,target:{kind:`ref`,ref:`@${s.ref}`},...ma(e,l,a,i.action,s.resolution)}}async function Ma(e,t,n){let{session:r,snapshot:i}=await Nn(e,t.session),a=n.fallbackLabel??``,o=Pa(i.nodes,n.ref,{fallbackLabel:a});if(o.kind!==`resolved`)throw Fa(o,n.ref);return Na({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o.resolved})}function Na(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=Pa(o.nodes,r.ref,{fallbackLabel:i});return s.kind===`resolved`&&se(C(a.node),C(s.resolved.node))?{snapshot:o,resolved:s.resolved}:{snapshot:n,resolved:a}}function Pa(e,n,r){let i=t(n);if(!i)throw new a(`INVALID_ARGS`,`Invalid ref: ${n}`);let o=s(e,i);if(Ia(o))return{kind:`resolved`,resolved:ua(i,o,`exact`)};let c=r.fallbackLabel.length>0?On(e,r.fallbackLabel):null;if(Ia(c))return{kind:`resolved`,resolved:ua(i,c,`label-fallback`)};let l=o??c;return l?{kind:`unusable`,node:l}:{kind:`missing`}}function Fa(e,n){let r=t(n)??n,i=e.kind===`unusable`?new a(`COMMAND_FAILED`,`Ref ${n} has no usable bounds`,{reason:E.targetBoundsInvalid,ref:r,hint:w}):new a(`COMMAND_FAILED`,`Ref ${n} not found`,{reason:E.refNotFound,ref:r,hint:w});return l(i,`no`)}function Ia(e){return e?D(e.rect)!==null:!1}async function G(e,t,n){return await Va(e,t,n.action),t.target.kind===`point`?await Ra(e,t,t.target,n):t.target.kind===`ref`?await ja(e,t,t.target,n):await Ba(e,t,t.target,n)}async function La(e,t,n){let r=(await e.sessions.get(t.session??`default`))?.snapshot,i=r?.nodes;if(!i)return;let a={x:n.x,y:n.y},o=x(i).resolveViewport({x:a.x,y:a.y,width:0,height:0});return o&&!b(o,a.x,a.y)?`Coordinates (${a.x}, ${a.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`:Mi({nodes:i,point:a,viewport:o,...r?.keyboard?{keyboard:r.keyboard}:{}})}async function Ra(e,t,n,r){let i=await La(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await za(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preAction:a}:{},...i?{warning:i}:{}}}async function za(e,t){try{return L((await I(e,t,!0)).snapshot)}catch{return}}async function Ba(e,t,n,r){let i=n.selector,a,o,s,c=$e(r.pipeline.poll,r.readinessTimeoutMs);if(c){let n=await qi(e,t,i,r,c);a=n.capture,o=n.resolved,s=n.readiness}else{let n=await Hi(e,t,i,r);if(a=n.capture,o=n.resolved,!o||!o.node.rect)throw await Wi({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o})}let l=o,{node:u,tapPoint:d}=await Ii({policy:r.pipeline,nodes:a.snapshot.nodes,...a.snapshot.keyboard?{keyboard:a.snapshot.keyboard}:{},node:l.node,action:r.action,label:`Selector ${l.selector}`,hooks:{onResolved:(e,t)=>ea(e,t,r),offscreen:async(n,i)=>await Li(e,t,n,i,l.selector,r)},resolveTapPoint:e=>Da(e,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}})});return{kind:`selector`,point:d,target:{kind:`selector`,selector:o.selector},...s?{readiness:s}:{},...ma(e,u,L(a.snapshot),r.action,fa(o,a.snapshot.nodes))}}async function Va(e,t,n){if(e.backend.platform!==`macos`)return;let r=await Ha(e,t);if((r===`desktop`||r===`menubar`)&&(r!==`menubar`||n!==`click`&&n!==`press`))throw new a(`UNSUPPORTED_OPERATION`,`${n} is not supported on macOS ${r} sessions yet. Open an app session to act, or use the ${r} surface to inspect.`)}async function Ha(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Ua(e,n,r,i){let a=(await e.sessions.get(n.session??`default`))?.snapshot,o=a?.nodes;if(!a||!o||t(r.ref)===null)return{};let s=Pa(o,r.ref,{fallbackLabel:r.fallbackLabel??``});if(s.kind!==`resolved`)return{};let{resolved:c}=s,l=A.resolvedTarget,{node:u}=await Ii({policy:l,nodes:o,node:c.node,action:i,label:`Ref ${r.ref}`,hooks:{offscreen:async(t,a)=>await Ri(e,n,t,a,r.ref,{action:i,pipeline:l})},resolveTapPoint:e=>D(e.rect)});return{...ga(u,i),node:u,preAction:L(a)}}async function Wa(e,t,n,r,i){let a=await Ua(e,t,n,r),o=F(await i(N(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:ca,...a,...o?{backendResult:o}:{}}}function Ga(e,t){let n=x(e),r=e.filter(n.isVisibleInEffectiveViewport).map(e=>e.rect).filter(Ka),i=r.length>0?r:e.map(e=>e.rect).filter(Ka);if(i.length===0)throw new a(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let o=Math.min(...i.map(e=>e.x)),s=Math.min(...i.map(e=>e.y)),c=Math.max(...i.map(e=>e.x+e.width)),l=Math.max(...i.map(e=>e.y+e.height));return{x:o,y:s,width:c-o,height:l-s}}function Ka(e){return!!(e&&e.width>0&&e.height>0)}async function qa(e,t){return await e.backend.resolveGestureViewport?.(N(e,t))||Ga((await I(e,t,!1)).snapshot.nodes,`gesture`)}const Ja=async(e,t)=>{let n=await G(e,t,{action:`focus`,requireInteractive:!0,pipeline:A.resolvedTarget});if(!e.backend.focus)throw new a(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let r=K(n),i=F(await e.backend.focus(N(e,t),r));return{...n,...i?{backendResult:i}:{},...T(`Focused (${r.x}, ${r.y})`)}},Ya=async(e,t)=>{let n=Tr(t),r=await G(e,t,{action:`longPress`,requireInteractive:!0,pipeline:A.promotedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.longPress)throw new a(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let i=t.durationMs===void 0?void 0:Qt(t.durationMs,`durationMs`,0,12e4),o=K(r),s=F(await e.backend.longPress(N(e,t),o,{durationMs:i}));return await Er(e,t,r,{...r,...i===void 0?{}:{durationMs:i},...s?{backendResult:s}:{},...T(`Long pressed (${o.x}, ${o.y})`)},n)},Xa=async(e,t)=>{let n=Tr(t),r=n.needsPreActionBaseline?null:await Za(e,t);if(r)return r;let i=await G(e,t,{action:`hover`,requireInteractive:!1,pipeline:A.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new a(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=K(i),s=F(await e.backend.hover(N(e,t),o));return await Er(e,t,i,{...i,...s?{backendResult:s}:{},...T(`Hovered (${o.x}, ${o.y})`)},n)};async function Za(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Wa(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Qa=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Va(e,t,`drag`);let n=await qa(e,t),r=await $a(e,t,`source`),i=await $a(e,t,`destination`),o=Je({from:K(r),to:K(i),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},n),s=F(await e.backend.performGesture(N(e,t),o)),{start:c,end:l}=Ke(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:eo(r),destination:eo(i)},recording:to(r,i),...s?{backendResult:s}:{},...T(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function $a(e,t,n){let r=t.gesture[n];return await G(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:A.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function eo(e){if(e.kind===`point`||!e.resolution)throw new a(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function to(e,t){let n=no(e),r=no(t),i=ro(e),a=ro(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function no(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function ro(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preAction))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preAction.nodes}}function K(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}const io=async(e,t)=>await so(e,t,`press`),ao=async(e,t)=>await so(e,t,`click`),oo=async(e,t)=>{if(typeof t.text!=`string`)throw new a(`INVALID_ARGS`,`fill requires text`);let n=Tr(t),r=n.needsPreActionBaseline?null:await uo(e,t);if(r)return r;let i=await G(e,t,{action:`fill`,requireInteractive:!0,pipeline:A.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new a(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=co(i),s=`node`in i?i.node?.type??``:``,c=s!==``&&re(s,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in i&&i.node?.hittable===!1,u=F(await e.backend.fill(N(e,t),o,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${po(i)} resolved to "${s}", attempting fill anyway.`:void 0;return await Er(e,t,i,{...i,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)};async function so(e,t,n){let r=Tr(t),i=r.needsPreActionBaseline?null:await lo(e,t,n);if(i)return i;let o=await G(e,t,{action:n,requireInteractive:!0,pipeline:A.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget,readinessTimeoutMs:t.readinessTimeoutMs});if(!e.backend.tap)throw new a(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=co(o),c;try{c=await e.backend.tap(N(e,t),s,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw cn(e,o),e}let l=F(c);return await Er(e,t,o,{...o,...l?{backendResult:l}:{}},r)}function co(e){if(!e.point)throw new a(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function lo(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||fo(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Wa(e,t,t.target,n,async(e,t)=>await r(e,t))}async function uo(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Wa(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function fo(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function po(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function q(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const mo=A.wait.poll.defaultTimeoutMs;function ho(e,t,n,r,i={}){let a=pi(r),o=n??a.defaultTimeoutMs,s=X(e),c=Ao(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(X(e)-s));return{capture:async n=>{let r=!1,i=X(e)-s,a=t=>l.push({startedMs:i,durationMs:X(e)-s-i,outcome:t}),o=await Vn(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(go(r,c.lastUnobservedCause())),o;let f=_o(o.error,c.readableCaptures());return a(f.outcome),u=f.evidence,{timedOut:!0,deadline:f.deadline}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:vo(l),waitedMs:X(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,neverReadableCause:c.neverReadableCause,sleepUntilNextPoll:async()=>await jo(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>X(e)-s}}function go(e,t){return e?`readable`:t?.outcome??`unreadable`}function _o(e,t){let n=Oo(e);if(n)return{outcome:`runner-restart`,deadline:`runner-restart-exhausted`,evidence:n};let r=Xi(e instanceof a?e.details:void 0);return r?{outcome:`readiness`,deadline:`readiness-exhausted`,evidence:{readinessPhase:r}}:{outcome:`deadline`,deadline:t===0?`capture-stalled`:`capture-truncated`,evidence:{}}}function vo(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function yo(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function bo(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function xo(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.readinessExhausted,...t,retriable:!0,hint:`The wait timeout ended during readiness work (${t.readinessPhase}), before that poll could capture the screen. Retry with a timeout long enough to cover it.`})}function So(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.deadlineExceeded,captureTruncated:!0,...t})}function Co(e,t){return new a(`COMMAND_FAILED`,e,{reason:W.targetAbsent,...t})}function wo(e,t,n){let r=e.neverReadableCause();if(r!==void 0){if(r.outcome===`retriable`)throw To(r.error,t);if(n)throw r.error}}function To(e,t){let r=n(e);return new a(r.code,r.message,{reason:W.captureStalled,...r.details,...t},r)}function J(e,t,n){let r=t.failureEvidence();switch(n){case`runner-restart-exhausted`:return bo(e,r);case`readiness-exhausted`:return wo(t,r,!1),xo(e,r);case`capture-stalled`:return wo(t,r,t.preserveUnreadableOnStall===!0),yo(e,r);case`capture-truncated`:return So(e,r);case void 0:return wo(t,r,!0),r.readableCaptures===0?yo(e,r):Co(e,r);default:return Do(n)}}function Eo(e){return e===`runner-restart-exhausted`||e===`readiness-exhausted`}function Do(e){throw Error(`Unhandled wait deadline: ${String(e)}`)}function Oo(e){if(!(e instanceof a))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...Y(t,`runnerRestartReason`),...Y(t,`runnerRestartCommand`),...Y(t,`runnerRestartCommandId`),...Y(t,`runnerInvalidatedSessionId`),...Y(t,`runnerRestartSessionId`),...Y(t,`logPath`),...Y(t,`diagnosticId`)}}function Y(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function ko(e){return e instanceof a&&e.details?.retriable===!0}function Ao(e=Ye){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(e(t))n={outcome:`unreadable`,error:t};else if(ko(t))n={outcome:`retriable`,error:t};else throw t;return}},lastUnobservedCause:()=>n,recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,neverReadableCause:()=>t===0?n:void 0}}function X(e){return e.clock?.now()??Date.now()}async function jo(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function Mo(e,t,n){let r=await H(A.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:Ae(e,i)}}async function No(e,t,n){let r=await Mo(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Pe(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function Po(e,t,n,r,i){let a=ze(n);if(a)throw Re(a,`wait`);let o=ho(t,n,i,A.wait,{isUnreadableError:Io,preserveUnreadableOnStall:!0}),s=q(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await Mo((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(Be(a.kind))throw Pe(r,a,`wait`);return a}catch(e){throw Ye(e)?ke(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw Eo(l)?J(`wait absent timed out for selector: ${r}`,o,l):c?Fo(r,c,o.failureEvidence()):J(`wait absent timed out for selector: ${r}`,o,l)}function Fo(e,t,n){let r=t.matches!==1;return new a(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${r?`es`:``} remain`,{reason:W.targetPresent,selector:e,...n,matches:t.matches,firstMatch:t.firstMatch})}function Io(e){if(!(e instanceof a))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(Be(t.observation)||t.observation===`unreadable`)}function Lo(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function Ro(e,t,n,r,i,o){let s=ho(t,n,i,A.wait),c=q(),l,u;for(;s.hasTimeRemaining();){let i=await s.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(i.timedOut){u=i.deadline;break}let a=i.value;if(a){let e=a.snapshot.nodes,n=Lo(await H(A.wait,e,r,{platform:t.backend.platform}));if(n){let t=zo(e,n,o);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:s.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new a(`COMMAND_FAILED`,`wait matched selector ${r} but no candidate carried the recorded landmark identity`,{reason:Qi,...s.failureEvidence(),...l}):J(`wait timed out for selector: ${r}`,s,u)}function zo(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=ft(e),a=mt(t.matchedNodes,i,ie(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:C(r),observedAncestry:pt(r,i,Math.max(n.ancestry.length,1)).chain}}}async function Bo(e,t,n,r,i){let o=i??mo,s=r??e.stable.defaultQuietMs,c=await e.stable.capture(t,n,{quietMs:s,timeoutMs:o});if(!c.settled)throw new a(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:W.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function Vo(e,t,n,r,i){let a=ho(t,n,i,A.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await Ho(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw J(`wait timed out for text: ${r}`,a,o)}async function Ho(e,t,n,r){return t.backend.findText&&(await t.backend.findText(Wo(t,n),r)).found?!0:await Uo(e,t,n,r)}async function Uo(e,t,n,r){return!!On((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function Wo(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function Go(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await jo(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await Ko(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await Ro(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await Po(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await Bo(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await qo(e,t,n,n.target.text,n.target.timeoutMs);default:return Jo(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let r=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(r.kind!==`text`)throw new a(`COMMAND_FAILED`,`waitForText returned non-text result`);return r}}}async function Ko(e,n,r,i,o){let c=await e.requireSnapshot(n,r.session),l=t(i);if(!l)throw new a(`INVALID_ARGS`,`Invalid ref: ${i}`);let u=s(c.snapshot.nodes,l);if(!u)throw new a(`COMMAND_FAILED`,`Ref ${i} not found`,{reason:E.refNotFound,ref:l,hint:w});let d=z(u,c.snapshot.nodes);if(!d)throw new a(`COMMAND_FAILED`,`Ref ${i} has no label to wait for`,{reason:E.refUnlabeled,ref:l});return await Vo(e,n,r,d,o)}async function qo(e,t,n,r,i){let o=Ce(r);if(!o.ok)throw new a(o.code,o.message);return await Vo(e,t,n,o.text,i)}function Jo(e){throw Error(`Unsupported wait target: ${String(e)}`)}const Yo=Go({captureSnapshot:B,requireSnapshot:Nn,stable:{defaultQuietMs:500,tinyTreeHint:Yn,tinyTreeNodeCount:5,capture:Xn}}),Xo=Yo.waitCommand,Zo=Yo.waitForTextCommand,Qo=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new a(`INVALID_ARGS`,ce);if(t.action===`wait`)return await ns(e,t,n);if(t.action===`list`)return await rs(e,t,n);let{capture:r,match:i}=await is(e,t,n);if(!i)throw new a(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let o=`@${i.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:o,node:i}:{kind:`text`,ref:o,text:await In(e,r,i),node:i}},$o=async(e,t)=>{if(t.target.kind===`ref`){let n=await Nn(e,t.session),r=Ln(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});$i(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=g(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await In(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await as(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?A.readText:A.readUnique,hooks:{onResolved:(e,n)=>$i(e,n,t.expectedResolvedTarget,`get`)}}),r=g(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await In(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},es=async(e,t)=>{let n=await $o(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new a(`COMMAND_FAILED`,`getText returned non-text result`);return n},ts=async(e,t)=>{let n=await $o(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new a(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n};async function ns(e,t,n){let r=ho(e,t,t.timeoutMs,A.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await is(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw J(`find wait timed out`,r,i)}async function rs(e,t,n){let r=De(n,t.query),i=await B(e,t,{updateSession:!0,...q()});if(j(i.snapshot.snapshotQuality))throw Mn(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?ci(A.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ne(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function is(e,t,n,r){let i=De(n,t.query),a=await B(e,t,{updateSession:!0,scope:jn(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...q()});if(j(a.snapshot.snapshotQuality))throw Mn(a.snapshot.snapshotQuality);if(i){let t=await H(A.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ne(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function as(e,t,n,r){let i=await B(e,{...t,session:n},{updateSession:!0,...q()}),a=await H(r.policy,i.snapshot.nodes,r.selector,{platform:e.backend.platform},r.hooks);if(a.kind!==`target`)throw Bn({outcome:a,selectorExpression:r.selector,command:`get`});return{capture:i,node:a.node,selector:a.selector,ref:`@${a.node.ref}`}}const os=async(e,t)=>{let n=Se(t.predicate);if(!n.ok)throw new a(n.code,n.message,{hint:n.hint});let r=n.predicate;if(r===`absent`){let e=ze(t);if(e)throw Re(e)}if(r===`text`&&!t.expectedText)throw new a(`INVALID_ARGS`,Ee);let i=t.selector,o=await ss(e,t,r,i);return r===`exists`?await cs(e,o,i):r===`absent`?await No(o.snapshot,i,e.backend.platform):await ls(e,t,o,r,i)};async function ss(e,t,n,i){try{return await B(e,t,{updateSession:!0,...q(n)})}catch(e){throw n!==`absent`||r(e)?e:ke(i,e)}}async function cs(e,t,n){let r=await H(A.readAny,t.snapshot.nodes,n,{platform:e.backend.platform});if(r.kind!==`target`)throw new a(`COMMAND_FAILED`,te(n,[],{unique:!1}),{hint:h([])});return{predicate:`exists`,pass:!0,selector:r.selector,matches:r.matches,selectorChain:xe(n)}}async function ls(e,t,n,r,i){let o=await H(A.readUnique,n.snapshot.nodes,i,{platform:e.backend.platform},{onResolved:(e,n)=>$i(e,n,t.expectedResolvedTarget,`is`)});if(o.kind!==`target`)throw Bn({outcome:o,selectorExpression:i,command:`is`,details:{predicate:r,selector:i}});let s=ye({predicate:r,node:o.node,visibility:x(n.snapshot.nodes),expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new a(`COMMAND_FAILED`,`is ${r} failed for selector ${o.selector}: ${s.details}`,{command:`is`,reason:E.predicateFailed,predicate:r,selector:o.selector,predicateDetails:s.details});return{predicate:r,pass:!0,selector:o.selector,...r===`text`?{text:s.actualText}:{},selectorChain:xe(i),node:o.node,preActionNodes:n.snapshot.nodes}}const us=async(e,t)=>await os(e,{...t,predicate:`visible`,selector:t.target.selector}),ds=async(e,t)=>await os(e,{...t,predicate:`hidden`,selector:t.target.selector}),fs=async(e,t)=>{if(!e.backend.performGesture)throw new a(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Va(e,t,t.gesture.intent);let n=await qa(e,t),r=qe(t.gesture,n,e.backend.platform),i=F(await e.backend.performGesture(N(e,t),r)),o=ms(r.pointers,0),s=ms(r.pointers,-1);return{kind:t.gesture.intent,durationMs:r.durationMs,pointerCount:r.topology===`single`?1:2,from:o,to:s,...i?{backendResult:i}:{},...T(hs(t.gesture,o,s))}},ps=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Qa(e,{...t,gesture:n}):await fs(e,{...t,gesture:n})};function ms(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new a(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let r=n;return{x:r.reduce((e,t)=>e+t.x,0)/r.length,y:r.reduce((e,t)=>e+t.y,0)/r.length}}function hs(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const Z={find:Qo,get:$o,getText:es,getAttrs:ts,is:os,isVisible:us,isHidden:ds,wait:Xo,waitForText:Zo},Q={click:ao,press:io,fill:oo,focus:Ja,longPress:Ya,hover:Xa,gesture:ps,settleObservation:sr};function gs(e){return{find:t=>Z.find(e,t),get:t=>Z.get(e,t),getText:(t,n={})=>Z.getText(e,{...n,target:t}),getAttrs:(t,n={})=>Z.getAttrs(e,{...n,target:t}),is:t=>Z.is(e,t),isVisible:(t,n={})=>Z.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>Z.isHidden(e,{...n,target:t}),wait:t=>Z.wait(e,t),waitForText:(t,n={})=>Z.waitForText(e,{...n,text:t})}}function _s(e){return{click:(t,n={})=>Q.click(e,{...n,target:t}),press:(t,n={})=>Q.press(e,{...n,target:t}),fill:(t,n,r={})=>Q.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>Q.focus(e,{...n,target:t}),longPress:(t,n={})=>Q.longPress(e,{...n,target:t}),hover:(t,n={})=>Q.hover(e,{...n,target:t}),gesture:t=>Q.gesture(e,t),settleObservation:t=>Q.settleObservation(e,t)}}const vs=[0,187,255,255];function ys(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||bs(e,n.rect)}function bs(e,t){let n=xs(t);if(n==null)return;let r=Cs(n.x,0,e.width-1),i=Cs(n.y,0,e.height-1),a=Cs(n.right,0,e.width-1),o=Cs(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Ss(e,n,i+t,vs),Ss(e,n,o-t,vs);for(let n=i;n<=o;n+=1)Ss(e,r+t,n,vs),Ss(e,a-t,n,vs)}}function xs(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function Ss(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function Cs(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const ws=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function Ts(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!Os(t,a,e))continue;let c=0,l=Ds(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Es({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Es(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of ws){let o=s+e.x,u=c+e.y;if(!ks(o,u,i,a))continue;let d=u*i+o;Os(t,n,d)&&(l=Ds(r,n,l,d))}return l}function Ds(e,t,n,r){return t[r]=1,e[n]=r,n+1}function Os(e,t,n){return e[n]===1&&t[n]!==1}function ks(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function As(e,t){return e.flatMap(e=>js(e,t.baseline.width,t.baseline.height)?Ms(e,t,Rs(t.baseline.height)):[e])}function js(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=Ls(n)&&r>=t*.35}function Ms(e,t,n){let r=Is(e,Fs(Ps(Ns(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>zs(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function Ns(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function Ps(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function Fs(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function Is(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function Ls(e){return Math.max(48,Math.round(e*.07))}function Rs(e){return Math.max(24,Math.round(e*.03))}function zs(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=Bs(t,a),Vs(i,e,t,a,r.baseline,r.current))}return i}function Bs(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Vs(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const Hs=2.5;function Us(e){let t=Ws(e);return As(t.length<=2e3?qs(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>Xs(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Ws(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return Ts({mask:t,width:i,height:a,hooks:{create:e=>Gs(e,i),visit:(e,t)=>Ks(e,t,i,n,r)}})}function Gs(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Ks(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}function qs(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>Js(e,r,t));if(!e){n.push({...r});continue}Ys(e,r)}return n}function Js(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function Ys(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function Xs(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Zs(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Zs(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Ir({x:$(r.x/n.width),y:$(r.y/n.height),width:$(r.width/n.width),height:$(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:$(e.differentPixels/n.differentPixels),densityPercentage:$(e.differentPixels/s),shape:ec(r,n.width,n.height),size:tc(s,n.totalPixels),location:Qs(i,n.width,n.height),averageBaselineColorHex:rc(a),averageCurrentColorHex:rc(o),baselineLuminance:Math.round(nc(a)),currentLuminance:Math.round(nc(o)),dominantChange:$s(a,o)}}function Zs(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Qs(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function $s(e,t){let n=nc(t)-nc(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function ec(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*Hs?`horizontal-band`:e.height>=e.width*Hs?`vertical-band`:`compact`}function tc(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function nc(e){return e.r*.2126+e.g*.7152+e.b*.0722}function rc(e){return`#${ic(e.r)}${ic(e.g)}${ic(e.b)}`}function ic(e){return e.toString(16).padStart(2,`0`)}function $(e){return Math.round(e*100*100)/100}const ac=Math.sqrt(3*255**2);async function oc(e,t,n={}){await sc(e,`Baseline image not found`),await sc(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([M.readFile(e),M.readFile(t)]),[o,s]=await Promise.all([ot(i,`baseline screenshot`),ot(a,`current screenshot`)]);cc(o.width,o.height,`baseline screenshot`,n.maxPixels),cc(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await lc(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*ac,{diffData:d,diffMask:f,differentPixels:p}=await st({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Us({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new at.PNG({width:o.width,height:o.height});e.data=d,ys(e,m),await M.mkdir(dt.dirname(r),{recursive:!0}),await M.writeFile(r,await ct(e))}else await lc(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function sc(e,t){try{await M.access(e)}catch{throw new a(`INVALID_ARGS`,`${t}: ${e}`)}}function cc(e,t,n,r){if(r==null||r<=0)return;let i=e*t;if(!(i<=r))throw new a(`INVALID_ARGS`,`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function lc(e){if(e)try{await M.unlink(e)}catch(e){if(!uc(e,`ENOENT`))throw e}}function uc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function dc(e,t){return e.map(e=>{let n=fc(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function fc(e,t){let n=be(e.rect);return t.map(t=>{let r=t.overlayRect,i=Lr(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:pc(i/be(r)),regionCoveragePercentage:pc(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function pc(e){return Math.round(e*100*100)/100}async function mc(e,t,r){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new a(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,r)}catch(e){throw n(e)}}async function hc(e,t,r){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new a(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw n(e)}}async function gc(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw n(e)}}const _c=async(e,t)=>{if(!t.baseline)throw new a(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=vc(t.threshold),r=t.current??{kind:`live`};if(t.overlayRefs&&!Ec(r))throw new a(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let i=await mc(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let a;Ec(r)?(s=await yc(e,t),a=s.path):(o=await mc(e,r,{usage:`diff screenshot current`,field:`current`}),a=o.path),c=t.out?await hc(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await oc(i.path,a,{threshold:n,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});Ec(r)&&(u=await bc(e,t,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await i.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function vc(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new a(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function yc(e,t){let n=await gc(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await xc(e,t,n.path,Sc(t))}catch(e){throw await n.cleanup(),e}return n}async function bc(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await Tc(n),r;let a=await hc(e,Cc(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await xc(e,t,a.path,{overlayRefs:!0,...Sc(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:dc(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function xc(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function Sc(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Cc(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:wc(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:wc(e.out.clientPath)}:{},...e.out.fileName?{fileName:wc(e.out.fileName)}:{}}}function wc(e){let t=dt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function Tc(e){try{await M.unlink(wc(e))}catch(e){if(!Dc(e,`ENOENT`))throw e}}function Ec(e){return e.kind===`live`}function Dc(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const Oc=async(e,t)=>{if(!e.backend.captureScreenshot)throw new a(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);u(t);let n=await hc(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),r,i;try{i=(await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}))?.displayRotation,t.scale!==void 0&&await rt(n.path,t.scale),r=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...r?{artifacts:[r]}:{},...i?{displayRotation:i}:{},...T(`Saved screenshot: ${n.path}`)}};function kc(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!i(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=He(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const Ac=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function jc(e){return e?.systemSurfaceOnly===!0?Ac:void 0}function Mc(e,t){return e.presentationKey?e:{...e,presentationKey:c(t)}}function Nc(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!Pc(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!Fc(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function Pc(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function Fc(e,t){return e.truncated===t.truncated&&e.nodes.length===t.nodes.length&&e.nodes.every((e,n)=>Lc(e,t.nodes[n]))}const Ic=Object.keys({index:!0,depth:!0,parentIndex:!0,type:!0,kind:!0,role:!0,subrole:!0,label:!0,value:!0,contentDescription:!0,identifier:!0,enabled:!0,selected:!0,checked:!0,focused:!0,heading:!0,roleDescription:!0,placeholder:!0,hittable:!0,bundleId:!0,appName:!0,windowTitle:!0,surface:!0,hiddenContentAbove:!0,hiddenContentBelow:!0,interactionBlocked:!0});function Lc(e,t){return Ic.every(n=>e[n]===t[n])&&Rc(e.rect,t.rect)&&zc(e.presentationHints,t.presentationHints)&&zc(e.actions,t.actions)}function Rc(e,t){return!e||!t?e===t:e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function zc(e,t){return!e||!t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}const Bc=async(e,t)=>{let n=await Hc(e,t),r=Nc({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(Wc(t.session,n));let i=Kc(n.snapshot);return p(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:kc({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...f({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...n.snapshot.keyboard?{keyboard:n.snapshot.keyboard}:{},...n.snapshot.viewport?{viewport:n.snapshot.viewport}:{},...Gc(n)})},Vc=async(e,t)=>{if(t.observeOnly===!0)throw new a(`INVALID_ARGS`,`observeOnly is supported by snapshot, not diff.`);let n=await Hc(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,o=Wc(t.session,n);if(!i){let t=Cn(n.snapshot.nodes,{flatten:r});return await e.sessions.set(o),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=Sn(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(o),{mode:`snapshot`,baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function Hc(e,t){if(!e.backend.captureSnapshot)throw new a(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,r=await e.sessions.get(n),i=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:r?.appId,appBundleId:r?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions,...t.observeOnly===void 0?{}:{observeOnly:t.observeOnly}}),o=Uc(i,e),s=p(o,Mc(o,t)),c=d(i),l=P(e);return{snapshot:s,result:i,session:r,annotations:c,warnings:qc({result:i,annotations:c,snapshot:s,options:t,session:r,capturedAt:s.createdAt??l,runtimeNow:l})}}function Uc(e,t){return e.snapshot?p(e.snapshot,{...e.snapshot,...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:P(t),...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{}}}function Wc(e,t){let n=t.session?.name??e??`default`;return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function Gc(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function Kc(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:lt(e.producer)===`unavailable`&&void 0:e.truncated}function qc(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...nt(e.annotations.quality,e.snapshot.nodes)),t.push(...it(Kc(e.snapshot))),e.snapshot.postGestureOutcome&&t.push(Kt(e.snapshot.postGestureOutcome)),t.push(...Qc(e)),e.annotations.quality||(t.push(...Yc(e)),t.push(...Zc(e.snapshot.nodes)));let n=Ie(e.snapshot.nodes);n&&t.push(n);let r=Jc(e.annotations);r&&t.push(r);let i=$c(e);return i&&t.push(i),t.push(...rl(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function Jc(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return Ac}function Yc(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return Xc(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function Xc(e){return e?S(e.type??``)===`application`:!1}function Zc(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function Qc(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function $c(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&el(t,e.snapshot)&&tl(t,e.capturedAt,e.runtimeNow)&&xt(t.nodes.length,e.snapshot.nodes.length))return nl}function el(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function tl(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const nl=`Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.`;function rl(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`y`:`ies`}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:e.reason===`sharp-drop`?[nl]:[]}const il={screenshot:Oc,diffScreenshot:_c,snapshot:Bc,diffSnapshot:Vc};function al(e){return fn(il,e)}export{Yt as A,yt as B,en as C,$t as D,on as E,_t as F,ft as H,vt as I,ht as L,zt as M,Tt as N,Qt as O,gt as P,St as R,ln as S,an as T,mt as U,pt as V,On as _,_s as a,F as b,Qi as c,H as d,li as f,z as g,Gr as h,mc as i,Bt as j,Kt as k,W as l,qr as m,jc as n,gs as o,Yr as p,hc as r,Zi as s,al as t,ci as u,gn as v,tn as w,N as x,fn as y,bt as z};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,U as n}from"./sdk-contracts.js";import{g as r,h as i,tt as a}from"./tv-remote.js";import{o}from"./sdk-device.js";import{Zt as s}from"./sdk-batch.js";import{c}from"./sdk-remote-config.js";import{a as l,i as u,o as d,r as f,s as ee,t as te}from"./runtime-deployment.js";import{t as p}from"./webdriver-source.js";import m from"node:fs";import h from"node:path";import ne,{readFile as re,stat as g}from"node:fs/promises";import{setTimeout as _}from"node:timers/promises";function v(e){return{provider:e.provider,providerSessionId:e.providerSessionId,status:e.artifacts.length>0?`ready`:`pending`,cloudArtifacts:e.artifacts,...e.artifacts.length>0?{}:{message:e.pendingMessage}}}function y(e){return{provider:e.provider,providerSessionId:e.providerSessionId,status:`unavailable`,cloudArtifacts:[],message:e.error instanceof Error?e.error.message:String(e.error)}}function b(e,t,n,r,i,a){let o=n[r],s=typeof o==`string`?o.trim():``;if(s.length!==0)return{provider:e,providerSessionId:t,kind:i,name:a,url:s,availability:`ready`}}function x(e){return{"x-agent-device-client":`agent-device-cli`,"x-agent-device-version":e}}async function S(e,r){try{await r()}catch(r){e instanceof t&&(e.details={...e.details,cleanupError:n(r)})}}function C(e){return`Basic ${Buffer.from(`${e.username}:${e.accessKey}`).toString(`base64`)}`}function ie(e){let t=0;for(;t<e.length&&e.charCodeAt(t)===47;)t+=1;return t===0?e:e.slice(t)}function ae(e){let t=e.length-1;for(;t>=0&&e.charCodeAt(t)===47;)--t;return t===e.length-1?e:e.slice(0,t+1)}function oe(e,t){let n=new URL(e);return n.pathname=`${ae(n.pathname)}/${t}`,n}function se(e){if(e.pathname.endsWith(`/`))return e;let t=new URL(e);return t.pathname=`${t.pathname}/`,t}async function ce(e,n,r){if(!(await g(e).catch(()=>void 0))?.isFile())throw new t(`INVALID_ARGS`,`${r.service} can only upload a regular app file: ${e}`,{provider:r.provider,appPath:e,hint:`Use an existing .ipa, .apk, or .aab file, or a .zip of the iOS simulator .app bundle.`});let i=new FormData;return i.set(n,new Blob([await re(e)]),h.basename(e)),i}async function le(e,n,r){let i=await fetch(n.endpoint,{method:`POST`,headers:{...x(n.clientVersion),Authorization:C(n.auth)},body:e,signal:r}),a=await T(i),o=n.readAppReference(a)?.trim();if(!i.ok||!o)throw new t(`COMMAND_FAILED`,`${n.service} app upload failed.`,{status:i.status,response:a});return o}function ue(e){return async({appPath:t,options:n,signal:r})=>({appReference:await e(t,r),bundleId:n?.appIdentifierHint,packageName:n?.packageNameHint,launchTarget:n?.appIdentifierHint??n?.packageNameHint})}async function de(e){let{app:n}=e,r=e.parseReference(n);if(r!==void 0)return r;if(/^https?:\/\//i.test(n))return n;let i=h.resolve(e.cwd??process.cwd(),n);if(!m.existsSync(i))throw new t(`INVALID_ARGS`,`${e.service} --provider-app must be ${e.referenceLabel}, URL, or existing local app path.`,{providerApp:n});return await e.uploadFile(i,e.signal)}const w=15e3;async function fe(e,n){let{service:r,unauthorizedHint:i,networkHint:a}=n.hints,o=`Retry connect or check the ${r} service status.`;try{let a=await fetch(e,{headers:{...x(n.clientVersion),...n.auth?{Authorization:C(n.auth)}:{}},signal:AbortSignal.timeout(w)});if(!a.ok){let e=a.status===401||a.status===403;throw new t(e?`UNAUTHORIZED`:`COMMAND_FAILED`,`${r} rejected connection verification.`,{status:a.status,hint:e?i:o})}let s=await T(a);if(s===void 0)throw new t(`COMMAND_FAILED`,`${r} connection verification answer was not JSON.`,{status:a.status,hint:o});return s}catch(e){throw e instanceof t?e:new t(`COMMAND_FAILED`,`${r} connection verification failed.`,{hint:a},e)}}async function pe(e,n){let r,i;try{r=await fetch(e,{headers:{...x(n.clientVersion),Authorization:C(n.auth)},signal:AbortSignal.timeout(w)}),i=await T(r)}catch(e){throw new t(`COMMAND_FAILED`,`${n.service} session details lookup failed.`,{hint:`Check network access to the ${n.service} API, then retry.`},e)}let a=i&&typeof i==`object`&&!Array.isArray(i)?i:void 0;if(!r.ok||!a)throw new t(`COMMAND_FAILED`,`${n.service} session details lookup failed.`,{status:r.status,response:i});return a}async function T(e){let t=await e.text();if(t.length!==0)try{return JSON.parse(t)}catch{return}}function me(e,t){let n=e=>e.replace(/(?:\.0)+$/,``);return n(e)===n(t)}function he(e,n){let r=c.find(e=>e===n);if(r)return r;throw new t(`INVALID_ARGS`,`Invalid ${e.flag} value: ${n}.`,{hint:`Use ${c.join(`|`)}.`,flag:e.flag,capability:e.capability})}function ge(e,n){if(e)return e;throw new t(`INVALID_ARGS`,`${n} lease allocation requires provider profile flags on the request.`)}function _e(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;throw new t(`INVALID_ARGS`,`${n} requires --platform ios|android.`)}function ve(e,n,r){let i=E(e,n);if(i)return i;throw new t(`INVALID_ARGS`,r)}function E(e,t){let n=e.flags?.[t];return typeof n==`string`&&n.length>0?n:void 0}function D(e,n,r){let i=e[n];if(i?.trim())return i;throw new t(`INVALID_ARGS`,`${r} requires ${n} in the environment.`)}function O(e,n){if(e.platform===`android`||e.platform===`ios`)return e.platform;throw new t(`INVALID_ARGS`,`connect ${n} requires --platform ios|android.`)}function k(e,n,r){if(e?.trim())return e;throw new t(`INVALID_ARGS`,`connect ${n} requires ${r}.`)}function A(e,n,r){let i=h.resolve(n,e);if(m.statSync(i,{throwIfNoEntry:!1})?.isFile())return i;throw new t(`INVALID_ARGS`,`${r} app file not found: ${i}`)}const j=`webdriver_request_timeout`;function M(e){return e instanceof t&&e.details?.reason===j}function N(e){return{dispatched:e}}const P=`webdriver_connect_refused`,F=`webdriver_request_interrupted`,ye=new Set([`ECONNREFUSED`,`ENOTFOUND`,`EAI_AGAIN`,`EHOSTUNREACH`,`ENETUNREACH`,`UND_ERR_CONNECT_TIMEOUT`]);function be(e){return e instanceof t&&e.details?.reason===P}const xe=new Set([`GET`,`HEAD`]),Se=Object.freeze({});var Ce=class{endpoint;headers;requestPolicy;constructor(e){this.endpoint=se(new URL(e.endpoint)),this.headers={...x(e.clientVersion),...e.auth?{Authorization:C(e.auth)}:{},...e.headers},this.requestPolicy={timeoutMs:e.requestPolicy?.timeoutMs??3e4,retryAttempts:e.requestPolicy?.retryAttempts??1,retryDelayMs:e.requestPolicy?.retryDelayMs??250}}async requestValue(e,t,n,r){return(await this.request(e,t,n,r)).value}async request(e,t,n,r){let i=r?.idempotent??xe.has(e);return await this.requestWithRetries(e,t,n,{retryAttempts:r?.retryAttempts??(i?this.requestPolicy.retryAttempts:0),timeoutMs:r?.timeoutMs??this.requestPolicy.timeoutMs,signal:r?.signal})}async requestWithRetries(e,t,n,r){let i;for(let a=0;a<=r.retryAttempts;a+=1)try{return await this.requestOnce(e,t,n,r.timeoutMs,r.signal)}catch(e){if(i=e,!Te(e,a,r.retryAttempts,r.signal))throw e;await _(this.requestPolicy.retryDelayMs,void 0,{signal:r.signal})}throw i}async requestOnce(e,t,n,r,i){let{ok:a,status:o,text:s}=await this.fetchWebDriver(e,t,n,r,i),c=s?De(s):{};if(a)return{status:o,value:Ee(c)};let l=Oe(o,c);throw H(l)&&V(R,{method:e,path:t,status:o,code:B(c)??null}),l}async fetchWebDriver(e,t,n,r,i){let a=new URL(ie(t),this.endpoint),o=n===void 0&&e===`POST`?Se:n,s=AbortSignal.timeout(r),c=i?AbortSignal.any([i,s]):s,l={method:e,path:t,timeoutMs:r,timeoutSignal:s,requestSignal:i},u;try{u=await fetch(a,{method:e,headers:{Accept:`application/json`,...o===void 0?{}:{"Content-Type":`application/json`},...this.headers},body:o===void 0?void 0:JSON.stringify(o),signal:c})}catch(e){throw I(e,l,`request`)}try{return{ok:u.ok,status:u.status,text:await u.text()}}catch(e){throw I(e,l,`response`)}}};function I(e,t,n){let{method:r,path:i,timeoutMs:a,timeoutSignal:o,requestSignal:s}=t;return s?.aborted?e:o.aborted?Me(r,i,a,e):n===`request`&&we(e)?Ne(r,i,e):n===`response`||e instanceof TypeError?Pe(r,i,e):e}function we(e){let t=L(e,0);return t.length>0&&t.every(e=>ye.has(e))}function L(e,t){if(t>4||!e||typeof e!=`object`)return[];let{code:n,cause:r}=e,i=e instanceof AggregateError?e.errors:[];return[...typeof n==`string`?[n]:[],...L(r,t+1),...i.flatMap(e=>L(e,t+1))]}function Te(e,t,n,r){return!r?.aborted&&Fe(e)&&t<n}function Ee(e){if(!e||typeof e!=`object`)return e;let t=e;return`value`in t?t.value:e}function De(e){try{return JSON.parse(e)}catch(n){throw new t(`COMMAND_FAILED`,`WebDriver response was not valid JSON.`,{text:e},n)}}function Oe(e,n){let r=n&&typeof n==`object`&&`value`in n?n.value:n,i=r&&typeof r==`object`&&typeof r.message==`string`?r.message:`WebDriver request failed with HTTP ${e}.`;return je(e,n)?new t(`COMMAND_FAILED`,i,{...z(),status:e,response:n}):new t(`COMMAND_FAILED`,i,{status:e,response:n,...e>=500?N(`unknown`):{}})}const R=`webdriver_route_unsupported`;function z(){return{reason:R,...N(`no`)}}const ke=new Set([`unknown command`,`unknown method`]),Ae=new Set([404,405,501]);function je(e,t){let n=B(t);return n===void 0?Ae.has(e):ke.has(n.toLowerCase())}function B(e){let t=e&&typeof e==`object`&&`value`in e?e.value:void 0,n=t&&typeof t==`object`?t.error:void 0;return typeof n==`string`?n:void 0}function V(e,t){import(`./diagnostics2.js`).then(e=>e.t).then(({emitDiagnostic:n})=>n({level:`debug`,phase:e,data:t})).catch(()=>void 0)}function H(e){return e instanceof t&&e.details?.reason===R}function Me(e,n,r,i){return new t(`COMMAND_FAILED`,`WebDriver ${e} ${n} timed out after ${r}ms.`,{reason:j,method:e,path:n,timeoutMs:r,...N(`unknown`)},i instanceof Error?i:void 0)}function Ne(e,n,r){return new t(`COMMAND_FAILED`,`WebDriver ${e} ${n} could not reach the driver.`,{reason:P,method:e,path:n,...N(`no`)},r instanceof Error?r:void 0)}function Pe(e,n,r){return new t(`COMMAND_FAILED`,`WebDriver ${e} ${n} lost its connection to the driver.`,{reason:F,method:e,path:n,...N(`unknown`)},r instanceof Error?r:void 0)}function Fe(e){if(M(e)||be(e)||e instanceof t&&e.details?.reason===F)return!0;if(e instanceof t){let t=e.details?.status;return typeof t==`number`&&t>=500}return!1}var Ie=class{transport;sessionCreateTimeoutMs;sessionId;constructor(e){this.transport=new Ce(e),this.sessionCreateTimeoutMs=e.requestPolicy?.sessionCreateTimeoutMs??18e4}async createSession(e,t){let n=Re(await this.requestValue(`POST`,`/session`,{capabilities:Le(e)},{timeoutMs:Be(this.sessionCreateTimeoutMs,t?.deadline)}));return this.sessionId=n.sessionId,n}async deleteSession(){let e=this.requireSessionId();await this.requestValue(`DELETE`,`/session/${e}`),this.sessionId=void 0}async installApp(e,t){await this.sessionRequest(`POST`,`/appium/device/install_app`,{appPath:e},{signal:t})}async activateApp(e){await this.appRouteWithSibling(`/appium/device/activate_app`,`mobile: activateApp`,e)}async terminateApp(e){await this.appRouteWithSibling(`/appium/device/terminate_app`,`mobile: terminateApp`,e)}async appRouteWithSibling(e,t,n){try{await this.sessionRequest(`POST`,e,{appId:n})}catch(r){if(!H(r))throw r;let{status:i}=await this.transport.request(`POST`,`/session/${this.requireSessionId()}/execute/sync`,{script:t,args:[{appId:n,bundleId:n}]});V(`webdriver_route_fallback`,{from:e,to:t,status:i})}}async performActions(e){await this.sessionRequest(`POST`,`/actions`,{actions:e})}async releaseActions(){await this.sessionRequest(`DELETE`,`/actions`)}async sendKeys(e){await this.sessionRequest(`POST`,`/keys`,{value:Array.from(e)})}async hideKeyboard(){await this.sessionRequest(`POST`,`/appium/device/hide_keyboard`)}async isKeyboardShown(e){let t;try{t=await this.sessionRequest(`GET`,`/appium/device/is_keyboard_shown`,void 0,{retryAttempts:0,...e===void 0?{}:{timeoutMs:e}})}catch(e){if(H(e))return`unsupported`;throw e}return typeof t==`boolean`?t:`unsupported`}async activeElement(e){let t=e===void 0?void 0:Date.now()+e,n;try{n=ze(await this.sessionRequest(`GET`,`/element/active`,void 0,G(t)))}catch(e){if(H(e))return`unsupported`;if(q(e))return`none`;throw e}if(n===void 0)return`unsupported`;try{let e=await this.sessionRequest(`GET`,`/element/${encodeURIComponent(n)}/rect`,void 0,G(t));return{id:n,rect:U(e)}}catch(e){if(H(e))return`unsupported`;if(q(e))return`none`;throw e}}async back(){await this.sessionRequest(`POST`,`/back`)}async setRotation(e){await this.sessionRequest(`POST`,`/rotation`,{x:0,y:0,z:e})}async setOrientation(e){await this.sessionRequest(`POST`,`/orientation`,{orientation:e})}async source(e){let n=await this.sessionRequest(`GET`,`/source`,void 0,e);if(typeof n!=`string`)throw new t(`COMMAND_FAILED`,`WebDriver source response was not a string`,{valueType:typeof n});return n}async screenshot(e){let n=await this.sessionRequest(`GET`,`/screenshot`);if(typeof n!=`string`)throw new t(`COMMAND_FAILED`,`WebDriver screenshot response was not base64 text`,{valueType:typeof n});await ne.writeFile(e,Buffer.from(n,`base64`))}async windowRect(){return U(await this.sessionRequest(`GET`,`/window/rect`))}async executeScript(e,t=[]){return await this.sessionRequest(`POST`,`/execute/sync`,{script:e,args:t})}async executeReadScript(e,t=[]){return await this.sessionRequest(`POST`,`/execute/sync`,{script:e,args:t},{idempotent:!0})}async sessionRequest(e,t,n,r){let i=this.requireSessionId();return await this.requestValue(e,`/session/${i}${t}`,n,r)}requireSessionId(){if(!this.sessionId)throw new t(`SESSION_NOT_FOUND`,`WebDriver session has not been created yet.`);return this.sessionId}async requestValue(e,t,n,r){return await this.transport.requestValue(e,t,n,r)}};function U(e){if(!e||typeof e!=`object`)throw new t(`COMMAND_FAILED`,`WebDriver window rect response was empty.`);let n=e,r={x:W(n,`x`),y:W(n,`y`),width:W(n,`width`),height:W(n,`height`)};if(r.x===void 0||r.y===void 0||r.width===void 0||r.height===void 0)throw new t(`COMMAND_FAILED`,`WebDriver window rect response was invalid.`,{response:n});return r}function W(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}function Le(e){return`alwaysMatch`in e||`firstMatch`in e?e:{alwaysMatch:e}}function Re(e){if(!e||typeof e!=`object`)throw new t(`COMMAND_FAILED`,`WebDriver create-session response was empty.`);let n=e,r=typeof n.sessionId==`string`?n.sessionId:typeof n.session_id==`string`?n.session_id:void 0;if(!r)throw new t(`COMMAND_FAILED`,`WebDriver create-session response missed sessionId.`,{response:n});return{sessionId:r,capabilities:n.capabilities&&typeof n.capabilities==`object`?n.capabilities:{}}}function ze(e){if(!e||typeof e!=`object`)return;let t=e,n=t[`element-6066-11e4-a52e-4f735466cecf`]??t.ELEMENT;return typeof n==`string`&&n.length>0?n:void 0}function G(e){return e===void 0?{retryAttempts:0}:{retryAttempts:0,timeoutMs:K(e)}}function Be(e,t){return t===void 0?e:Math.min(e,K(t))}function K(e){return Math.max(0,e-Date.now())}function q(e){return e instanceof t&&Ve(e).toLowerCase()===`no such element`}function Ve(e){let t=e.details?.response,n=t&&typeof t==`object`?t.value:void 0,r=n&&typeof n==`object`?n.error:void 0;return typeof r==`string`?r:``}function J(e,t){return{type:`pointer`,id:e,parameters:{pointerType:`touch`},actions:t}}async function He(e){return Y(p(e,`android`).nodes)}function Ue(e){return Y(p(e).nodes)}function Y(e){let t=e.flatMap(e=>We(e)&&Ge(e.rect)?[e.rect]:[]).sort((e,t)=>t.width*t.height-e.width*e.height)[0];return t?{x:t.x,y:t.y,width:t.width,height:t.height}:void 0}function We(e){let t=e.type?.toLowerCase()??``;return e.visibleToUser!==!1&&(t.includes(`scrollview`)||t.includes(`listview`)||t.includes(`recyclerview`))}function Ge(e){return!!e&&e.width>=50&&e.height>=50}async function Ke(e,n,r){let i=[];for(let t of n===`android`?[`rotation`,`orientation`]:[`orientation`,`rotation`])try{await qe(e,t,r);return}catch(e){if(!H(e))throw e;i.push({transport:t,error:e instanceof Error?e.message:String(e)})}throw new t(`COMMAND_FAILED`,`Could not set device orientation to ${r} on the hosted WebDriver session.`,{...z(),hint:`The provider driver rejected both orientation endpoints. Set the orientation as a session capability instead, for example connect --provider-device-orientation portrait.`,rotation:r,attempts:i})}async function qe(e,t,n){if(t===`rotation`){await e.setRotation(r(n));return}await e.setOrientation(i(n))}const X=1500;function Je(e){return new Promise(t=>setTimeout(t,e))}function Z(e,n,r){return new t(`COMMAND_FAILED`,`fill tapped (${e}, ${n}) but ${r}`,{reason:`text_entry_focus_not_observed`,x:e,y:n,hint:`The tap most likely missed the field. Re-check the target with snapshot -i and fill the element it reports, rather than retrying the same coordinates.`})}function Ye(e,n){return new t(`COMMAND_FAILED`,`fill tapped (${e}, ${n}) but this driver reports neither the focused element nor keyboard state, so the text was not sent`,{reason:`text_entry_focus_unobservable`,x:e,y:n,hint:`This provider cannot confirm a field took focus. Use press <target> followed by type <text> to enter it anyway, accepting that nothing witnesses which field receives the keys.`})}function Xe(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function Ze(e){return new Qe(e.client,e.backend,e.capabilities,e.targetId)}var Qe=class{client;backend;capabilities;targetId;constructor(e,t,n,r){this.client=e,this.backend=t,this.capabilities=n,this.targetId=r}async open(e,t){if(t?.url){await this.client.executeScript(`mobile: deepLink`,[{url:t.url,package:e}]);return}let n=t?.appBundleId??e;n&&await this.client.activateApp(n)}async openDevice(){await this.client.executeScript(`mobile: activateApp`,[{}])}async close(e){e&&await this.client.terminateApp(e)}async tap(e,t){return this.requireSupport(`tap`),await this.pointerGesture(`tap`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x:e,y:t}}async doubleTap(e,t){return this.requireSupport(`doubleTap`),await this.pointerGesture(`doubleTap`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pointerUp`,button:0},{type:`pause`,duration:80},{type:`pointerDown`,button:0},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x:e,y:t}}async swipe(e,t,n,r,i=400){return this.requireSupport(`swipe`),await this.pointerGesture(`swipe`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pointerMove`,duration:i,x:n,y:r},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x1:e,y1:t,x2:n,y2:r,durationMs:i}}async longPress(e,t,n=600){return this.requireSupport(`longPress`),await this.pointerGesture(`longPress`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pause`,duration:n},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x:e,y:t,durationMs:n}}async focus(e,t){return await this.tap(e,t)}async type(e){this.requireSupport(`type`),await this.client.sendKeys(e)}async fill(e,n,r,i){if(this.requireSupport(`fill`),r.length===0)throw new t(`UNSUPPORTED_OPERATION`,`fill with empty text (clear field) is not supported on the webdriver backend`,{hint:`Use a visible clear/reset control in the app, or fill the field with the intended replacement text directly.`});let a=await this.readTextEntryState();await this.tap(e,n);let o=await this.awaitTextEntryReadiness(a,e,n);return await this.type(r),{backend:`webdriver`,x:e,y:n,text:r,textEntryReadiness:o}}async scroll(e,t){this.requireSupport(`scroll`);let n=t?.durationMs??350;await this.client.hideKeyboard().catch(()=>void 0);let r=await this.scrollGestureFrame(),i=a({direction:e,amount:t?.amount,pixels:t?.pixels,referenceWidth:r.width,referenceHeight:r.height}),o={...i,x1:i.x1+r.x,y1:i.y1+r.y,x2:i.x2+r.x,y2:i.y2+r.y};return await this.swipe(o.x1,o.y1,o.x2,o.y2,n),{backend:`webdriver`,...o,distance:i.pixels,durationMs:n}}async gestureViewport(){return await this.scrollGestureFrame()}async performGesture(e){return this.requireSupport($e(e)),await this.client.performActions(e.pointers.map(e=>J(`gesture-pointer-${e.pointerId}`,Q(e.samples)))),await this.client.releaseActions().catch(()=>void 0),{backend:`webdriver-w3c-actions`}}async screenshot(e,t){this.requireSupport(`screenshot`),await this.client.screenshot(e)}async snapshot(e){return this.requireSupport(`snapshot`),await this.captureSource(e?.signal)}async captureSource(e){let t=await this.readSource(e);if(this.backend===`xctest`){let{acquireWebDriverIosSnapshot:e}=await import(`./webdriver-ios-snapshot.js`);return e(t,this.targetId)}let{parseWebDriverSourceFacts:n}=await import(`./webdriver-source.js`).then(e=>e.n);return{backend:`android`,producer:`appium-source`,nodes:n(t,`android`).nodes}}async readSource(e){try{return await this.client.source(e===void 0?{}:{signal:e})}catch(e){throw M(e)?et(e):e}}async back(e){this.requireSupport(`back`),await this.client.back()}async home(){this.requireSupport(`home`),await this.client.executeScript(`mobile: pressButton`,[{name:`home`}])}async setOrientation(e){this.requireSupport(`orientation`),await Ke(this.client,this.backend,e)}async appSwitcher(){this.requireSupport(`appSwitcher`),await this.client.executeScript(`mobile: pressButton`,[{name:`appSwitch`}])}async tvRemote(e,t){this.unsupported(`tvRemote`)}async keyboardStatus(){return this.requireSupport(`keyboard`),{kind:`ime-probe`,visible:await this.keyboardVisible()}}async keyboardDismiss(){this.requireSupport(`keyboard`);let e=await this.keyboardVisibility();if(e===!1)return this.dismissResult({wasVisible:e,visible:!1,dismissed:!1});await this.client.hideKeyboard();let t=await this.keyboardVisibilityAfterMutation();return this.dismissResult({...e===void 0?{}:{wasVisible:e},...t===void 0?{}:{visible:t,dismissed:e===!0&&!t}})}dismissResult(e){return this.backend===`android`?{kind:`ime-probe`,...e}:{kind:`mechanism`,mechanism:`appium-hide-keyboard`,...e}}async keyboardEnter(){if(this.requireSupport(`keyboard`),this.backend===`android`)return await this.client.executeScript(`mobile: pressKey`,[{keycode:66}]),{kind:`android-acknowledged`};let e=await this.keyboardVisibility();await this.client.sendKeys(`
2
+ `);let t=await this.keyboardVisibilityAfterMutation();return{kind:`visibility-echo`,...e===void 0?{}:{wasVisible:e},...t===void 0?{}:{visible:t}}}async keyboardVisibilityAfterMutation(){try{return await this.keyboardVisibility()}catch{return}}async keyboardVisibility(){let e=await this.client.isKeyboardShown(X);return e===`unsupported`?void 0:e}async keyboardVisible(){let e=await this.keyboardVisibility();if(e===void 0)throw new t(`UNSUPPORTED_OPERATION`,`This driver does not implement the keyboard visibility route.`,{provider:this.capabilities.provider,platform:this.capabilities.platform,operation:`keyboard`});return e}async readClipboard(){this.requireSupport(`clipboard.read`);let e=await this.client.executeReadScript(`mobile: getClipboard`,[{}]);return typeof e==`string`?e:``}async writeClipboard(e){this.requireSupport(`clipboard.write`),await this.client.executeScript(`mobile: setClipboard`,[{content:e}])}async setSetting(e,t,n,r){this.unsupported(`settings`)}async awaitTextEntryReadiness(e,t,n){let r=e.keyboard,i=Date.now()+2e3,a=e.focusedElementId,o=await this.pollWithinBudget(i,async e=>{let r=await this.client.activeElement(e);return r===`unsupported`?`abandon`:r===`none`?`retry`:r.id!==a||Xe(r.rect,t,n)?`satisfied`:`retry`});if(o===`satisfied`)return`focused-element`;if(o===`expired`)throw Z(t,n,`nothing there took text-entry focus, so the text was not sent`);if(r===`unsupported`)throw Ye(t,n);if(r)throw Z(t,n,`the keyboard was already up and this driver cannot report which field holds focus, so the text was not sent`);if(await this.pollWithinBudget(i,async e=>await this.client.isKeyboardShown(e)===!0?`satisfied`:`retry`)===`satisfied`)return`keyboard-shown`;throw Z(t,n,`no keyboard appeared, so the text was not sent`)}async readTextEntryState(){let[e,t]=await Promise.all([this.client.isKeyboardShown(X),this.client.activeElement(X)]);return{keyboard:e,focusedElementId:t===`none`||t===`unsupported`?void 0:t.id}}async pollWithinBudget(e,t){let n=!1,r;for(;;){let i=e-Date.now();if(i<=0)break;try{let e=await t(Math.min(X,i));if(n=!0,e!==`retry`)return e}catch(e){r=e}let a=e-Date.now();if(a<=0)break;await Je(Math.min(100,a))}if(!n&&r!==void 0)throw r;return`expired`}async pointerGesture(e,t){await this.client.performActions([J(e,t)]),await this.client.releaseActions().catch(()=>void 0)}async scrollGestureFrame(){return await this.client.source().then(e=>this.backend===`xctest`?Ue(e):He(e)).catch(()=>void 0)||await this.client.windowRect()}requireSupport(e){l(this.capabilities,e)||this.unsupported(e)}unsupported(e){throw new t(`UNSUPPORTED_OPERATION`,ee(this.capabilities,e),{provider:this.capabilities.provider,platform:this.capabilities.platform,operation:e})}};function Q(e){let n=e[0];if(!n)throw new t(`INVALID_ARGS`,`WebDriver gesture pointer requires samples`);let r=[{type:`pointerMove`,duration:0,x:n.point.x,y:n.point.y},{type:`pointerDown`,button:0}];for(let t=1;t<e.length;t+=1){let n=e[t-1],i=e[t];r.push({type:`pointerMove`,duration:i.offsetMs-n.offsetMs,x:i.point.x,y:i.point.y})}return r.push({type:`pointerUp`,button:0}),r}function $e(e){if(e.topology===`single`)return`swipe`;switch(e.intent){case`pan`:case`transform`:return`transformGesture`;case`pinch`:return`pinch`;case`rotate`:return`rotateGesture`}}function et(e){return new t(`COMMAND_FAILED`,`The cloud driver did not finish reading the screen in its budget.`,{...e.details,hint:`A screen that never goes idle (looping video, live ticker, continuous animation) gives the driver no moment to read the UI tree. This read has the transport's own budget and does not grow with --timeout; take a screenshot, or drive the screen from refs an earlier snapshot already captured.`},e)}var tt=class{sessionsByLeaseId=new Map;ownedDeviceIds=new Set;releasedProviderSessionIdsByLeaseId=new Map;options;constructor(e){this.options=e}ownsDevice(e){return this.ownedDeviceIds.has(e.id)}findSessionForDevice(e){return[...this.sessionsByLeaseId.values()].find(t=>t.device.id===e.id)}findSessionForLease(e){return this.sessionsByLeaseId.get(e)}getInteractor(e){return this.findSessionForDevice(e)?.interactor}heartbeat(e){if(e.leaseProvider===this.options.provider&&this.sessionsByLeaseId.has(e.leaseId))return{provider:this.options.provider}}async allocate(e,t){if(e.leaseProvider!==this.options.provider)return;let{rejectRefusedProviderProfileFields:n}=await import(`./provider-profile-fields.js`).then(e=>e.t);if(n(t?.flags,this.options.profileFields),this.sessionsByLeaseId.has(e.leaseId))return this.heartbeat(e);let r=await this.prepareSession(e,t),i=new Ie({clientVersion:this.options.clientVersion,endpoint:r.endpoint,auth:r.auth,headers:r.headers,requestPolicy:this.options.requestPolicy}),a=await this.createSessionWithPreparedCleanup(i,r,e,t),o=this.deviceForLease(e,r),s=r.providerSessionId??a.sessionId,c=d({provider:this.options.provider,platform:r.platform,overrides:this.options.capabilityOverrides});return this.sessionsByLeaseId.set(e.leaseId,Object.freeze({lease:e,device:o,client:i,prepared:r,capabilities:c,webDriverSessionId:a.sessionId,providerSessionId:s,interactor:Ze({client:i,backend:f(r.platform),capabilities:c,targetId:o.id})})),this.ownedDeviceIds.add(o.id),{provider:this.options.provider,deviceId:o.id,sessionId:a.sessionId,providerSessionId:s,capabilities:c,...r.providerData}}async release(e){if(e.leaseProvider!==this.options.provider)return;let t=this.sessionsByLeaseId.get(e.leaseId);if(!t)return;this.sessionsByLeaseId.delete(e.leaseId),this.releasedProviderSessionIdsByLeaseId.set(e.leaseId,t.providerSessionId);let n=await this.closeSession(t),r=await this.safeListArtifacts(t);return{provider:this.options.provider,providerSessionId:t.providerSessionId,...n.cleanup,...n.warnings.length>0?{warnings:n.warnings}:{},...r?{cloudArtifacts:r}:{}}}async listCloudArtifacts(e){if(e.provider!==this.options.provider)return;let t=this.sessionsByLeaseId.get(e.leaseId??``);return t?await this.listActiveCloudArtifacts(t,e.providerSessionId):await this.listReleasedCloudArtifacts(e)}async listActiveCloudArtifacts(e,t){if(!(t&&t!==e.providerSessionId))return await this.safeListArtifacts(e)}async listReleasedCloudArtifacts(e){let t=this.releasedProviderSessionIdsByLeaseId.get(e.leaseId??``);if(!(!t||!this.options.listArtifacts)&&!(e.providerSessionId&&e.providerSessionId!==t))return await this.options.listArtifacts({provider:this.options.provider,providerSessionId:t})}async shutdown(){await Promise.allSettled([...this.sessionsByLeaseId.values()].map(async e=>await this.closeSession(e))),this.sessionsByLeaseId.clear(),this.ownedDeviceIds.clear()}async createSessionWithPreparedCleanup(e,t,n,r){try{return await e.createSession(t.webdriverCapabilities,{deadline:r?.deadline})}catch(e){let r=M(e)?nt(e,this.options.provider,n,t):e;throw await S(r,()=>t.cleanup?.()),r}}async prepareSession(e,t){let n=this.baseSessionForLease(e);return this.options.prepareSession?await this.options.prepareSession({lease:e,req:t,base:n}):n}baseSessionForLease(e){let t=typeof this.options.webdriverCapabilities==`function`?this.options.webdriverCapabilities(e):this.options.webdriverCapabilities??{};return{provider:this.options.provider,endpoint:this.options.endpoint,platform:this.options.platform,deviceName:this.options.deviceName,auth:this.options.auth,headers:this.options.headers,webdriverCapabilities:u(this.options.platform,this.options.deviceName,t)}}deviceForLease(e,t){return{...o(t.platform),...t.platform===`ios`?{appleOs:`ios`}:{},id:t.deviceId??this.options.deviceId?.(e)??`${this.options.provider}:${t.platform}:${e.leaseId}`,name:t.deviceName,kind:`device`,target:`mobile`,booted:!0}}async closeSession(e){let t=[],r;try{await e.client.deleteSession()}catch(e){t.push({code:`WEBDRIVER_SESSION_DELETE_FAILED`,message:n(e)})}try{r=await e.prepared.cleanup?.()}catch(e){t.push({code:`PROVIDER_CLEANUP_FAILED`,message:n(e)})}return{cleanup:r,warnings:t}}async safeListArtifacts(e){let t=e.prepared.listArtifacts??this.options.listArtifacts;if(t)try{return await t({provider:this.options.provider,lease:e.lease,device:e.device,webDriverSessionId:e.webDriverSessionId,providerSessionId:e.providerSessionId})}catch(t){return y({provider:this.options.provider,providerSessionId:e.providerSessionId,error:t})}}};function nt(e,n,r,i){let a=e.details?.timeoutMs;return new t(`COMMAND_FAILED`,`${n} did not create the WebDriver session within ${String(a)}ms.`,{reason:`provider_session_create_timeout`,provider:n,leaseId:r.leaseId,runId:r.runId,timeoutMs:a,...i.providerSessionId?{providerSessionId:i.providerSessionId}:{},hint:`${n} may still finish creating the session after agent-device stopped waiting, and that session would keep billing until the provider reaps it. Before retrying, check ${n} for a running session created for lease ${r.leaseId} (run ${r.runId}) and stop it.`},e)}var rt=e({createCloudWebDriverRuntime:()=>$});function $(e){return new it(e)}var it=class{provider;owner;leaseLifecycle;cloudArtifacts;deviceInventoryProvider;capabilities;platformRuntimeModule;sessions;deployment;constructor(e){this.provider=e.provider,this.owner=s(e.provider,e.platform),this.capabilities=d({provider:e.provider,platform:e.platform,overrides:e.capabilityOverrides}),this.sessions=new tt(e),this.deployment=te({provider:e.provider,uploadApp:e.uploadApp,findSessionForDevice:e=>this.sessions.findSessionForDevice(e)}),this.platformRuntimeModule=Object.freeze({owner:this.owner,loadRuntime:async e=>await this.loadRuntime(e)}),this.leaseLifecycle={allocate:async(e,t)=>await this.sessions.allocate(e,t),heartbeat:async e=>this.sessions.heartbeat(e),release:async e=>await this.sessions.release(e)},this.cloudArtifacts={listCloudArtifacts:async e=>await this.sessions.listCloudArtifacts(e)},this.deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider)return null;if(!e.leaseId)return[];let t=this.sessions.findSessionForLease(e.leaseId);return t?[t.device]:[]}}async loadRuntime(e){let{createWebDriverPlatformRuntimeOwner:t}=await import(`./platform-runtime2.js`);return t({host:e,owner:this.owner,ownsDevice:e=>this.ownsDevice(e),isSessionActive:e=>this.sessions.findSessionForDevice(e)!==void 0,deployment:this.deployment,capabilities:this.capabilities,snapshotAvailable:this.capabilities.operations.snapshot.support!==`unsupported`,screenshotAvailable:this.capabilities.operations.screenshot.support!==`unsupported`,getInteractor:e=>this.getInteractor(e)})}ownsDevice(e){return this.sessions.ownsDevice(e)}getInteractor(e){return this.sessions.getInteractor(e)}async installApp(e,t,n,r){return await this.deployment.installApp(e,t,n,r)}async installInstallablePath(e,t,n){return await this.deployment.installInstallablePath(e,t,n)}async shutdown(){await this.sessions.shutdown()}};export{b as S,_e as _,ue as a,me as b,le as c,k as d,O as f,ge as g,he as h,oe as i,E as l,ve as m,rt as n,pe as o,D as p,ce as r,fe as s,$ as t,S as u,de as v,v as x,A as y};
@@ -1 +1,2 @@
1
- import{P as e}from"./sdk-contracts.js";import{Xt as t,nn as n,rn as r,tn as i}from"./sdk-batch.js";import{n as a,t as o}from"./application-lifecycle-runtime.js";import{A as s,B as c,C as l,D as u,G as d,H as f,I as p,J as m,K as h,L as g,N as _,O as ee,V as te,d as ne,h as re,j as ie,n as v,o as y,s as b,v as x,w as S,x as C,z as w}from"./alert-runtime.js";import{n as T}from"./audio-probe-runtime.js";import{n as E}from"./perf-runtime.js";import{i as D,t as O}from"./touch-runtime.js";import{i as k}from"./gesture-admission.js";import{r as A}from"./application-lifecycle-interaction.js";import{n as j,r as M,t as N}from"./screen-recording-transport.js";async function P(e){let{host:t,device:n,owner:r,signal:i}=e,a=await t.screenRecording.web.resolve(n);return a?{available:!0,operations:{screenRecordingStart:async e=>(F(e),await N({host:t,device:n,owner:r,input:e,signal:i,transport:{backend:`agent-browser`,targetLabel:`web recording`,start:async t=>await a.start(e.outputPath,t),stop:async()=>await a.stop()},support:{scopes:[`app`],fps:!1,exportQuality:!1,hideTouches:!1},unsupported:e=>`web recordings do not support ${e.join(`, `)}; agent-browser records WebM directly`})),screenRecordingReattach:async()=>M(`Web recordings cannot be reattached after daemon restart.`),screenRecordingCleanup:async()=>j(`Web recordings cannot be cleaned after daemon restart.`)}}:{available:!1,operations:{}}}function F(t){if(t.recordOnlySession)throw new e(`INVALID_ARGS`,`record on web requires an active browser session; run open <url> --platform web first`);if(!t.outputPath.toLowerCase().endsWith(`.webm`))throw new e(`INVALID_ARGS`,`web recordings require a .webm output path; agent-browser records WebM directly`)}const I=t(`web`),L=Object.freeze({available:!0}),ae=n(`unsupported-platform-leaf`,`Web targets read element text from the captured tree only.`),R=n(`unsupported-platform-leaf`),z=n(`owner-capability-missing`,`record is not supported by this web provider`),B=n(`unsupported-platform-leaf`,`Re-run without --actions, or target an iOS simulator.`),V=n(`unsupported-platform-leaf`),H=n(`unsupported-platform-leaf`,`apps is not supported on web targets.`),U=n(`unsupported-platform-leaf`),W=n(`unsupported-platform-leaf`),G=n(`unsupported-platform-leaf`,`Apple runner preparation is supported only for Apple targets.`),K=n(`owner-capability-missing`),q=n(`unsupported-platform-leaf`,`A web click is one immediate pointer press; the browser backend has no timed hold.`),J=n(`unsupported-platform-leaf`,`audio on web sessions is the stateless page probe; host capture is a macOS-host operation.`);function Y(e,t){return typeof e==`function`?t:K}function X(e,t){return e?L:t}const oe=n(`unsupported-platform-leaf`),se=n(`unsupported-platform-leaf`,k),Z=n(`unsupported-device-kind`,`open is supported only for web browser devices.`),ce=n(`unsupported-device-kind`,`close is supported only for web browser devices.`),le=n(`unsupported-provider-mode`,`Port reverse is supported only by an owning provider runtime.`);function ue(e){let t=Q(e),n=de(e);return o({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:V,clearRuntimeHints:V,closeApplication:n,finalizeApplicationClose:n,prepareAppleRunner:G,configureProviderPortReverse:le})}function Q(e){return e.kind===`device`?L:Z}function de(e){return e.kind===`device`?L:ce}function fe(t){return Object.freeze({owner:I,ownsDevice:e=>e.platform===`web`,inspectFacts:async e=>{let n=await t.networkTransports.resolve(e),r=await P({host:t,device:e,owner:I,signal:new AbortController().signal}),i=e.kind===`device`?await t.localInteractors.resolve(e,{}):void 0;return $(e,n,r.available,i)},bind:async n=>{if(n.intent.kind===`exact-owner`&&!i(n.intent.owner,I))throw new e(`UNSUPPORTED_OPERATION`,`Web runtime owner identity does not match`);if(n.device.platform!==`web`)throw new e(`UNSUPPORTED_PLATFORM`,`Web runtime owner cannot bind ${n.device.platform}`);let r=await t.networkTransports.resolve(n.device),a=await P({host:t,device:n.device,owner:I,signal:n.scope.signal}),o=n.device.kind===`device`?await t.localInteractors.resolve(n.device,{signal:n.scope.signal}):void 0;return pe(t,n.device,n.scope.signal,r,a,$(n.device,r,a.available,o))},shutdown:async()=>void 0})}function pe(t,n,i,o,s,c){let l=o.dump,u={...l?{networkDump:async e=>{let t=await l({maxEntries:e.maxEntries,include:e.include},i);return Object.freeze({source:`provider`,...t})}}:{},...s.operations,...c.operations.captureSnapshot.available?f({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.captureScreenshot.available?h({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.focusPoint.available?g({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.typeText.available?ee({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...r(c.operations.tapPoint,()=>O({device:n,signal:i,resolveInteractor:t.localInteractors.resolve,facts:c.operations,pause:async e=>await t.clock.sleep(e,i)})),...c.operations.scrollDirection.available?ie({device:n,signal:i,resolveInteractor:t.localInteractors.resolve}):{},...c.operations.setViewport.available?{setViewport:async r=>{i.throwIfAborted();let a=await t.localInteractors.resolve(n,{signal:i});if(!a.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by the bound web interactor`);await a.setViewport(r.width,r.height),i.throwIfAborted()}}:{},...r(c.operations.audioProbeQuery,()=>({audioProbeQuery:async r=>{let i=await t.audioProbe.web.resolve(n);if(i===void 0)throw new e(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);return await i.probe(r)}})),...a(A({owner:`web`,openTargetIdentity:`app-name`,host:t.localInteractors,device:n,signal:i}),c.operations)};return Object.freeze({device:n,owner:I,facts:c,operations:Object.freeze(u),[Symbol.asyncDispose]:async()=>void 0})}function $(e,t,r,i){let a=n(`owner-capability-missing`,`network is not supported by this web provider`),o=X(e.kind===`device`,Z);return Object.freeze({device:{family:`web`,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:t.mode},operations:{appLogInspect:R,appLogDoctor:R,appLogStart:R,appLogReattach:R,appLogCleanup:R,appState:U,networkDump:X(!!t.dump,a),screenRecordingStart:X(r,z),screenRecordingReattach:X(r,z),screenRecordingCleanup:X(r,z),...d({capture:o,customActions:B,withoutActiveApp:o}),...te({findText:Z}),...m({capture:o}),...w({focus:o}),...s({type:o}),...D({unsupported:V,tap:o,tapRef:Y(i?.tapRef,o),longPress:q,hover:Y(i?.hover,o),hoverRef:Y(i?.hoverRef,o),fill:o,fillRef:Y(i?.fillRef,o)}),..._({scroll:o}),...p({unsupported:oe,targetAuthoredDrag:se}),...c({setViewport:o}),...u({readTextAtPoint:ae}),...S({back:W}),...l({orientation:W}),...C({tvRemote:W}),...x({unsupported:W}),...re({unsupported:W}),...T({capture:J,query:L}),...E({frames:W,memorySample:W,memorySnapshot:W,nativeCapture:W,profileReport:W}),...ne({unsupported:W}),setFoldPose:W,...b({triggerAppEvent:W}),...y({setSetting:W,readSetting:W}),...v({read:W,wait:W,accept:W,dismiss:W}),ensureReady:V,bootTarget:V,bootTargetHeadless:V,listApps:H,deployApp:V,materializeAppSource:V,deployMaterializedApp:V,sendPushNotification:V,shutdownTarget:V,...ue(e)}})}export{fe as createWebPlatformRuntime};
1
+ import{L as e,P as t,U as n,q as r}from"./sdk-contracts.js";import{H as i,r as a}from"./tv-remote.js";import{i as o}from"./recording-export-quality.js";import"./command-metadata.js";import{n as s,t as c}from"./app-inventory.js";import{z as l}from"./file.js";import{l as u}from"./exec.js";import"./command.js";import{r as d}from"./version.js";import{i as f}from"./snapshot-chrome.js";import{g as p}from"./selector-pipeline-policy.js";import{i as ee}from"./png-worker-client.js";import{o as m}from"./png-worker-contract.js";import{t as te}from"./png-encode.js";import{r as h}from"./artifact-paths.js";import{t as ne}from"./mp4-duration.js";import{t as re}from"./png-resize.js";import{t as ie}from"./png-size.js";import{a as ae,c as g,i as _,l as v,n as oe,o as se,r as y,s as b,t as ce}from"./runtime-factory.js";import{i as x,n as le,r as ue}from"./screenshot-overlay-draw.js";import{c as de,o as fe,r as pe,s as me}from"./video.js";import S from"node:fs";import he from"node:os";import C from"node:path";function w(e,t){if(e!==void 0)return T(e,t)}function T(e,n){let r=e?.trim();if(!r)throw new t(`INVALID_ARGS`,`${n} must be a non-empty string`);return r}const ge=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(v(e,n),n.filter)}},_e=async(e,n={})=>{if(!e.backend.bootDevice)throw new t(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let r=O(n.target),a=await e.backend.bootDevice(v(e,n),r),o=g(a);return{kind:`deviceBooted`,...r?{target:r}:{},...o?{backendResult:o}:{},...i(`Booted device`)}},ve=async(e,n={})=>{if(!e.backend.shutdownDevice)throw new t(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let r=O(n.target),a=await e.backend.shutdownDevice(v(e,n),r),o=g(a);return{kind:`deviceShutdown`,...r?{target:r}:{},...o?{backendResult:o}:{},...i(`Shutdown device`)}},ye=async(e,t)=>await E(e,t,`install`),be=async(e,t)=>await E(e,t,`reinstall`),xe=async(e,t)=>await E(e,t,`installFromSource`);async function E(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?T(n.app,`app`):void 0;if(r!==`installFromSource`&&!o)throw new t(`INVALID_ARGS`,`admin.${r} requires app`);let s=v(e,n),c=await Se(e,s,n.source);try{let t=await a.call(e.backend,s,{...o?{app:o}:{},source:c.source});return Te(r,o,c.source,t)}finally{await c.cleanup?.()}}async function Se(e,t,n){let r=await Ce(e,D(n));try{return{source:D(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 Ce(e,t){if(t.kind===`url`)return{source:t};let n=await _(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function D(e){if(!e||typeof e!=`object`)throw new t(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:T(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:T(e.id,`source.id`)};if(e.kind===`url`){let t=T(e.url,`source.url`);return we(t),{kind:`url`,url:t}}throw new t(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function we(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 O(e){if(!e)return;let t=w(e.id,`target.id`),n=w(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 Te(e,t,n,r){let a=g(r),o=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,s=k(r,`appName`),c=k(r,`appId`),l=k(r,`bundleId`),u=k(r,`packageName`),d=k(r,`launchTarget`),f=k(r,`installablePath`),p=k(r,`archivePath`);return{kind:o,...t?{app:t}:{},source:n,...c?{appId:c}:{},...s?{appName:s}:{},...l?{bundleId:l}:{},...u?{packageName:u}:{},...d?{launchTarget:d}:{},...f?{installablePath:f}:{},...p?{archivePath:p}:{},...a?{backendResult:a}:{},...i(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${s??d??t??Ee(n)}`)}}function k(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function Ee(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const De=/^[A-Za-z0-9_.:-]{1,64}$/,Oe=async(e,n)=>{if(!e.backend.openApp)throw new t(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let r=Pe(n),a=await e.backend.openApp(j(e,n),r,{launchArgs:n.launchArgs,relaunch:n.relaunch}),o=g(a);return{kind:`appOpened`,target:r,relaunch:n.relaunch===!0,...o?{backendResult:o}:{},...i(`Opened: ${Ie(r)}`)}},ke=async(e,n={})=>{if(!e.backend.closeApp)throw new t(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let r=w(n.app,`app`),a=await e.backend.closeApp(j(e,n),r),o=g(a);return{kind:`appClosed`,...r?{app:r}:{},...o?{backendResult:o}:{},...i(r?`Closed: ${r}`:`Closed app`)}},Ae=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(j(e,n),c(n.filter))}},je=async(e,n)=>{if(!e.backend.getAppState)throw new t(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let r=T(n.app,`app`);return{kind:`appState`,app:r,state:await e.backend.getAppState(j(e,n),r)}},Me=async(e,n)=>{if(!e.backend.pushFile)throw new t(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let r=T(n.app,`app`),a=await Le(e,n.input);try{let t=await e.backend.pushFile(j(e,n),a.backendInput,r),o=g(t);return{kind:`appPushed`,app:r,inputKind:a.inputKind,...o?{backendResult:o}:{},...i(`Pushed to ${r}`)}}finally{await a.cleanup?.()}},Ne=async(e,n)=>{if(!e.backend.triggerAppEvent)throw new t(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let r=Re(n.name);ze(n.payload,`apps.triggerEvent payload for "${r}"`);let a=await e.backend.triggerAppEvent(j(e,n),{name:r,...n.payload?{payload:n.payload}:{}}),o=g(a);return{kind:`appEventTriggered`,name:r,...n.payload?{payload:n.payload}:{},...o?{backendResult:o}:{},...i(`Triggered app event: ${r}`)}};function Pe(e){let n=w(e.app,`app`),r=w(e.appId,`appId`),i=w(e.bundleId,`bundleId`),a=w(e.packageName,`packageName`),o=w(e.url,`url`),s=w(e.activity,`activity`),c={...n?{app:n}:{},...r?{appId:r}:{},...i?{bundleId:i}:{},...a?{packageName:a}:{},...o?{url:o}:{},...s?{activity:s}:{}};if(!Fe(c))throw new t(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return c}function Fe(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function Ie(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function Le(e,n){if(!n||typeof n!=`object`)throw new t(`INVALID_ARGS`,`apps.push requires an input`);if(n.kind===`json`)return A(n.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:n.payload},inputKind:`json`};let r=await _(e,n,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:r.path},inputKind:`file`,...r.cleanup?{cleanup:r.cleanup}:{}}}function Re(e){let n=T(e,`name`);if(!De.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 ze(e,t){e!==void 0&&A(e,t,8192)}function A(e,n,r){if(Be(e,n),Buffer.byteLength(Ve(e,n),`utf8`)>r)throw new t(`INVALID_ARGS`,`${n} exceeds ${r} bytes`)}function Be(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a JSON object`)}function Ve(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 j(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const He={open:Oe,close:ke,list:Ae,state:je,push:Me,triggerEvent:Ne},Ue={devices:ge,boot:_e,shutdown:ve,install:ye,reinstall:be,installFromSource:xe};function We(e){return{...b(He,e),list:(t={})=>He.list(e,{...t,filter:s(t.filter)})}}const Ge=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,Ke=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function qe(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(Ke,()=>(t=!0,`[REDACTED]`)),n=Ye(n,()=>{t=!0}),{value:n,redacted:t}}function Je(e){try{let t=new URL(e),n=Xe(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function Ye(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=Je(e);return n?(n.redacted&&t(),n.value):e}):e}function Xe(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))Ge.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const M=2048,N=4096,P=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function Ze(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=z(e.message,N),r=L(e.metadata);return t||=n.redacted||r.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:n.value??``,...e.source?{source:e.source}:{},...r.value?{metadata:r.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function Qe(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?et(e.url):void 0,i=t===`headers`||t===`all`?F(e.requestHeaders):void 0,a=t===`headers`||t===`all`?F(e.responseHeaders):void 0,o=t===`body`||t===`all`?I(e.requestBody):void 0,s=t===`body`||t===`all`?I(e.responseBody):void 0,c=L(e.metadata);return n||=(r?.redacted??!1)||(i?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...r?{url:r.value}:{},...e.status===void 0?{}:{status:e.status},...e.durationMs===void 0?{}:{durationMs:e.durationMs},...i?.value?{requestHeaders:i.value}:{},...a?.value?{responseHeaders:a.value}:{},...o?.value===void 0?{}:{requestBody:o.value},...s?.value===void 0?{}:{responseBody:s.value},...c.value?{metadata:c.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:n,...e.notes?{notes:e.notes}:{}}}function $e(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=z(e.message,N),r=L(e.metadata);return t||=n.redacted||r.redacted,{name:e.name,...e.value===void 0?{}:{value:e.value},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...n.value===void 0?{}:{message:n.value},...r.value?{metadata:r.value}:{}}}),...e.startedAt?{startedAt:e.startedAt}:{},...e.endedAt?{endedAt:e.endedAt}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function F(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(P.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=z(i,M);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function et(e){return Je(e)??z(e,M)}function I(e){return e===void 0?{redacted:!1}:tt(e)??z(e,M)}function tt(e){try{let t=R(JSON.parse(e),qe);return B(JSON.stringify(t.value),M,t.redacted)}catch{return}}function L(e){return R(e,e=>z(e,M))}function R(e,t){if(e===void 0)return{redacted:!1};if(typeof e==`string`)return t(e);if(!e||typeof e!=`object`)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let r=R(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(P.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=R(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function z(e,t){if(e===void 0)return{redacted:!1};let n=qe(e);return B(n.value,t,n.redacted)}function B(e,t,n){if(e===void 0)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}const nt=async(e,n={})=>{if(!e.backend.readLogs)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return Ze(await e.backend.readLogs(await V(e,n),at(n)))},rt=async(e,n={})=>{if(!e.backend.dumpNetwork)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let r=ot(n);return Qe(await e.backend.dumpNetwork(await V(e,n),r),r.include??`summary`)},it=async(e,n={})=>{if(!e.backend.measurePerf)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return $e(await e.backend.measurePerf(await V(e,n),st(n)))};async function V(e,t){let n=v(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 at(e){return{...H(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:W(e.levels,`levels`)},...e.search===void 0?{}:{search:T(e.search,`search`)},...e.source===void 0?{}:{source:T(e.source,`source`)}}}function ot(e){return{...H(e,25,200,`network limit`),include:ct(e.include)}}function st(e){return{...U(e),...e.sampleMs===void 0?{}:{sampleMs:p(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:W(e.metrics,`metrics`,20)}}}function H(e,t,n,r){return{...U(e),...e.cursor===void 0?{}:{cursor:T(e.cursor,`cursor`)},limit:e.limit===void 0?t:p(e.limit,r,1,n)}}function U(e){return{...e.since===void 0?{}:{since:T(e.since,`since`)},...e.until===void 0?{}:{until:T(e.until,`until`)}}}function ct(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 W(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)=>T(e,`${n}[${t}]`))}const lt={logs:nt,network:rt,perf:it},G=`contact_sheet_frame_extraction_failed`,K=`contact_sheet_no_frames`;function q(e=process.platform){if(e!==`darwin`)throw new t(`UNSUPPORTED_OPERATION`,`Contact sheets can only be built on macOS hosts, which is where the frame decoder runs`,{reason:`contact_sheet_unsupported_host`,hostPlatform:e,hint:`Run this command on the macOS host that recorded the clip, or read the video artifact itself.`})}async function ut(e){if(q(e.hostPlatform??process.platform),e.timesMs.length===0)throw new t(`COMMAND_FAILED`,`Contact sheet sampling requested no frames`,{reason:K,videoPath:e.videoPath});gt(e.signal);let n=await ht(e);gt(e.signal);let r;try{r=await u(n,[`--input`,e.videoPath,`--output-dir`,e.scratchDir,`--times`,e.timesMs.join(`,`),`--max-width`,String(e.maxWidth)],{timeoutMs:9e4,env:fe(),allowFailure:!0,...e.signal===void 0?{}:{signal:e.signal}})}catch(t){X(t,e.videoPath,`Failed to run the frame decoder`)}if(r.exitCode!==0)throw new t(`COMMAND_FAILED`,`Failed to extract frames from the recording: ${mt(r.stderr)||`exit ${r.exitCode}`}`,{reason:G,videoPath:e.videoPath,exitCode:r.exitCode});let i=dt(r.stdout,e.videoPath,e.scratchDir,e.timesMs.length);if(i.frames.length===0)throw new t(`COMMAND_FAILED`,`The recording returned no decodable frames for a contact sheet`,{reason:K,videoPath:e.videoPath,skippedSampleCount:i.skippedSampleCount});return i}function dt(e,t,n,r){let i;try{i=JSON.parse(e)}catch(e){throw Y(t,`invalid manifest: ${String(e)}`)}let a=Z(i).frames;if(!Array.isArray(a))throw Y(t,`manifest has no frames array`);let o=Z(i).skipped;if(a.length>r)throw Y(t,`returned ${a.length} frames for ${r} requested samples`);let s=a.flatMap(e=>{let r=Z(e),i=ft(r.path),a=pt(r.actualTimeMs);if(i===void 0||a===void 0||a<0)throw Y(t,`frame entry is missing a path or presentation time`);let o=C.resolve(n,C.basename(i));return S.existsSync(o)?[{requestedTimeMs:pt(r.requestedTimeMs)??a,actualTimeMs:a,path:o}]:[]});return{frames:s.sort((e,t)=>e.actualTimeMs-t.actualTimeMs),skippedSampleCount:Math.max(Array.isArray(o)?o.length:0,r-s.length)}}function J(e,n,r){return new t(`COMMAND_FAILED`,e,{reason:G,videoPath:n},r)}function Y(e,t){return J(`Frame extraction returned an unreadable manifest: ${t}`,e)}function X(e,i,a){throw r(e)||e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason?e:J(`${a} for ${i}: ${n(e)}`,i,e)}function Z(e){return typeof e==`object`&&e?e:{}}function ft(e){return typeof e==`string`&&e!==``?e:void 0}function pt(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function mt(e){return(e.trim().split(`
2
+ `).pop()??``).trim()}async function ht(e){try{return await me({sourcePath:de(`recording-frames.swift`,d()),extraSourcePaths:[de(`RecordingExportSupport.swift`,d())],cacheName:`recording-frames`,timeoutMs:12e4})}catch(t){X(t,e.videoPath,`Could not build the frame decoder`)}}function gt(t){if(t?.aborted)throw e()}function _t(e,n){if(e===void 0||!Number.isFinite(e)||e<0)throw new t(`COMMAND_FAILED`,`Cannot plan a contact sheet: the video timeline of ${n} could not be read`,{reason:`contact_sheet_duration_unknown`,videoPath:n,hint:`Retry once the recording finished finalizing; a clip whose container is still being written has no readable duration.`});if(e<=250)return{durationMs:e,timesMs:e>0?[0,Math.round(e)]:[0]};let r=Math.min(48,Math.floor(e/250)+1),i=e/(r-1);return{durationMs:e,timesMs:Array.from({length:r},(e,t)=>Math.round(t*i))}}const vt=[360,320,280,240,200,160],yt=[255,255,255,255],bt=[17,24,39,255],Q=ue(2)+8;function xt(e){let{cells:n}=e;if(n.length===0)throw new t(`COMMAND_FAILED`,`Contact sheet has no cells to render`);let r=Ct(n[0].image.height/Math.max(1,n[0].image.width),n.length,e),i=Et(r.width,r.height,bt);return n.forEach((e,t)=>{let n=t%r.columns,a=Math.floor(t/r.columns);St(i,8+n*(r.cellWidth+8),8+a*(Q+r.cellHeight+8),e,r.cellWidth,r.cellHeight)}),{bytes:te(i.data,r.width,r.height,4),width:r.width,height:r.height,cellWidth:r.cellWidth}}function St(e,t,n,r,i,a){le(e,{x:t+4,y:n+4,text:kt(r.timeMs),color:yt,scale:2}),Dt(e,re(Ot(r.image),i,a),t,n+Q)}function Ct(e,n,r){let i=wt(e,n,r.maxPixels);if(i)return i;let a=Tt(e,n,160);throw new t(`COMMAND_FAILED`,`Contact sheet would be ${a.width*a.height} pixels, above the configured maxImagePixels limit of ${r.maxPixels}`,{reason:`contact_sheet_pixel_budget_exceeded`,cellCount:r.cells.length,maxPixels:r.maxPixels,hint:`Shorten the recording or raise the command policy maxImagePixels limit.`})}function wt(e,t,n){for(let r of vt){let i=Tt(e,t,r);if(i.width*i.height<=n)return i}}function Tt(e,t,n){let r=Math.min(4,t),i=Math.ceil(t/r),a=Math.max(1,Math.round(n*e));return{columns:r,cellWidth:n,cellHeight:a,width:16+r*n+(r-1)*8,height:16+i*(Q+a)+(i-1)*8}}function Et(e,t,n){let r=new m.PNG({width:e,height:t});for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1)x(r,t,i,n);return r}function Dt(e,t,n,r){for(let i=0;i<t.height;i+=1)for(let a=0;a<t.width;a+=1){let o=(i*t.width+a)*4;x(e,n+a,r+i,[t.data[o],t.data[o+1],t.data[o+2],t.data[o+3]])}}function Ot(e){let t=new m.PNG({width:e.width,height:e.height});return Buffer.from(e.data.buffer,e.data.byteOffset,e.data.byteLength).copy(t.data),t}function kt(e){let t=Math.floor(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=Math.floor(e%1e3);return`${[n,r,i].map(e=>String(e).padStart(2,`0`)).join(`:`)}.${String(a).padStart(3,`0`)}`}function At(e,t){if(e.width!==t.width||e.height!==t.height)return{status:`dimension_mismatch`};let n=e.width*e.height;if(n===0)return{status:`compared`,changedPixelRatio:0};if(e.data.length!==t.data.length)return{status:`dimension_mismatch`};let r=0;for(let n=0;n+3<e.data.length;n+=4)(e.data[n]!==t.data[n]||e.data[n+1]!==t.data[n+1]||e.data[n+2]!==t.data[n+2])&&(r+=1);return{status:`compared`,changedPixelRatio:r/n}}function jt(e,t=.02,n=24){let r=[],i;for(let n of e){let e=i?Nt(i,n.image):1;e<t||(r.push({timeMs:n.timeMs,changedPixelRatio:e,image:n.image}),i=n.image)}Mt(r,e);let a=r.length>n?Pt(r,n):r;return{cells:a,keptCellCount:r.length,thinned:a.length<r.length}}function Mt(e,t){let n=t.at(-1);if(!n)return;let r=e.at(-1);!r||r.timeMs===n.timeMs||e.push({timeMs:n.timeMs,changedPixelRatio:Nt(r.image,n.image),image:n.image})}function Nt(e,t){let n=At(e,t);return n.status===`compared`?n.changedPixelRatio:1}function Pt(e,t){if(t<=1)return[e.at(-1)];let n=(e.length-1)/(t-1);return Array.from({length:t},(t,r)=>e[Math.round(r*n)])}async function Ft(e){q(e.hostPlatform??process.platform);let n=C.resolve(e.videoPath),r=C.resolve(e.outputPath??h(n));Rt(n,r);let i=await pe(n);if(i!==`mp4`)throw new t(`INVALID_ARGS`,i===`webm`?`Contact sheets need an MP4 recording; ${n} is WebM, whose frames this decoder does not read`:`Contact sheets need an MP4 recording; ${n} is not a readable MP4`,{reason:`contact_sheet_container_unsupported`,videoPath:n,container:i??`unknown`,hint:`Re-record on a backend that exports MP4, or pass the MP4 artifact the recording produced.`});let a=_t(ne(n),n),o=S.mkdtempSync(C.join(he.tmpdir(),`agent-device-contact-sheet-`));try{let t=await ut({videoPath:n,scratchDir:o,timesMs:a.timesMs,maxWidth:360,hostPlatform:e.hostPlatform??process.platform,...e.signal===void 0?{}:{signal:e.signal}}),i=await It(t.frames,e.maxPixels);Lt(e.signal);let s=jt(i,e.changedPixelThreshold??.02),c=xt({cells:s.cells,maxPixels:e.maxPixels});return Ht(r,c.bytes),{path:r,videoPath:n,durationMs:a.durationMs,width:c.width,height:c.height,sampledFrameCount:a.timesMs.length,decodedFrameCount:t.frames.length,skippedSampleCount:t.skippedSampleCount,changedPixelThreshold:e.changedPixelThreshold??.02,cells:s.cells.map(Bt),...Vt(s,t)}}finally{S.rmSync(o,{recursive:!0,force:!0})}}async function It(e,n){let r=[];for(let i of e){let e=await ie(i.path);if(e.width>360)throw new t(`COMMAND_FAILED`,`Frame extraction returned a ${e.width}px-wide frame when the sheet asked for 360px cells`,{reason:G,framePath:i.path,frameWidth:e.width,frameWidthLimit:360});if(e.width*e.height>n)throw new t(`COMMAND_FAILED`,`Frame extraction returned a ${e.width}x${e.height} frame, above the ${n}-pixel budget for the whole sheet`,{reason:G,framePath:i.path,framePixels:e.width*e.height,maxPixels:n});let a=await ee(S.readFileSync(i.path),`recording frame`);r.push({timeMs:i.actualTimeMs,image:a})}return r}function Lt(t){if(t?.aborted)throw e()}function Rt(e,n){if(zt(e,n)??n===e)throw new t(`INVALID_ARGS`,`A contact sheet cannot be written over the recording it describes: ${n}`,{reason:`contact_sheet_output_collides_with_input`,videoPath:e,outputPath:n,hint:`Choose a different --out path, or omit it to write beside the recording.`})}function zt(e,t){let n=$(e),r=$(t);if(n!==void 0&&r!==void 0)return n.dev===r.dev&&n.ino===r.ino}function $(e){try{return S.statSync(e)}catch{return}}function Bt(e){return{timeMs:e.timeMs,changedPixelRatio:e.changedPixelRatio}}function Vt(e,t){let n=[];return t.skippedSampleCount>0&&n.push(`${t.skippedSampleCount} sample times returned no frame, so the sheet covers less of the recording than it asked for`),e.thinned&&n.push(`${e.keptCellCount} changes were found and 24 cells are printed, so the sheet thins evenly across the recording instead of showing every change`),n.length===0?{}:{warning:n.join(`; `)}}function Ht(e,n){try{S.mkdirSync(C.dirname(e),{recursive:!0}),l({destination:e,contents:n})}catch(n){throw new t(`COMMAND_FAILED`,`Failed to write the contact sheet to ${e}: ${n instanceof Error?n.message:String(n)}`,{reason:`contact_sheet_output_write_failed`,outputPath:e})}}const Ut=async(e,n)=>{if(!n.video)throw new t(`INVALID_ARGS`,`record contact-sheet requires a recording to read`);Gt(n.changedPixelThreshold);let r=await _(e,n.video,{usage:`record contact-sheet`,field:`video`}),i;try{let t=Wt(n,n.video,r.path);i=await y(e,t,{field:`path`,ext:`.png`,artifactType:`screen-recording-contact-sheet`});let a=await Ft({videoPath:r.path,outputPath:i.path,maxPixels:e.policy.maxImagePixels,...n.changedPixelThreshold===void 0?{}:{changedPixelThreshold:n.changedPixelThreshold},signal:n.signal??e.signal}),o=await i.publish();return{...a,path:Kt(a.path,o),...o?{artifact:o}:{}}}catch(e){throw await i?.cleanup?.(),e}finally{await r.cleanup?.()}};function Wt(e,n,r){if(e.out)return e.out;if(n.kind===`path`)return{kind:`path`,path:C.resolve(h(n.path||r))};throw new t(`INVALID_ARGS`,`record contact-sheet needs an output path when the recording is an uploaded artifact`,{hint:"Pass --out <sheet.png> (CLI) or `out` (Node) to name where the sheet is written."})}function Gt(e){if(e!==void 0&&(!Number.isFinite(e)||e<0||e>1))throw new t(`INVALID_ARGS`,`record contact-sheet needs a changedPixelThreshold between 0 and 1, got ${e}`,{reason:`contact_sheet_threshold_invalid`,changedPixelThreshold:e,hint:`Omit it to use the calibrated default, or pass a share of the frame between 0 and 1.`})}function Kt(e,t){return t?t.kind===`localPath`?t.path:t.clientPath??e:e}const qt=async(e,n)=>{let r=Qt(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 y(e,n.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let t=Yt(n,a?.path);return $t(r,await i.call(e.backend,v(e,n),t),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}},Jt=async(e,n)=>{let r=Qt(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 y(e,n.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let t=a?.path?{outPath:a.path}:{};return en(r,await i.call(e.backend,v(e,n),t),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}};function Yt(e,t){let n={};t&&(n.outPath=t);let r=Xt(e.fps);r!==void 0&&(n.fps=r);let i=Zt(e.quality);return i!==void 0&&(n.quality=i),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function Xt(e){return e===void 0?void 0:p(e,`fps`,1,60)}function Zt(e){if(e===void 0)return;let n=o(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 Qt(e,n){if(e===`start`||e===`stop`)return e;throw new t(`INVALID_ARGS`,`${n} action must be start or stop`)}function $t(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}:{},...tn(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function en(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...tn(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function tn(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...i(e===`start`?r.startMessage:r.stopMessage)}}const nn={record:qt,trace:Jt,contactSheet:Ut},rn=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 a=await e.backend.pressBack(v(e,n),{mode:r}),o=g(a);return{kind:`systemBack`,mode:r,...o?{backendResult:o}:{},...i(`Back`)}},an=async(e,n={})=>{if(!e.backend.pressHome)throw new t(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let r=await e.backend.pressHome(v(e,n)),a=g(r);return{kind:`systemHome`,...a?{backendResult:a}:{},...i(`Home`)}},on=async(e,n)=>{if(!e.backend.pressTvRemote)throw new t(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let r=a(n.button),o=n.durationMs===void 0?void 0:p(n.durationMs,`durationMs`,0,1e4),s=await e.backend.pressTvRemote(v(e,n),{button:r,...o===void 0?{}:{durationMs:o}}),c=g(s);return{kind:`tvRemotePressed`,button:r,...o===void 0?{}:{durationMs:o},...c?{backendResult:c}:{},...i(`Pressed TV remote ${r}`)}},sn=async(e,n)=>{if(!e.backend.setOrientation)throw new t(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let r=pn(n.orientation),a=await e.backend.setOrientation(v(e,n),r),o=g(a);return{kind:`systemOrientationSet`,orientation:r,...o?{backendResult:o}:{},...i(`Rotated to ${r}`)}},cn=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(!f(r))throw new t(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let i=await e.backend.setKeyboard(v(e,n),{action:r}),a=g(i),o=Sn(i)?i:{};return r===`enter`||r===`return`?hn(o,a):r===`dismiss`?gn(r,o,a):vn(r,o,a)},ln=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(v(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=await e.backend.setClipboard(v(e,n),n.text),a=g(r);return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(n.text).length,...a?{backendResult:a}:{},...i(`Clipboard updated`)}},un=async(e,n={})=>{if(!e.backend.openSettings)throw new t(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let r=w(n.target,`target`),a=await e.backend.openSettings(v(e,n),r),o=g(a);return{kind:`settingsOpened`,...r?{target:r}:{},...o?{backendResult:o}:{},...i(r?`Opened settings: ${r}`:`Opened settings`)}},dn=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:p(n.timeoutMs,`timeoutMs`,0,12e4);return mn(r,await e.backend.handleAlert(v(e,n),r,{timeoutMs:i}))},fn=async(e,n={})=>{if(!e.backend.openAppSwitcher)throw new t(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let r=await e.backend.openAppSwitcher(v(e,n)),a=g(r);return{kind:`appSwitcherOpened`,...a?{backendResult:a}:{},...i(`Opened app switcher`)}};function pn(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 mn(e,t){return e===`get`?yn(t):e===`wait`?bn(t):xn(e,t)}function hn(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...i(`Keyboard enter pressed`)}}function gn(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...i(_n(t))}}function _n(e){return e.dismissed===!1?`Keyboard already hidden`:e.mechanism===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`}function vn(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function yn(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 bn(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},...i(e.alert?`Alert visible`:`Alert wait timed out`)}}function xn(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}:{},...i(n.handled?`Alert ${e}ed`:`No alert handled`)}}function Sn(e){return!!(e&&typeof e==`object`)}const Cn={back:rn,home:an,orientation:sn,keyboard:cn,clipboard:ln,settings:un,alert:dn,appSwitcher:fn,tvRemote:on};function wn(e){return{capture:oe(e),selectors:se(e),interactions:ae(e),system:b(Cn,e),apps:We(e),admin:b(Ue,e),recording:b(nn,e),observability:b(lt,e)}}function Tn(e){let t=ce(e);return{...t,...wn(t)}}export{Tn as createAgentDevice};