agent-device 0.21.12 → 0.21.14

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 (317) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.12.apk → agent-device-android-ime-helper-0.21.14.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.14.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.12.manifest.json → agent-device-android-ime-helper-0.21.14.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.12.manifest.json → agent-device-android-snapshot-helper-0.21.14.manifest.json} +6 -6
  7. package/apple/macos-helper/Package.swift +4 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +3 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/ScreenshotResponseTests.swift +15 -0
  10. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +47 -1
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +122 -42
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/Info.plist +23 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +17 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAppScreenCapture.swift +21 -13
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerScrollViewportPolicy.swift +1 -162
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -9
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -56
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +0 -48
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +0 -50
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +33 -586
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +40 -24
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +2 -3
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +0 -36
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +630 -0
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +34 -2256
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -338
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -12
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+GestureExecution.swift +160 -0
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -24
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +0 -142
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +90 -39
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+MainThreadWork.swift +78 -106
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +23 -2
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +162 -113
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +0 -209
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +86 -10
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollDragExecution.swift +271 -0
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +1 -200
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +20 -227
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +78 -295
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotAcquisition.swift +40 -27
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +0 -78
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +85 -581
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +106 -0
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +142 -0
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +49 -78
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +0 -44
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +73 -114
  49. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +1 -12
  50. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +11 -94
  51. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +2 -10
  52. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -1
  53. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +0 -35
  54. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +0 -31
  55. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +2 -18
  56. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +34 -52
  57. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -22
  58. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +135 -0
  59. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +22 -6
  60. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +140 -20
  61. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +16 -19
  62. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +21 -9
  63. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +59 -10
  64. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +12 -10
  65. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +13 -8
  66. package/dist/src/absence-observation-errors.js +1 -1
  67. package/dist/src/adapter.js +1 -1
  68. package/dist/src/adb-executor.js +1 -1
  69. package/dist/src/adb-failure.js +1 -1
  70. package/dist/src/adb-transport.js +1 -1
  71. package/dist/src/agent-browser-provider.js +1 -1
  72. package/dist/src/agent-browser-tool.js +1 -1
  73. package/dist/src/agent-device-client.js +2 -2
  74. package/dist/src/ai-sdk.js +1 -1
  75. package/dist/src/alert-runtime.js +1 -1
  76. package/dist/src/android-adb.d.ts +1 -1
  77. package/dist/src/app-catalog.js +1 -1
  78. package/dist/src/app-deployment-resolution.js +1 -1
  79. package/dist/src/app-inventory.js +1 -1
  80. package/dist/src/app-launch.js +2 -2
  81. package/dist/src/app-lifecycle.js +1 -1
  82. package/dist/src/app-lifecycle2.js +1 -1
  83. package/dist/src/app-log-files.js +1 -1
  84. package/dist/src/app-log-runtime2.js +3 -3
  85. package/dist/src/app-resolution.js +2 -2
  86. package/dist/src/apple-runner-platform.js +1 -1
  87. package/dist/src/application-lifecycle-interaction.js +1 -1
  88. package/dist/src/archive.js +1 -1
  89. package/dist/src/artifact-download.js +1 -1
  90. package/dist/src/auth-session.js +1 -1
  91. package/dist/src/auth.js +1 -1
  92. package/dist/src/back-mode.js +1 -1
  93. package/dist/src/backend-snapshot-options.js +1 -1
  94. package/dist/src/boot-diagnostics.js +1 -1
  95. package/dist/src/capture-disclosure.js +1 -1
  96. package/dist/src/capture.js +1 -1
  97. package/dist/src/cli-config.js +1 -1
  98. package/dist/src/cli-help.js +8 -7
  99. package/dist/src/cli-runner.js +1 -1
  100. package/dist/src/cli.js +4 -4
  101. package/dist/src/click-button.js +1 -1
  102. package/dist/src/client-metro.js +1 -1
  103. package/dist/src/client-types.d.ts +4 -5
  104. package/dist/src/clipboard-shell-response.js +1 -1
  105. package/dist/src/code-signature.js +1 -1
  106. package/dist/src/command-schema.js +3 -3
  107. package/dist/src/command-tools.js +3 -3
  108. package/dist/src/connection-runtime.js +1 -1
  109. package/dist/src/connection.js +1 -1
  110. package/dist/src/contracts.js +1 -1
  111. package/dist/src/daemon-client-lifecycle.js +1 -1
  112. package/dist/src/daemon-resolution.js +1 -1
  113. package/dist/src/daemon.js +1 -1
  114. package/dist/src/debug-symbols-facade.js +1 -1
  115. package/dist/src/device-claim-rule.js +2 -2
  116. package/dist/src/device-input-state.d.ts +1 -1
  117. package/dist/src/device-inventory-context.js +1 -1
  118. package/dist/src/device-rotation.js +1 -1
  119. package/dist/src/device-selection-resolver.js +1 -1
  120. package/dist/src/device-session.js +1 -1
  121. package/dist/src/device-shell.js +1 -1
  122. package/dist/src/device2.js +1 -1
  123. package/dist/src/devicectl.js +1 -1
  124. package/dist/src/diagnostics.js +1 -1
  125. package/dist/src/dispatch-resolve.js +1 -1
  126. package/dist/src/display-inventory.js +1 -1
  127. package/dist/src/doctor-facade.js +1 -1
  128. package/dist/src/doctor2.js +1 -1
  129. package/dist/src/engine-eval-script.js +1 -1
  130. package/dist/src/error.js +1 -1
  131. package/dist/src/exec.js +1 -1
  132. package/dist/src/file.js +1 -1
  133. package/dist/src/find.js +1 -1
  134. package/dist/src/format.js +1 -1
  135. package/dist/src/gesture-plan-types.d.ts +38 -0
  136. package/dist/src/gesture-plan.js +1 -1
  137. package/dist/src/gesture-runtime.js +1 -1
  138. package/dist/src/harmonyos.js +1 -1
  139. package/dist/src/helper.js +2 -2
  140. package/dist/src/host.js +1 -1
  141. package/dist/src/human-control-contract.js +1 -1
  142. package/dist/src/human-control.js +1 -1
  143. package/dist/src/index.js +1 -1
  144. package/dist/src/input-actions.js +1 -1
  145. package/dist/src/input-actions2.js +1 -1
  146. package/dist/src/install-artifact-facade.js +1 -1
  147. package/dist/src/install-source-network-transport.js +1 -1
  148. package/dist/src/install-source2.js +1 -1
  149. package/dist/src/interaction-positionals.js +1 -1
  150. package/dist/src/interaction-ref-policy.js +1 -1
  151. package/dist/src/interaction2.js +1 -1
  152. package/dist/src/interactor-operation-binding.js +1 -1
  153. package/dist/src/interactor-operation-catalog.js +1 -1
  154. package/dist/src/interactor.js +4 -4
  155. package/dist/src/interactor2.js +1 -1
  156. package/dist/src/interactors.js +1 -1
  157. package/dist/src/internal/bin.js +1 -1
  158. package/dist/src/internal/daemon.js +2 -2
  159. package/dist/src/internal/png-worker.js +1 -1
  160. package/dist/src/internal/run-script-http-child.js +1 -1
  161. package/dist/src/inventory.js +1 -1
  162. package/dist/src/inventory2.js +1 -1
  163. package/dist/src/inventory3.js +1 -1
  164. package/dist/src/inventory5.js +1 -1
  165. package/dist/src/ios-snapshot-acquisition.js +1 -1
  166. package/dist/src/ios-snapshot-runtime.js +1 -1
  167. package/dist/src/lease.js +1 -1
  168. package/dist/src/limrun-download-file.js +1 -1
  169. package/dist/src/limrun-runtime-dependencies.js +1 -1
  170. package/dist/src/limrun.d.ts +435 -4
  171. package/dist/src/linux.js +1 -1
  172. package/dist/src/local-interactor-operation-set.js +1 -1
  173. package/dist/src/location-coordinates.js +1 -1
  174. package/dist/src/managed-device-scope.js +1 -1
  175. package/dist/src/mechanics.js +5 -5
  176. package/dist/src/mobile-snapshot-semantics.js +1 -1
  177. package/dist/src/multitouch-support.js +1 -1
  178. package/dist/src/native-build-cache.js +1 -0
  179. package/dist/src/observation.js +1 -1
  180. package/dist/src/parameterized-recorded-fill.js +1 -1
  181. package/dist/src/perf-facade.js +1 -2
  182. package/dist/src/perf-runtime-operation-builder.js +1 -1
  183. package/dist/src/perf-runtime-plan.js +1 -1
  184. package/dist/src/perf-target.js +2 -0
  185. package/dist/src/perf.js +1 -1
  186. package/dist/src/physical-device-apps.js +1 -0
  187. package/dist/src/physical-device-control.js +1 -1
  188. package/dist/src/platform-request-scope.js +1 -1
  189. package/dist/src/platform-runtime-host.js +1 -1
  190. package/dist/src/platform-runtime-managed-owner.js +1 -1
  191. package/dist/src/platform-runtime-open-target.js +1 -1
  192. package/dist/src/platform-runtime-operation-host.js +2 -2
  193. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  194. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  195. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  196. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  197. package/dist/src/platform-runtime-unavailable.js +1 -1
  198. package/dist/src/platform-runtime.js +1 -1
  199. package/dist/src/platform-runtime2.js +1 -1
  200. package/dist/src/png-crop-bytes.js +1 -1
  201. package/dist/src/png-size.js +1 -1
  202. package/dist/src/png-worker-client.js +1 -1
  203. package/dist/src/png.js +1 -1
  204. package/dist/src/prepare-kind.js +1 -1
  205. package/dist/src/provider-session-ownership.js +1 -1
  206. package/dist/src/provider-webdriver.js +1 -1
  207. package/dist/src/proxy.js +1 -1
  208. package/dist/src/quality-warnings.js +1 -1
  209. package/dist/src/react-native.js +1 -1
  210. package/dist/src/record-runtime.js +1 -1
  211. package/dist/src/recording.js +1 -1
  212. package/dist/src/register-builtins.js +1 -1
  213. package/dist/src/registry.js +35 -35
  214. package/dist/src/remote-config2.js +1 -1
  215. package/dist/src/replay-divergence.js +1 -1
  216. package/dist/src/replay.js +1 -1
  217. package/dist/src/reporting.js +1 -1
  218. package/dist/src/request-admission.js +1 -1
  219. package/dist/src/request-cancel.js +1 -1
  220. package/dist/src/request-runtime-binding.js +1 -1
  221. package/dist/src/retry.js +1 -1
  222. package/dist/src/runner-cache-metadata.js +1 -1
  223. package/dist/src/runner-client.js +1 -1
  224. package/dist/src/runner-dev-tools-security.js +1 -1
  225. package/dist/src/runner-device-readiness.js +1 -1
  226. package/dist/src/runner-disposal.js +1 -1
  227. package/dist/src/runner-error-classification.js +3 -0
  228. package/dist/src/runner-operations-facade.js +1 -1
  229. package/dist/src/runner-presentation.js +1 -1
  230. package/dist/src/runner.js +1 -1
  231. package/dist/src/runtime-transport-hints.js +1 -1
  232. package/dist/src/runtime.js +3 -3
  233. package/dist/src/runtime10.js +2 -2
  234. package/dist/src/runtime2.js +2 -2
  235. package/dist/src/runtime3.js +1 -1
  236. package/dist/src/runtime4.js +4 -4
  237. package/dist/src/runtime5.js +1 -1
  238. package/dist/src/runtime6.js +1 -1
  239. package/dist/src/runtime7.js +1 -1
  240. package/dist/src/runtime8.js +1 -1
  241. package/dist/src/runtime9.js +1 -1
  242. package/dist/src/screen-recording-admission-ledger.js +1 -1
  243. package/dist/src/screen-recording-completion.js +1 -1
  244. package/dist/src/screen-recording-options.js +1 -1
  245. package/dist/src/screen-recording-resource-recovery.js +1 -1
  246. package/dist/src/screen-recording-transport.js +1 -1
  247. package/dist/src/screenshot-density.js +1 -1
  248. package/dist/src/screenshot-image.js +1 -1
  249. package/dist/src/screenshot-runtime.js +1 -1
  250. package/dist/src/screenshot.js +1 -1
  251. package/dist/src/screenshot3.js +1 -1
  252. package/dist/src/script.js +1 -1
  253. package/dist/src/scroll-command.d.ts +377 -0
  254. package/dist/src/scroll-command.js +1 -1
  255. package/dist/src/scroll-gesture.js +1 -1
  256. package/dist/src/sdk-batch-runner.js +2 -2
  257. package/dist/src/sdk-batch.js +2 -2
  258. package/dist/src/sdk-contracts.d.ts +28 -0
  259. package/dist/src/sdk-contracts.js +1 -1
  260. package/dist/src/sdk-device.js +1 -1
  261. package/dist/src/sdk-io.js +1 -1
  262. package/dist/src/sdk-remote-config.js +1 -1
  263. package/dist/src/sdk-selectors.d.ts +23 -726
  264. package/dist/src/selection.js +0 -0
  265. package/dist/src/selector-runtime.js +1 -1
  266. package/dist/src/semantic-index.js +1 -1
  267. package/dist/src/server.js +1 -1
  268. package/dist/src/session-allocation.js +1 -1
  269. package/dist/src/session-observation.js +1 -1
  270. package/dist/src/session-routing.js +1 -1
  271. package/dist/src/session-runtime-admission.js +1 -1
  272. package/dist/src/session-snapshot.js +1 -1
  273. package/dist/src/session-store.js +2 -2
  274. package/dist/src/session2.js +3 -3
  275. package/dist/src/settings.js +1 -1
  276. package/dist/src/simctl-facade.js +1 -1
  277. package/dist/src/simctl.js +1 -1
  278. package/dist/src/simulator-state.js +1 -1
  279. package/dist/src/simulator.js +1 -1
  280. package/dist/src/snapshot-runtime-binding.js +1 -1
  281. package/dist/src/snapshot-runtime.js +1 -1
  282. package/dist/src/snapshot-state.js +1 -1
  283. package/dist/src/snapshot2.js +1 -1
  284. package/dist/src/snapshot3.js +1 -1
  285. package/dist/src/snapshot4.js +1 -1
  286. package/dist/src/src.js +1 -1
  287. package/dist/src/src7.js +1 -1
  288. package/dist/src/src8.js +2 -2
  289. package/dist/src/string-enum.js +1 -1
  290. package/dist/src/takeover.js +1 -1
  291. package/dist/src/text-entry-focus.js +1 -1
  292. package/dist/src/tool-provider-facade.js +1 -1
  293. package/dist/src/tool-provider.js +2 -2
  294. package/dist/src/tool-provider2.js +1 -1
  295. package/dist/src/touch-runtime.js +1 -1
  296. package/dist/src/transport.js +1 -1
  297. package/dist/src/tree.js +1 -1
  298. package/dist/src/tv-remote.js +1 -1
  299. package/dist/src/type-text-runtime.js +1 -1
  300. package/dist/src/update-check.js +1 -1
  301. package/dist/src/verified-file.js +1 -1
  302. package/dist/src/version.js +1 -1
  303. package/dist/src/video.js +1 -1
  304. package/dist/src/viewport.js +1 -1
  305. package/dist/src/web.js +1 -1
  306. package/dist/src/web2.js +1 -1
  307. package/dist/src/webdriver-source.js +1 -1
  308. package/package.json +3 -2
  309. package/server.json +2 -2
  310. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.12.apk.sha256 +0 -1
  311. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.12.apk +0 -0
  312. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.12.apk.sha256 +0 -1
  313. package/dist/src/app-inventory.d.ts +0 -4
  314. package/dist/src/apps-simctl.js +0 -1
  315. package/dist/src/cloud-artifacts.d.ts +0 -61
  316. package/dist/src/runner-contract.js +0 -3
  317. package/dist/src/snapshot-process.js +0 -1
@@ -1,6 +1,6 @@
1
- import{r as e}from"./rolldown-runtime.js";import{D as t,L as n,O as r,U as i,g as a,m as o}from"./sdk-contracts.js";import"./capture.js";import{O as s}from"./sdk-batch-runner.js";import{a as c,d as l,i as u,l as d,o as f,r as p,t as ee,u as te}from"./android-input-ownership.js";import{Gr as ne,Hr as re,Ur as ie,Vr as ae}from"./sdk-batch.js";import{i as oe,n as se,r as ce}from"./snapshot-scope.js";import{_ as le,d as ue,p as de}from"./scroll-gesture.js";import{r as fe}from"./success-text.js";import{n as pe}from"./alert-contract.js";import{_ as me,d as he,n as ge,v as _e,x as ve,y as ye}from"./location-coordinates.js";import{r as be}from"./mobile-snapshot-semantics.js";import"./device.js";import{n as xe}from"./device-rotation.js";import{c as m,r as h}from"./diagnostics.js";import{a as Se,c as Ce,h as we,n as Te,s as Ee}from"./exec.js";import{t as g}from"./timeouts.js";import{i as De}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{a as _,n as Oe,o as v}from"./device-shell.js";import"./retry.js";import{n as ke,r as Ae}from"./version.js";import{n as je,r as Me}from"./install-source2.js";import{_ as Ne,a as y,c as Pe,d as b,f as Fe,g as x,h as S,i as Ie,l as Le,n as Re,o as C,p as ze,r as Be,s as Ve,t as He,u as Ue,v as We}from"./adb-executor.js";import{c as Ge,h as Ke,i as qe,o as Je,r as Ye,u as Xe}from"./adb-transport.js";import{i as Ze,n as w,o as Qe,s as $e}from"./adb-failure.js";import{a as et,i as tt,n as nt,o as T}from"./adb.js";import{i as rt,n as it,r as at}from"./gesture-plan.js";import{n as ot,r as st,s as ct}from"./android-system-chrome.js";import{a as lt,c as ut,i as dt,l as ft,n as pt,o as mt,r as ht,s as gt,u as _t}from"./app-lifecycle.js";import{a as vt,i as yt,n as bt,o as xt,r as St,t as Ct}from"./app-deployment-resolution.js";import{a as wt,i as Tt,n as Et,o as Dt,t as Ot}from"./app-parsers.js";import{i as kt,n as At,r as jt,t as Mt}from"./window-state.js";import{n as Nt}from"./toolchain-probe.js";import{t as Pt}from"./keyed-lock.js";import{t as Ft}from"./bounds.js";import{t as It}from"./entities.js";import{n as Lt}from"./startup-recovery-fence.js";import{n as Rt}from"./numeric.js";import E from"node:path";import zt from"node:net";import{TextDecoder as Bt}from"node:util";const Vt=new Map;async function Ht(e){let t=Vt.get(e.deviceKey);if(t!==void 0)return t;let n;try{let t=await e.adb([`features`],{allowFailure:!0,timeoutMs:2e3,...e.signal?{signal:e.signal}:{}});if(t.exitCode!==0)return!1;n=t.stdout}catch{return!1}let r=Wt(n).includes(`shell_v2`);return Vt.set(e.deviceKey,r),r}function Ut(){Vt.clear()}function Wt(e){return e.split(`
2
- `).map(e=>e.trim()).filter(Boolean)}const Gt=new Set([`com.android.permissioncontroller`,`com.google.android.permissioncontroller`,`com.google.android.packageinstaller`,`com.android.packageinstaller`]);function Kt(e){return Gt.has(e)}const qt=new Set([`android`,`com.android.systemui`]),Jt=/^android:id\/(?:alertTitle|message|button[123]|parentPanel|buttonPanel|contentPanel)$/i,Yt=/^android:id\/button[123]$/i,Xt=/(?:^|:)id\/permission_/i,Zt=/\b(?:is(?:n't| not) responding|keeps stopping|has stopped|close app|app info)\b/i,Qt=/^(?:ok|allow|allow all|while using the app|only this time|yes|continue|save|confirm|turn on|open settings)$/i,$t=/^(?:cancel|deny|don.t allow|don’t allow|not now|no|dismiss|close|close app|later|skip)$/i;function en(e){if(e!==null){if(Yt.test(e))return`button`;if(Jt.test(e))return`content`}}function tn(e){let t=an(e.filter(nn)),n=t.nodes;if(n.length===0)return null;let r=un(n),i=n.filter(e=>D(e)&&!bn(e)),a=pn(i),o=mn(i,a);if(!a&&!o&&r.length===0)return null;let s=xn(n);return{alert:{...a?{title:a}:{},...o?{message:o}:{},buttons:r.map(e=>e.label),platform:`android`,source:t.source,...s?{packageName:s}:{}},buttons:r}}function nn(e){return!d(e)}function rn(e,t){let n=t===`accept`?`accept`:`dismiss`;return e.find(e=>e.role===n)||(t===`dismiss`?e.find(e=>e.role===`neutral`)??null:e.length===1?e[0]??null:null)}function an(e){let t=e.filter(e=>vn(e));if(t.length)return{nodes:t,source:`permission`};let n=ln(e);return n.length?{nodes:n,source:`system-dialog`}:{nodes:on(e),source:`native-dialog`}}function on(e){let t=e.filter(e=>sn(e.type??``)),n=e.filter(e=>Jt.test(e.identifier??``)),r=t.length?[...t,...n]:cn(n);if(r.length===0)return[];let i=hn(e,r);return i===void 0?r:_n(e,i)}function sn(e){let t=Math.max(e.lastIndexOf(`.`),e.lastIndexOf(`$`));return e.slice(t+1).toLowerCase().endsWith(`dialog`)}function cn(e){let t=e.some(e=>Yt.test(e.identifier??``)),n=e.some(e=>!Yt.test(e.identifier??``));return t&&n?e:[]}function ln(e){let t=e.filter(e=>yn(e));if(t.length===0)return[];let n=hn(e,t);return n===void 0?t:_n(e,n).filter(e=>e.bundleId&&qt.has(e.bundleId))}function un(e){let t=new Set,n=[];for(let r of e){let e=D(r);if(!e||!r.rect||!bn(r))continue;let i=e.trim().toLowerCase();if(!i||t.has(i))continue;t.add(i);let o=a(r.rect);n.push({label:e,x:o.x,y:o.y,role:dn(r,e)})}return n}function dn(e,t){return fn(e.identifier??``)||(Qt.test(t.trim())?`accept`:$t.test(t.trim())?`dismiss`:`neutral`)}function fn(e){return/(?:^|:)id\/button1$/i.test(e)?`accept`:/(?:^|:)id\/button2$/i.test(e)?`dismiss`:/(?:^|:)id\/button3$/i.test(e)?`neutral`:/(?:^|:)id\/permission_allow/i.test(e)?`accept`:/(?:^|:)id\/permission_deny/i.test(e)?`dismiss`:null}function pn(e){return D(e.find(e=>/(?:^|:)id\/(?:alertTitle|permission_message)$/i.test(e.identifier??``)))||D(e[0])}function mn(e,t){let n=e.map(e=>D(e)).filter(e=>e&&e!==t);return n.length?[...new Set(n)].join(`
3
- `):void 0}function hn(e,t){let n=t[0];if(!n)return;let r=gn(e,n.index);for(let n of t.slice(1)){let t=new Set(gn(e,n.index));for(let e=r.length-1;e>=0;--e)t.has(r[e])||r.splice(e,1)}return r.at(-1)}function gn(e,t){let n=new Map(e.map(e=>[e.index,e])),r=[],i=n.get(t);for(;i;)r.push(i.index),i=i.parentIndex===void 0?void 0:n.get(i.parentIndex);return r.reverse()}function _n(e,t){let n=new Map;for(let t of e){if(t.parentIndex===void 0)continue;let e=n.get(t.parentIndex)??[];e.push(t),n.set(t.parentIndex,e)}let r=new Set([t]),i=[t];for(let e of i)for(let t of n.get(e)??[])r.has(t.index)||(r.add(t.index),i.push(t.index));return e.filter(e=>r.has(e.index))}function vn(e){let t=e.bundleId??``;return Gt.has(t)||Xt.test(e.identifier??``)}function yn(e){let t=e.bundleId??``;return qt.has(t)&&Zt.test(D(e))}function bn(e){let t=e.type??``,n=e.identifier??``;return!!(e.hittable||/\bbutton\b/i.test(t)||Yt.test(n)||/(?:^|:)id\/permission_(?:allow|deny)/i.test(n))}function D(e){return e?[e.label,e.value].filter(e=>typeof e==`string`&&e.trim().length>0)[0]?.trim()??``:``}function xn(e){return e.find(e=>e.bundleId)?.bundleId}function Sn(e,n,r){if(typeof e!=`number`||!Number.isInteger(e))throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} must be an integer.`);return e}function O(e,n,r,i){if(e!==r)throw new t(`INVALID_ARGS`,`Android ${i} manifest ${n} must be "${r}".`);return r}function Cn(e,n,r){if(typeof e!=`string`||e.length===0)throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} is required.`);return e}function wn(e,n){let r=Cn(e,`sha256`,n).trim().toLowerCase();if(r.length!==64||!/^[0-9a-f]+$/.test(r))throw new t(`INVALID_ARGS`,`Android ${n} manifest sha256 must be a 64-character hex string.`);return r}function Tn(e){let t={status:[],results:[],currentStatus:null,currentResult:null};for(let n of e.split(/\r?\n/))En(n,t);return Dn(t),{status:t.status,results:t.results}}function En(e,t){if(e.startsWith(`INSTRUMENTATION_STATUS: `)){t.currentStatus??={},An(e.slice(24),t.currentStatus);return}if(e.startsWith(`INSTRUMENTATION_STATUS_CODE: `)){On(t);return}if(e.startsWith(`INSTRUMENTATION_RESULT: `)){t.currentResult??={},An(e.slice(24),t.currentResult);return}e.startsWith(`INSTRUMENTATION_CODE: `)&&kn(t)}function Dn(e){On(e),kn(e)}function On(e){e.currentStatus&&=(e.status.push(e.currentStatus),null)}function kn(e){e.currentResult&&=(e.results.push(e.currentResult),null)}function An(e,t){let n=e.indexOf(`=`);n<0||(t[e.slice(0,n)]=e.slice(n+1))}function k(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function A(e){if(e===`true`)return!0;if(e===`false`)return!1}function jn(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return e}const Mn=1e4;async function Nn(e,t){try{return await He(e,t)}catch(e){throw Qe(e)}}async function Pn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,apkPath:a,sha256:o,cache:s,deviceKey:c,installTimeoutMs:l,helperLabel:u}=e,d=`${c}\0${r}\0${i}\0${o}`;if(s.has(d))return{packageName:r,versionCode:i,installedSha256:o,installed:!1,reason:`current`};await Vn(a,o,u);let f=await Fn({adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:o});if(f.reason===`current`)return s.add(d),{packageName:r,versionCode:i,...f,installed:!1};let p=await Nn(a,{provider:n,replace:!0,allowFailure:!0,timeoutMs:l});if(p.exitCode!==0)throw w(`Failed to install ${u}`,p,{packageName:r,versionCode:i,reason:f.reason});return s.add(d),{packageName:r,versionCode:i,...f,installed:!0}}async function Fn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:a,signal:o}=e,s=await Rn(t,r,o);if(s===void 0)return{reason:`missing`};if(s<i)return{installedVersionCode:s,reason:`outdated`};if(s>i)return{installedVersionCode:s,reason:`current`};try{let e=await zn(t,n,r,o);return{installedVersionCode:s,installedSha256:e,reason:e===a?`current`:`mismatched`}}catch{return o?.throwIfAborted(),{installedVersionCode:s,reason:`unverifiable`}}}async function In(e){let r=x().files,i=Ae(),a=E.join(ke(),`android`,e.helperDirName,`dist`),o=E.join(a,e.manifestFileName(i));try{let t=e.parseManifest(JSON.parse(await r.readText(o))),n=E.join(a,t.assetName);return await r.access(n),{apkPath:n,manifest:t}}catch(r){throw new t(`UNSUPPORTED_OPERATION`,e.unavailableMessage,{manifestPath:o,error:n(r).message},r)}}function Ln(e){return async t=>await Pn({adb:t.adb,adbProvider:t.adbProvider,packageName:t.artifact.manifest.packageName,versionCode:t.artifact.manifest.versionCode,apkPath:t.artifact.apkPath,sha256:t.artifact.manifest.sha256,cache:e.cache,deviceKey:t.deviceKey,installTimeoutMs:e.installTimeoutMs,helperLabel:e.helperLabel})}async function Rn(e,t,n){let r=await b(e,[`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:5e3,signal:n});if(r.exitCode!==0)return;let i=RegExp(`package:${Un(t)}(?:\\s|$).*versionCode:(\\d+)`).exec(`${r.stdout}\n${r.stderr}`);return i?Number(i[1]):void 0}async function zn(e,n,r,i){let a=await b(e,[`pm`,`path`,r],{allowFailure:!0,timeoutMs:Mn,signal:i}),o=Bn(`${a.stdout}\n${a.stderr}`);if(a.exitCode!==0||!o)throw new t(`COMMAND_FAILED`,`Could not resolve installed Android helper APK`);let s=x().files,c=await s.makeTempDirectory(`agent-device-helper-`),l=E.join(c,`base.apk`);try{let e=await Re(o,l,{provider:n,allowFailure:!0,timeoutMs:Mn,signal:i});if(e.exitCode!==0)throw w(`Could not read installed Android helper APK`,e,{packageName:r,remotePath:o});return await Hn(l)}finally{await s.remove(c,{recursive:!0,force:!0})}}function Bn(e){return e.split(/\r?\n/).map(e=>e.startsWith(`package:`)?e.slice(8).trim():``).find(e=>e.endsWith(`/base.apk`))}async function Vn(e,n,r){let i=await Hn(e);if(i!==n)throw new t(`COMMAND_FAILED`,`${r} APK checksum mismatch`,{apkPath:e,expectedSha256:n,actualSha256:i})}async function Hn(e){let t=x().files;return t.sha256(await t.readBytes(e))}function Un(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Wn=`android-snapshot-helper-v1`,Gn=`uiautomator-xml`,Kn=5e3,qn=3e4;function Jn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Android snapshot helper manifest must be an object.`);let n=e;return{name:Xn(n.name,`name`,`android-snapshot-helper`),version:j(n.version,`version`),releaseTag:Qn(n.releaseTag),assetName:Qn(n.assetName),apkUrl:$n(n.apkUrl,`apkUrl`),sha256:Zn(n.sha256),checksumName:Qn(n.checksumName),packageName:j(n.packageName,`packageName`),versionCode:Yn(n.versionCode,`versionCode`),instrumentationRunner:j(n.instrumentationRunner,`instrumentationRunner`),minSdk:Yn(n.minSdk,`minSdk`),targetSdk:n.targetSdk===void 0?void 0:Yn(n.targetSdk,`targetSdk`),outputFormat:Xn(n.outputFormat,`outputFormat`,Gn),statusProtocol:Xn(n.statusProtocol,`statusProtocol`,Wn)}}function Yn(e,t){return Sn(e,t,`snapshot helper`)}function Xn(e,t,n){return O(e,t,n,`snapshot helper`)}function Zn(e){let n=j(e,`sha256`).trim().toLowerCase();if(n.length!==64||!er(n))throw new t(`INVALID_ARGS`,`Android snapshot helper manifest sha256 must be a 64-character hex string.`);return n}function j(e,n){if(typeof e!=`string`||e.trim().length===0)throw new t(`INVALID_ARGS`,`Android snapshot helper manifest ${n} is required.`);return e}function Qn(e){return typeof e==`string`&&e.trim().length>0?e:void 0}function $n(e,t){return e===null?null:j(e,t)}function er(e){for(let t of e){let e=t.charCodeAt(0);if(!(e>=48&&e<=57)&&!(e>=97&&e<=102))return!1}return!0}const M=new Map;function tr(e){let t=`${e.deviceKey}\0${e.packageName}\0${e.versionCode}\0`;for(let e of M.keys())e.startsWith(t)&&ar(e)}function nr(){M.clear()}function rr(e,t,n,r){return e?`${e}\0${t}\0${n}\0${r}`:void 0}function ir(e,t){if(!e)return;let[n,r]=e.split(`\0`),i=`${n}\0${r}\0`;for(let t of M.keys())t!==e&&t.startsWith(i)&&M.delete(t);M.set(e,t)}function ar(e){e&&M.delete(e)}async function or(e){let{adb:t,artifact:n}=e,r=e.installPolicy??`missing-or-outdated`,i=n.manifest.packageName,a=n.manifest.versionCode,o=n.manifest.sha256;if(r===`never`)return{packageName:i,versionCode:a,installed:!1,reason:`skipped`};let s=rr(e.deviceKey,i,a,o),c=s?M.get(s):void 0;if(s&&r!==`always`&&c!==void 0)return{packageName:i,versionCode:a,installedVersionCode:c,installedSha256:o,installed:!1,reason:`current`};await Vn(n.apkPath,o,`Android snapshot helper`);let l=r===`always`?{installedVersionCode:await lr(t,i,e.timeoutMs,e.signal),reason:`forced`}:await Fn({adb:t,adbProvider:cr(e.adbProvider,t),packageName:i,versionCode:a,sha256:o,signal:e.signal}),{installedVersionCode:u}=l,d=`installedSha256`in l?l.installedSha256:void 0,f=l.reason;if(f===`current`){if(u===void 0)throw Error(`Expected installed versionCode for current Android snapshot helper`);return ir(s,u),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!1,reason:f}}let p;try{p=await ur(t,e.adbProvider??t,n.apkPath,{packageName:i,timeoutMs:e.timeoutMs,signal:e.signal})}catch(e){throw ar(s),sr(e,{packageName:i,versionCode:a})}if(p.exitCode!==0)throw ar(s),sr(w(`Failed to install Android snapshot helper`,p,{packageName:i,versionCode:a}));return ir(s,a),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!0,reason:f}}function sr(e,t){let n=r(e,`COMMAND_FAILED`);return n.details={...t,...n.details,androidSnapshotHelperInstallFailure:!0},n}function cr(e,t){return e?typeof e==`function`?{exec:e}:e:{exec:t}}async function lr(e,t,n,r){let i=await b(e,[`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:n,signal:r});if(i.exitCode===0)return dr(`${i.stdout}\n${i.stderr}`,t)}async function ur(e,t,n,r){let i=async()=>await Nn(n,{allowFailure:!0,provider:t,replace:!0,timeoutMs:r.timeoutMs,signal:r.signal}),a=await i();if(a.exitCode===0||!fr(a))return a;let o=await e([`uninstall`,r.packageName],{allowFailure:!0,timeoutMs:r.timeoutMs,signal:r.signal}),s=await i();return s.exitCode===0?s:{...s,stderr:[s.stderr,o.stderr?`Previous uninstall stderr after INSTALL_FAILED_UPDATE_INCOMPATIBLE: ${o.stderr}`:``].filter(Boolean).join(`
1
+ import{r as e}from"./rolldown-runtime.js";import{O as t,R as n,W as r,g as i,k as a,m as o}from"./sdk-contracts.js";import"./capture.js";import{O as s}from"./sdk-batch-runner.js";import{a as c,d as l,i as u,l as d,o as f,r as p,t as ee,u as te}from"./android-input-ownership.js";import{Hr as ne,Kr as re,Vr as ie,Wr as ae}from"./sdk-batch.js";import{i as oe,n as se,r as ce}from"./snapshot-scope.js";import{_ as le,d as ue,p as de}from"./scroll-gesture.js";import{r as fe}from"./success-text.js";import{n as pe}from"./alert-contract.js";import{_ as me,d as he,n as ge,v as _e,x as ve,y as ye}from"./location-coordinates.js";import{r as be}from"./mobile-snapshot-semantics.js";import"./device.js";import{n as xe}from"./device-rotation.js";import{c as m,r as h}from"./diagnostics.js";import{a as Se,c as Ce,h as we,n as Te,s as Ee}from"./exec.js";import{t as g}from"./timeouts.js";import{i as De}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{a as _,n as Oe,o as v}from"./device-shell.js";import"./retry.js";import{a as ke,r as Ae}from"./version.js";import{n as je,r as Me}from"./install-source2.js";import{_ as Ne,a as y,c as Pe,d as b,f as Fe,g as x,h as S,i as Ie,l as Le,n as Re,o as C,p as ze,r as Be,s as Ve,t as He,u as Ue,v as We}from"./adb-executor.js";import{c as Ge,h as Ke,i as qe,o as Je,r as Ye,u as Xe}from"./adb-transport.js";import{i as Ze,n as w,o as Qe,s as $e}from"./adb-failure.js";import{a as et,i as tt,n as nt,o as T}from"./adb.js";import{i as rt,n as it,r as at}from"./gesture-plan.js";import{n as ot,r as st,s as ct}from"./android-system-chrome.js";import{a as lt,c as ut,i as dt,l as ft,n as pt,o as mt,r as ht,s as gt,u as _t}from"./app-lifecycle.js";import{a as vt,i as yt,n as bt,o as xt,r as St,t as Ct}from"./app-deployment-resolution.js";import{a as wt,i as Tt,n as Et,o as Dt,t as Ot}from"./app-parsers.js";import{i as kt,n as At,r as jt,t as Mt}from"./window-state.js";import{n as Nt}from"./toolchain-probe.js";import{t as Pt}from"./keyed-lock.js";import{t as Ft}from"./bounds.js";import{t as It}from"./entities.js";import{n as Lt}from"./startup-recovery-fence.js";import{n as Rt}from"./numeric.js";import E from"node:path";import zt from"node:net";import{TextDecoder as Bt}from"node:util";const Vt=new Map;async function Ht(e){let t=Vt.get(e.deviceKey);if(t!==void 0)return t;let n;try{let t=await e.adb([`features`],{allowFailure:!0,timeoutMs:2e3,...e.signal?{signal:e.signal}:{}});if(t.exitCode!==0)return!1;n=t.stdout}catch{return!1}let r=Wt(n).includes(`shell_v2`);return Vt.set(e.deviceKey,r),r}function Ut(){Vt.clear()}function Wt(e){return e.split(`
2
+ `).map(e=>e.trim()).filter(Boolean)}const Gt=new Set([`com.android.permissioncontroller`,`com.google.android.permissioncontroller`,`com.google.android.packageinstaller`,`com.android.packageinstaller`]);function Kt(e){return Gt.has(e)}const qt=new Set([`android`,`com.android.systemui`]),Jt=/^android:id\/(?:alertTitle|message|button[123]|parentPanel|buttonPanel|contentPanel)$/i,Yt=/^android:id\/button[123]$/i,Xt=/(?:^|:)id\/permission_/i,Zt=/\b(?:is(?:n't| not) responding|keeps stopping|has stopped|close app|app info)\b/i,Qt=/^(?:ok|allow|allow all|while using the app|only this time|yes|continue|save|confirm|turn on|open settings)$/i,$t=/^(?:cancel|deny|don.t allow|don’t allow|not now|no|dismiss|close|close app|later|skip)$/i;function en(e){if(e!==null){if(Yt.test(e))return`button`;if(Jt.test(e))return`content`}}function tn(e){let t=an(e.filter(nn)),n=t.nodes;if(n.length===0)return null;let r=un(n),i=n.filter(e=>D(e)&&!bn(e)),a=pn(i),o=mn(i,a);if(!a&&!o&&r.length===0)return null;let s=xn(n);return{alert:{...a?{title:a}:{},...o?{message:o}:{},buttons:r.map(e=>e.label),platform:`android`,source:t.source,...s?{packageName:s}:{}},buttons:r}}function nn(e){return!d(e)}function rn(e,t){let n=t===`accept`?`accept`:`dismiss`;return e.find(e=>e.role===n)||(t===`dismiss`?e.find(e=>e.role===`neutral`)??null:e.length===1?e[0]??null:null)}function an(e){let t=e.filter(e=>vn(e));if(t.length)return{nodes:t,source:`permission`};let n=ln(e);return n.length?{nodes:n,source:`system-dialog`}:{nodes:on(e),source:`native-dialog`}}function on(e){let t=e.filter(e=>sn(e.type??``)),n=e.filter(e=>Jt.test(e.identifier??``)),r=t.length?[...t,...n]:cn(n);if(r.length===0)return[];let i=hn(e,r);return i===void 0?r:_n(e,i)}function sn(e){let t=Math.max(e.lastIndexOf(`.`),e.lastIndexOf(`$`));return e.slice(t+1).toLowerCase().endsWith(`dialog`)}function cn(e){let t=e.some(e=>Yt.test(e.identifier??``)),n=e.some(e=>!Yt.test(e.identifier??``));return t&&n?e:[]}function ln(e){let t=e.filter(e=>yn(e));if(t.length===0)return[];let n=hn(e,t);return n===void 0?t:_n(e,n).filter(e=>e.bundleId&&qt.has(e.bundleId))}function un(e){let t=new Set,n=[];for(let r of e){let e=D(r);if(!e||!r.rect||!bn(r))continue;let a=e.trim().toLowerCase();if(!a||t.has(a))continue;t.add(a);let o=i(r.rect);n.push({label:e,x:o.x,y:o.y,role:dn(r,e)})}return n}function dn(e,t){return fn(e.identifier??``)||(Qt.test(t.trim())?`accept`:$t.test(t.trim())?`dismiss`:`neutral`)}function fn(e){return/(?:^|:)id\/button1$/i.test(e)?`accept`:/(?:^|:)id\/button2$/i.test(e)?`dismiss`:/(?:^|:)id\/button3$/i.test(e)?`neutral`:/(?:^|:)id\/permission_allow/i.test(e)?`accept`:/(?:^|:)id\/permission_deny/i.test(e)?`dismiss`:null}function pn(e){return D(e.find(e=>/(?:^|:)id\/(?:alertTitle|permission_message)$/i.test(e.identifier??``)))||D(e[0])}function mn(e,t){let n=e.map(e=>D(e)).filter(e=>e&&e!==t);return n.length?[...new Set(n)].join(`
3
+ `):void 0}function hn(e,t){let n=t[0];if(!n)return;let r=gn(e,n.index);for(let n of t.slice(1)){let t=new Set(gn(e,n.index));for(let e=r.length-1;e>=0;--e)t.has(r[e])||r.splice(e,1)}return r.at(-1)}function gn(e,t){let n=new Map(e.map(e=>[e.index,e])),r=[],i=n.get(t);for(;i;)r.push(i.index),i=i.parentIndex===void 0?void 0:n.get(i.parentIndex);return r.reverse()}function _n(e,t){let n=new Map;for(let t of e){if(t.parentIndex===void 0)continue;let e=n.get(t.parentIndex)??[];e.push(t),n.set(t.parentIndex,e)}let r=new Set([t]),i=[t];for(let e of i)for(let t of n.get(e)??[])r.has(t.index)||(r.add(t.index),i.push(t.index));return e.filter(e=>r.has(e.index))}function vn(e){let t=e.bundleId??``;return Gt.has(t)||Xt.test(e.identifier??``)}function yn(e){let t=e.bundleId??``;return qt.has(t)&&Zt.test(D(e))}function bn(e){let t=e.type??``,n=e.identifier??``;return!!(e.hittable||/\bbutton\b/i.test(t)||Yt.test(n)||/(?:^|:)id\/permission_(?:allow|deny)/i.test(n))}function D(e){return e?[e.label,e.value].filter(e=>typeof e==`string`&&e.trim().length>0)[0]?.trim()??``:``}function xn(e){return e.find(e=>e.bundleId)?.bundleId}function Sn(e,n,r){if(typeof e!=`number`||!Number.isInteger(e))throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} must be an integer.`);return e}function O(e,n,r,i){if(e!==r)throw new t(`INVALID_ARGS`,`Android ${i} manifest ${n} must be "${r}".`);return r}function Cn(e,n,r){if(typeof e!=`string`||e.length===0)throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} is required.`);return e}function wn(e,n){let r=Cn(e,`sha256`,n).trim().toLowerCase();if(r.length!==64||!/^[0-9a-f]+$/.test(r))throw new t(`INVALID_ARGS`,`Android ${n} manifest sha256 must be a 64-character hex string.`);return r}function Tn(e){let t={status:[],results:[],currentStatus:null,currentResult:null};for(let n of e.split(/\r?\n/))En(n,t);return Dn(t),{status:t.status,results:t.results}}function En(e,t){if(e.startsWith(`INSTRUMENTATION_STATUS: `)){t.currentStatus??={},An(e.slice(24),t.currentStatus);return}if(e.startsWith(`INSTRUMENTATION_STATUS_CODE: `)){On(t);return}if(e.startsWith(`INSTRUMENTATION_RESULT: `)){t.currentResult??={},An(e.slice(24),t.currentResult);return}e.startsWith(`INSTRUMENTATION_CODE: `)&&kn(t)}function Dn(e){On(e),kn(e)}function On(e){e.currentStatus&&=(e.status.push(e.currentStatus),null)}function kn(e){e.currentResult&&=(e.results.push(e.currentResult),null)}function An(e,t){let n=e.indexOf(`=`);n<0||(t[e.slice(0,n)]=e.slice(n+1))}function k(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function A(e){if(e===`true`)return!0;if(e===`false`)return!1}function jn(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return e}const Mn=1e4;async function Nn(e,t){try{return await He(e,t)}catch(e){throw Qe(e)}}async function Pn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,apkPath:a,sha256:o,cache:s,deviceKey:c,installTimeoutMs:l,helperLabel:u}=e,d=`${c}\0${r}\0${i}\0${o}`;if(s.has(d))return{packageName:r,versionCode:i,installedSha256:o,installed:!1,reason:`current`};await Vn(a,o,u);let f=await Fn({adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:o});if(f.reason===`current`)return s.add(d),{packageName:r,versionCode:i,...f,installed:!1};let p=await Nn(a,{provider:n,replace:!0,allowFailure:!0,timeoutMs:l});if(p.exitCode!==0)throw w(`Failed to install ${u}`,p,{packageName:r,versionCode:i,reason:f.reason});return s.add(d),{packageName:r,versionCode:i,...f,installed:!0}}async function Fn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:a,signal:o}=e,s=await Rn(t,r,o);if(s===void 0)return{reason:`missing`};if(s<i)return{installedVersionCode:s,reason:`outdated`};if(s>i)return{installedVersionCode:s,reason:`current`};try{let e=await zn(t,n,r,o);return{installedVersionCode:s,installedSha256:e,reason:e===a?`current`:`mismatched`}}catch{return o?.throwIfAborted(),{installedVersionCode:s,reason:`unverifiable`}}}async function In(e){let r=x().files,i=ke(),a=E.join(Ae(),`android`,e.helperDirName,`dist`),o=E.join(a,e.manifestFileName(i));try{let t=e.parseManifest(JSON.parse(await r.readText(o))),n=E.join(a,t.assetName);return await r.access(n),{apkPath:n,manifest:t}}catch(r){throw new t(`UNSUPPORTED_OPERATION`,e.unavailableMessage,{manifestPath:o,error:n(r).message},r)}}function Ln(e){return async t=>await Pn({adb:t.adb,adbProvider:t.adbProvider,packageName:t.artifact.manifest.packageName,versionCode:t.artifact.manifest.versionCode,apkPath:t.artifact.apkPath,sha256:t.artifact.manifest.sha256,cache:e.cache,deviceKey:t.deviceKey,installTimeoutMs:e.installTimeoutMs,helperLabel:e.helperLabel})}async function Rn(e,t,n){let r=await b(e,[`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:5e3,signal:n});if(r.exitCode!==0)return;let i=RegExp(`package:${Un(t)}(?:\\s|$).*versionCode:(\\d+)`).exec(`${r.stdout}\n${r.stderr}`);return i?Number(i[1]):void 0}async function zn(e,n,r,i){let a=await b(e,[`pm`,`path`,r],{allowFailure:!0,timeoutMs:Mn,signal:i}),o=Bn(`${a.stdout}\n${a.stderr}`);if(a.exitCode!==0||!o)throw new t(`COMMAND_FAILED`,`Could not resolve installed Android helper APK`);let s=x().files,c=await s.makeTempDirectory(`agent-device-helper-`),l=E.join(c,`base.apk`);try{let e=await Re(o,l,{provider:n,allowFailure:!0,timeoutMs:Mn,signal:i});if(e.exitCode!==0)throw w(`Could not read installed Android helper APK`,e,{packageName:r,remotePath:o});return await Hn(l)}finally{await s.remove(c,{recursive:!0,force:!0})}}function Bn(e){return e.split(/\r?\n/).map(e=>e.startsWith(`package:`)?e.slice(8).trim():``).find(e=>e.endsWith(`/base.apk`))}async function Vn(e,n,r){let i=await Hn(e);if(i!==n)throw new t(`COMMAND_FAILED`,`${r} APK checksum mismatch`,{apkPath:e,expectedSha256:n,actualSha256:i})}async function Hn(e){let t=x().files;return t.sha256(await t.readBytes(e))}function Un(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Wn=`android-snapshot-helper-v1`,Gn=`uiautomator-xml`,Kn=5e3,qn=3e4;function Jn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Android snapshot helper manifest must be an object.`);let n=e;return{name:Xn(n.name,`name`,`android-snapshot-helper`),version:j(n.version,`version`),releaseTag:Qn(n.releaseTag),assetName:Qn(n.assetName),apkUrl:$n(n.apkUrl,`apkUrl`),sha256:Zn(n.sha256),checksumName:Qn(n.checksumName),packageName:j(n.packageName,`packageName`),versionCode:Yn(n.versionCode,`versionCode`),instrumentationRunner:j(n.instrumentationRunner,`instrumentationRunner`),minSdk:Yn(n.minSdk,`minSdk`),targetSdk:n.targetSdk===void 0?void 0:Yn(n.targetSdk,`targetSdk`),outputFormat:Xn(n.outputFormat,`outputFormat`,Gn),statusProtocol:Xn(n.statusProtocol,`statusProtocol`,Wn)}}function Yn(e,t){return Sn(e,t,`snapshot helper`)}function Xn(e,t,n){return O(e,t,n,`snapshot helper`)}function Zn(e){let n=j(e,`sha256`).trim().toLowerCase();if(n.length!==64||!er(n))throw new t(`INVALID_ARGS`,`Android snapshot helper manifest sha256 must be a 64-character hex string.`);return n}function j(e,n){if(typeof e!=`string`||e.trim().length===0)throw new t(`INVALID_ARGS`,`Android snapshot helper manifest ${n} is required.`);return e}function Qn(e){return typeof e==`string`&&e.trim().length>0?e:void 0}function $n(e,t){return e===null?null:j(e,t)}function er(e){for(let t of e){let e=t.charCodeAt(0);if(!(e>=48&&e<=57)&&!(e>=97&&e<=102))return!1}return!0}const M=new Map;function tr(e){let t=`${e.deviceKey}\0${e.packageName}\0${e.versionCode}\0`;for(let e of M.keys())e.startsWith(t)&&ar(e)}function nr(){M.clear()}function rr(e,t,n,r){return e?`${e}\0${t}\0${n}\0${r}`:void 0}function ir(e,t){if(!e)return;let[n,r]=e.split(`\0`),i=`${n}\0${r}\0`;for(let t of M.keys())t!==e&&t.startsWith(i)&&M.delete(t);M.set(e,t)}function ar(e){e&&M.delete(e)}async function or(e){let{adb:t,artifact:n}=e,r=e.installPolicy??`missing-or-outdated`,i=n.manifest.packageName,a=n.manifest.versionCode,o=n.manifest.sha256;if(r===`never`)return{packageName:i,versionCode:a,installed:!1,reason:`skipped`};let s=rr(e.deviceKey,i,a,o),c=s?M.get(s):void 0;if(s&&r!==`always`&&c!==void 0)return{packageName:i,versionCode:a,installedVersionCode:c,installedSha256:o,installed:!1,reason:`current`};await Vn(n.apkPath,o,`Android snapshot helper`);let l=r===`always`?{installedVersionCode:await lr(t,i,e.timeoutMs,e.signal),reason:`forced`}:await Fn({adb:t,adbProvider:cr(e.adbProvider,t),packageName:i,versionCode:a,sha256:o,signal:e.signal}),{installedVersionCode:u}=l,d=`installedSha256`in l?l.installedSha256:void 0,f=l.reason;if(f===`current`){if(u===void 0)throw Error(`Expected installed versionCode for current Android snapshot helper`);return ir(s,u),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!1,reason:f}}let p;try{p=await ur(t,e.adbProvider??t,n.apkPath,{packageName:i,timeoutMs:e.timeoutMs,signal:e.signal})}catch(e){throw ar(s),sr(e,{packageName:i,versionCode:a})}if(p.exitCode!==0)throw ar(s),sr(w(`Failed to install Android snapshot helper`,p,{packageName:i,versionCode:a}));return ir(s,a),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!0,reason:f}}function sr(e,t){let n=a(e,`COMMAND_FAILED`);return n.details={...t,...n.details,androidSnapshotHelperInstallFailure:!0},n}function cr(e,t){return e?typeof e==`function`?{exec:e}:e:{exec:t}}async function lr(e,t,n,r){let i=await b(e,[`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:n,signal:r});if(i.exitCode===0)return dr(`${i.stdout}\n${i.stderr}`,t)}async function ur(e,t,n,r){let i=async()=>await Nn(n,{allowFailure:!0,provider:t,replace:!0,timeoutMs:r.timeoutMs,signal:r.signal}),a=await i();if(a.exitCode===0||!fr(a))return a;let o=await e([`uninstall`,r.packageName],{allowFailure:!0,timeoutMs:r.timeoutMs,signal:r.signal}),s=await i();return s.exitCode===0?s:{...s,stderr:[s.stderr,o.stderr?`Previous uninstall stderr after INSTALL_FAILED_UPDATE_INCOMPATIBLE: ${o.stderr}`:``].filter(Boolean).join(`
4
4
  `)}}function dr(e,t){let n=`package:${t}`;for(let t of e.split(/\r?\n/)){if(!t.startsWith(n)||t.length>n.length&&!/\s/.test(t[n.length]??``))continue;let e=/(?:^|\s)versionCode:(\d+)(?:\s|$)/.exec(t);if(e)return Number(e[1])}}function fr(e){return`${e.stdout}\n${e.stderr}`.includes(`INSTALL_FAILED_UPDATE_INCOMPATIBLE`)}function pr(e){return e.errorType===`java.util.concurrent.TimeoutException`?`accessibility-timeout`:void 0}function mr(e){return e===137?`accessibility-timeout`:void 0}function hr(e){return e?{androidCaptureFailureReason:e}:{}}function gr(){return new Promise((e,t)=>{let n=zt.createServer();n.unref(),n.on(`error`,t),n.listen(0,`127.0.0.1`,()=>{let r=n.address();if(!r||typeof r==`string`){n.close(()=>t(Error(`Failed to allocate a local TCP port`)));return}let i=r.port;n.close(()=>e(i))})})}function _r(e,n,r,i){return new Promise((a,o)=>{let s=zt.connect({host:`127.0.0.1`,port:e}),c=[],l=setTimeout(()=>{u(),s.destroy(),o(new t(`COMMAND_FAILED`,`Android snapshot helper session request timed out`,{command:n,timeoutMs:r,port:e}))},r),u=()=>{clearTimeout(l),i?.removeEventListener(`abort`,d)},d=()=>{u(),s.destroy(),o(i?.reason??new DOMException(`The operation was aborted`,`AbortError`))};if(i?.addEventListener(`abort`,d,{once:!0}),i?.aborted){d();return}s.on(`connect`,()=>s.write(`${n}\n`)),s.on(`data`,e=>c.push(Buffer.from(e))),s.on(`error`,e=>{u(),o(e)}),s.on(`close`,()=>{u(),a(Buffer.concat(c).toString(`utf8`))})})}async function vr(e){let t=`snapshot-${Date.now()}-${Math.random().toString(16).slice(2)}`;return wr(await _r(e.port,`snapshot ${t}`,yr(e),e.signal),t)}function yr(e){return Math.min(e.commandTimeoutMs,Math.max(e.timeoutMs+3e3,3e3))}function br(e,n,r){return new Promise((i,a)=>{let o=``,s=setTimeout(()=>{r?.removeEventListener(`abort`,l),a(new t(`COMMAND_FAILED`,`Android snapshot helper session did not become ready`,{output:o,timeoutMs:n,reason:`android_snapshot_helper_session_ready_timeout`}))},n),c=e=>{o+=e.toString(),o.includes(`agentDeviceProtocol=android-snapshot-helper-v1`)&&o.includes(`sessionReady=true`)&&(clearTimeout(s),r?.removeEventListener(`abort`,l),i())},l=()=>{clearTimeout(s),a(r?.reason??new DOMException(`The operation was aborted`,`AbortError`))};if(r?.addEventListener(`abort`,l,{once:!0}),r?.aborted){l();return}e.stdout?.on(`data`,c),e.stderr?.on(`data`,c),e.once(`exit`,(e,n)=>{clearTimeout(s),r?.removeEventListener(`abort`,l),a(new t(`COMMAND_FAILED`,`Android snapshot helper session exited before ready`,{output:o,exitCode:e,signal:n,reason:`android_snapshot_helper_session_exited_before_ready`}))}),e.on(`error`,e=>{clearTimeout(s),r?.removeEventListener(`abort`,l),a(e)})})}function xr(e){let t=e.indexOf(`
5
5
 
6
6
  `);return Dr(e.slice(0,t<0?e.length:t))}function Sr(e,n){if(e.agentDeviceProtocol!==`android-snapshot-helper-v1`)throw new t(`COMMAND_FAILED`,`Android automation helper session returned wrong protocol`,{headers:e});if(e.requestId!==n)throw new t(`COMMAND_FAILED`,`Android automation helper session returned stale output`,{headers:e,requestId:n})}function Cr(e,t){let n=xr(e);return n.agentDeviceProtocol===`android-snapshot-helper-v1`&&n.requestId===t&&n.ok===`true`}function wr(e,n){let r=e.indexOf(`
@@ -8,8 +8,8 @@ import{r as e}from"./rolldown-runtime.js";import{D as t,L as n,O as r,U as i,g a
8
8
  `);if(r<0)throw new t(`COMMAND_FAILED`,`Android snapshot helper session returned malformed output`,{response:e});let i=Dr(e.slice(0,r)),a=e.slice(r+2);return Tr(i,n),Er(i,a),{xml:a,metadata:Or(i)}}function Tr(e,n){if(e.agentDeviceProtocol!==`android-snapshot-helper-v1`)throw new t(`COMMAND_FAILED`,`Android snapshot helper session returned wrong protocol`,{headers:e});if(e.outputFormat!==`uiautomator-xml`)throw new t(`COMMAND_FAILED`,`Android snapshot helper session returned wrong output format`,{headers:e});if(e.requestId!==n)throw new t(`COMMAND_FAILED`,`Android snapshot helper session returned stale output`,{headers:e,requestId:n});if(e.ok!==`true`)throw new t(`COMMAND_FAILED`,e.message||e.errorType||`Android snapshot helper session returned an error`,{helper:e,...hr(pr(e))})}function Er(e,n){let r=k(e.byteLength);if(r!==void 0&&Buffer.byteLength(n,`utf8`)!==r)throw new t(`COMMAND_FAILED`,`Android snapshot helper session returned truncated XML`,{headers:e,actualByteLength:Buffer.byteLength(n,`utf8`)});if(!n.includes(`<hierarchy`)||!n.includes(`</hierarchy>`))throw new t(`COMMAND_FAILED`,`Android snapshot helper session did not return XML`,{headers:e,xml:n})}function Dr(e){let t={};for(let n of e.split(/\r?\n/)){let e=n.indexOf(`=`);e<0||(t[n.slice(0,e)]=n.slice(e+1))}return t}function Or(e){return{helperApiVersion:e.helperApiVersion,outputFormat:Gn,waitForIdleTimeoutMs:k(e.waitForIdleTimeoutMs),waitForIdleQuietMs:k(e.waitForIdleQuietMs),timeoutMs:k(e.timeoutMs),maxDepth:k(e.maxDepth),maxNodes:k(e.maxNodes),rootPresent:A(e.rootPresent),captureMode:e.captureMode===`interactive-windows`||e.captureMode===`active-window`?e.captureMode:void 0,windowCount:k(e.windowCount),nodeCount:k(e.nodeCount),truncated:A(e.truncated),elapsedMs:k(e.elapsedMs)}}function N(e,n,r,i){if(i instanceof t){let a=i.details??{};return new t(i.code,i.message,{...a,action:e,package:r,tool:n,hint:typeof a.hint==`string`?a.hint:jr(n,a)},i)}return new t(`COMMAND_FAILED`,`Failed to ${e} Android ${n} for ${r}`,{action:e,package:r,tool:n,hint:kr(n)},i)}function kr(e){return e===`simpleperf`?`Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.`:`Verify perfetto is available, the app process is running, and the device permits trace capture.`}function Ar(e){return e===`simpleperf`?`Use an emulator/system image with simpleperf available, or install the Android NDK simpleperf binary for this device.`:`Use Android 10+ or a system image that exposes the perfetto command-line binary.`}function jr(e,t){let n=(typeof t.stderr==`string`?t.stderr:``).toLowerCase();return e===`simpleperf`?Mr(n):Pr(n)?`Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.`:kr(e)}function Mr(e){return Nr(e)?`Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.`:e.includes(`not supported`)||e.includes(`failed to open perf event`)?`This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.`:kr(`simpleperf`)}function Nr(e){return e.includes(`permission denied`)||e.includes(`not profileable`)||e.includes(`profileable`)}function Pr(e){return e.includes(`permission denied`)||e.includes(`not allowed`)}const Fr=`adb-shell-simpleperf`,Ir=`adb-shell-perfetto`,Lr=15e3,P=3e4,Rr=`/data/local/tmp`;async function zr(e,n){try{let t=await b(e,[`pidof`,n],{allowFailure:!0,timeoutMs:Lr}),r=Vr(t.stdout);if(t.exitCode===0&&r)return r}catch{}throw new t(`COMMAND_FAILED`,`No active Android app process found for ${n}`,{package:n,hint:`Run open <app> for this session again, wait for the app UI to appear, then retry perf.`})}async function Br(e,n,r){let i=await b(e,[_(`command -v ${v(n)} || which ${v(n)}`)],{allowFailure:!0,timeoutMs:Lr});if(!(i.exitCode===0&&i.stdout.trim()))throw new t(`UNSUPPORTED_OPERATION`,`Android device does not expose ${n}`,{package:r,tool:n,hint:Ar(n)})}function Vr(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}const Hr=2e3,Ur=`android_snapshot_helper_runtime_occupied`,F=new Map;function Wr(e){return`${e.platform}:${e.id}`}async function Gr(e){await ii({adb:e.adb,packageName:e.packageName}),await qr({deviceKey:e.deviceKey,packageName:e.packageName,adb:e.adb,cause:e.cause})}async function Kr(e){let t=F.get(e.deviceKey);if(!t)return;await ii({adb:e.adb,packageName:t.packageName,timeoutMs:5e3,...e.signal?{signal:e.signal}:{}}),e.signal?.throwIfAborted();let n=await Xr({adb:e.adb,packageName:t.packageName});if(n===`occupied`&&(await g(250),n=await Xr({adb:e.adb,packageName:t.packageName})),n===`occupied`)throw Yr({deviceKey:e.deviceKey,packageName:t.packageName,cause:t.cause});n!==`unknown`&&F.delete(e.deviceKey)}async function qr(e){let t=e.release??await Xr({adb:e.adb,packageName:e.packageName});if(t===`released`)return F.delete(e.deviceKey),t;let n=e.cause instanceof Error?e.cause.message:String(e.cause);return F.set(e.deviceKey,{packageName:e.packageName,cause:n}),h({level:`warn`,phase:`android_snapshot_helper_retirement_pending`,data:{deviceKey:e.deviceKey,packageName:e.packageName,release:t}}),t}function Jr(e){return e instanceof t&&e.details?.reason===Ur}function Yr(e){let n=e.cause instanceof Error?e.cause.message:String(e.cause);return new t(`COMMAND_FAILED`,`Android automation helper is still holding device automation ownership`,{reason:Ur,deviceKey:e.deviceKey,packageName:e.packageName,cause:n,hint:`Retry after the helper process exits, or restart the device if Android keeps reporting the helper as running.`})}async function Xr(e){try{let t=await b(e.adb,[`pidof`,e.packageName,_(`|| echo AGENT_DEVICE_NO_HELPER`)],{allowFailure:!0,timeoutMs:Hr}),n=t.stdout.trim();return Vr(n)?`occupied`:n===`AGENT_DEVICE_NO_HELPER`&&t.stderr.trim().length===0?`released`:`unknown`}catch{return`unknown`}}async function Zr(e){let t=AbortSignal.timeout(e.timeoutMs);return await Promise.all([...e.forceStopRuntime?[ii({adb:e.adb,packageName:e.packageName,timeoutMs:e.timeoutMs,signal:t})]:[],ai({...e,signal:t})]),{timedOut:t.aborted}}function Qr(e){let t=$r(e);return{ended:t?Promise.resolve():new Promise(t=>{e.once(`close`,()=>t()),e.once(`exit`,()=>t())}),hasEnded:()=>$r(e),completedCleanly:()=>!t&&e.exitCode===0&&e.signalCode==null}}function $r(e){return e.exitCode!=null||e.signalCode!=null}async function ei(e,t,n){let r,i,a=await Promise.race([e.then(()=>!0),new Promise(e=>{r=setTimeout(()=>e(!1),t)}),...n?[new Promise(e=>{i=()=>e(!1),n.addEventListener(`abort`,i,{once:!0}),n.aborted&&i()})]:[]]);return r&&clearTimeout(r),i&&n?.removeEventListener(`abort`,i),a}async function ti(e){if(e.processExit.hasEnded())return!0;try{e.process.kill(`SIGTERM`)}catch{}return await ei(e.processExit.ended,e.timeoutMs)}function ni(e){F.delete(e)}function ri(){F.clear()}async function ii(e){await b(e.adb,[`am`,`force-stop`,e.packageName],{allowFailure:!0,timeoutMs:e.timeoutMs??2e3,...e.signal?{signal:e.signal}:{}}).catch(()=>{})}async function ai(e){e.process.stdin?.end(),e.process.stdout?.destroy(),e.process.stderr?.destroy(),await e.adb([`forward`,`--remove`,`tcp:${e.port}`],{allowFailure:!0,timeoutMs:e.timeoutMs,signal:e.signal})}async function oi(e){let n=ci(e),r=e.deviceKey??`android:default`;await Kr({deviceKey:r,adb:e.adb,signal:e.signal});let i;try{i=await e.adb(li(n),{allowFailure:!0,timeoutMs:n.commandTimeoutMs,signal:e.signal})}catch(t){throw e.signal?.aborted?(await Gr({deviceKey:r,packageName:n.packageName,adb:e.adb,cause:t}),e.signal.throwIfAborted(),t):t}e.signal?.aborted&&(await Gr({deviceKey:r,packageName:n.packageName,adb:e.adb,cause:e.signal.reason}),e.signal.throwIfAborted());let{output:a,cleanupDone:o}=await ui(e,n,i);if(n.outputPath&&!o&&await _i(e.adb,n.outputPath),i.exitCode!==0)throw new t(`COMMAND_FAILED`,`Android snapshot helper failed`,Te(i,{helper:a.metadata}));return a}function si(e){return{adb:e.adb,adbProvider:e.adbProvider,deviceKey:e.deviceKey,helperVersion:e.artifact.manifest.version,helperVersionCode:e.artifact.manifest.versionCode,helperSha256:e.artifact.manifest.sha256,packageName:e.artifact.manifest.packageName,instrumentationRunner:e.artifact.manifest.instrumentationRunner,waitForIdleTimeoutMs:500,timeoutMs:Kn,commandTimeoutMs:qn,...e.signal?{signal:e.signal}:{}}}function ci(e){let t=I(e.timeoutMs,8e3),n=I(e.packageName,`com.callstack.agentdevice.snapshothelper`);return{waitForIdleTimeoutMs:I(e.waitForIdleTimeoutMs,500),waitForIdleQuietMs:I(e.waitForIdleQuietMs,100),timeoutMs:t,commandTimeoutMs:I(e.commandTimeoutMs,t+5e3),maxDepth:I(e.maxDepth,128),maxNodes:I(e.maxNodes,5e3),packageName:n,runner:I(e.instrumentationRunner,`${n}/.SnapshotInstrumentation`),...e.outputPath?{outputPath:e.outputPath}:{},...e.emitChunks===void 0?{}:{emitChunks:e.emitChunks}}}function I(e,t){return e===void 0?t:e}function li(e,t={}){return Oe(`adb`,`shell`,[`am`,`instrument`,`-w`,`-e`,`waitForIdleTimeoutMs`,String(e.waitForIdleTimeoutMs),`-e`,`waitForIdleQuietMs`,String(e.waitForIdleQuietMs),`-e`,`timeoutMs`,String(e.timeoutMs),`-e`,`maxDepth`,String(e.maxDepth),`-e`,`maxNodes`,String(e.maxNodes),...e.outputPath?[`-e`,`outputPath`,e.outputPath]:[],...e.emitChunks===void 0?[]:[`-e`,`emitChunks`,String(e.emitChunks)],...t.sessionPort===void 0?[]:[`-e`,`sessionPort`,t.sessionPort],e.runner])}async function ui(e,t,n){try{return{output:vi(`${n.stdout}\n${n.stderr}`),cleanupDone:!1}}catch(r){return await di(e,t,n,r)}}async function di(e,n,r,i){if(i instanceof t&&r.exitCode!==0&&i.details?.helper)throw i;let a=await fi(e,n,r);if(a)return{output:a,cleanupDone:!0};throw new t(`COMMAND_FAILED`,r.exitCode===0?`Android snapshot helper output could not be parsed`:`Android snapshot helper failed before returning parseable output`,{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode,...hr(mr(r.exitCode))},i)}async function fi(e,t,n){if(!(n.exitCode!==0||!t.outputPath))return await mi(e.adb,t.outputPath,gi(`${n.stdout}\n${n.stderr}`)??pi(t))}function pi(e){return{outputFormat:Gn,waitForIdleTimeoutMs:e.waitForIdleTimeoutMs,waitForIdleQuietMs:e.waitForIdleQuietMs,timeoutMs:e.timeoutMs,maxDepth:e.maxDepth,maxNodes:e.maxNodes,transport:`instrumentation`}}async function mi(e,t,n){let r;try{r=await b(e,hi(t),{allowFailure:!0,timeoutMs:5e3})}catch{return}if(r.exitCode!==0)return;let i=r.stdout.trim();if(!(!i.includes(`<hierarchy`)||!i.includes(`</hierarchy>`)))return{xml:i,metadata:n}}function hi(e){return[`sh`,`-c`,`cat "$1"; status=$?; rm -f "$1"; exit "$status"`,`agent-device-snapshot-helper-output`,e]}function gi(e){try{return Ei(bi(Tn(e).results))}catch{return null}}async function _i(e,t){try{await b(e,[`rm`,`-f`,t],{allowFailure:!0,timeoutMs:5e3})}catch{}}function vi(e){let t=Tn(e),n=bi(t.results);return{xml:Si(yi(t.status),n),metadata:{...Ei(n),transport:`instrumentation`}}}function yi(e){let t=[];for(let n of e){if(n.agentDeviceProtocol!==`android-snapshot-helper-v1`||n.outputFormat!==`uiautomator-xml`)continue;let{payloadBase64:e}=n;e!==void 0&&t.push({index:L(n.chunkIndex),count:L(n.chunkCount),payloadBase64:e})}return t}function bi(e){let n=e.find(e=>e.agentDeviceProtocol===Wn);if(!n)throw new t(`COMMAND_FAILED`,`Android snapshot helper did not return a final result`);if(n.ok!==`true`)throw new t(`COMMAND_FAILED`,xi(n),{errorType:n.errorType,helper:n,...hr(pr(n))});return n}function xi(e){return e.message&&e.message!==`null`?e.message:e.errorType||`Android snapshot helper returned an error`}function Si(e,n){if(e.length===0)throw new t(`COMMAND_FAILED`,`Android snapshot helper did not return XML chunks`,{helper:n});let r=Ci(e),i=Buffer.concat(Ti(wi(e,r),r)).toString(`utf8`);if(!i.includes(`<hierarchy`)||!i.includes(`</hierarchy>`))throw new t(`COMMAND_FAILED`,`Android snapshot helper output did not contain XML`,{xml:i});return i}function Ci(e){let n=e[0]?.count??e.length;if(n<1||e.length!==n||e.some(e=>e.count!==n))throw new t(`COMMAND_FAILED`,`Android snapshot helper returned incomplete XML chunks`,{expectedChunks:n,actualChunks:e.length});return n}function wi(e,n){let r=new Map;for(let i of e){if(i.index===void 0||i.index<0||i.index>=n)throw new t(`COMMAND_FAILED`,`Android snapshot helper returned invalid chunk index`,{chunkIndex:i.index,expectedChunks:n});if(r.has(i.index))throw new t(`COMMAND_FAILED`,`Android snapshot helper returned duplicate XML chunks`,{chunkIndex:i.index});r.set(i.index,i.payloadBase64)}return r}function Ti(e,n){let r=[];for(let i=0;i<n;i+=1){let a=e.get(i);if(a===void 0)throw new t(`COMMAND_FAILED`,`Android snapshot helper returned incomplete XML chunks`,{missingChunkIndex:i,expectedChunks:n});r.push(Buffer.from(a,`base64`))}return r}function Ei(e){return{helperApiVersion:e.helperApiVersion,outputFormat:Gn,waitForIdleTimeoutMs:L(e.waitForIdleTimeoutMs),waitForIdleQuietMs:L(e.waitForIdleQuietMs),timeoutMs:L(e.timeoutMs),maxDepth:L(e.maxDepth),maxNodes:L(e.maxNodes),rootPresent:Oi(e.rootPresent),captureMode:Di(e.captureMode),windowCount:L(e.windowCount),nodeCount:L(e.nodeCount),truncated:Oi(e.truncated),elapsedMs:L(e.elapsedMs)}}function Di(e){return e===`interactive-windows`||e===`active-window`?e:void 0}const L=k,Oi=A,ki=5e3,R=new Map,z=new Map;async function Ai(e){return await ji(e)!==void 0}async function ji(e){let t=e.deviceKey??`android:default`;if(await Kr({deviceKey:t,adb:e.adb,signal:e.signal}),!Ui()||!e.adbProvider?.spawn)return;let n=ci(e),r=Vi(n),i=await Ni({deviceKey:t,identity:Bi(t,r,e),options:e,resolved:r,startBudgetMs:Hi(n.commandTimeoutMs)});return i?{session:i,resolved:r,deviceKey:t}:void 0}function Mi(e){return R.get(e)}async function Ni(e){if(!Ii(e.identity))return await Pi(e.deviceKey,e.identity),R.get(e.deviceKey)??await Fi(e)}async function Pi(e,t){let n=R.get(e);!n||Ri(n,t)||await B(e,{force:$r(n.process)})}async function Fi(e){let n=Date.now();try{return await zi(e)}catch(r){e.options.signal?.throwIfAborted(),z.set(e.identity,Date.now()+Li(Date.now()-n)),h({level:`warn`,phase:`android_snapshot_helper_session_start_failed`,data:{deviceKey:e.deviceKey,reason:r instanceof t?r.details?.reason:void 0,detail:r instanceof Error?r.message:String(r)}});return}}function Ii(e){let t=z.get(e);return t===void 0?!1:t>Date.now()||(z.delete(e),!1)}function Li(e){return Math.min(Math.max(e,1e4),6e4)}function Ri(e,t){return e.identity===t&&!$r(e.process)}async function zi(e){let t=await gr();await e.options.adb([`forward`,`tcp:${t}`,`tcp:${t}`],{allowFailure:!1,timeoutMs:ki,signal:e.options.signal});let n=li({...e.resolved,outputPath:void 0,emitChunks:!1},{sessionPort:t}),r=e.options.adbProvider.spawn(n,{allowFailure:!0,captureOutput:!1}),i={identity:e.identity,deviceKey:e.deviceKey,helper:{packageName:e.resolved.packageName,runner:e.resolved.runner,helperVersion:e.options.helperVersion,helperVersionCode:e.options.helperVersionCode,sha256:e.options.helperSha256},port:t,adb:e.options.adb,process:r,startedAtMs:Date.now(),capturedCount:0};try{return await br(r,e.startBudgetMs,e.options.signal),R.set(e.deviceKey,i),z.delete(e.identity),ni(e.deviceKey),h({phase:`android_snapshot_helper_session_ready`,data:{deviceKey:e.deviceKey,port:t,packageName:e.resolved.packageName,runner:e.resolved.runner}}),i}catch(t){let n=Qr(r);try{r.kill(`SIGTERM`)}catch{}throw await Promise.all([ei(n.ended,250),Zr({adb:i.adb,process:i.process,port:i.port,packageName:i.helper.packageName,timeoutMs:Hr,forceStopRuntime:!0})]),await qr({deviceKey:e.deviceKey,packageName:i.helper.packageName,adb:i.adb,cause:t}),t}}function Bi(e,t,n){return JSON.stringify({deviceKey:e,packageName:t.packageName,runner:t.runner,helperVersion:n.helperVersion,helperVersionCode:n.helperVersionCode,helperSha256:n.helperSha256,waitForIdleTimeoutMs:t.waitForIdleTimeoutMs,waitForIdleQuietMs:t.waitForIdleQuietMs,timeoutMs:t.timeoutMs,maxDepth:t.maxDepth,maxNodes:t.maxNodes})}function Vi(e){let t=Math.min(e.timeoutMs,2e3);return{...e,timeoutMs:t,commandTimeoutMs:Math.min(e.commandTimeoutMs,t+3e3)}}function Hi(e){return Math.min(e,Math.max(Math.floor(e/2),5e3))}function Ui(){let e=x().environment.AGENT_DEVICE_ANDROID_SNAPSHOT_HELPER_SESSION;return e===void 0||!/^(0|false|no|off)$/i.test(e)}async function B(e,t={}){let n=R.get(e);if(!n)return!1;R.delete(e);let r=Qr(n.process),i=t.force===!0||t.signal?.aborted===!0,a=await Wi(n,r,i,t.signal),o=r.hasEnded(),s=a.acknowledged&&a.exited,c=s&&await Ht({adb:n.adb,deviceKey:e,signal:t.signal}),l=i?t.signal?.aborted===!0?250:Hr:ki,u=i?250:2e3,[d,f]=await Promise.all([ti({process:n.process,processExit:r,timeoutMs:u}),Zr({adb:n.adb,process:n.process,port:n.port,packageName:n.helper.packageName,timeoutMs:l,forceStopRuntime:t.resetRuntime===!0||!c})]),p=await qr({deviceKey:e,packageName:n.helper.packageName,adb:n.adb,cause:t.cause,...c?{release:`released`}:{}});return h({phase:`android_snapshot_helper_session_stop`,data:{deviceKey:e,port:n.port,capturedCount:n.capturedCount,lifetimeMs:Date.now()-n.startedAtMs,quitAcknowledged:a.acknowledged,quitExitObserved:s,releaseProvenByQuit:c,release:p,forceKilled:!o&&d,forced:i||t.signal?.aborted===!0,externalCleanupTimedOut:f.timedOut}}),!0}async function Wi(e,t,n,r){if(n)return{acknowledged:!1,exited:!1};let i=`quit-${Date.now()}`;try{let n=Cr(await _r(e.port,`quit ${i}`,1e3,r),i);return{acknowledged:n,exited:n&&await ei(t.ended,11e3,r)&&t.completedCleanly()}}catch{return{acknowledged:!1,exited:!1}}}async function Gi(e){await B(Wr(e))}async function Ki(){try{await Promise.allSettled([...R.keys()].map(async e=>{await B(e)}))}finally{R.clear(),z.clear(),ri(),Ut()}}async function qi(e){let t=await ji(e);if(t)return await Ji({session:t.session,deviceKey:t.deviceKey,options:e,resolved:t.resolved})}async function Ji(e){let{session:t,deviceKey:n,options:r,resolved:i}=e;try{let e=t.capturedCount>0,n=await vr({port:t.port,timeoutMs:i.timeoutMs,commandTimeoutMs:i.commandTimeoutMs,signal:r.signal});return t.capturedCount+=1,{xml:n.xml,metadata:{...n.metadata,transport:`persistent-session`,sessionReused:e}}}catch(e){await B(n,{force:!0,signal:r.signal,cause:e}),r.signal?.throwIfAborted(),h({level:`warn`,phase:`android_snapshot_helper_session_fallback`,data:{deviceKey:n,reason:e instanceof Error?e.message:String(e),uiAutomationConnectionTimeout:ct(e)===`accessibility-timeout`}});return}}async function Yi(e){let n=Mi(e.deviceKey);if(!n)return;if(!Xi(n.helper,e.helper)){h({level:`warn`,phase:`android_snapshot_helper_session_touch_identity_mismatch`,data:{deviceKey:e.deviceKey,sessionHelper:n.helper,requestedHelper:e.helper}}),await B(e.deviceKey);return}let r=`${e.action}-${Date.now()}-${Math.random().toString(16).slice(2)}`,i=e.payloadBase64?`${e.action} ${r} ${e.payloadBase64}`:`${e.action} ${r}`,a;try{a=xr(await _r(n.port,i,e.timeoutMs)),Sr(a,r)}catch(t){throw await B(e.deviceKey),t}if(a.ok!==`true`)throw new t(`COMMAND_FAILED`,a.message||a.errorType||`Android automation helper ${e.action} failed`,{errorType:a.errorType,helper:a});return a}function Xi(e,t){return e.packageName===t.packageName&&e.runner===t.runner&&Zi(e.helperVersion,t.helperVersion)&&Zi(e.helperVersionCode,t.helperVersionCode)&&Zi(e.sha256,t.sha256)}function Zi(e,t){return e===void 0||t===void 0||e===t}const Qi=`android-touch-plan-v1`,$i=45e3,ea=`ANDROID_TOUCH_HELPER_NO_FINAL_RESULT`,ta=`ANDROID_TOUCH_HELPER_REPORTED_FAILURE`;async function na(e,t){let n=await aa(e),r=sa(t),i=Math.max(45e3,r.durationMs+15e3),a=Buffer.from(JSON.stringify({protocol:Qi,...r})).toString(`base64`),o=await m(`android_touch_helper_gesture`,async()=>{let e=await Yi({deviceKey:n.deviceKey,action:`gesture`,helper:ia(n.artifact),payloadBase64:a,timeoutMs:i});return e?{...da(e),helperTransport:`persistent-session`}:{...await la({adb:n.adb,runner:n.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`gesture`,`-e`,`payloadBase64`,a],timeoutMs:i,readResult:da}),helperTransport:`instrumentation`}},{packageName:n.artifact.manifest.packageName,version:n.artifact.manifest.version});return{backend:`android-helper`,helperVersion:n.artifact.manifest.version,installReason:n.install.reason,...o}}async function ra(e,t={}){let n=await aa(e);t.helperSessionScope===`daemon-session`&&await Ai(si({adb:n.adb,adbProvider:n.adbProvider,artifact:n.artifact,deviceKey:n.deviceKey}));try{let e=await Yi({deviceKey:n.deviceKey,action:`viewport`,helper:ia(n.artifact),timeoutMs:$i});if(e)return fa(e)}catch(e){await B(n.deviceKey),h({level:`warn`,phase:`android_touch_helper_viewport_session_fallback`,data:{reason:e instanceof Error?e.message:String(e)}})}return await la({adb:n.adb,runner:n.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`viewport`],timeoutMs:$i,readResult:fa})}function ia(e){return{packageName:e.manifest.packageName,runner:e.manifest.instrumentationRunner,helperVersion:e.manifest.version,helperVersionCode:e.manifest.versionCode,sha256:e.manifest.sha256}}async function aa(e){let t=C(e),n=t.snapshotHelperArtifact??await oa(),r=Wr(e);await Kr({deviceKey:r,adb:t.exec});let i=await m(`android_touch_helper_install`,async()=>await or({adb:t.exec,adbProvider:t,artifact:n,deviceKey:r,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode});return h({phase:`android_touch_helper_install_decision`,data:i}),i.installed&&await B(r),{adb:t.exec,adbProvider:t,artifact:n,install:i,deviceKey:r}}async function oa(){return await In({helperDirName:`snapshot-helper`,manifestFileName:e=>`agent-device-android-snapshot-helper-${e}.manifest.json`,parseManifest:e=>{let t=Jn(e);return{...t,assetName:t.assetName??`agent-device-android-snapshot-helper-${t.version}.apk`}},unavailableMessage:`Android touch gestures require the bundled Android automation helper artifact, but it was not found or could not be read`})}function sa(e){return{kind:e.topology===`single`?`swipe`:`transform`,durationMs:e.durationMs,pointers:e.pointers.map(ca)}}function ca(e){return{pointerId:e.pointerId,samples:e.samples.map(({offsetMs:e,point:t})=>({offsetMs:e,x:t.x,y:t.y}))}}async function la(e){let n=await b(e.adb,[`am`,`instrument`,`-w`,...e.extraArgs,e.runner],{allowFailure:!0,timeoutMs:e.timeoutMs}),r;try{r=ua(`${n.stdout}\n${n.stderr}`)}catch(e){if(e instanceof t){if(e.code===ta)throw new t(`COMMAND_FAILED`,e.message,e.details,e);if(e.code!==ea)throw e}throw new t(`COMMAND_FAILED`,n.exitCode===0?`Android automation helper output could not be parsed`:`Android automation helper failed before returning parseable output`,Te(n),e)}if(n.exitCode!==0)throw new t(`COMMAND_FAILED`,`Android automation helper failed`,Te(n,{helper:r}));return e.readResult(r)}function ua(e){let n=Tn(e).results.find(e=>e.agentDeviceProtocol===Wn);if(!n)throw new t(ea,`Android automation helper did not return a final result`);if(n.ok!==`true`)throw new t(ta,n.message&&n.message!==`null`?n.message:n.errorType||`Android automation helper returned an error`,{errorType:n.errorType,helper:n});return n}function da(e){return{helperKind:e.kind,helperApiVersion:e.helperApiVersion,injectedEvents:k(e.injectedEvents),elapsedMs:k(e.elapsedMs)}}function fa(e){let n=k(e.x),r=k(e.y),i=k(e.width),a=k(e.height);if(n===void 0||r===void 0||i===void 0||a===void 0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);let o=pa(e);return{viewport:jn({x:n,y:r,width:i,height:a}),...o?{keyboard:o}:{}}}function pa(e){let t=k(e.keyboardX),n=k(e.keyboardY),r=k(e.keyboardWidth),i=k(e.keyboardHeight);if(t!==void 0&&n!==void 0&&r!==void 0&&i!==void 0)return{x:t,y:n,width:r,height:i}}function ma(e){if(e.topology===`two`||e.intent===`longPress`)return e;let{releaseBehavior:t,...n}=e,[{pointerId:r,samples:i}]=n.pointers,a=[...new Set([...rt(e.durationMs,`android`),...i.map(({offsetMs:e})=>e)])].sort((e,t)=>e-t),o=0,s=a.map(e=>{for(;o<i.length-2&&e>i[o+1].offsetMs;)o+=1;let n=i[o],r=i[o+1],a=r.offsetMs-n.offsetMs,s=(e-n.offsetMs)/a;return{offsetMs:e,point:e===r.offsetMs||a===0?r.point:at(n.point,r.point,t===`controlled`?ha(s,a):s)}}),c=[s[0],s[1],s[2],...s.slice(3)];return{...n,pointers:[{pointerId:r,samples:c}]}}function ha(e,t){let n=Math.min(16/t,.5);return e<n?e**2/n:1-(1-e)**2/(1-n)}async function ga(e,t){let n=ma(t),r=Pe(e);if(r){let e=n.intent===`longPress`?{...n,viewport:jn(await r.gestureViewport())}:n;return{backend:`provider-native-touch`,...await r.touch(e)??{}}}return await na(e,n)}async function _a(e,t={}){return(await va(e,t)).viewport}async function va(e,t={}){let n=Pe(e);return n?{viewport:jn(await n.gestureViewport())}:await ra(e,t)}async function ya(e,t,n){await T(e,[`input`,`tap`,t,n])}async function ba(e,t,n){let r=De(t);await T(e,[`input`,...n&&n>0?[`keyevent`,`--longpress`]:[`keyevent`],r])}async function xa(e){await T(e,[`input`,`keyevent`,`4`])}async function Sa(e){await T(e,[`input`,`keyevent`,`3`])}async function Ca(e){await T(e,[`input`,`keyevent`,`ENTER`])}async function wa(e,t){let n=Pa(t);await T(e,[`settings`,`put`,`system`,`accelerometer_rotation`,`0`]),await T(e,[`settings`,`put`,`system`,`user_rotation`,n]),await Ea(e,t,n)}const Ta=15e3;async function Ea(e,n,r){let i=Date.now()+Ta,a=await Da(e,n,i);for(;a!==void 0&&a!==r&&Date.now()<i;)await g(Math.min(500,Oa(i))),a=await Da(e,n,i);if(a!==void 0&&a!==r)throw new t(`COMMAND_FAILED`,`orientation ${n} did not take effect: the display still reports rotation ${a} after ${Ta}ms`,{requestedRotation:Number(r),observedRotation:Number(a),hint:"The foreground app may pin its orientation, or the device may ignore user_rotation. Check `adb shell dumpsys display | grep mCurrentOrientation` and the app manifest."})}async function Da(e,n,r){try{let t=await T(e,[`dumpsys`,`display`],{timeoutMs:Oa(r)});return/mCurrentOrientation=(\d)/.exec(t.stdout)?.[1]}catch(e){throw new t(`COMMAND_FAILED`,`orientation ${n} could not confirm the display rotation: ${e instanceof Error?e.message:String(e)}`,{hint:"The device did not answer `dumpsys display` within the orientation budget."})}}function Oa(e){return Math.max(1,e-Date.now())}async function ka(e){await T(e,[`input`,`keyevent`,`187`])}async function Aa(e,t,n,r=800){let i={x:t,y:n};return await ga(e,{topology:`single`,intent:`longPress`,durationMs:r,pointers:[{pointerId:0,samples:[{offsetMs:0,point:i},{offsetMs:r,point:i}]}]})}async function ja(e,t,n){await ya(e,t,n)}async function Ma(e,t,n){let{viewport:r,keyboard:i}=await va(e,{helperSessionScope:n?.helperSessionScope}),a=Na(t,r,i),o=ue({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:a.viewport.width,referenceHeight:a.viewport.height}),s={...o,referenceWidth:a.viewport.x+a.viewport.width,referenceHeight:a.viewport.y+a.viewport.height,x1:a.viewport.x+o.x1,y1:a.viewport.y+o.y1,x2:a.viewport.x+o.x2,y2:a.viewport.y+o.y2},c=Math.max(n?.durationMs??300,16),l=await ga(e,{...it({intent:`pan`,origin:{x:s.x1,y:s.y1},delta:{x:s.x2-s.x1,y:s.y2-s.y1},durationMs:c},a.viewport,`android`),releaseBehavior:n?.releaseBehavior??`controlled`});return{...s,...a.evidence,...n?.durationMs===void 0?{}:{durationMs:c},...l}}function Na(e,t,n){if(n===void 0)return{viewport:t,evidence:{}};let r=de(t,n);if(r.kind===`occluded`)throw le(e,{keyboardMinY:r.keyboardMinY,visibleHeight:r.visibleHeight,viewportHeight:t.height});return r.kind===`avoided`?{viewport:r.viewport,evidence:{keyboardAvoided:!0,keyboardMinY:r.keyboardMinY}}:{viewport:t,evidence:{}}}function Pa(e){let n=xe[e];if(n===void 0)throw new t(`INVALID_ARGS`,`Unsupported Android rotation: ${e}`);return String(n)}async function Fa(e){let n=(await T(e,[`wm`,`size`])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!n)throw new t(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(n[1]),height:Number(n[2])}}async function Ia(e,t,n){return t===`wait`?await La(n.captureNodes,n.timeoutMs??1e4):t===`get`?Ua((await Ha(n.captureNodes))?.alert??null):await Ra(e,t,n.captureNodes)}async function La(e,n){let r=Date.now(),i=await Va(e,n);if(!i)throw new t(`COMMAND_FAILED`,`alert wait timed out`);return{kind:`alertWait`,platform:`android`,action:`wait`,alert:i.alert,waitedMs:Date.now()-r,...fe(`Alert visible`)}}async function Ra(e,n,r){let i=await Va(r,pe);if(!i)throw new t(`COMMAND_FAILED`,`alert not found`,{hint:`If a sheet is visible in snapshot but alert reports no alert, it is likely app-owned UI. Use snapshot -i and press the visible label/ref.`});let a=rn(i.buttons,n);if(a)return await ya(e,a.x,a.y),await za(i.alert,n,r),Wa(n,i.alert,a.label,{x:a.x,y:a.y});if(n===`dismiss`)return await xa(e),await za(i.alert,n,r),Wa(n,i.alert,`Back`);throw new t(`COMMAND_FAILED`,`alert accept found an alert but no accept button`,{alert:i.alert,hint:`Inspect alert get --json for visible buttons, then use press by visible label/ref if needed.`})}async function za(e,n,r){let i=Date.now();for(;;){let a=await Ha(r);if(!a||!Ba(a.alert,e))return;if(Date.now()-i>=2e3)throw new t(`COMMAND_FAILED`,`alert ${n} did not dismiss the visible alert`,{alert:e,hint:`The alert button was pressed but the dialog is still visible. Inspect alert get --json, then press the visible button by label/ref or retry.`});await g(300)}}function Ba(e,t){return e.title===t.title&&e.buttons.join(`\0`)===t.buttons.join(`\0`)}async function Va(e,t){let n=Date.now();for(;Date.now()-n<t;){let t=await Ha(e);if(t)return t;await g(300)}return null}async function Ha(e){return tn(await m(`snapshot_capture`,e,{backend:`android`,purpose:`alert`}))}function Ua(e){return{kind:`alertStatus`,platform:`android`,action:`get`,alert:e,...fe(e?`Alert visible`:`No alert visible`)}}function Wa(e,t,n,r){return{kind:`alertHandled`,platform:`android`,action:e,handled:!0,alert:t,button:n,...r?{coordinates:r}:{},...fe(`Alert ${e}ed`)}}const Ga=`android.intent.category.LAUNCHER`,Ka=`android.intent.category.DEFAULT`;async function qa(e,t){await b(e,[`am`,`force-stop`,t])}async function Ja(e,t,n=[Ga]){for(let r of n){let n=await b(e,[`cmd`,`package`,`resolve-activity`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,r,t],{allowFailure:!0});if(n.exitCode!==0)continue;let i=mt(n.stdout);if(i)return i}return null}async function Ya(e,n,r={}){let i=r.category??Ga;if(r.activity){await b(e,[`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,Ka,`-c`,i,`-n`,Xa(n,r.activity)]);return}let a=await b(e,[`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,Ka,`-c`,i,`-p`,n],{allowFailure:!0});if(a.exitCode===0&&!ht(a.stdout,a.stderr))return;let o=await Ja(e,n,[i]);if(!o)throw new t(`COMMAND_FAILED`,`Failed to resolve Android launch component for ${n}`,{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode});await b(e,[`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,Ka,`-c`,i,`-n`,o])}function Xa(e,t){return t.includes(`/`)?t:`${e}/${t.startsWith(`.`)?t:`.${t}`}`}let Za=null;function Qa(e){return`${e.PATH??``}::${e.AGENT_DEVICE_BUNDLETOOL_JAR??``}`}async function $a(e){let n=Qa(e);if(Za?.key===n)return Za.invocation;if(await we(`bundletool`)){let e={cmd:`bundletool`,prefixArgs:[]};return Za={key:n,invocation:e},e}let r=await Ee(e.AGENT_DEVICE_BUNDLETOOL_JAR,`AGENT_DEVICE_BUNDLETOOL_JAR`);if(!r)throw new t(`TOOL_MISSING`,`bundletool not found in PATH. Install bundletool or set AGENT_DEVICE_BUNDLETOOL_JAR to a bundletool-all.jar path.`);let i={cmd:`java`,prefixArgs:[`-jar`,r]};return Za={key:n,invocation:i},i}async function eo(e,t,n){let r=await $a(n);await Ce(r.cmd,[...r.prefixArgs,...e],{signal:t})}function to(e){return E.extname(e).toLowerCase()===`.aab`}async function no(e,t,n={}){let r=C(e),i=`universal`;if(r.installBundle){await r.installBundle(t,{mode:i,signal:n.signal});return}let a=x().files,o=await a.makeTempDirectory(`agent-device-aab-`),s=E.join(o,`bundle.apks`);try{await eo([`build-apks`,`--bundle`,t,`--output`,s,`--mode`,i],n.signal,n.environment??x().environment),await eo([`install-apks`,`--apks`,s,`--device-id`,e.id],n.signal,n.environment??x().environment)}finally{await a.remove(o,{recursive:!0,force:!0})}}async function ro(e,t,n={}){if(to(t)){await no(e,t,n);return}await He(t,{device:e,replace:!0,signal:n.signal})}async function io(e,t,n={}){await yt(e,async()=>{e.booted||await ut(e.id,void 0,n.signal),await ro(e,t,n)})}const ao=[`mInputShown`,`mIsInputViewShown`,`isInputViewShown`,`mDecorViewVisible`,`mWindowVisible`,`mInShowWindow`],oo=new Map([[2,`number`],[3,`phone`],[4,`datetime`]]),so=new Set([32,208]),co=new Set([128,224,144]);async function lo(e){return await V(y(e))}async function V(e){let t=await b(e,[`dumpsys`,`input_method`],{allowFailure:!0});if(t.exitCode!==0)throw w(`Failed to query Android keyboard state`,t);return po(t.stdout)}async function uo(e){return await fo(y(e))}async function fo(e){let n=await V(e),r=n,i=0;for(;r.visible&&i<2;)await b(e,[`input`,`keyevent`,`111`]),i+=1,await g(120),r=await V(e);if(n.visible&&r.visible)throw new t(`UNSUPPORTED_OPERATION`,`Android keyboard dismiss is unavailable for the current IME without back navigation.`,{attempts:i,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner});return{attempts:i,wasVisible:n.visible,dismissed:n.visible&&!r.visible,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}function po(e){let t=vo(e)??mo(e),n=ho(e),r=go(e,/\bpackageName=([A-Za-z0-9_.]+)\b/g),i=go(e,/\b(?:resourceId|resource-id)=([^\s,}]+)/g),a=f(e),o=ee(r,i,a);return _o(r,i,a),{visible:t??!1,inputType:n,type:n?So(n):void 0,inputMethodPackage:a,focusedPackage:r,focusedResourceId:i,inputOwner:o}}function mo(e){let t=e.match(/\bmImeWindowVis=0x([0-9a-fA-F]+)\b/)?.[1];if(!t)return null;let n=Number.parseInt(t,16);return Number.isNaN(n)?null:!!(n&1)}function ho(e){let t=go(e,/\binputType=0x([0-9a-fA-F]+)\b/gi);return t?`0x${t.toLowerCase()}`:void 0}function go(e,t){let n;for(let r of e.matchAll(t))n=r[1];return n}function _o(e,t,n){n||!u(e)&&!c(t)||h({level:`warn`,phase:`android_input_ownership_fallback`,data:{focusedPackage:e,focusedResourceId:t}})}function vo(e){return bo(yo(e,ao))}function yo(e,t){let n=new Map,r=RegExp(`\\b(${t.join(`|`)})=([a-zA-Z]+)\\b`,`g`);for(let t of e.matchAll(r)){let e=t[1],r=t[2]?.toLowerCase();!e||r!==`true`&&r!==`false`||n.set(e,r===`true`)}return n}function bo(e){if(e.size===0)return null;let t=xo(e,[`mWindowVisible`,`mDecorViewVisible`,`mInShowWindow`]);if(t!==void 0)return t;let n=e.get(`mInputShown`);return n===void 0?xo(e,[`mIsInputViewShown`,`isInputViewShown`])??null:n}function xo(e,t){for(let n of t){let t=e.get(n);if(t!==void 0)return t}}function So(e){let t=Number.parseInt(e.replace(/^0x/i,``),16);if(Number.isNaN(t))return`unknown`;let n=t&15,r=oo.get(n);if(r)return r;if(n!==1)return`unknown`;let i=t&4080;return so.has(i)?`email`:co.has(i)?`password`:`text`}async function Co(e){return await wo(y(e))}async function wo(e){return Oo(await Do(e,[`cmd`,`clipboard`,`get`,`text`],`read`))}async function To(e,t){await Eo(y(e),t)}async function Eo(e,t){await Do(e,[`cmd`,`clipboard`,`set`,`text`,t],`write`)}async function Do(e,t,n){let{androidClipboardShellCommandUnavailableError:r,classifyAndroidClipboardShellResponse:i}=await import(`./clipboard-shell-response.js`),a=await b(e,t,{allowFailure:!0}),o=i(a);if(o===`no-shell-command`)throw r(n);if(o===`call-failed`)throw w(`Failed to ${n} Android clipboard text`,a);return a.stdout}function Oo(e){let t=e.replaceAll(`\r
9
9
  `,`
10
10
  `).replace(/\n$/,``),n=t.match(/^clipboard text:\s*(.*)$/i);return n?n[1]??``:t.trim().toLowerCase()===`null`?``:t}const ko=`com.callstack.agentdevice.imehelper`,Ao=`android-ime-helper-v1`;async function jo(e){return e.imeHelperArtifact??await Mo()}async function Mo(){return await x().resolveHelperArtifact({helperDirName:`ime-helper`,manifestFileName:e=>`agent-device-android-ime-helper-${e}.manifest.json`,parseManifest:No,unavailableMessage:`Android test IME text entry requires the bundled Android IME helper artifact, but it was not found or could not be read`})}const H=`IME helper`;function No(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Android IME helper manifest must be an object.`);let n=e;return{name:O(n.name,`name`,`android-ime-helper`,H),version:Cn(n.version,`version`,H),assetName:Cn(n.assetName,`assetName`,H),sha256:wn(n.sha256,H),packageName:O(n.packageName,`packageName`,ko,H),versionCode:Sn(n.versionCode,`versionCode`,H),serviceComponent:O(n.serviceComponent,`serviceComponent`,`com.callstack.agentdevice.imehelper/.TestInputMethodService`,H),broadcastProtocol:O(n.broadcastProtocol,`broadcastProtocol`,Ao,H)}}const Po=new Set;async function Fo(e){return await x().ensureHelperInstalled({cache:Po,installTimeoutMs:3e4,helperLabel:`Android IME helper`},e)}function Io(){Po.clear()}function U(e){return`${e.platform}:${e.id}`}function Lo(e){return e===ko}async function Ro(e,t,n){await Bo(e,t,`com.callstack.agentdevice.imehelper.ACTION_INPUT_TEXT_B64`,{text:Buffer.from(n,`utf8`).toString(`base64`)})}async function zo(e,t){await Bo(e,t,`com.callstack.agentdevice.imehelper.ACTION_CLEAR_TEXT`,{})}async function Bo(e,t,n,r){let i=[`am`,`broadcast`,`-p`,t,`-a`,n];i.push(`--es`,`protocol`,Ao);for(let[e,t]of Object.entries(r))i.push(`--es`,e,t);let a=await b(e,i,{allowFailure:!0,timeoutMs:1e4});if(a.exitCode!==0)throw w(`Android IME helper broadcast failed`,a,{action:n,packageName:t})}const Vo=`agent_device_ime_helper_previous_ime`,Ho=`secure`,Uo=`default_input_method`,Wo={previousIme:Vo,defaultInputMethod:Uo};async function W(e){let t=await b(e,[`settings`,`get`,Ho,Uo],{allowFailure:!0,timeoutMs:5e3});return Yo(t.exitCode===0?t.stdout:``)}async function G(e){let t=await b(e,[`settings`,`get`,Ho,Vo],{allowFailure:!0,timeoutMs:5e3});return Yo(t.exitCode===0?t.stdout:``)||void 0}async function Go(e,t){return(await b(e,[`settings`,`put`,Ho,Vo,t],{allowFailure:!0,timeoutMs:5e3})).exitCode===0&&await G(e)===t}async function Ko(e){await b(e,[`settings`,`delete`,Ho,Vo],{allowFailure:!0,timeoutMs:5e3})}async function qo(e,t,r){try{(t?await Go(e,t):await Jo(e))||S({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:t!==void 0}})}catch(e){S({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:t!==void 0,error:n(e).message}})}}async function Jo(e){return await Ko(e),await G(e)===void 0}function Yo(e){let t=e.trim();return!t||t===`null`?``:t}const K=new Set,Xo=new Map;function Zo(e){return K.has(U(e))}function Qo(e,t,n){return Pt(Xo,`${e}:${t}`,n)}function $o(){K.clear()}function es(e,t){let n=U(e);t?K.add(n):K.delete(n)}async function ts(e,t){return await Qo(t.stateDir,e.id,async()=>{let n=U(e);if(!K.has(n))return{restored:!1,reason:`no-record`};K.delete(n);let r=await rs(y(e),e);return ns(r.reason)&&await x().imeRecoveryMarkers.clear(t.stateDir,e.id),r})}function ns(e){return e===`ok`||e===`helper-not-active`||e===`no-record`}async function rs(e,t){let n=t.id;if(K.has(U(t)))return{restored:!1,reason:`owned-by-live-session`};let r=await G(e);if(!r)return{restored:!1,reason:`no-record`};let i=await W(e);if(i!==`com.callstack.agentdevice.imehelper/.TestInputMethodService`)return S({level:`debug`,phase:`android_test_ime_restore_skipped`,data:{device:n,currentIme:i,previousIme:r}}),{restored:!1,previousIme:r,reason:`helper-not-active`};await b(e,[`ime`,`set`,r],{allowFailure:!0,timeoutMs:1e4});let a=await W(e);return a===r?(await Ko(e).catch(()=>{}),S({phase:`android_test_ime_restored`,data:{device:n,previousIme:r}}),{restored:!0,previousIme:r,reason:`ok`}):(S({level:`warn`,phase:`android_test_ime_restore_failed`,data:{device:n,previousIme:r,afterIme:a}}),{restored:!1,previousIme:r,reason:`set-failed`})}async function is(e){let t=x().imeRecoveryMarkers,r=await t.read(e.stateDir);if(r.length===0)return;let i;try{i=new Set(await e.listSerials())}catch(e){S({level:`debug`,phase:`android_test_ime_startup_scan_failed`,data:{error:n(e).message}});return}for(let a of r){if(!i.has(a))continue;let r={platform:`android`,id:a,name:a,kind:a.startsWith(`emulator-`)?`emulator`:`device`,booted:!0};try{await Qo(e.stateDir,a,async()=>{let n=await rs(y(r),r);n.restored&&S({level:`warn`,phase:`android_test_ime_orphan_restored`,data:{device:a,previousIme:n.previousIme}}),ns(n.reason)&&await t.clear(e.stateDir,a)})}catch(e){S({level:`debug`,phase:`android_test_ime_orphan_restore_failed`,data:{device:a,error:n(e).message}})}}}async function as(){x();try{return(await Ne(Xe([`devices`]),{timeoutMs:5e3})).stdout.split(`
11
- `).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`List of devices`)).map(e=>e.split(/\s+/)).filter(e=>e[1]===`device`).map(e=>e[0])}catch{return[]}}const os=2e3;async function ss(e=x().environment,t=x().files){let n=e.ANDROID_HOME||e.ANDROID_SDK_ROOT,r=await ys(n,t),i=await Nt(`adb`,[`version`]);return i?hs({license:r,sdkRoot:n,versionLine:i}):vs(n,r)}async function cs(e,t){if(e.platform!==`android`)return[];let n=y(e,t.transportOverrides.androidAdb),r=[];return t.shouldProbeMetro&&r.push(await ms(n,e.id,t.metroPort)),r.push(await ls(n,e)),r}async function ls(e,t){try{let n=await W(e),r=Zo(t);return n===await us()&&!r?await ds(e,t,n):fs(t,n,r)}catch(e){return ps(e)}}async function us(){try{return(await Mo()).manifest.serviceComponent}catch{return}}async function ds(e,t,n){let r=(await b(e,[`settings`,`get`,`secure`,Wo.previousIme],{allowFailure:!0,timeoutMs:os})).stdout.trim(),i=r&&r!==`null`?r:void 0;return{id:`android-test-ime`,status:`fail`,summary:`Android test IME helper is the active input method on ${t.id}, but no active session owns it -- likely left over from a crashed session.`,hint:`A stuck test IME leaves the real keyboard unavailable on this device until restored.`,command:i?`adb -s ${t.id} shell ime set ${i}`:`adb -s ${t.id} shell ime list -s`,evidence:{currentIme:n,previousIme:i}}}function fs(e,t,n){return{id:`android-test-ime`,status:`pass`,summary:n?`Android test IME helper is active for this session on ${e.id}.`:`Android test IME helper is not active on ${e.id}; the device's normal IME is in use.`,evidence:{currentIme:t}}}function ps(e){let t=n(e);return{id:`android-test-ime`,status:`warn`,summary:`Could not inspect the Android test IME helper state.`,hint:t.message,evidence:{code:t.code}}}async function ms(e,t,r){try{let n=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:os}),i=`tcp:${r} tcp:${r}`,a=n.stdout.includes(i);return{id:`android-reverse`,status:a?`pass`:`warn`,summary:a?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:a?void 0:`adb -s ${t} reverse tcp:${r} tcp:${r}`,evidence:{stdout:n.stdout.trim()}}}catch(e){let t=n(e);return{id:`android-reverse`,status:`warn`,summary:`Could not inspect Android adb reverse mappings.`,hint:t.message,evidence:{code:t.code}}}}function hs(e){return{id:`toolchain`,status:gs(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${_s(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function gs(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function _s(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function vs(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function ys(e,t){if(!e)return`unknown`;try{return await t.access(E.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}function bs(e,t){if(!t)return{expected:e,actual:null,failureReason:`text_mismatch`,targetInput:null,actualInput:null};let n=ws(t),r={failureReason:t.reason??`text_mismatch`,targetInput:Ss(t.targetInput),actualInput:Ss(t.actualInput)};return n?{...r,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??``).length}:{...r,expected:e,actual:t.actual}}function q(e){return e?e.password?!0:xs(e.text):!1}function xs(e){return e?Array.from(e).every(Cs):!1}function Ss(e){if(!e)return null;let t=q(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function Cs(e){return e===`•`||e===`*`||e===`●`}function ws(e){return e.masked===!0||q(e.targetInput)||q(e.actualInput)}const Ts=new WeakMap;function Es(e,t){return t&&Ts.set(e,t),e}function Ds(e){return Ts.get(e)}function Os(e){return e.clickable}function ks(e){return e.focusable||e.focused===!0}function J(e){return Os(e)||ks(e)}function As(e){let t=e.trim();return t?/^[\w.]+:id\/[\w.-]+$/i.test(t):!1}function js(e,t){return{raw:e,...t?{effectiveRect:t}:{}}}function Ms(e,t,n){if(!e)return;let r=Fs(e);return t&&(r=Ps(r,t)),n&&(r=Ps(r,n)),r}function Ns(e){return{...e.raw,...e.effectiveRect?{rect:e.effectiveRect}:{rect:void 0},hittable:e.raw.hittable===!0&&ie(e.effectiveRect)?!0:void 0}}function Ps(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),o=i>n&&a>r;return{x:o?n:e.x,y:o?r:e.y,width:o?i-n:0,height:o?a-r:0}}function Fs(e){return{x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)}}function Is(e,t){let n=new Set;return Ls(e,n,t),zs(e,n,t),n}function Ls(e,t,n){for(let r of e.children){if(n?.check(`work`),r.visibleToUser===!1){t.add(r);continue}Ls(r,t,n)}}function Rs(e,t,n){return n?.check(`work`),e.children.filter(e=>!t.has(e)&&e.visibleToUser!==!1)}function zs(e,t,n){let r=Rs(e,t,n).filter(Vs);if(r.length<2)return;let i=r.filter(e=>Hs(e)&&Us(e));if(i.length===0)return;let a=Bs(i);for(let r of Rs(e,t,n))n?.check(`work`),Hs(r)&&(Us(r)&&(a===void 0||r.windowLayer===a)||t.add(r))}function Bs(e){let t=e.map(e=>e.windowLayer).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function Vs(e){return e.windowIndex!==void 0||e.windowType!==void 0}function Hs(e){return e.windowType===1}function Us(e){return e.windowActive===!0||e.windowFocused===!0}function Ws(e,t,n,r,i){let a=new Set(e.sourceNodes),o=Ks(t,i),s=Gs(o,n,qs(o,a,i),i);if(!s)return{nodes:[],sourceNodes:[]};let c=new Set(Ks([s],i)),l=[];for(let[t,n]of e.sourceNodes.entries())i.check(`work`),c.has(n)&&l.push(t);if(l.length===0)return{nodes:[],sourceNodes:[]};let u=1/0;for(let t of l)i.check(`work`),u=Math.min(u,e.nodes[t]?.depth??0);let d=[];for(let t of l)i.check(`work`),(e.nodes[t]?.depth??0)-u<=r&&d.push(t);return i.consume(d.length),{nodes:oe(d.map(t=>e.nodes[t]),u),sourceNodes:d.map(t=>e.sourceNodes[t])}}function Gs(e,t,n,r){for(let i of e)if(r.check(`work`),se(i,t)&&n.has(i))return i;return null}function Ks(e,t){let n=[],r=[...e].reverse();for(;r.length>0;){t.check(`work`);let e=r.pop();n.push(e);for(let n=e.children.length-1;n>=0;--n)t.check(`work`),r.push(e.children[n])}return n}function qs(e,t,n){let r=new Set;for(let i=e.length-1;i>=0;--i){n.check(`work`);let a=e[i];if(t.has(a)){r.add(a);continue}for(let e of a.children)if(n.check(`work`),r.has(e)){r.add(a);break}}return r}function Js(e,t,n,r,i){if(e.visibleToUser===!1)return!1;let a=Ys(e);return t.interactiveOnly?Xs(e,a,n,r,i):a.isStructural||a.isVisual?$s(e,a,r):!0}function Ys(e){let t=tc(e.type),n=!!(e.label&&e.label.trim().length>0),r=!!(e.identifier&&e.identifier.trim().length>0);return{type:t,hasMeaningfulText:n&&!As(e.label??``),hasMeaningfulId:r&&!As(e.identifier??``),isStructural:nc(t),isVisual:t===`imageview`||t===`imagebutton`}}function Xs(e,t,n,r,i){return Qs(e)?!1:J(e)||ae(t.type)&&r?!0:Zs(t,n,r,i)}function Zs(e,t,n,r){return!e.hasMeaningfulText&&!e.hasMeaningfulId||e.isVisual||e.isStructural&&!r&&!t?!1:t||n||r}function Qs(e){return!!(e.rect&&(e.rect.width<=0||e.rect.height<=0))}function $s(e,t,n){return J(e)||t.hasMeaningfulText||t.hasMeaningfulId?!0:n}function ec(e){if(!e)return!1;let t=tc(e);return t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)}function tc(e){return e?e.toLowerCase():``}function nc(e){let t=e.split(`.`).pop()??e;return t.includes(`layout`)||t===`viewgroup`||t===`view`}function rc(e,t,n,r){return{...js(e,t),...n?{clipsDescendants:!0}:{},...r?{windowRect:r}:{}}}const ic=`ANDROID_SNAPSHOT_PRESENTATION_FAILED`;var Y=class extends Error{code=ic;qualityReasonCode=`presentation-failed`;details;analysis;constructor(e,t,n){super(e),this.name=`AndroidSnapshotPresentationFailure`,this.details=t,this.analysis=n}};function ac(e){return e instanceof Y?e.code===ic:!!(e&&typeof e==`object`&&e.code===ic)}var oc=class{workUnits=0;options;defaultMaxWorkUnits;deadlineAtMs;constructor(e,t){this.options=e,this.defaultMaxWorkUnits=t;let n=e.now??Date.now;this.deadlineAtMs=e.deadlineAtMs??n()+dc()}get workUnitCount(){return this.workUnits}check(e){this.consume(1)}consume(e){this.workUnits+=e;let t=this.options.maxWorkUnits??this.defaultMaxWorkUnits;if(this.workUnits>t)throw new Y(`Android snapshot presentation exceeded its linear work budget`,{phase:`complexity`,workUnits:this.workUnits,maxWorkUnits:t});if((this.options.now??Date.now)()>=this.deadlineAtMs)throw new Y(`Android snapshot presentation exceeded its cooperative deadline`,{phase:`deadline`,workUnits:this.workUnits,deadlineAtMs:this.deadlineAtMs,maxWorkUnits:t})}};function sc(e,t){return new oc(e??{},t)}function cc(e,t,n){let r=new Map;for(let i of e){n.check(`regular-invariant`);let e=lc(i,r,t),a=i.effectiveRect;if(!a||!ie(a)){if(Ns(i).hittable===!0)throw new Y(`Android regular snapshot node ${i.raw.index} with degenerate effective geometry was marked hittable`,{phase:`regular-invariant`,workUnits:n.workUnitCount,nodeIndex:i.raw.index,frame:a});r.set(i.raw.index,e);continue}if(e&&!uc(a,e))throw new Y(`Android regular snapshot node ${i.raw.index} escaped its cumulative clip`,{phase:`regular-invariant`,workUnits:n.workUnitCount,nodeIndex:i.raw.index,frame:a,clip:e});r.set(i.raw.index,i.clipsDescendants?a:e)}}function lc(e,t,n){let r=e.raw.parentIndex;return r===void 0?e.windowRect??n:t.get(r)??e.windowRect??n}function uc(e,t){let n=1e-4;return e.x>=t.x-n&&e.y>=t.y-n&&e.x+e.width<=t.x+t.width+n&&e.y+e.height<=t.y+t.height+n}function dc(){return 250}function fc(e,t,n){let r=n.depth??1/0,i=ce(n.scope),a=Ac(e),o=sc(n.androidPresentation,Math.max(1024,a.rawNodeCount*128)),s={nodes:[],sourceNodes:[],...t===void 0?{}:{maxNodes:t},maxDepth:i?1/0:r,options:n,analysis:a,interactiveDescendantMemo:new Map,hidden:new Set,presentationBudget:o,presentationNodes:[],truncated:!1};try{o.check(`work`),s.viewport=Cc(e,o),s.hidden=n.raw?new Set:Is(e,o);for(let t of e.children)if(mc(s,t,0),s.truncated)break;n.raw||cc(s.presentationNodes,s.viewport,o);let t=s.nodes,a=new Map(s.sourceNodes.map((e,t)=>[e,t])),{nodes:c,sourceNodes:l}=i?Ws(s,e.children,i,r,o):s,u={nodes:c,sourceNodes:l,occlusionContext:{nodes:t,sourceIndexByNodeIndex:new Map(l.flatMap((e,t)=>{let n=a.get(e),r=c[t]?.index;return n===void 0||r===void 0?[]:[[r,n]]})),androidSiblingOrderByNodeIndex:pc(s.sourceNodes)},analysis:s.analysis};return s.truncated?{...u,truncated:!0}:u}catch(e){throw ac(e)&&(e.analysis??=s.analysis),e}}function pc(e){let t=new Map,n=new Map;for(let[r,i]of e.entries()){let e=Ds(i);if(!e)continue;let a=t.get(e.parent);a===void 0&&(a=t.size,t.set(e.parent,a)),n.set(r,{group:a,order:e.order})}return n}function mc(e,t,n,r,i=!1,a=!1,o=!1,s,c){if(e.presentationBudget.check(`work`),hc(e,t,n))return;let l=t.windowRect??s??e.viewport,u=gc(e,t,c,l),d=_c(e,t,r,i,a,o,u,l),f=i||J(t),p=a||ec(t.type),ee=vc(e,t,u,c);yc(e,t,n,d,f,p,o||st(t.identifier),l,ee)}function hc(e,t,n){return e.maxNodes!==void 0&&e.nodes.length>=e.maxNodes?(e.truncated=!0,!0):n>e.maxDepth||e.hidden.has(t)}function gc(e,t,n,r){return e.options.raw?t.rect:Ms(t.rect,r,n)}function _c(e,t,n,r,i,a,o,s){return!e.options.raw&&!Js(t,e.options,r,Ec(e,t),i)?n:bc(e,t,n,a||st(t.identifier),o,s)}function vc(e,t,n,r){return e.options.raw||!wc(t)?r:n}function yc(e,t,n,r,i,a,o,s,c){for(let l of t.children)if(mc(e,l,n+1,r,i,a,o,s,c),e.truncated)return}function bc(e,t,n,r,i,a){let o=e.nodes.length;return e.sourceNodes.push(t),Sc(e,t,xc(e,t,n,r),i,a),o}function xc(e,t,n,r){return{index:e.nodes.length,type:t.type??void 0,label:t.label??void 0,value:t.value??void 0,identifier:t.identifier??void 0,bundleId:t.packageName??void 0,rect:t.rect,enabled:t.enabled,focused:t.focused,selected:t.selected,editable:t.editable,password:t.password,hintShowing:t.hintShowing,selectionStart:t.selectionStart,selectionEnd:t.selectionEnd,visibleToUser:t.visibleToUser,hittable:J(t)||void 0,depth:Tc(e.nodes,n),parentIndex:n,...Dc(t,e.hidden),...r?{systemChrome:!0}:{}}}function Sc(e,t,n,r,i){let a=rc(n,r,!e.options.raw&&wc(t),i);e.presentationNodes.push(a),e.nodes.push(e.options.raw?a.raw:Ns(a))}function Cc(e,t){let n=[],r=[...e.children];for(;r.length>0;){t.check(`work`);let e=r.pop();ie(e.windowRect)&&n.push(e.windowRect),r.push(...e.children)}return ne(n)??void 0}function wc(e){return e.scrollable===!0&&ae(e.type)}function Tc(e,t){return t===void 0?0:(e[t]?.depth??-1)+1}function Ec(e,t){let n=e.interactiveDescendantMemo.get(t);if(n!==void 0)return n;for(let n of t.children)if(!e.hidden.has(n)&&n.visibleToUser!==!1&&(J(n)||Ec(e,n)))return e.interactiveDescendantMemo.set(t,!0),!0;return e.interactiveDescendantMemo.set(t,!1),!1}function Dc(e,t){return Oc(e,t)?{...e.canScrollBackward?{hiddenContentAbove:!0}:{},...e.canScrollForward?{hiddenContentBelow:!0}:{}}:{}}function Oc(e,t){if(!e.scrollable||!ae(e.type)||`${e.type??``}`.toLowerCase().includes(`horizontalscrollview`))return!1;let n=kc(e,t);return!(n&&n.horizontal>n.vertical&&n.horizontal>16)}function kc(e,t){let n=e.children.filter(e=>!t.has(e)&&e.visibleToUser!==!1);if(!e.rect||n.length===0)return null;let r=n.map(e=>e.rect).filter(e=>e!==void 0);if(r.length===0)return null;let i=Math.min(...r.map(e=>e.x)),a=Math.max(...r.map(e=>e.x+e.width)),o=Math.min(...r.map(e=>e.y)),s=Math.max(...r.map(e=>e.y+e.height));return{horizontal:Math.max(0,a-i-e.rect.width),vertical:Math.max(0,s-o-e.rect.height)}}function Ac(e){let t=0,n=0,r=[...e.children];for(;r.length>0;){let e=r.pop();t+=1,n=Math.max(n,e.depth),r.push(...e.children)}return{rawNodeCount:t,maxDepth:n}}function jc(){let e=[],t=()=>e.at(-1)===!0;return{open(n,r){let i=t()||st(n);return r||e.push(i),i},close(){e.pop()}}}function*Mc(e){let t=/<node\b[^>]*>|<\/node>/g,n=jc(),r=t.exec(e);for(;r;){let i=r[0];if(i.startsWith(`</node`))n.close();else{let e=Nc(i);yield n.open(e.resourceId,i.endsWith(`/>`))?{...e,systemChrome:!0}:e}r=t.exec(e)}}function Nc(e){let t=Pc(e),n=Ft(t.bounds);return{...t,...n?{rect:n}:{}}}function Pc(e){let t=Fc(e),n=e=>Uc(t,e),r=e=>{let t=n(e);if(t!==null)return t===`true`},i=e=>{let t=n(e);if(t===null||t.trim()===``)return;let r=Number(t);return Number.isFinite(r)?r:void 0},a=(e,t)=>{let n=i(t);return n===void 0?{}:{[e]:n}},o=(e,t)=>{let r=Ft(n(t));return r===void 0?{}:{[e]:r}},s=(e,t)=>{let n=r(t);return n===void 0?{}:{[e]:n}};return{text:n(`text`),desc:n(`content-desc`),resourceId:n(`resource-id`),packageName:n(`package`),className:n(`class`),bounds:n(`bounds`),clickable:r(`clickable`),enabled:r(`enabled`),focusable:r(`focusable`),focused:r(`focused`),password:r(`password`),...s(`editable`,`editable`),...a(`selectionStart`,`selection-start`),...a(`selectionEnd`,`selection-end`),...s(`hintShowing`,`hint-showing`),...s(`visibleToUser`,`visible-to-user`),...s(`selected`,`selected`),...a(`drawingOrder`,`drawing-order`),...s(`scrollable`,`scrollable`),...s(`canScrollForward`,`can-scroll-forward`),...s(`canScrollBackward`,`can-scroll-backward`),...a(`windowIndex`,`window-index`),...a(`windowType`,`window-type`),...a(`windowLayer`,`window-layer`),...s(`windowActive`,`window-active`),...s(`windowFocused`,`window-focused`),...o(`windowRect`,`window-bounds`)}}function Fc(e){let t=new Map,n=e.indexOf(` `),r=e.lastIndexOf(`>`);if(n<0||r<=n)return t;let i=n;for(;i<r;){let n=Ic(e,i,r);if(!n)break;t.set(n.name,n.value),i=n.nextCursor}return t}function Ic(e,t,n){if(t=Rc(e,t,n),t>=n||zc(e[t]))return;let r=t;t=Lc(e,t,n);let i=e.slice(r,t);if(t=Rc(e,t,n),!i||e[t]!==`=`)return;t=Rc(e,t+1,n);let a=e[t];if(!Bc(a))return;let o=t+1,s=e.indexOf(a,o);if(!(s<0||s>=n))return{name:i,value:It(e.slice(o,s)),nextCursor:s+1}}function Lc(e,t,n){for(;t<n&&!Hc(e[t]??``);)t+=1;return t}function Rc(e,t,n){for(;t<n&&Vc(e[t]??``);)t+=1;return t}function zc(e){return e===`/`||e===`>`}function Bc(e){return e===`"`||e===`'`}function Vc(e){return e===` `||e===`
12
- `||e===`\r`||e===` `}function Hc(e){return e===`=`||e===`/`||e===`>`||Vc(e)}function Uc(e,t){return e.get(t)??null}function Wc(e){let t={type:null,label:null,value:null,identifier:null,packageName:null,clickable:!1,focusable:!1,depth:-1,children:[]},n=[t],r=/<node\b[^>]*>|<\/node>/g,i=r.exec(e);for(;i;){let t=i[0];if(t.startsWith(`</node`)){n.length>1&&n.pop(),i=r.exec(e);continue}let a=Nc(t),o=n.at(-1),s=Gc(a,o.depth+1,o);o.children.push(s),t.endsWith(`/>`)||n.push(s),i=r.exec(e)}return t}function Gc(e,t,n){return Es({type:e.className,label:e.text||e.desc,value:e.text,identifier:e.resourceId,packageName:e.packageName,rect:e.rect,enabled:e.enabled,focused:e.focused,selected:e.selected,editable:e.editable,password:e.password,hintShowing:e.hintShowing,selectionStart:e.selectionStart,selectionEnd:e.selectionEnd,visibleToUser:e.visibleToUser,clickable:e.clickable===!0,focusable:e.focusable===!0,scrollable:e.scrollable,canScrollForward:e.canScrollForward,canScrollBackward:e.canScrollBackward,windowIndex:e.windowIndex,windowType:e.windowType,windowLayer:e.windowLayer,windowActive:e.windowActive,windowFocused:e.windowFocused,windowRect:e.windowRect,depth:t,parentIndex:void 0,children:[]},e.drawingOrder===void 0?void 0:{parent:n,order:e.drawingOrder})}function Kc(e){let t=new Map;return e.nodes.forEach((n,r)=>{t.set(n.index,e.sourceNodes[r]?.clickable)}),{kind:`exact`,provider:`android-helper`,clickableByNodeIndex:t}}const qc=new Set([`android`,`com.android.systemui`]);function Jc(e,t,n={}){if(t.backend!==`android-helper`)return{outcome:`ok`};let r=al(e,n.foregroundAppPackage);return Zc(r,t)?Yc(r,t,`empty-helper-output`,`Android snapshot helper returned no accessibility nodes`):rl(r)?{outcome:`ok`}:Xc(r)?{outcome:`system-surface-only`}:Qc(r)?{outcome:`ok`}:$c(r)?Yc(r,t,`content-poor-app-window`,`Android snapshot helper returned insufficient foreground app content`):el(r)||tl(r,t)?Yc(r,t,`content-poor-app-window`,`Android snapshot helper returned insufficient application window content`):nl(r)?Yc(r,t,`system-window-only`,`Android snapshot helper returned only non-application windows`):{outcome:`ok`}}function Yc(e,t,n,r){return{outcome:`unusable`,decision:il(e,t,n,r)}}function Xc(e){return e.windowRootCount>0&&e.applicationWindowRootCount===0&&e.activeSystemSurfaceMeaningfulNodeCount>=3}function Zc(e,t){return e.nodeCount===0||t.nodeCount===0||t.rootPresent===!1}function Qc(e){return $c(e)&&e.inputMethodMeaningfulNodeCount>=2}function $c(e){let t=e.foregroundAppMeaningfulNodeCount;return t===void 0?!1:t===0?e.applicationMeaningfulNodeCount<2:t<2&&e.meaningfulNodeCount>t}function el(e){return e.foregroundAppMeaningfulNodeCount===void 0&&e.applicationWindowRootCount>0&&e.applicationMeaningfulNodeCount<2}function tl(e,t){return e.foregroundAppMeaningfulNodeCount===void 0&&e.windowRootCount===0&&(t.windowCount??0)>1&&e.nonSystemMeaningfulNodeCount<2}function nl(e){return e.windowRootCount>0&&e.applicationWindowRootCount===0||e.windowRootCount===0&&e.nodeCount>0&&e.systemUiNodeCount===e.nodeCount}function rl(e){return e.hasAlertButtonIdentifier&&e.hasAlertContentIdentifier}function il(e,t,n,r){return{reason:n,failureReason:r,diagnostics:yl(e,t)}}function al(e,t){let n=ol(t);for(let t of Mc(e))sl(n,t);return ml(n)}function ol(e){return{nodeCount:0,systemUiNodeCount:0,windowRootCount:0,applicationWindowRootCount:0,activeSystemSurfaceMeaningfulNodeCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,inputMethodMeaningfulNodeCount:0,hasAlertButtonIdentifier:!1,hasAlertContentIdentifier:!1,...e===void 0?{}:{foregroundAppPackage:e,foregroundAppMeaningfulNodeCount:0},windowTypes:new Set}}function sl(e,t){e.nodeCount+=1,vl(t.packageName)&&(e.systemUiNodeCount+=1),t.visibleToUser!==!1&&cl(e,t.resourceId),ll(e,t),ul(e,t)}function cl(e,t){let n=en(t);n===`button`&&(e.hasAlertButtonIdentifier=!0),n===`content`&&(e.hasAlertContentIdentifier=!0)}function ll(e,t){t.windowType!==void 0&&(e.currentWindowType=t.windowType,e.currentWindowActiveOrFocused=t.windowActive===!0||t.windowFocused===!0,e.windowRootCount+=1,e.windowTypes.add(t.windowType),t.windowType===1&&(e.applicationWindowRootCount+=1))}function ul(e,t){hl(t)&&(e.meaningfulNodeCount+=1,dl(e,t),pl(e,t))}function dl(e,t){e.currentWindowType===1&&!_l(t.packageName)&&(e.applicationMeaningfulNodeCount+=1),fl(e)&&!ot(t)&&(e.activeSystemSurfaceMeaningfulNodeCount+=1)}function fl(e){return e.currentWindowType!==void 0&&e.currentWindowType!==1&&e.currentWindowActiveOrFocused===!0}function pl(e,t){_l(t.packageName)||(e.nonSystemMeaningfulNodeCount+=1),p({packageName:t.packageName,resourceId:t.resourceId})&&(e.inputMethodMeaningfulNodeCount+=1),e.foregroundAppPackage!==void 0&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1)}function ml(e){return{nodeCount:e.nodeCount,systemUiNodeCount:e.systemUiNodeCount,windowRootCount:e.windowRootCount,applicationWindowRootCount:e.applicationWindowRootCount,activeSystemSurfaceMeaningfulNodeCount:e.activeSystemSurfaceMeaningfulNodeCount,meaningfulNodeCount:e.meaningfulNodeCount,applicationMeaningfulNodeCount:e.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:e.nonSystemMeaningfulNodeCount,inputMethodMeaningfulNodeCount:e.inputMethodMeaningfulNodeCount,hasAlertButtonIdentifier:e.hasAlertButtonIdentifier,hasAlertContentIdentifier:e.hasAlertContentIdentifier,...e.foregroundAppPackage===void 0?{}:{foregroundAppPackage:e.foregroundAppPackage,foregroundAppMeaningfulNodeCount:e.foregroundAppMeaningfulNodeCount??0},windowTypes:[...e.windowTypes].sort((e,t)=>e-t).slice(0,8)}}function hl(e){return e.visibleToUser===!1?!1:gl(e.text)||gl(e.desc)||gl(e.resourceId)}function gl(e){return e!==null&&e.trim()!==``}function _l(e){return e===null||qc.has(e)}function vl(e){return e!==null&&qc.has(e)}function yl(e,t){return{helperNodeCount:e.nodeCount,helperSystemUiNodeCount:e.systemUiNodeCount,helperWindowRootCount:e.windowRootCount,helperApplicationWindowRootCount:e.applicationWindowRootCount,helperMeaningfulNodeCount:e.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:e.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:e.nonSystemMeaningfulNodeCount,helperInputMethodMeaningfulNodeCount:e.inputMethodMeaningfulNodeCount,...e.foregroundAppPackage===void 0?{}:{helperForegroundAppPackage:e.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:e.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2},helperWindowTypes:e.windowTypes,...t.captureMode?{helperCaptureMode:t.captureMode}:{}}}async function bl(e){let t=await B(e.deviceKey,{resetRuntime:!0,signal:e.signal,cause:e.cause});e.signal?.throwIfAborted(),t||await xl(e.adb,e.packageName)}async function xl(e,t){await ii({adb:e,packageName:t}),await g(150),h({level:`debug`,phase:`android_snapshot_helper_runtime_reset`,data:{packageName:t}})}const Sl=Symbol(`androidSnapshotCaptureEvidence`);function Cl(e,t){return Object.defineProperty(e,Sl,{value:t}),e}function wl(e){let t={...e,backend:`android`,producer:`android-uiautomator`},n=e[Sl];return te(t,n.clickability),n.occlusionContext&&l(t,n.occlusionContext),t}async function Tl(e,t={}){let n=C(e,t.helperAdb).exec;return(await Nl(e,t,n)).xml}async function El(e,t={}){let n=C(e,t.helperAdb).exec,r=await Nl(e,t,n),i=r.xml,a=Wc(i),o=kl(r.metadata,a),s={...t,androidPresentation:{...t.androidPresentation,deadlineAtMs:t.androidPresentation?.deadlineAtMs??Date.now()+250}};try{let e=fc(a,void 0,s),n=Ol(e.truncated,r.metadata);t.interactiveOnly&&t.includeHiddenContentHints!==!1&&Ml({options:s,tree:a,xml:i,interactiveSnapshot:e});let{sourceNodes:c,occlusionContext:l,...u}=e;return Cl({...u,...jl(n),androidSnapshot:o,quality:{state:`healthy`,backend:`android-helper`}},{clickability:Kc(e),occlusionContext:l})}catch(e){if(!ac(e))throw e;return Dl({failure:e,androidSnapshot:o})}}function Dl(e){return Cl({nodes:[],truncated:!0,analysis:e.failure.analysis??{rawNodeCount:0,maxDepth:0},androidSnapshot:{...e.androidSnapshot,presentationFailure:{phase:e.failure.details.phase,workUnits:e.failure.details.workUnits,...e.failure.details.maxWorkUnits===void 0?{}:{maxWorkUnits:e.failure.details.maxWorkUnits}}},quality:{state:`sparse`,backend:`android-helper`,reason:e.failure.message,reasonCode:e.failure.qualityReasonCode}},{clickability:{kind:`exact`,provider:`android-helper`,clickableByNodeIndex:new Map}})}function Ol(e,t){return e===!0||t.helperTruncated===!0||e}function kl(e,t){return Al(t)===!1?{...e,occlusionScanUnavailable:!0}:e}function Al(e){let t=[...e.children];if(t.length!==0){for(;t.length>0;){let e=t.pop();if(Ds(e)!==void 0)return!0;t.push(...e.children)}return!1}}function jl(e){return e===!0?{truncated:!0}:{}}function Ml(e){if(Zl(e.interactiveSnapshot.nodes).size>0||Xl(e.xml))return;let t=fc(e.tree,void 0,{...e.options,interactiveOnly:!1});Ql(be(o(t.nodes)),t,e.interactiveSnapshot)}async function Nl(e,t,n){let r=C(e,t.helperAdb),i=await m(`android_snapshot_helper_artifact_resolution`,async()=>await Jl(t.helperArtifact??r.snapshotHelperArtifact));if(i.artifact)return await Pl(e,t,n,i.artifact);throw h({level:`error`,phase:`android_snapshot_helper_unavailable`,data:{reason:i.errorReason??`artifact_not_found`}}),Yl(i.errorReason)}async function Pl(e,t,n,r){let i=Wr(e),a=C(e,t.helperAdb),o=t.helperSessionScope!==`daemon-session`;try{let e;for(let o=0;;o+=1){o>0&&await zl(t.signal);let s=await Rl({options:t,adb:n,adbProvider:a,artifact:r,helperDeviceKey:i,attempt:o,previousContentReason:e});if(s.outcome===`captured`)return s.capture;if(o+1>=3)return await Bl({contentRecovery:s.decision,attempts:o+1,helperDeviceKey:i,artifact:r,adb:n,signal:t.signal});e=s.decision.reason}}finally{o&&await B(i)}}async function Fl(e,t,n,r,i){let a=await m(`android_snapshot_helper_install`,async()=>await or({adb:t,adbProvider:n,artifact:r,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4,signal:e.signal}),{packageName:r.manifest.packageName,versionCode:r.manifest.versionCode,installPolicy:e.helperInstallPolicy??`missing-or-outdated`});return h({phase:`android_snapshot_helper_install_decision`,data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,artifactSha256:r.manifest.sha256,installedSha256:a.installedSha256,installed:a.installed,reason:a.reason}}),a}async function Il(e){let{signal:t,adb:r,adbProvider:i,artifact:a,helperDeviceKey:o}=e,s=si({adb:r,adbProvider:i,artifact:a,deviceKey:o,signal:t});try{let e=await m(`android_snapshot_helper_session_capture`,async()=>await qi(s),{packageName:a.manifest.packageName,version:a.manifest.version,timeoutMs:Kn});if(e)return e}catch(e){if(t?.throwIfAborted(),Jr(e))throw e;h({level:`warn`,phase:`android_snapshot_helper_session_fallback`,data:{reason:n(e).message}}),await xl(r,a.manifest.packageName)}return await m(`android_snapshot_helper_capture`,async()=>await oi(s),{packageName:a.manifest.packageName,version:a.manifest.version,timeoutMs:Kn,commandTimeoutMs:qn})}function Ll(e,t,n){return{xml:e.xml,metadata:{backend:`android-helper`,helperVersion:t.manifest.version,helperApiVersion:e.metadata.helperApiVersion,helperTransport:e.metadata.transport,helperSessionReused:e.metadata.sessionReused,installReason:n,waitForIdleTimeoutMs:e.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:e.metadata.waitForIdleQuietMs,timeoutMs:e.metadata.timeoutMs,maxDepth:e.metadata.maxDepth,maxNodes:e.metadata.maxNodes,rootPresent:e.metadata.rootPresent,captureMode:e.metadata.captureMode,windowCount:e.metadata.windowCount,nodeCount:e.metadata.nodeCount,helperTruncated:e.metadata.truncated,elapsedMs:e.metadata.elapsedMs}}}async function Rl(e){let{options:t,adb:n,adbProvider:r,artifact:i,helperDeviceKey:a,attempt:o}=e,s;try{let e=await Fl(t,n,r,i,a);e.installed&&await B(a),s=Ll(await Il({signal:t.signal,adb:n,adbProvider:r,artifact:i,helperDeviceKey:a}),i,e.reason)}catch(e){return t.signal?.throwIfAborted(),{outcome:`captured`,capture:await Vl({error:e,helperDeviceKey:a,artifact:i,adb:n})}}let c=Jc(s.xml,s.metadata,{foregroundAppPackage:t.appBundleId});if(c.outcome===`unusable`)return{outcome:`unusable`,decision:c.decision};let l=c.outcome===`system-surface-only`;return!l&&o>0&&h({phase:`android_snapshot_helper_content_recaptured`,data:{attempts:o+1,recoveredFromReason:e.previousContentReason}}),{outcome:`captured`,capture:{xml:s.xml,metadata:l?{...s.metadata,systemSurfaceOnly:!0}:s.metadata}}}async function zl(e){e?.throwIfAborted(),await g(250),e?.throwIfAborted()}async function Bl(e){throw h({level:`error`,phase:`android_snapshot_helper_content_invalid`,data:{reason:e.contentRecovery.reason,failureReason:e.contentRecovery.failureReason,attempts:e.attempts,...e.contentRecovery.diagnostics}}),await bl({adb:e.adb,deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,signal:e.signal,cause:e.contentRecovery.failureReason}),new t(`COMMAND_FAILED`,e.contentRecovery.failureReason,{...e.contentRecovery.diagnostics,androidSnapshotHelperFailureReason:e.contentRecovery.reason,attempts:e.attempts,retriable:!0,hint:`Retry after the app UI stabilizes. If this persists, capture a screenshot and report the helper diagnostics; agent-device does not substitute a second snapshot engine.`})}async function Vl(e){let t=Hl(e.error);throw h({level:`error`,phase:`android_snapshot_helper_failed`,data:{reason:t}}),await B(e.helperDeviceKey),await xl(e.adb,e.artifact.manifest.packageName),tr({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),Ul(e.error,t)}function Hl(e){let t=n(e),r=ql(t.details?.helper);if(r&&r!==t.message)return`${t.message}: ${r}`;if(r)return r;let i=(typeof t.details?.stderr==`string`?t.details.stderr.trim():``).split(/\r?\n/).find(e=>e.trim());return i?`${t.message}: ${i}`:t.message}function Ul(e,r){let a=n(e),o=Wl(a);return new t(i(a.code),`Android snapshot helper failed: ${r}`,{...a.details,...Kl(a),androidSnapshotHelperFailureReason:r,...o?{androidCaptureFailureReason:o}:{},hint:Gl(a,o)},e)}function Wl(e){return ct(e)}function Gl(e,t){return t===`accessibility-timeout`?`Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists.`:e.details?.androidSnapshotHelperInstallFailure===!0?[e.hint,`This is a device-side install failure (adb rejection or OEM policy) — the helper artifact itself is present, this is not a missing/unbuilt build.`].filter(Boolean).join(` `):e.hint??`Retry once. If the helper still fails, run agent-device doctor and report the diagnostic log; agent-device does not substitute a second snapshot engine.`}function Kl(e){let t={};return e.diagnosticId!==void 0&&(t.diagnosticId=e.diagnosticId),e.logPath!==void 0&&(t.logPath=e.logPath),e.retriable!==void 0&&(t.retriable=e.retriable),e.supportedOn!==void 0&&(t.supportedOn=e.supportedOn),t}function ql(e){if(!e||typeof e!=`object`||!(`message`in e))return;let t=String(e.message).trim();return t&&t!==`null`?t:void 0}async function Jl(e){if(e)return{artifact:e};let t=Ae(),r=E.join(ke(),`android`,`snapshot-helper`,`dist`),i=E.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await x().files.access(i)}catch{return{}}try{let e=Jn(JSON.parse(await x().files.readText(i))),t=E.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await x().files.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{errorReason:n(e).message}}}function Yl(e){let n=e??`the bundled helper artifact was not found`;return new t(`COMMAND_FAILED`,`Android snapshot helper is unavailable: ${n}`,{androidSnapshotHelperFailureReason:n,hint:"Run `pnpm build:android` to build the helper dist for a source checkout — the runtime needs android/snapshot-helper/dist/agent-device-android-snapshot-helper-<version>.manifest.json and the .apk it references. Packaged installs ship these via the prepack script; if they are missing from a packaged install, reinstall agent-device."})}function Xl(e){return e.includes(` can-scroll-forward=`)||e.includes(` can-scroll-backward=`)}function Zl(e){let t=new Map;for(let n of e){let e={};n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n.index,e)}return t}function Ql(e,t,n){if(e.size===0)return;let r=new Map;for(let[e,t]of n.sourceNodes.entries()){let i=n.nodes[e];i&&r.set(t,i)}for(let[n,i]of e){let e=t.sourceNodes[n];if(!e)continue;let a=r.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}async function $l(e,t,n,r,i={}){let a=[0,150,350],o=null,s=null,c=await vu(e);for(let l of a){l>0&&await g(l);let a=await cu(e,t,n,r,c,i);if(o=a,a.reason===`ime_capture`)return a;s=a.ok?a:null}return s??o??{ok:!1,actual:null,reason:`text_mismatch`,targetInput:null,actualInput:null}}async function eu(e,t,n,r={}){return au(await Tl(e,r),t,n)}async function tu(e,t,n,r){let i=await vu(e);return lu(await Tl(e,r),t,n,i).targetInput}async function nu(e,t,n,r={}){try{return await tu(e,t,n,r)}catch(e){return h({level:`warn`,phase:`android_fill_pre_action_target_capture_failed`,data:{error:e instanceof Error?e.message:String(e)}}),null}}function X(e,n,r){if(r?.ok)return;let i=r?ru(e,n,r):null;if(i)return i;throw new t(`COMMAND_FAILED`,ou(r),su(e,r))}function ru(e,t,n){let r=n.targetInput,i=n.actualInput;if(e.length===0||n.reason===`ime_capture`||!t||!r||!i||q(t)||q(r)||q(i)||!wu(t,r)||!wu(t,i)||t.text===n.actual)return null;let a=Tu(t);return h({level:`warn`,phase:`android_fill_verification_unconfirmed`,data:{target:a}}),{verification:`unconfirmed`,requested:e,before:t.text,after:n.actual,target:a}}function iu(e,t,n,r,i={}){let a=lu(e,t,n,i);return uu(a)?{ok:!1,actual:a.actualInput?.text??null,reason:`ime_capture`,targetInput:a.targetInput,actualInput:a.actualInput}:du(a,r)??fu(a,r)}function au(e,t,n){return lu(e,t,n).targetInput?.text??null}function ou(e){return e?.reason===`ime_capture`?`Android fill input was captured by the active keyboard instead of the app field`:e?.reason===`masked_unverified`?`Android fill verification could not confirm masked text value`:`Android fill verification failed`}function su(e,t){let n=bs(e,t);return t?.reason===`ime_capture`&&(n.hint=`The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill.`),n}async function cu(e,t,n,r,i,a){return iu(await Tl(e,a),t,n,r,i)}function lu(e,t,n,r={}){let i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let a of Mc(e)){let e=_u(a,r);e&&yu(i,e,t,n)}return xu(i)}function uu(e){let{targetInput:t,actualInput:n}=e;return!t||!n||n===t?!1:n.inputMethodOwned&&!t.inputMethodOwned}function du(e,t){let n=e.actualInput;if(!n||!Cu(n))return null;let r=n.text??null,i=Array.from(pu(n)).length,a=Array.from(t).length,o=a===0?i===0:i>0&&i===a;return{ok:o,actual:r,reason:o?void 0:`masked_unverified`,masked:!0,targetInput:e.targetInput,actualInput:n}}function fu(e,t){let n=e.actualInput;return{ok:n!==null&&mu(pu(n),t),actual:n?.text??null,reason:`text_mismatch`,targetInput:e.targetInput,actualInput:n}}function pu(e){return e.hintShowing?``:e.text??``}function mu(e,t){if(e===t)return!0;if(t.length===0)return!1;let n=hu(e),r=hu(t);return!n||!r?!1:!!(n===r||gu(n,r))}function hu(e){return e.replaceAll(/\s+/g,` `).trim()}function gu(e,t){if(e.length!==t.length||e.length===0||e.slice(1)!==t.slice(1))return!1;let n=e[0],r=t[0];return!n||!r?!1:r.toLowerCase()===r&&n===r.toUpperCase()}function _u(e,t){if(!e.rect)return null;let n=e.text??``,r=Math.max(1,e.rect.width*e.rect.height);return{text:n||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:e.password===!0,inputMethodOwned:p({packageName:e.packageName,resourceId:e.resourceId,activeInputMethodPackage:t.activeInputMethodPackage}),area:r,editText:Su(e.className??``),hintShowing:e.hintShowing===!0}}async function vu(e){try{return{activeInputMethodPackage:(await lo(e)).inputMethodPackage}}catch(e){return h({level:`warn`,phase:`android_fill_verification_input_method_probe_failed`,data:{error:e instanceof Error?e.message:String(e)}}),{}}}function yu(e,t,n,r){let i=re(t.rect,n,r);if(i&&t.editText&&(e.editAtPoint=bu(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=bu(e.focusedEdit,t);return}i&&t.text&&(e.anyAtPoint=bu(e.anyAtPoint,t))}function bu(e,t){return e&&e.area<t.area?e:t}function xu(e){let t=e.editAtPoint??e.anyAtPoint;return{targetInput:t,actualInput:(e.focusedEdit?.text?e.focusedEdit:null)??t}}function Su(e){let t=e.toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)}function Cu(e){return q(e)}function wu(e,t){return e.resourceId||t.resourceId?e.resourceId===t.resourceId&&e.packageName===t.packageName:e.className===t.className&&e.packageName===t.packageName&&e.rect.x===t.rect.x&&e.rect.y===t.rect.y&&e.rect.width===t.rect.width&&e.rect.height===t.rect.height}function Tu(e){return{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:e.rect}}async function Eu(e,t){return await Lt(t.stateDir),await Qo(t.stateDir,e.id,async()=>await Ou(e,t))}function Du(e){let t=r(e).details?.hint;return{outcome:`helper-unavailable`,reason:n(e).message,...typeof t==`string`?{hint:t}:{}}}async function Ou(e,t){let n=x().imeRecoveryMarkers,r=y(e),i=C(e),a=U(e),o;try{o=await jo(i),await Fo({adb:r,adbProvider:i,artifact:o,deviceKey:a})}catch(e){return Du(e)}let{manifest:s}=o,c=await W(r);if(c===s.serviceComponent){let i=await n.write(t.stateDir,e.id),o=await G(r);return i&&K.add(a),{outcome:`settled`,activated:!1,alreadyActive:!0,...i?{}:{persistFailed:!0},previousIme:o,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName}}let l=await G(r);if(!await Go(r,c))return await qo(r,l,e.id),S({level:`warn`,phase:`android_test_ime_persist_failed`,data:{device:e.id,previousIme:c}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName};let u=(await n.read(t.stateDir)).includes(e.id);if(!await n.write(t.stateDir,e.id))return await qo(r,l,e.id),S({level:`warn`,phase:`android_test_ime_marker_persist_failed`,data:{device:e.id,previousIme:c}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName};await b(r,[`ime`,`enable`,s.serviceComponent],{allowFailure:!0,timeoutMs:1e4});let d=await b(r,[`ime`,`set`,s.serviceComponent],{allowFailure:!0,timeoutMs:1e4}),f=await W(r);return f===s.serviceComponent?(K.add(a),S({phase:`android_test_ime_activated`,data:{device:e.id,previousIme:c}}),{outcome:`settled`,activated:!0,alreadyActive:!1,previousIme:c,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName}):(K.delete(a),await qo(r,l,e.id),u||await n.clear(t.stateDir,e.id),S({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,activeIme:f,stderr:d.stderr.trim()}}),{outcome:`settled`,activated:!1,alreadyActive:!1,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName})}function ku(e){return E.join(e,`android-test-ime-pending`)}function Au(e,t){return E.join(ku(e),encodeURIComponent(t))}async function ju(e,t){let r=x().files,i,a=!1;try{let n=ku(e);if(i=Au(e,t),await r.ensureDirectory(n),(await Pu(i))?.serial===t)return!0;let o={version:1,serial:t};if(await r.writeAtomicText(i,`${JSON.stringify(o)}\n`,384),a=!0,(await Pu(i))?.serial!==t)throw Error(`Android test IME marker read-back did not match the requested device.`);return!0}catch(o){return a&&i&&await r.remove(i,{force:!0}).catch(()=>{}),h({level:`debug`,phase:`android_test_ime_marker_write_failed`,data:{stateDir:e,serial:t,error:n(o).message}}),!1}}async function Mu(e,t){await x().files.remove(Au(e,t),{force:!0}).catch(()=>{})}async function Nu(e){let t=x().files,n;try{n=await t.readDirectory(ku(e))}catch{return[]}let r=[];for(let t of n)try{let n=E.join(ku(e),t),i=await Pu(n);i&&Au(e,i.serial)===n&&r.push(i.serial)}catch{}return[...new Set(r)].sort()}async function Pu(e){try{return Fu(await x().files.readText(e))}catch{return}}function Fu(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t;return n.version===1&&typeof n.serial==`string`&&n.serial.length>0?{version:1,serial:n.serial}:void 0}catch{return}}const Iu=new Bt(`utf-16le`);let Lu;async function Ru(e,t){for(let n of[`AndroidManifest.xml`,`base/manifest/AndroidManifest.xml`]){let r=await zu(e,n,t);if(!r)continue;let i=Bu(r);if(i)return i}return await Yu(e,t)}async function zu(e,t,n){try{let r=await Ce(`unzip`,[`-p`,e,t],{allowFailure:!0,binaryStdout:!0,signal:n});return r.exitCode!==0||!r.stdoutBuffer||r.stdoutBuffer.length===0?void 0:r.stdoutBuffer}catch{n?.throwIfAborted();return}}function Bu(e){return e.subarray(0,Math.min(e.length,128)).toString(`utf8`).trimStart().startsWith(`<`)?Vu(e.toString(`utf8`)):Hu(e)}function Vu(e){return e.match(/<manifest\b[^>]*\bpackage\s*=\s*["']([^"']+)["']/i)?.[1]}function Hu(e){if(e.length<8||e.readUInt16LE(0)!==3)return;let t;for(let n=e.readUInt16LE(2);n+8<=e.length;){let r=e.readUInt16LE(n),i=e.readUInt16LE(n+2),a=e.readUInt32LE(n+4);if(a<=0||n+a>e.length)return;if(r===1)t=Wu(e.subarray(n,n+a));else if(r===258&&t){let r=Uu(e,n,i,t);if(r)return r}n+=a}}function Uu(e,t,n,r){if(n<36||t+n>e.length||r[e.readUInt32LE(t+20)]!==`manifest`)return;let i=e.readUInt16LE(t+24),a=e.readUInt16LE(t+26),o=e.readUInt16LE(t+28),s=t+i;for(let t=0;t<o;t+=1){let n=s+t*a;if(n+20>e.length)return;if(r[e.readUInt32LE(n+4)]!==`package`)continue;let i=e.readUInt32LE(n+8);if(i!==4294967295)return r[i];let o=e.readUInt8(n+15),c=e.readUInt32LE(n+16);return o===3?r[c]:void 0}}function Wu(e){if(e.length<28)return[];let t=e.readUInt32LE(8),n=e.readUInt32LE(16),r=e.readUInt32LE(20),i=!!(n&256),a=[];for(let n=0;n<t;n+=1){let t=28+n*4;if(t+4>e.length)return a;let o=r+e.readUInt32LE(t);a.push(i?Gu(e,o):Ku(e,o))}return a}function Gu(e,t){let[,n]=qu(e,t),[r,i]=qu(e,t+n),a=t+n+i;return e.subarray(a,a+r).toString(`utf8`)}function Ku(e,t){let[n,r]=Ju(e,t),i=t+r;return Iu.decode(e.subarray(i,i+n*2))}function qu(e,t){let n=e.readUInt8(t);if(!(n&128))return[n,1];let r=e.readUInt8(t+1);return[(n&127)<<8|r,2]}function Ju(e,t){let n=e.readUInt16LE(t);if(!(n&32768))return[n,2];let r=e.readUInt16LE(t+2);return[(n&32767)<<16|r,4]}async function Yu(e,t){t?.throwIfAborted();let n=await Xu();if(!n)return;let r=await Ce(n,[`dump`,`badging`,e],{allowFailure:!0,signal:t});if(r.exitCode===0)return r.stdout.match(/package:\s+name='([^']+)'/)?.[1]}async function Xu(){if(Lu!==void 0)return Lu??void 0;try{let e=x().files;for(let t of _t()){let n=E.join(t,`build-tools`);try{let t=(await e.readDirectory(n)).sort((e,t)=>t.localeCompare(e,void 0,{numeric:!0}));for(let r of t){let t=E.join(n,r,`aapt`);if(E.isAbsolute(t)&&await e.isExecutable(t))return Lu=t,t}}catch{}}}catch{}Lu=null}async function Zu(e,t){let n=e.kind===`url`&&je(e.url),r=await Me({source:e,isInstallablePath:(e,t)=>t.isFile()&&Qu(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||n,signal:t?.signal});try{let e=t?.resolveIdentity===!1?{}:await $u(r.installablePath,t?.signal);return{archivePath:r.archivePath,installablePath:r.installablePath,packageName:e.packageName,cleanup:r.cleanup}}catch(e){throw await r.cleanup(),e}}function Qu(e){let t=E.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function $u(e,t){let n=E.extname(e).toLowerCase();return n!==`.apk`&&n!==`.aab`?{}:{packageName:await Ru(e,t)}}async function ed(e,n,r,i={}){let a=typeof r.action==`string`&&r.action.trim()?r.action.trim():`${n}.TEST_PUSH`,o=[`am`,`broadcast`,`-a`,a,`-p`,n],s=typeof r.receiver==`string`?r.receiver.trim():``;s&&o.push(`-n`,s);let c=r.extras;if(c!==void 0&&(typeof c!=`object`||!c||Array.isArray(c)))throw new t(`INVALID_ARGS`,`Android push payload extras must be an object`);let l=c??{},u=0;for(let[e,t]of Object.entries(l))e&&(td(o,e,t),u+=1);return await T(e,o,{signal:i.signal}),{action:a,extrasCount:u}}function td(e,n,r){if(typeof r==`string`){e.push(`--es`,n,r);return}if(typeof r==`boolean`){e.push(`--ez`,n,r?`true`:`false`);return}if(typeof r==`number`&&Number.isFinite(r)){if(Number.isInteger(r)){e.push(`--ei`,n,String(r));return}e.push(`--ef`,n,String(r));return}throw new t(`INVALID_ARGS`,`Unsupported Android broadcast extra type for "${n}". Use string, boolean, or number.`)}function Z(e){let t=e.replaceAll(`,`,``).match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let n=Number(t[0]);return Number.isFinite(n)?n:null}function nd(e){let t=sd(e.map(e=>e.intendedVsyncNs)),n=[];for(let e=1;e<t.length;e+=1){let r=t[e]-t[e-1];r>=4e6&&r<=5e7&&n.push(r)}if(n.length!==0)return cd(n)}function rd(e){let{frames:t,frameDeadlineNs:n,summaryDroppedFrameCount:r}=e;return r===void 0?n===void 0?[]:t.filter(e=>e.durationNs>n):r<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,r).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}function id(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e;if(t.length===0||n===void 0)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>od({frames:e,windowStartNs:n,measuredAtMs:r,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}function ad(e){return Math.round(e*10)/10}function od(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-n)/1e6)),c=Math.max(s,Math.round((o-n)/1e6)),l=i!==void 0&&Number.isFinite(r)?r-i:void 0;return{startOffsetMs:s,endOffsetMs:c,startAt:l===void 0?void 0:new Date(l+a/1e6).toISOString(),endAt:l===void 0?void 0:new Date(l+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:ad(Math.max(...t.map(e=>e.durationNs))/1e6)}}function sd(e){return[...new Set(e.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)}function cd(e){let t=[...e].sort((e,t)=>e-t),n=Math.floor(t.length/2);return t.length%2==1?t[n]:(t[n-1]+t[n])/2}function ld(e,t,n){ud(e,t);let r=bd(e),i=gd(e),a=fd(i,r,t),o=Date.parse(n),s=Sd({frames:i,measuredAtMs:o,summary:r}),c=rd({frames:i,frameDeadlineNs:a,summaryDroppedFrameCount:r?.droppedFrameCount}),l=r?.sampleWindowMs??s.sampleWindowMs??Ed(i),u=pd(r,i,c),d=hd({droppedFrames:c,timing:s,measuredAtMs:o,summary:r});return{...u,sampleWindowMs:l,...md(a),windowStartedAt:s.windowStartedAt,windowEndedAt:s.windowEndedAt,timestampSource:s.timestampSource,measuredAt:n,method:`adb-shell-dumpsys-gfxinfo-framestats`,source:r?`android-gfxinfo-summary`:`framestats-rows`,worstWindows:d&&d.length>0?d:void 0}}function ud(e,n){if(/no process found for:/i.test(e))throw new t(`COMMAND_FAILED`,`Android gfxinfo did not find a running process for ${n}`,{metric:`fps`,package:n,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect.`})}function dd(e){throw new t(`COMMAND_FAILED`,`Failed to parse Android framestats output for ${e}`,{metric:`fps`,package:e,hint:`Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging.`})}function fd(e,n,r){let i=nd(e);if(!n&&e.length===0&&dd(r),n||i!==void 0)return i;throw new t(`COMMAND_FAILED`,`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:`fps`,package:r,hint:`Retry perf after a longer interaction window so consecutive Android frame timestamps are available.`})}function pd(e,t,n){let r=e?.totalFrameCount??t.length,i=e?.droppedFrameCount??n.length;return{totalFrameCount:r,droppedFrameCount:i,droppedFramePercent:e?.droppedFramePercent??(r>0?Rt(i/r*100):0)}}function md(e){return{frameDeadlineMs:e===void 0?void 0:ad(e/1e6),refreshRateHz:e===void 0?void 0:ad(1e9/e)}}function hd(e){let{droppedFrames:t,timing:n,measuredAtMs:r,summary:i}=e;if(t.length===0)return;let a=id({frames:t,windowStartNs:n.windowStartNs,measuredAtMs:r,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}function gd(e){let t=[],n=null;for(let r of e.split(`
11
+ `).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`List of devices`)).map(e=>e.split(/\s+/)).filter(e=>e[1]===`device`).map(e=>e[0])}catch{return[]}}const os=2e3;async function ss(e=x().environment,t=x().files){let n=e.ANDROID_HOME||e.ANDROID_SDK_ROOT,r=await ys(n,t),i=await Nt(`adb`,[`version`]);return i?hs({license:r,sdkRoot:n,versionLine:i}):vs(n,r)}async function cs(e,t){if(e.platform!==`android`)return[];let n=y(e,t.transportOverrides.androidAdb),r=[];return t.shouldProbeMetro&&r.push(await ms(n,e.id,t.metroPort)),r.push(await ls(n,e)),r}async function ls(e,t){try{let n=await W(e),r=Zo(t);return n===await us()&&!r?await ds(e,t,n):fs(t,n,r)}catch(e){return ps(e)}}async function us(){try{return(await Mo()).manifest.serviceComponent}catch{return}}async function ds(e,t,n){let r=(await b(e,[`settings`,`get`,`secure`,Wo.previousIme],{allowFailure:!0,timeoutMs:os})).stdout.trim(),i=r&&r!==`null`?r:void 0;return{id:`android-test-ime`,status:`fail`,summary:`Android test IME helper is the active input method on ${t.id}, but no active session owns it -- likely left over from a crashed session.`,hint:`A stuck test IME leaves the real keyboard unavailable on this device until restored.`,command:i?`adb -s ${t.id} shell ime set ${i}`:`adb -s ${t.id} shell ime list -s`,evidence:{currentIme:n,previousIme:i}}}function fs(e,t,n){return{id:`android-test-ime`,status:`pass`,summary:n?`Android test IME helper is active for this session on ${e.id}.`:`Android test IME helper is not active on ${e.id}; the device's normal IME is in use.`,evidence:{currentIme:t}}}function ps(e){let t=n(e);return{id:`android-test-ime`,status:`warn`,summary:`Could not inspect the Android test IME helper state.`,hint:t.message,evidence:{code:t.code}}}async function ms(e,t,r){try{let n=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:os}),i=`tcp:${r} tcp:${r}`,a=n.stdout.includes(i);return{id:`android-reverse`,status:a?`pass`:`warn`,summary:a?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:a?void 0:`adb -s ${t} reverse tcp:${r} tcp:${r}`,evidence:{stdout:n.stdout.trim()}}}catch(e){let t=n(e);return{id:`android-reverse`,status:`warn`,summary:`Could not inspect Android adb reverse mappings.`,hint:t.message,evidence:{code:t.code}}}}function hs(e){return{id:`toolchain`,status:gs(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${_s(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function gs(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function _s(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function vs(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function ys(e,t){if(!e)return`unknown`;try{return await t.access(E.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}function bs(e,t){if(!t)return{expected:e,actual:null,failureReason:`text_mismatch`,targetInput:null,actualInput:null};let n=ws(t),r={failureReason:t.reason??`text_mismatch`,targetInput:Ss(t.targetInput),actualInput:Ss(t.actualInput)};return n?{...r,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??``).length}:{...r,expected:e,actual:t.actual}}function q(e){return e?e.password?!0:xs(e.text):!1}function xs(e){return e?Array.from(e).every(Cs):!1}function Ss(e){if(!e)return null;let t=q(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function Cs(e){return e===`•`||e===`*`||e===`●`}function ws(e){return e.masked===!0||q(e.targetInput)||q(e.actualInput)}const Ts=new WeakMap;function Es(e,t){return t&&Ts.set(e,t),e}function Ds(e){return Ts.get(e)}function Os(e){return e.clickable}function ks(e){return e.focusable||e.focused===!0}function J(e){return Os(e)||ks(e)}function As(e){let t=e.trim();return t?/^[\w.]+:id\/[\w.-]+$/i.test(t):!1}function js(e,t){return{raw:e,...t?{effectiveRect:t}:{}}}function Ms(e,t,n){if(!e)return;let r=Fs(e);return t&&(r=Ps(r,t)),n&&(r=Ps(r,n)),r}function Ns(e){return{...e.raw,...e.effectiveRect?{rect:e.effectiveRect}:{rect:void 0},hittable:e.raw.hittable===!0&&ae(e.effectiveRect)?!0:void 0}}function Ps(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),o=i>n&&a>r;return{x:o?n:e.x,y:o?r:e.y,width:o?i-n:0,height:o?a-r:0}}function Fs(e){return{x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)}}function Is(e,t){let n=new Set;return Ls(e,n,t),zs(e,n,t),n}function Ls(e,t,n){for(let r of e.children){if(n?.check(`work`),r.visibleToUser===!1){t.add(r);continue}Ls(r,t,n)}}function Rs(e,t,n){return n?.check(`work`),e.children.filter(e=>!t.has(e)&&e.visibleToUser!==!1)}function zs(e,t,n){let r=Rs(e,t,n).filter(Vs);if(r.length<2)return;let i=r.filter(e=>Hs(e)&&Us(e));if(i.length===0)return;let a=Bs(i);for(let r of Rs(e,t,n))n?.check(`work`),Hs(r)&&(Us(r)&&(a===void 0||r.windowLayer===a)||t.add(r))}function Bs(e){let t=e.map(e=>e.windowLayer).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function Vs(e){return e.windowIndex!==void 0||e.windowType!==void 0}function Hs(e){return e.windowType===1}function Us(e){return e.windowActive===!0||e.windowFocused===!0}function Ws(e,t,n,r,i){let a=new Set(e.sourceNodes),o=Ks(t,i),s=Gs(o,n,qs(o,a,i),i);if(!s)return{nodes:[],sourceNodes:[]};let c=new Set(Ks([s],i)),l=[];for(let[t,n]of e.sourceNodes.entries())i.check(`work`),c.has(n)&&l.push(t);if(l.length===0)return{nodes:[],sourceNodes:[]};let u=1/0;for(let t of l)i.check(`work`),u=Math.min(u,e.nodes[t]?.depth??0);let d=[];for(let t of l)i.check(`work`),(e.nodes[t]?.depth??0)-u<=r&&d.push(t);return i.consume(d.length),{nodes:oe(d.map(t=>e.nodes[t]),u),sourceNodes:d.map(t=>e.sourceNodes[t])}}function Gs(e,t,n,r){for(let i of e)if(r.check(`work`),se(i,t)&&n.has(i))return i;return null}function Ks(e,t){let n=[],r=[...e].reverse();for(;r.length>0;){t.check(`work`);let e=r.pop();n.push(e);for(let n=e.children.length-1;n>=0;--n)t.check(`work`),r.push(e.children[n])}return n}function qs(e,t,n){let r=new Set;for(let i=e.length-1;i>=0;--i){n.check(`work`);let a=e[i];if(t.has(a)){r.add(a);continue}for(let e of a.children)if(n.check(`work`),r.has(e)){r.add(a);break}}return r}function Js(e,t,n,r,i){if(e.visibleToUser===!1)return!1;let a=Ys(e);return t.interactiveOnly?Xs(e,a,n,r,i):a.isStructural||a.isVisual?$s(e,a,r):!0}function Ys(e){let t=tc(e.type),n=!!(e.label&&e.label.trim().length>0),r=!!(e.identifier&&e.identifier.trim().length>0);return{type:t,hasMeaningfulText:n&&!As(e.label??``),hasMeaningfulId:r&&!As(e.identifier??``),isStructural:nc(t),isVisual:t===`imageview`||t===`imagebutton`}}function Xs(e,t,n,r,i){return Qs(e)?!1:J(e)||ie(t.type)&&r?!0:Zs(t,n,r,i)}function Zs(e,t,n,r){return!e.hasMeaningfulText&&!e.hasMeaningfulId||e.isVisual||e.isStructural&&!r&&!t?!1:t||n||r}function Qs(e){return!!(e.rect&&(e.rect.width<=0||e.rect.height<=0))}function $s(e,t,n){return J(e)||t.hasMeaningfulText||t.hasMeaningfulId?!0:n}function ec(e){if(!e)return!1;let t=tc(e);return t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)}function tc(e){return e?e.toLowerCase():``}function nc(e){let t=e.split(`.`).pop()??e;return t.includes(`layout`)||t===`viewgroup`||t===`view`}function rc(e,t,n,r){return{...js(e,t),...n?{clipsDescendants:!0}:{},...r?{windowRect:r}:{}}}const ic=`ANDROID_SNAPSHOT_PRESENTATION_FAILED`;var Y=class extends Error{code=ic;qualityReasonCode=`presentation-failed`;details;analysis;constructor(e,t,n){super(e),this.name=`AndroidSnapshotPresentationFailure`,this.details=t,this.analysis=n}};function ac(e){return e instanceof Y?e.code===ic:!!(e&&typeof e==`object`&&e.code===ic)}var oc=class{workUnits=0;options;defaultMaxWorkUnits;deadlineAtMs;constructor(e,t){this.options=e,this.defaultMaxWorkUnits=t;let n=e.now??Date.now;this.deadlineAtMs=e.deadlineAtMs??n()+dc()}get workUnitCount(){return this.workUnits}check(e){this.consume(1)}consume(e){this.workUnits+=e;let t=this.options.maxWorkUnits??this.defaultMaxWorkUnits;if(this.workUnits>t)throw new Y(`Android snapshot presentation exceeded its linear work budget`,{phase:`complexity`,workUnits:this.workUnits,maxWorkUnits:t});if((this.options.now??Date.now)()>=this.deadlineAtMs)throw new Y(`Android snapshot presentation exceeded its cooperative deadline`,{phase:`deadline`,workUnits:this.workUnits,deadlineAtMs:this.deadlineAtMs,maxWorkUnits:t})}};function sc(e,t){return new oc(e??{},t)}function cc(e,t,n){let r=new Map;for(let i of e){n.check(`regular-invariant`);let e=lc(i,r,t),a=i.effectiveRect;if(!a||!ae(a)){if(Ns(i).hittable===!0)throw new Y(`Android regular snapshot node ${i.raw.index} with degenerate effective geometry was marked hittable`,{phase:`regular-invariant`,workUnits:n.workUnitCount,nodeIndex:i.raw.index,frame:a});r.set(i.raw.index,e);continue}if(e&&!uc(a,e))throw new Y(`Android regular snapshot node ${i.raw.index} escaped its cumulative clip`,{phase:`regular-invariant`,workUnits:n.workUnitCount,nodeIndex:i.raw.index,frame:a,clip:e});r.set(i.raw.index,i.clipsDescendants?a:e)}}function lc(e,t,n){let r=e.raw.parentIndex;return r===void 0?e.windowRect??n:t.get(r)??e.windowRect??n}function uc(e,t){let n=1e-4;return e.x>=t.x-n&&e.y>=t.y-n&&e.x+e.width<=t.x+t.width+n&&e.y+e.height<=t.y+t.height+n}function dc(){return 250}function fc(e,t,n){let r=n.depth??1/0,i=ce(n.scope),a=Ac(e),o=sc(n.androidPresentation,Math.max(1024,a.rawNodeCount*128)),s={nodes:[],sourceNodes:[],...t===void 0?{}:{maxNodes:t},maxDepth:i?1/0:r,options:n,analysis:a,interactiveDescendantMemo:new Map,hidden:new Set,presentationBudget:o,presentationNodes:[],truncated:!1};try{o.check(`work`),s.viewport=Cc(e,o),s.hidden=n.raw?new Set:Is(e,o);for(let t of e.children)if(mc(s,t,0),s.truncated)break;n.raw||cc(s.presentationNodes,s.viewport,o);let t=s.nodes,a=new Map(s.sourceNodes.map((e,t)=>[e,t])),{nodes:c,sourceNodes:l}=i?Ws(s,e.children,i,r,o):s,u={nodes:c,sourceNodes:l,occlusionContext:{nodes:t,sourceIndexByNodeIndex:new Map(l.flatMap((e,t)=>{let n=a.get(e),r=c[t]?.index;return n===void 0||r===void 0?[]:[[r,n]]})),androidSiblingOrderByNodeIndex:pc(s.sourceNodes)},analysis:s.analysis};return s.truncated?{...u,truncated:!0}:u}catch(e){throw ac(e)&&(e.analysis??=s.analysis),e}}function pc(e){let t=new Map,n=new Map;for(let[r,i]of e.entries()){let e=Ds(i);if(!e)continue;let a=t.get(e.parent);a===void 0&&(a=t.size,t.set(e.parent,a)),n.set(r,{group:a,order:e.order})}return n}function mc(e,t,n,r,i=!1,a=!1,o=!1,s,c){if(e.presentationBudget.check(`work`),hc(e,t,n))return;let l=t.windowRect??s??e.viewport,u=gc(e,t,c,l),d=_c(e,t,r,i,a,o,u,l),f=i||J(t),p=a||ec(t.type),ee=vc(e,t,u,c);yc(e,t,n,d,f,p,o||st(t.identifier),l,ee)}function hc(e,t,n){return e.maxNodes!==void 0&&e.nodes.length>=e.maxNodes?(e.truncated=!0,!0):n>e.maxDepth||e.hidden.has(t)}function gc(e,t,n,r){return e.options.raw?t.rect:Ms(t.rect,r,n)}function _c(e,t,n,r,i,a,o,s){return!e.options.raw&&!Js(t,e.options,r,Ec(e,t),i)?n:bc(e,t,n,a||st(t.identifier),o,s)}function vc(e,t,n,r){return e.options.raw||!wc(t)?r:n}function yc(e,t,n,r,i,a,o,s,c){for(let l of t.children)if(mc(e,l,n+1,r,i,a,o,s,c),e.truncated)return}function bc(e,t,n,r,i,a){let o=e.nodes.length;return e.sourceNodes.push(t),Sc(e,t,xc(e,t,n,r),i,a),o}function xc(e,t,n,r){return{index:e.nodes.length,type:t.type??void 0,label:t.label??void 0,value:t.value??void 0,contentDescription:t.contentDescription,identifier:t.identifier??void 0,bundleId:t.packageName??void 0,rect:t.rect,enabled:t.enabled,focused:t.focused,selected:t.selected,heading:t.heading,roleDescription:t.roleDescription,editable:t.editable,password:t.password,hintShowing:t.hintShowing,selectionStart:t.selectionStart,selectionEnd:t.selectionEnd,visibleToUser:t.visibleToUser,hittable:J(t)||void 0,depth:Tc(e.nodes,n),parentIndex:n,...Dc(t,e.hidden),...r?{systemChrome:!0}:{}}}function Sc(e,t,n,r,i){let a=rc(n,r,!e.options.raw&&wc(t),i);e.presentationNodes.push(a),e.nodes.push(e.options.raw?a.raw:Ns(a))}function Cc(e,t){let n=[],r=[...e.children];for(;r.length>0;){t.check(`work`);let e=r.pop();ae(e.windowRect)&&n.push(e.windowRect),r.push(...e.children)}return re(n)??void 0}function wc(e){return e.scrollable===!0&&ie(e.type)}function Tc(e,t){return t===void 0?0:(e[t]?.depth??-1)+1}function Ec(e,t){let n=e.interactiveDescendantMemo.get(t);if(n!==void 0)return n;for(let n of t.children)if(!e.hidden.has(n)&&n.visibleToUser!==!1&&(J(n)||Ec(e,n)))return e.interactiveDescendantMemo.set(t,!0),!0;return e.interactiveDescendantMemo.set(t,!1),!1}function Dc(e,t){return Oc(e,t)?{...e.canScrollBackward?{hiddenContentAbove:!0}:{},...e.canScrollForward?{hiddenContentBelow:!0}:{}}:{}}function Oc(e,t){if(!e.scrollable||!ie(e.type)||`${e.type??``}`.toLowerCase().includes(`horizontalscrollview`))return!1;let n=kc(e,t);return!(n&&n.horizontal>n.vertical&&n.horizontal>16)}function kc(e,t){let n=e.children.filter(e=>!t.has(e)&&e.visibleToUser!==!1);if(!e.rect||n.length===0)return null;let r=n.map(e=>e.rect).filter(e=>e!==void 0);if(r.length===0)return null;let i=Math.min(...r.map(e=>e.x)),a=Math.max(...r.map(e=>e.x+e.width)),o=Math.min(...r.map(e=>e.y)),s=Math.max(...r.map(e=>e.y+e.height));return{horizontal:Math.max(0,a-i-e.rect.width),vertical:Math.max(0,s-o-e.rect.height)}}function Ac(e){let t=0,n=0,r=[...e.children];for(;r.length>0;){let e=r.pop();t+=1,n=Math.max(n,e.depth),r.push(...e.children)}return{rawNodeCount:t,maxDepth:n}}function jc(){let e=[],t=()=>e.at(-1)===!0;return{open(n,r){let i=t()||st(n);return r||e.push(i),i},close(){e.pop()}}}function*Mc(e){let t=/<node\b[^>]*>|<\/node>/g,n=jc(),r=t.exec(e);for(;r;){let i=r[0];if(i.startsWith(`</node`))n.close();else{let e=Nc(i);yield n.open(e.resourceId,i.endsWith(`/>`))?{...e,systemChrome:!0}:e}r=t.exec(e)}}function Nc(e){let t=Pc(e),n=Ft(t.bounds);return{...t,...n?{rect:n}:{}}}function Pc(e){let t=Fc(e),n=e=>Uc(t,e),r=e=>{let t=n(e);if(t!==null)return t===`true`},i=e=>{let t=n(e);if(t===null||t.trim()===``)return;let r=Number(t);return Number.isFinite(r)?r:void 0},a=(e,t)=>{let n=i(t);return n===void 0?{}:{[e]:n}},o=(e,t)=>{let r=Ft(n(t));return r===void 0?{}:{[e]:r}},s=(e,t)=>{let r=n(t);return r===null||r===``?{}:{[e]:r}},c=(e,t)=>{let n=r(t);return n===void 0?{}:{[e]:n}};return{text:n(`text`),desc:n(`content-desc`),resourceId:n(`resource-id`),packageName:n(`package`),className:n(`class`),bounds:n(`bounds`),clickable:r(`clickable`),enabled:r(`enabled`),focusable:r(`focusable`),focused:r(`focused`),password:r(`password`),...c(`editable`,`editable`),...a(`selectionStart`,`selection-start`),...a(`selectionEnd`,`selection-end`),...c(`hintShowing`,`hint-showing`),...c(`visibleToUser`,`visible-to-user`),...c(`selected`,`selected`),...c(`heading`,`heading`),...s(`roleDescription`,`role-description`),...a(`drawingOrder`,`drawing-order`),...c(`scrollable`,`scrollable`),...c(`canScrollForward`,`can-scroll-forward`),...c(`canScrollBackward`,`can-scroll-backward`),...a(`windowIndex`,`window-index`),...a(`windowType`,`window-type`),...a(`windowLayer`,`window-layer`),...c(`windowActive`,`window-active`),...c(`windowFocused`,`window-focused`),...o(`windowRect`,`window-bounds`)}}function Fc(e){let t=new Map,n=e.indexOf(` `),r=e.lastIndexOf(`>`);if(n<0||r<=n)return t;let i=n;for(;i<r;){let n=Ic(e,i,r);if(!n)break;t.set(n.name,n.value),i=n.nextCursor}return t}function Ic(e,t,n){if(t=Rc(e,t,n),t>=n||zc(e[t]))return;let r=t;t=Lc(e,t,n);let i=e.slice(r,t);if(t=Rc(e,t,n),!i||e[t]!==`=`)return;t=Rc(e,t+1,n);let a=e[t];if(!Bc(a))return;let o=t+1,s=e.indexOf(a,o);if(!(s<0||s>=n))return{name:i,value:It(e.slice(o,s)),nextCursor:s+1}}function Lc(e,t,n){for(;t<n&&!Hc(e[t]??``);)t+=1;return t}function Rc(e,t,n){for(;t<n&&Vc(e[t]??``);)t+=1;return t}function zc(e){return e===`/`||e===`>`}function Bc(e){return e===`"`||e===`'`}function Vc(e){return e===` `||e===`
12
+ `||e===`\r`||e===` `}function Hc(e){return e===`=`||e===`/`||e===`>`||Vc(e)}function Uc(e,t){return e.get(t)??null}function Wc(e){let t={type:null,label:null,value:null,identifier:null,packageName:null,clickable:!1,focusable:!1,depth:-1,children:[]},n=[t],r=/<node\b[^>]*>|<\/node>/g,i=r.exec(e);for(;i;){let t=i[0];if(t.startsWith(`</node`)){n.length>1&&n.pop(),i=r.exec(e);continue}let a=Nc(t),o=n.at(-1),s=Gc(a,o.depth+1,o);o.children.push(s),t.endsWith(`/>`)||n.push(s),i=r.exec(e)}return t}function Gc(e,t,n){let r=e.text||e.desc;return Es({type:e.className,label:r,value:e.text,...e.desc&&e.desc!==r?{contentDescription:e.desc}:{},identifier:e.resourceId,packageName:e.packageName,rect:e.rect,enabled:e.enabled,focused:e.focused,selected:e.selected,heading:e.heading,roleDescription:e.roleDescription,editable:e.editable,password:e.password,hintShowing:e.hintShowing,selectionStart:e.selectionStart,selectionEnd:e.selectionEnd,visibleToUser:e.visibleToUser,clickable:e.clickable===!0,focusable:e.focusable===!0,scrollable:e.scrollable,canScrollForward:e.canScrollForward,canScrollBackward:e.canScrollBackward,windowIndex:e.windowIndex,windowType:e.windowType,windowLayer:e.windowLayer,windowActive:e.windowActive,windowFocused:e.windowFocused,windowRect:e.windowRect,depth:t,parentIndex:void 0,children:[]},e.drawingOrder===void 0?void 0:{parent:n,order:e.drawingOrder})}function Kc(e){let t=new Map;return e.nodes.forEach((n,r)=>{t.set(n.index,e.sourceNodes[r]?.clickable)}),{kind:`exact`,provider:`android-helper`,clickableByNodeIndex:t}}const qc=new Set([`android`,`com.android.systemui`]);function Jc(e,t,n={}){if(t.backend!==`android-helper`)return{outcome:`ok`};let r=al(e,n.foregroundAppPackage);return Zc(r,t)?Yc(r,t,`empty-helper-output`,`Android snapshot helper returned no accessibility nodes`):rl(r)?{outcome:`ok`}:Xc(r)?{outcome:`system-surface-only`}:Qc(r)?{outcome:`ok`}:$c(r)?Yc(r,t,`content-poor-app-window`,`Android snapshot helper returned insufficient foreground app content`):el(r)||tl(r,t)?Yc(r,t,`content-poor-app-window`,`Android snapshot helper returned insufficient application window content`):nl(r)?Yc(r,t,`system-window-only`,`Android snapshot helper returned only non-application windows`):{outcome:`ok`}}function Yc(e,t,n,r){return{outcome:`unusable`,decision:il(e,t,n,r)}}function Xc(e){return e.windowRootCount>0&&e.applicationWindowRootCount===0&&e.activeSystemSurfaceMeaningfulNodeCount>=3}function Zc(e,t){return e.nodeCount===0||t.nodeCount===0||t.rootPresent===!1}function Qc(e){return $c(e)&&e.inputMethodMeaningfulNodeCount>=2}function $c(e){let t=e.foregroundAppMeaningfulNodeCount;return t===void 0?!1:t===0?e.applicationMeaningfulNodeCount<2:t<2&&e.meaningfulNodeCount>t}function el(e){return e.foregroundAppMeaningfulNodeCount===void 0&&e.applicationWindowRootCount>0&&e.applicationMeaningfulNodeCount<2}function tl(e,t){return e.foregroundAppMeaningfulNodeCount===void 0&&e.windowRootCount===0&&(t.windowCount??0)>1&&e.nonSystemMeaningfulNodeCount<2}function nl(e){return e.windowRootCount>0&&e.applicationWindowRootCount===0||e.windowRootCount===0&&e.nodeCount>0&&e.systemUiNodeCount===e.nodeCount}function rl(e){return e.hasAlertButtonIdentifier&&e.hasAlertContentIdentifier}function il(e,t,n,r){return{reason:n,failureReason:r,diagnostics:yl(e,t)}}function al(e,t){let n=ol(t);for(let t of Mc(e))sl(n,t);return ml(n)}function ol(e){return{nodeCount:0,systemUiNodeCount:0,windowRootCount:0,applicationWindowRootCount:0,activeSystemSurfaceMeaningfulNodeCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,inputMethodMeaningfulNodeCount:0,hasAlertButtonIdentifier:!1,hasAlertContentIdentifier:!1,...e===void 0?{}:{foregroundAppPackage:e,foregroundAppMeaningfulNodeCount:0},windowTypes:new Set}}function sl(e,t){e.nodeCount+=1,vl(t.packageName)&&(e.systemUiNodeCount+=1),t.visibleToUser!==!1&&cl(e,t.resourceId),ll(e,t),ul(e,t)}function cl(e,t){let n=en(t);n===`button`&&(e.hasAlertButtonIdentifier=!0),n===`content`&&(e.hasAlertContentIdentifier=!0)}function ll(e,t){t.windowType!==void 0&&(e.currentWindowType=t.windowType,e.currentWindowActiveOrFocused=t.windowActive===!0||t.windowFocused===!0,e.windowRootCount+=1,e.windowTypes.add(t.windowType),t.windowType===1&&(e.applicationWindowRootCount+=1))}function ul(e,t){hl(t)&&(e.meaningfulNodeCount+=1,dl(e,t),pl(e,t))}function dl(e,t){e.currentWindowType===1&&!_l(t.packageName)&&(e.applicationMeaningfulNodeCount+=1),fl(e)&&!ot(t)&&(e.activeSystemSurfaceMeaningfulNodeCount+=1)}function fl(e){return e.currentWindowType!==void 0&&e.currentWindowType!==1&&e.currentWindowActiveOrFocused===!0}function pl(e,t){_l(t.packageName)||(e.nonSystemMeaningfulNodeCount+=1),p({packageName:t.packageName,resourceId:t.resourceId})&&(e.inputMethodMeaningfulNodeCount+=1),e.foregroundAppPackage!==void 0&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1)}function ml(e){return{nodeCount:e.nodeCount,systemUiNodeCount:e.systemUiNodeCount,windowRootCount:e.windowRootCount,applicationWindowRootCount:e.applicationWindowRootCount,activeSystemSurfaceMeaningfulNodeCount:e.activeSystemSurfaceMeaningfulNodeCount,meaningfulNodeCount:e.meaningfulNodeCount,applicationMeaningfulNodeCount:e.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:e.nonSystemMeaningfulNodeCount,inputMethodMeaningfulNodeCount:e.inputMethodMeaningfulNodeCount,hasAlertButtonIdentifier:e.hasAlertButtonIdentifier,hasAlertContentIdentifier:e.hasAlertContentIdentifier,...e.foregroundAppPackage===void 0?{}:{foregroundAppPackage:e.foregroundAppPackage,foregroundAppMeaningfulNodeCount:e.foregroundAppMeaningfulNodeCount??0},windowTypes:[...e.windowTypes].sort((e,t)=>e-t).slice(0,8)}}function hl(e){return e.visibleToUser===!1?!1:gl(e.text)||gl(e.desc)||gl(e.resourceId)}function gl(e){return e!==null&&e.trim()!==``}function _l(e){return e===null||qc.has(e)}function vl(e){return e!==null&&qc.has(e)}function yl(e,t){return{helperNodeCount:e.nodeCount,helperSystemUiNodeCount:e.systemUiNodeCount,helperWindowRootCount:e.windowRootCount,helperApplicationWindowRootCount:e.applicationWindowRootCount,helperMeaningfulNodeCount:e.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:e.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:e.nonSystemMeaningfulNodeCount,helperInputMethodMeaningfulNodeCount:e.inputMethodMeaningfulNodeCount,...e.foregroundAppPackage===void 0?{}:{helperForegroundAppPackage:e.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:e.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2},helperWindowTypes:e.windowTypes,...t.captureMode?{helperCaptureMode:t.captureMode}:{}}}async function bl(e){let t=await B(e.deviceKey,{resetRuntime:!0,signal:e.signal,cause:e.cause});e.signal?.throwIfAborted(),t||await xl(e.adb,e.packageName)}async function xl(e,t){await ii({adb:e,packageName:t}),await g(150),h({level:`debug`,phase:`android_snapshot_helper_runtime_reset`,data:{packageName:t}})}const Sl=Symbol(`androidSnapshotCaptureEvidence`);function Cl(e,t){return Object.defineProperty(e,Sl,{value:t}),e}function wl(e){let t={...e,backend:`android`,producer:`android-uiautomator`},n=e[Sl];return te(t,n.clickability),n.occlusionContext&&l(t,n.occlusionContext),t}async function Tl(e,t={}){let n=C(e,t.helperAdb).exec;return(await Nl(e,t,n)).xml}async function El(e,t={}){let n=C(e,t.helperAdb).exec,r=await Nl(e,t,n),i=r.xml,a=Wc(i),o=kl(r.metadata,a),s={...t,androidPresentation:{...t.androidPresentation,deadlineAtMs:t.androidPresentation?.deadlineAtMs??Date.now()+250}};try{let e=fc(a,void 0,s),n=Ol(e.truncated,r.metadata);t.interactiveOnly&&t.includeHiddenContentHints!==!1&&Ml({options:s,tree:a,xml:i,interactiveSnapshot:e});let{sourceNodes:c,occlusionContext:l,...u}=e;return Cl({...u,...jl(n),androidSnapshot:o,quality:{state:`healthy`,backend:`android-helper`}},{clickability:Kc(e),occlusionContext:l})}catch(e){if(!ac(e))throw e;return Dl({failure:e,androidSnapshot:o})}}function Dl(e){return Cl({nodes:[],truncated:!0,analysis:e.failure.analysis??{rawNodeCount:0,maxDepth:0},androidSnapshot:{...e.androidSnapshot,presentationFailure:{phase:e.failure.details.phase,workUnits:e.failure.details.workUnits,...e.failure.details.maxWorkUnits===void 0?{}:{maxWorkUnits:e.failure.details.maxWorkUnits}}},quality:{state:`sparse`,backend:`android-helper`,reason:e.failure.message,reasonCode:e.failure.qualityReasonCode}},{clickability:{kind:`exact`,provider:`android-helper`,clickableByNodeIndex:new Map}})}function Ol(e,t){return e===!0||t.helperTruncated===!0||e}function kl(e,t){return Al(t)===!1?{...e,occlusionScanUnavailable:!0}:e}function Al(e){let t=[...e.children];if(t.length!==0){for(;t.length>0;){let e=t.pop();if(Ds(e)!==void 0)return!0;t.push(...e.children)}return!1}}function jl(e){return e===!0?{truncated:!0}:{}}function Ml(e){if(Zl(e.interactiveSnapshot.nodes).size>0||Xl(e.xml))return;let t=fc(e.tree,void 0,{...e.options,interactiveOnly:!1});Ql(be(o(t.nodes)),t,e.interactiveSnapshot)}async function Nl(e,t,n){let r=C(e,t.helperAdb),i=await m(`android_snapshot_helper_artifact_resolution`,async()=>await Jl(t.helperArtifact??r.snapshotHelperArtifact));if(i.artifact)return await Pl(e,t,n,i.artifact);throw h({level:`error`,phase:`android_snapshot_helper_unavailable`,data:{reason:i.errorReason??`artifact_not_found`}}),Yl(i.errorReason)}async function Pl(e,t,n,r){let i=Wr(e),a=C(e,t.helperAdb),o=t.helperSessionScope!==`daemon-session`;try{let e;for(let o=0;;o+=1){o>0&&await zl(t.signal);let s=await Rl({options:t,adb:n,adbProvider:a,artifact:r,helperDeviceKey:i,attempt:o,previousContentReason:e});if(s.outcome===`captured`)return s.capture;if(o+1>=3)return await Bl({contentRecovery:s.decision,attempts:o+1,helperDeviceKey:i,artifact:r,adb:n,signal:t.signal});e=s.decision.reason}}finally{o&&await B(i)}}async function Fl(e,t,n,r,i){let a=await m(`android_snapshot_helper_install`,async()=>await or({adb:t,adbProvider:n,artifact:r,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4,signal:e.signal}),{packageName:r.manifest.packageName,versionCode:r.manifest.versionCode,installPolicy:e.helperInstallPolicy??`missing-or-outdated`});return h({phase:`android_snapshot_helper_install_decision`,data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,artifactSha256:r.manifest.sha256,installedSha256:a.installedSha256,installed:a.installed,reason:a.reason}}),a}async function Il(e){let{signal:t,adb:r,adbProvider:i,artifact:a,helperDeviceKey:o}=e,s=si({adb:r,adbProvider:i,artifact:a,deviceKey:o,signal:t});try{let e=await m(`android_snapshot_helper_session_capture`,async()=>await qi(s),{packageName:a.manifest.packageName,version:a.manifest.version,timeoutMs:Kn});if(e)return e}catch(e){if(t?.throwIfAborted(),Jr(e))throw e;h({level:`warn`,phase:`android_snapshot_helper_session_fallback`,data:{reason:n(e).message}}),await xl(r,a.manifest.packageName)}return await m(`android_snapshot_helper_capture`,async()=>await oi(s),{packageName:a.manifest.packageName,version:a.manifest.version,timeoutMs:Kn,commandTimeoutMs:qn})}function Ll(e,t,n){return{xml:e.xml,metadata:{backend:`android-helper`,helperVersion:t.manifest.version,helperApiVersion:e.metadata.helperApiVersion,helperTransport:e.metadata.transport,helperSessionReused:e.metadata.sessionReused,installReason:n,waitForIdleTimeoutMs:e.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:e.metadata.waitForIdleQuietMs,timeoutMs:e.metadata.timeoutMs,maxDepth:e.metadata.maxDepth,maxNodes:e.metadata.maxNodes,rootPresent:e.metadata.rootPresent,captureMode:e.metadata.captureMode,windowCount:e.metadata.windowCount,nodeCount:e.metadata.nodeCount,helperTruncated:e.metadata.truncated,elapsedMs:e.metadata.elapsedMs}}}async function Rl(e){let{options:t,adb:n,adbProvider:r,artifact:i,helperDeviceKey:a,attempt:o}=e,s;try{let e=await Fl(t,n,r,i,a);e.installed&&await B(a),s=Ll(await Il({signal:t.signal,adb:n,adbProvider:r,artifact:i,helperDeviceKey:a}),i,e.reason)}catch(e){return t.signal?.throwIfAborted(),{outcome:`captured`,capture:await Vl({error:e,helperDeviceKey:a,artifact:i,adb:n})}}let c=Jc(s.xml,s.metadata,{foregroundAppPackage:t.appBundleId});if(c.outcome===`unusable`)return{outcome:`unusable`,decision:c.decision};let l=c.outcome===`system-surface-only`;return!l&&o>0&&h({phase:`android_snapshot_helper_content_recaptured`,data:{attempts:o+1,recoveredFromReason:e.previousContentReason}}),{outcome:`captured`,capture:{xml:s.xml,metadata:l?{...s.metadata,systemSurfaceOnly:!0}:s.metadata}}}async function zl(e){e?.throwIfAborted(),await g(250),e?.throwIfAborted()}async function Bl(e){throw h({level:`error`,phase:`android_snapshot_helper_content_invalid`,data:{reason:e.contentRecovery.reason,failureReason:e.contentRecovery.failureReason,attempts:e.attempts,...e.contentRecovery.diagnostics}}),await bl({adb:e.adb,deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,signal:e.signal,cause:e.contentRecovery.failureReason}),new t(`COMMAND_FAILED`,e.contentRecovery.failureReason,{...e.contentRecovery.diagnostics,androidSnapshotHelperFailureReason:e.contentRecovery.reason,attempts:e.attempts,retriable:!0,hint:`Retry after the app UI stabilizes. If this persists, capture a screenshot and report the helper diagnostics; agent-device does not substitute a second snapshot engine.`})}async function Vl(e){let t=Hl(e.error);throw h({level:`error`,phase:`android_snapshot_helper_failed`,data:{reason:t}}),await B(e.helperDeviceKey),await xl(e.adb,e.artifact.manifest.packageName),tr({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),Ul(e.error,t)}function Hl(e){let t=n(e),r=ql(t.details?.helper);if(r&&r!==t.message)return`${t.message}: ${r}`;if(r)return r;let i=(typeof t.details?.stderr==`string`?t.details.stderr.trim():``).split(/\r?\n/).find(e=>e.trim());return i?`${t.message}: ${i}`:t.message}function Ul(e,i){let a=n(e),o=Wl(a);return new t(r(a.code),`Android snapshot helper failed: ${i}`,{...a.details,...Kl(a),androidSnapshotHelperFailureReason:i,...o?{androidCaptureFailureReason:o}:{},hint:Gl(a,o)},e)}function Wl(e){return ct(e)}function Gl(e,t){return t===`accessibility-timeout`?`Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists.`:e.details?.androidSnapshotHelperInstallFailure===!0?[e.hint,`This is a device-side install failure (adb rejection or OEM policy) — the helper artifact itself is present, this is not a missing/unbuilt build.`].filter(Boolean).join(` `):e.hint??`Retry once. If the helper still fails, run agent-device doctor and report the diagnostic log; agent-device does not substitute a second snapshot engine.`}function Kl(e){let t={};return e.diagnosticId!==void 0&&(t.diagnosticId=e.diagnosticId),e.logPath!==void 0&&(t.logPath=e.logPath),e.retriable!==void 0&&(t.retriable=e.retriable),e.supportedOn!==void 0&&(t.supportedOn=e.supportedOn),t}function ql(e){if(!e||typeof e!=`object`||!(`message`in e))return;let t=String(e.message).trim();return t&&t!==`null`?t:void 0}async function Jl(e){if(e)return{artifact:e};let t=ke(),r=E.join(Ae(),`android`,`snapshot-helper`,`dist`),i=E.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await x().files.access(i)}catch{return{}}try{let e=Jn(JSON.parse(await x().files.readText(i))),t=E.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await x().files.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{errorReason:n(e).message}}}function Yl(e){let n=e??`the bundled helper artifact was not found`;return new t(`COMMAND_FAILED`,`Android snapshot helper is unavailable: ${n}`,{androidSnapshotHelperFailureReason:n,hint:"Run `pnpm build:android` to build the helper dist for a source checkout — the runtime needs android/snapshot-helper/dist/agent-device-android-snapshot-helper-<version>.manifest.json and the .apk it references. Packaged installs ship these via the prepack script; if they are missing from a packaged install, reinstall agent-device."})}function Xl(e){return e.includes(` can-scroll-forward=`)||e.includes(` can-scroll-backward=`)}function Zl(e){let t=new Map;for(let n of e){let e={};n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n.index,e)}return t}function Ql(e,t,n){if(e.size===0)return;let r=new Map;for(let[e,t]of n.sourceNodes.entries()){let i=n.nodes[e];i&&r.set(t,i)}for(let[n,i]of e){let e=t.sourceNodes[n];if(!e)continue;let a=r.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}async function $l(e,t,n,r,i={}){let a=[0,150,350],o=null,s=null,c=await vu(e);for(let l of a){l>0&&await g(l);let a=await cu(e,t,n,r,c,i);if(o=a,a.reason===`ime_capture`)return a;s=a.ok?a:null}return s??o??{ok:!1,actual:null,reason:`text_mismatch`,targetInput:null,actualInput:null}}async function eu(e,t,n,r={}){return au(await Tl(e,r),t,n)}async function tu(e,t,n,r){let i=await vu(e);return lu(await Tl(e,r),t,n,i).targetInput}async function nu(e,t,n,r={}){try{return await tu(e,t,n,r)}catch(e){return h({level:`warn`,phase:`android_fill_pre_action_target_capture_failed`,data:{error:e instanceof Error?e.message:String(e)}}),null}}function X(e,n,r){if(r?.ok)return;let i=r?ru(e,n,r):null;if(i)return i;throw new t(`COMMAND_FAILED`,ou(r),su(e,r))}function ru(e,t,n){let r=n.targetInput,i=n.actualInput;if(e.length===0||n.reason===`ime_capture`||!t||!r||!i||q(t)||q(r)||q(i)||!wu(t,r)||!wu(t,i)||t.text===n.actual)return null;let a=Tu(t);return h({level:`warn`,phase:`android_fill_verification_unconfirmed`,data:{target:a}}),{verification:`unconfirmed`,requested:e,before:t.text,after:n.actual,target:a}}function iu(e,t,n,r,i={}){let a=lu(e,t,n,i);return uu(a)?{ok:!1,actual:a.actualInput?.text??null,reason:`ime_capture`,targetInput:a.targetInput,actualInput:a.actualInput}:du(a,r)??fu(a,r)}function au(e,t,n){return lu(e,t,n).targetInput?.text??null}function ou(e){return e?.reason===`ime_capture`?`Android fill input was captured by the active keyboard instead of the app field`:e?.reason===`masked_unverified`?`Android fill verification could not confirm masked text value`:`Android fill verification failed`}function su(e,t){let n=bs(e,t);return t?.reason===`ime_capture`&&(n.hint=`The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill.`),n}async function cu(e,t,n,r,i,a){return iu(await Tl(e,a),t,n,r,i)}function lu(e,t,n,r={}){let i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let a of Mc(e)){let e=_u(a,r);e&&yu(i,e,t,n)}return xu(i)}function uu(e){let{targetInput:t,actualInput:n}=e;return!t||!n||n===t?!1:n.inputMethodOwned&&!t.inputMethodOwned}function du(e,t){let n=e.actualInput;if(!n||!Cu(n))return null;let r=n.text??null,i=Array.from(pu(n)).length,a=Array.from(t).length,o=a===0?i===0:i>0&&i===a;return{ok:o,actual:r,reason:o?void 0:`masked_unverified`,masked:!0,targetInput:e.targetInput,actualInput:n}}function fu(e,t){let n=e.actualInput;return{ok:n!==null&&mu(pu(n),t),actual:n?.text??null,reason:`text_mismatch`,targetInput:e.targetInput,actualInput:n}}function pu(e){return e.hintShowing?``:e.text??``}function mu(e,t){if(e===t)return!0;if(t.length===0)return!1;let n=hu(e),r=hu(t);return!n||!r?!1:!!(n===r||gu(n,r))}function hu(e){return e.replaceAll(/\s+/g,` `).trim()}function gu(e,t){if(e.length!==t.length||e.length===0||e.slice(1)!==t.slice(1))return!1;let n=e[0],r=t[0];return!n||!r?!1:r.toLowerCase()===r&&n===r.toUpperCase()}function _u(e,t){if(!e.rect)return null;let n=e.text??``,r=Math.max(1,e.rect.width*e.rect.height);return{text:n||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:e.password===!0,inputMethodOwned:p({packageName:e.packageName,resourceId:e.resourceId,activeInputMethodPackage:t.activeInputMethodPackage}),area:r,editText:Su(e.className??``),hintShowing:e.hintShowing===!0}}async function vu(e){try{return{activeInputMethodPackage:(await lo(e)).inputMethodPackage}}catch(e){return h({level:`warn`,phase:`android_fill_verification_input_method_probe_failed`,data:{error:e instanceof Error?e.message:String(e)}}),{}}}function yu(e,t,n,r){let i=ne(t.rect,n,r);if(i&&t.editText&&(e.editAtPoint=bu(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=bu(e.focusedEdit,t);return}i&&t.text&&(e.anyAtPoint=bu(e.anyAtPoint,t))}function bu(e,t){return e&&e.area<t.area?e:t}function xu(e){let t=e.editAtPoint??e.anyAtPoint;return{targetInput:t,actualInput:(e.focusedEdit?.text?e.focusedEdit:null)??t}}function Su(e){let t=e.toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)}function Cu(e){return q(e)}function wu(e,t){return e.resourceId||t.resourceId?e.resourceId===t.resourceId&&e.packageName===t.packageName:e.className===t.className&&e.packageName===t.packageName&&e.rect.x===t.rect.x&&e.rect.y===t.rect.y&&e.rect.width===t.rect.width&&e.rect.height===t.rect.height}function Tu(e){return{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:e.rect}}async function Eu(e,t){return await Lt(t.stateDir),await Qo(t.stateDir,e.id,async()=>await Ou(e,t))}function Du(e){let t=a(e).details?.hint;return{outcome:`helper-unavailable`,reason:n(e).message,...typeof t==`string`?{hint:t}:{}}}async function Ou(e,t){let n=x().imeRecoveryMarkers,r=y(e),i=C(e),a=U(e),o;try{o=await jo(i),await Fo({adb:r,adbProvider:i,artifact:o,deviceKey:a})}catch(e){return Du(e)}let{manifest:s}=o,c=await W(r);if(c===s.serviceComponent){let i=await n.write(t.stateDir,e.id),o=await G(r);return i&&K.add(a),{outcome:`settled`,activated:!1,alreadyActive:!0,...i?{}:{persistFailed:!0},previousIme:o,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName}}let l=await G(r);if(!await Go(r,c))return await qo(r,l,e.id),S({level:`warn`,phase:`android_test_ime_persist_failed`,data:{device:e.id,previousIme:c}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName};let u=(await n.read(t.stateDir)).includes(e.id);if(!await n.write(t.stateDir,e.id))return await qo(r,l,e.id),S({level:`warn`,phase:`android_test_ime_marker_persist_failed`,data:{device:e.id,previousIme:c}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName};await b(r,[`ime`,`enable`,s.serviceComponent],{allowFailure:!0,timeoutMs:1e4});let d=await b(r,[`ime`,`set`,s.serviceComponent],{allowFailure:!0,timeoutMs:1e4}),f=await W(r);return f===s.serviceComponent?(K.add(a),S({phase:`android_test_ime_activated`,data:{device:e.id,previousIme:c}}),{outcome:`settled`,activated:!0,alreadyActive:!1,previousIme:c,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName}):(K.delete(a),await qo(r,l,e.id),u||await n.clear(t.stateDir,e.id),S({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,activeIme:f,stderr:d.stderr.trim()}}),{outcome:`settled`,activated:!1,alreadyActive:!1,helperServiceComponent:s.serviceComponent,helperPackageName:s.packageName})}function ku(e){return E.join(e,`android-test-ime-pending`)}function Au(e,t){return E.join(ku(e),encodeURIComponent(t))}async function ju(e,t){let r=x().files,i,a=!1;try{let n=ku(e);if(i=Au(e,t),await r.ensureDirectory(n),(await Pu(i))?.serial===t)return!0;let o={version:1,serial:t};if(await r.writeAtomicText(i,`${JSON.stringify(o)}\n`,384),a=!0,(await Pu(i))?.serial!==t)throw Error(`Android test IME marker read-back did not match the requested device.`);return!0}catch(o){return a&&i&&await r.remove(i,{force:!0}).catch(()=>{}),h({level:`debug`,phase:`android_test_ime_marker_write_failed`,data:{stateDir:e,serial:t,error:n(o).message}}),!1}}async function Mu(e,t){await x().files.remove(Au(e,t),{force:!0}).catch(()=>{})}async function Nu(e){let t=x().files,n;try{n=await t.readDirectory(ku(e))}catch{return[]}let r=[];for(let t of n)try{let n=E.join(ku(e),t),i=await Pu(n);i&&Au(e,i.serial)===n&&r.push(i.serial)}catch{}return[...new Set(r)].sort()}async function Pu(e){try{return Fu(await x().files.readText(e))}catch{return}}function Fu(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t;return n.version===1&&typeof n.serial==`string`&&n.serial.length>0?{version:1,serial:n.serial}:void 0}catch{return}}const Iu=new Bt(`utf-16le`);let Lu;async function Ru(e,t){for(let n of[`AndroidManifest.xml`,`base/manifest/AndroidManifest.xml`]){let r=await zu(e,n,t);if(!r)continue;let i=Bu(r);if(i)return i}return await Yu(e,t)}async function zu(e,t,n){try{let r=await Ce(`unzip`,[`-p`,e,t],{allowFailure:!0,binaryStdout:!0,signal:n});return r.exitCode!==0||!r.stdoutBuffer||r.stdoutBuffer.length===0?void 0:r.stdoutBuffer}catch{n?.throwIfAborted();return}}function Bu(e){return e.subarray(0,Math.min(e.length,128)).toString(`utf8`).trimStart().startsWith(`<`)?Vu(e.toString(`utf8`)):Hu(e)}function Vu(e){return e.match(/<manifest\b[^>]*\bpackage\s*=\s*["']([^"']+)["']/i)?.[1]}function Hu(e){if(e.length<8||e.readUInt16LE(0)!==3)return;let t;for(let n=e.readUInt16LE(2);n+8<=e.length;){let r=e.readUInt16LE(n),i=e.readUInt16LE(n+2),a=e.readUInt32LE(n+4);if(a<=0||n+a>e.length)return;if(r===1)t=Wu(e.subarray(n,n+a));else if(r===258&&t){let r=Uu(e,n,i,t);if(r)return r}n+=a}}function Uu(e,t,n,r){if(n<36||t+n>e.length||r[e.readUInt32LE(t+20)]!==`manifest`)return;let i=e.readUInt16LE(t+24),a=e.readUInt16LE(t+26),o=e.readUInt16LE(t+28),s=t+i;for(let t=0;t<o;t+=1){let n=s+t*a;if(n+20>e.length)return;if(r[e.readUInt32LE(n+4)]!==`package`)continue;let i=e.readUInt32LE(n+8);if(i!==4294967295)return r[i];let o=e.readUInt8(n+15),c=e.readUInt32LE(n+16);return o===3?r[c]:void 0}}function Wu(e){if(e.length<28)return[];let t=e.readUInt32LE(8),n=e.readUInt32LE(16),r=e.readUInt32LE(20),i=!!(n&256),a=[];for(let n=0;n<t;n+=1){let t=28+n*4;if(t+4>e.length)return a;let o=r+e.readUInt32LE(t);a.push(i?Gu(e,o):Ku(e,o))}return a}function Gu(e,t){let[,n]=qu(e,t),[r,i]=qu(e,t+n),a=t+n+i;return e.subarray(a,a+r).toString(`utf8`)}function Ku(e,t){let[n,r]=Ju(e,t),i=t+r;return Iu.decode(e.subarray(i,i+n*2))}function qu(e,t){let n=e.readUInt8(t);if(!(n&128))return[n,1];let r=e.readUInt8(t+1);return[(n&127)<<8|r,2]}function Ju(e,t){let n=e.readUInt16LE(t);if(!(n&32768))return[n,2];let r=e.readUInt16LE(t+2);return[(n&32767)<<16|r,4]}async function Yu(e,t){t?.throwIfAborted();let n=await Xu();if(!n)return;let r=await Ce(n,[`dump`,`badging`,e],{allowFailure:!0,signal:t});if(r.exitCode===0)return r.stdout.match(/package:\s+name='([^']+)'/)?.[1]}async function Xu(){if(Lu!==void 0)return Lu??void 0;try{let e=x().files;for(let t of _t()){let n=E.join(t,`build-tools`);try{let t=(await e.readDirectory(n)).sort((e,t)=>t.localeCompare(e,void 0,{numeric:!0}));for(let r of t){let t=E.join(n,r,`aapt`);if(E.isAbsolute(t)&&await e.isExecutable(t))return Lu=t,t}}catch{}}}catch{}Lu=null}async function Zu(e,t){let n=e.kind===`url`&&je(e.url),r=await Me({source:e,isInstallablePath:(e,t)=>t.isFile()&&Qu(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||n,signal:t?.signal});try{let e=t?.resolveIdentity===!1?{}:await $u(r.installablePath,t?.signal);return{archivePath:r.archivePath,installablePath:r.installablePath,packageName:e.packageName,cleanup:r.cleanup}}catch(e){throw await r.cleanup(),e}}function Qu(e){let t=E.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function $u(e,t){let n=E.extname(e).toLowerCase();return n!==`.apk`&&n!==`.aab`?{}:{packageName:await Ru(e,t)}}async function ed(e,n,r,i={}){let a=typeof r.action==`string`&&r.action.trim()?r.action.trim():`${n}.TEST_PUSH`,o=[`am`,`broadcast`,`-a`,a,`-p`,n],s=typeof r.receiver==`string`?r.receiver.trim():``;s&&o.push(`-n`,s);let c=r.extras;if(c!==void 0&&(typeof c!=`object`||!c||Array.isArray(c)))throw new t(`INVALID_ARGS`,`Android push payload extras must be an object`);let l=c??{},u=0;for(let[e,t]of Object.entries(l))e&&(td(o,e,t),u+=1);return await T(e,o,{signal:i.signal}),{action:a,extrasCount:u}}function td(e,n,r){if(typeof r==`string`){e.push(`--es`,n,r);return}if(typeof r==`boolean`){e.push(`--ez`,n,r?`true`:`false`);return}if(typeof r==`number`&&Number.isFinite(r)){if(Number.isInteger(r)){e.push(`--ei`,n,String(r));return}e.push(`--ef`,n,String(r));return}throw new t(`INVALID_ARGS`,`Unsupported Android broadcast extra type for "${n}". Use string, boolean, or number.`)}function Z(e){let t=e.replaceAll(`,`,``).match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let n=Number(t[0]);return Number.isFinite(n)?n:null}function nd(e){let t=sd(e.map(e=>e.intendedVsyncNs)),n=[];for(let e=1;e<t.length;e+=1){let r=t[e]-t[e-1];r>=4e6&&r<=5e7&&n.push(r)}if(n.length!==0)return cd(n)}function rd(e){let{frames:t,frameDeadlineNs:n,summaryDroppedFrameCount:r}=e;return r===void 0?n===void 0?[]:t.filter(e=>e.durationNs>n):r<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,r).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}function id(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e;if(t.length===0||n===void 0)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>od({frames:e,windowStartNs:n,measuredAtMs:r,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}function ad(e){return Math.round(e*10)/10}function od(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-n)/1e6)),c=Math.max(s,Math.round((o-n)/1e6)),l=i!==void 0&&Number.isFinite(r)?r-i:void 0;return{startOffsetMs:s,endOffsetMs:c,startAt:l===void 0?void 0:new Date(l+a/1e6).toISOString(),endAt:l===void 0?void 0:new Date(l+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:ad(Math.max(...t.map(e=>e.durationNs))/1e6)}}function sd(e){return[...new Set(e.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)}function cd(e){let t=[...e].sort((e,t)=>e-t),n=Math.floor(t.length/2);return t.length%2==1?t[n]:(t[n-1]+t[n])/2}function ld(e,t,n){ud(e,t);let r=bd(e),i=gd(e),a=fd(i,r,t),o=Date.parse(n),s=Sd({frames:i,measuredAtMs:o,summary:r}),c=rd({frames:i,frameDeadlineNs:a,summaryDroppedFrameCount:r?.droppedFrameCount}),l=r?.sampleWindowMs??s.sampleWindowMs??Ed(i),u=pd(r,i,c),d=hd({droppedFrames:c,timing:s,measuredAtMs:o,summary:r});return{...u,sampleWindowMs:l,...md(a),windowStartedAt:s.windowStartedAt,windowEndedAt:s.windowEndedAt,timestampSource:s.timestampSource,measuredAt:n,method:`adb-shell-dumpsys-gfxinfo-framestats`,source:r?`android-gfxinfo-summary`:`framestats-rows`,worstWindows:d&&d.length>0?d:void 0}}function ud(e,n){if(/no process found for:/i.test(e))throw new t(`COMMAND_FAILED`,`Android gfxinfo did not find a running process for ${n}`,{metric:`fps`,package:n,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect.`})}function dd(e){throw new t(`COMMAND_FAILED`,`Failed to parse Android framestats output for ${e}`,{metric:`fps`,package:e,hint:`Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging.`})}function fd(e,n,r){let i=nd(e);if(!n&&e.length===0&&dd(r),n||i!==void 0)return i;throw new t(`COMMAND_FAILED`,`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:`fps`,package:r,hint:`Retry perf after a longer interaction window so consecutive Android frame timestamps are available.`})}function pd(e,t,n){let r=e?.totalFrameCount??t.length,i=e?.droppedFrameCount??n.length;return{totalFrameCount:r,droppedFrameCount:i,droppedFramePercent:e?.droppedFramePercent??(r>0?Rt(i/r*100):0)}}function md(e){return{frameDeadlineMs:e===void 0?void 0:ad(e/1e6),refreshRateHz:e===void 0?void 0:ad(1e9/e)}}function hd(e){let{droppedFrames:t,timing:n,measuredAtMs:r,summary:i}=e;if(t.length===0)return;let a=id({frames:t,windowStartNs:n.windowStartNs,measuredAtMs:r,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}function gd(e){let t=[],n=null;for(let r of e.split(`
13
13
  `)){let e=r.trim();if(e.length===0||e===`---PROFILEDATA---`)continue;let i=e.split(`,`).map(e=>e.trim());if(_d(i)){n=new Map(i.map((e,t)=>[e,t]));continue}let a=vd(i,n);a&&t.push(a)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}function _d(e){return e.includes(`IntendedVsync`)&&e.includes(`FrameCompleted`)}function vd(e,t){if(!t||e.length<t.size)return;let n=yd(e,t,`Flags`),r=yd(e,t,`IntendedVsync`),i=yd(e,t,`FrameCompleted`);if(!(n!==0||r===null||i===null||r<=0||i<=r))return{intendedVsyncNs:r,frameCompletedNs:i,durationNs:i-r}}function yd(e,t,n){let r=t.get(n);if(r===void 0)return null;let i=Number(e[r]);return Number.isFinite(i)?i:null}function bd(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??``,n=Dd(t,`Total frames rendered`),r=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(n===void 0||!r)return;let i=r[1],a=r[2];if(i===void 0||a===void 0)return;let o=Z(i)??void 0,s=Number(a);if(o===void 0||!Number.isFinite(s)||n<0)return;let c=Dd(t,`Uptime`),l=Dd(t,`Stats since`);return{droppedFramePercent:Rt(s),droppedFrameCount:o,totalFrameCount:n,sampleWindowMs:xd({uptimeMs:c,statsSinceNs:l}),uptimeMs:c,statsSinceNs:l}}function xd(e){let{uptimeMs:t,statsSinceNs:n}=e;if(t===void 0||n===void 0)return;let r=t-Math.round(n/1e6);return r>=0?r:void 0}function Sd(e){let{frames:t,measuredAtMs:n,summary:r}=e,i=Cd(t),a=r?.statsSinceNs,o=a??i.firstFrameNs,s=wd(o,i.lastFrameNs),c=r?.sampleWindowMs??s;if(!Number.isFinite(n)||r?.uptimeMs===void 0||o===void 0)return{sampleWindowMs:c,windowStartNs:o};let l=n-r.uptimeMs;return{sampleWindowMs:c,windowStartNs:o,windowStartedAt:new Date(l+o/1e6).toISOString(),windowEndedAt:Td({deviceBootWallClockMs:l,measuredAtMs:n,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:`estimated-from-device-uptime`}}function Cd(e){return e.length===0?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function wd(e,t){if(e!==void 0&&t!==void 0)return Math.max(0,Math.round((t-e)/1e6))}function Td(e){let{deviceBootWallClockMs:t,measuredAtMs:n,summaryStartNs:r,lastFrameNs:i}=e;return r===void 0?i===void 0?void 0:new Date(t+i/1e6).toISOString():new Date(n).toISOString()}function Ed(e){if(e.length===0)return;let t=Cd(e);return wd(t.firstFrameNs,t.lastFrameNs)}function Dd(e,t){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),r=e.match(RegExp(`^\\s*${n}:\\s*([0-9][0-9,]*)`,`im`));if(!r)return;let i=r[1];return i===void 0?void 0:Z(i)??void 0}async function Od(e,t,n={}){let r=y(e,n.adb);try{let i=ld((await b(r,[`dumpsys`,`gfxinfo`,t,`framestats`],{timeoutMs:15e3})).stdout,t,new Date().toISOString());return await kd(e,t,n),i}catch(e){throw Ad(t,e)}}async function kd(e,t,n={}){let r=y(e,n.adb);try{await b(r,[`dumpsys`,`gfxinfo`,t,`reset`],{allowFailure:!0,timeoutMs:3e3})}catch{}}function Ad(e,n){return n instanceof t?new t(n.code,n.message,{...n.details??{},metric:`fps`,package:e},n):new t(`COMMAND_FAILED`,`Failed to sample Android fps for ${e}`,{metric:`fps`,package:e},n)}async function jd(e,t,n,r,i){return{capture:{durationMs:r,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:n},frameHealth:t.kind===`perfetto`?await Md(e,t.packageName,i):void 0,notes:[t.kind===`perfetto`?`Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.`:`Open the Simpleperf report artifact for symbol-level CPU attribution.`]}}async function Md(e,t,n){try{let r=await Od(e,t,n);return{available:!0,droppedFramePercent:r.droppedFramePercent,droppedFrameCount:r.droppedFrameCount,totalFrameCount:r.totalFrameCount,method:r.method,worstWindows:r.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:`Android frame health was not available`}}}async function Nd(e,t,n){let r=y(e,n.adb);await zd(r,t),await Hd(r,t),await Vd(r,t,n.files);let i=await Rd(t.outPath,n.files);await Id(r,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await jd(e,t,i,o,{adb:r});return{...t,action:`stop`,platform:`android`,state:`stopped`,stoppedAt:a,durationMs:o,sizeBytes:i,method:t.kind===`simpleperf`?Fr:Ir,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function Pd(e,t,n={}){let r=y(e,n.adb);try{t.state===`running`&&(await zd(r,t),await Hd(r,t).catch(()=>{}))}finally{await Id(r,t.remotePath)}}function Fd(e,t,n=Rr){return`${n}/agent-device-${e.replaceAll(/[^A-Za-z0-9_.-]/g,`_`)}-${Date.now()}-${t}`}async function Id(e,t){try{await b(e,[`rm`,`-f`,t],{allowFailure:!0,timeoutMs:Lr})}catch{}}async function Ld(e,t,n=x().files){await n.ensureDirectory(E.dirname(e)),await n.writeBytes(e,Buffer.from(`${JSON.stringify(t,null,2)}\n`))}async function Rd(e,n=x().files){try{return(await n.stat(e)).size}catch(n){throw new t(`COMMAND_FAILED`,`Profiler artifact was not written: ${e}`,{outPath:e,hint:`Retry the profiling command and check daemon logs if the artifact path is still missing.`},n)}}async function zd(e,t){try{await b(e,[_(Bd(t.profilerPid))],{timeoutMs:P})}catch(e){throw N(`stop`,t.kind,t.packageName,e)}}function Bd(e){return[`pid=${v(e)}`,`kill -INT "$pid" 2>/dev/null || true`,`for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done`,`kill -TERM "$pid" 2>/dev/null || true`,`for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done`,`echo "profiler process did not stop after SIGTERM" >&2`,`exit 1`].join(`; `)}async function Vd(e,n,r){await(r??x().files).ensureDirectory(E.dirname(n.outPath));try{await e([`pull`,n.remotePath,n.outPath],{timeoutMs:P})}catch(e){throw new t(`COMMAND_FAILED`,`Failed to pull Android ${n.kind} artifact for ${n.packageName}`,{package:n.packageName,tool:n.kind,remotePath:n.remotePath,outPath:n.outPath,hint:`Check that the profiling command ran long enough to create an artifact, then retry stop with the same session.`},e)}}async function Hd(e,n){let r;for(let t=0;t<12;t+=1){let t=await Ud(e,n.remotePath);if(t!==void 0&&t>0&&t===r)return;r=t,await g(250)}throw new t(`COMMAND_FAILED`,`Android ${n.kind} artifact is not ready to pull`,{package:n.packageName,tool:n.kind,remotePath:n.remotePath,hint:`The profiler stopped, but the remote artifact was missing, empty, or still changing. Retry stop with the same session or inspect the device-side artifact.`})}async function Ud(e,t){let n=v(t),r=await b(e,[_(`if [ -f ${n} ]; then stat -c %s ${n} 2>/dev/null || wc -c < ${n}; fi`)],{allowFailure:!0,timeoutMs:Lr});if(r.exitCode!==0)return;let i=Number(r.stdout.trim().split(/\s+/)[0]);return Number.isFinite(i)?i:void 0}async function Wd(e,t,n,r={}){let i=y(e,r.adb),a=await zr(i,t);await Br(i,`perfetto`,t);let o=Fd(t,`app.perfetto-trace`,`/data/misc/perfetto-traces`),s;try{await kd(e,t,{adb:i}),s=await Kd(i,o,t)}catch(e){throw await Id(i,o),e}return{type:`trace`,kind:`perfetto`,packageName:t,appPid:a,profilerPid:s,remotePath:o,outPath:n,startedAt:Date.now(),state:`running`,action:`start`,platform:`android`,method:Ir,message:`Started Android Perfetto trace for ${t}`}}async function Gd(e,t,n,r={}){return await Nd(e,{...t,outPath:n},r)}async function Kd(e,n,r){try{let i=Vr((await b(e,[`perfetto`,`--background-wait`,`-o`,n,`-t`,`3600s`,`sched`,`freq`,`idle`,`am`,`wm`,`gfx`,`view`,`binder_driver`,`hal`,`dalvik`],{timeoutMs:P})).stdout);if(i)return i;throw new t(`COMMAND_FAILED`,`Android perfetto did not return a profiler pid`,{package:r,tool:`perfetto`,hint:`Retry perf trace start. If perfetto exits immediately, verify the device permits trace capture.`})}catch(e){throw N(`start`,`perfetto`,r,e)}}function qd(e){let t=[];for(let n of s(e)){let e=n.match(/^([0-9]+(?:\.[0-9]+)?)%\s+(.+)$/);if(!e)continue;let r=Number(e[1]),i=e[2]?.trim();if(!Number.isFinite(r)||!i)continue;let a=i.split(/\s{2,}/).filter(Boolean);if(t.push({percentage:Rt(r),command:a[0],dso:a[1],symbol:a.slice(2).join(` `)||void 0}),t.length>=50)break}return t}async function Jd(e,t,n,r={}){let i=y(e,r.adb),a=await zr(i,t);await Br(i,`simpleperf`,t);let o=Fd(t,`cpu.perf.data`),s;try{s=await Zd(i,a,o,t)}catch(e){throw await Id(i,o),e}return{type:`cpu-profile`,kind:`simpleperf`,packageName:t,appPid:a,profilerPid:s,remotePath:o,outPath:n,startedAt:Date.now(),state:`running`,action:`start`,platform:`android`,method:Fr,message:`Started Android Simpleperf CPU profile for ${t}`}}async function Yd(e,t,n,r={}){return await Nd(e,{...t,outPath:n},r)}async function Xd(e,t,n,r={}){let i=y(e,r.adb);await Br(i,`simpleperf`,t.packageName);let a=await ef(i,t),o=new Date().toISOString(),s=qd(a.stdout),c=s.slice(0,10).map(e=>({symbol:e.symbol??`<unknown>`,binary:e.dso,selfSamplePercent:e.percentage}));await Ld(n,{kind:`simpleperf-report`,generatedAt:o,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,sourceRemotePath:t.remotePath,entryCount:s.length,summary:{topFunctions:c},entries:s},r.files);let l=await Rd(n,r.files);return{action:`report`,platform:`android`,type:`cpu-profile-report`,kind:`simpleperf`,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,outPath:n,sizeBytes:l,generatedAt:o,entryCount:s.length,summary:{topFunctions:c},method:Fr,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function Zd(e,n,r,i){try{let a=Vr((await b(e,[_(Qd(n,r))],{timeoutMs:P})).stdout);if(a)return a;throw new t(`COMMAND_FAILED`,`Android simpleperf did not return a profiler pid`,{package:i,tool:`simpleperf`,hint:`Retry perf. If simpleperf exits immediately, verify the app is profileable and the device permits native profiling.`})}catch(e){throw N(`start`,`simpleperf`,i,e)}}function Qd(e,t){return $d([`simpleperf`,`record`,`-e`,`cpu-clock:u`,`-p`,e,`-o`,t,`--duration`,`3600`],`simpleperf`)}function $d(e,t){let n=e.map(v).join(` `),r=`${Rr}/agent-device-${t}-${Date.now()}.err`;return[`err=${v(r)}`,`(${n}) >/dev/null 2>"$err" & pid=$!`,`sleep 1`,`if kill -0 "$pid" 2>/dev/null; then rm -f "$err"; echo "$pid"; exit 0; fi`,`cat "$err" >&2`,`rm -f "$err"`,`exit 1`].join(`; `)}async function ef(e,t){try{return await b(e,[`simpleperf`,`report`,`-i`,t.remotePath,`--stdio`,`--sort`,`comm,dso,symbol`],{timeoutMs:P})}catch(e){throw N(`report`,`simpleperf`,t.packageName,e)}}const tf=15e3,nf=12e4;async function rf(e,t,n={}){let r=y(e,n.adb);try{return cf((await b(r,[`dumpsys`,`meminfo`,t],{timeoutMs:tf})).stdout,t,new Date().toISOString())}catch(e){throw gf(`memory`,t,e)}}async function af(e,n,r,i={}){let a=y(e,i.adb),o=i.files??x().files,s=await lf(a,n),c=uf(n);await o.ensureDirectory(E.dirname(r));let l=await of(o,r);try{Se(await b(a,[`am`,`dumpheap`,n,c],{allowFailure:!0,timeoutMs:nf}),`Failed to capture Android heap dump for ${n}`,e=>({kind:`android-hprof`,package:n,pid:s,remotePath:c,hint:df(e.stdout,e.stderr)}));let e=await a([`pull`,c,r],{allowFailure:!0,timeoutMs:nf});if(e.exitCode!==0)throw await sf(o,r,l),w(`Failed to pull Android heap dump for ${n}`,e,{kind:`android-hprof`,package:n,pid:s,remotePath:c,path:r,hint:`Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs.`});let i=await o.stat(r).catch(()=>null);if(!i?.isFile||i.size<=0)throw await sf(o,r,l),new t(`COMMAND_FAILED`,`Android heap dump artifact is missing or empty`,{kind:`android-hprof`,package:n,pid:s,path:r,remotePath:c,hint:`Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug.`});return{available:!0,kind:`android-hprof`,path:r,sizeBytes:i.size,measuredAt:new Date().toISOString(),method:`adb-shell-am-dumpheap`,packageName:n,pid:s,remotePath:c}}finally{await b(a,[`rm`,`-f`,c],{allowFailure:!0,timeoutMs:tf}).catch(()=>{})}}async function of(e,t){return await e.stat(t).then(e=>e.isFile).catch(()=>!1)}async function sf(e,t,n){n||await e.remove(t,{force:!0}).catch(()=>{})}function cf(e,n,r){if(/no process found for:/i.test(e))throw new t(`COMMAND_FAILED`,`Android meminfo did not find a running process for ${n}`,{metric:`memory`,package:n,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf.`});let i=_f(e,`TOTAL PSS`)??vf(e);if(i===void 0)throw new t(`COMMAND_FAILED`,`Failed to parse Android meminfo output for ${n}`,{metric:`memory`,package:n,hint:`Retry perf after reopening the app session. If the problem persists, capture adb shell dumpsys meminfo output for debugging.`});return{totalPssKb:i,totalRssKb:_f(e,`TOTAL RSS`),measuredAt:r,method:`adb-shell-dumpsys-meminfo`,topConsumers:ff(e)}}async function lf(e,n){let r=await b(e,[`pidof`,n],{allowFailure:!0,timeoutMs:tf}),i=r.stdout.trim().split(/\s+/).map(Number).find(e=>Number.isInteger(e)&&e>0);if(r.exitCode===0&&i!==void 0)return i;throw new t(`COMMAND_FAILED`,`No running Android process found for ${n}`,{kind:`android-hprof`,package:n,stdout:r.stdout,stderr:r.stderr,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot.`})}function uf(e){return`/data/local/tmp/agent-device-${e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}-${Date.now()}.hprof`}function df(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`profileable`)||n.includes(`debuggable`)||n.includes(`not allowed`)?`Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.`:n.includes(`permission`)||n.includes(`denied`)?`The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.`:`Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.`}function ff(e){let t=e.split(`
14
14
  `).flatMap(e=>pf(e)??[]).sort((e,t)=>t.pssKb-e.pssKb).slice(0,5);return t.length>0?t:void 0}function pf(e){let t=e.trim();if(mf(t))return;let n=t.match(/^(.+?)\s+([0-9][0-9,]*(?:\(\d+\))?)(?:\s|$)/);if(n)return hf(n[1],n[2])}function mf(e){if(!e||e.startsWith(`**`)||e.startsWith(`-`)||e.includes(`:`))return!0;let t=/^\S.+\s+\d/.test(e);return/^(pss|total|native|dalvik|unknown|app summary\b)/i.test(e)&&!t}function hf(e,t){let n=e?.trim(),r=t?Z(t):null;if(!(!n||n===`TOTAL`||r===null||r<=0)&&!/^(pss|private|shared|heap|size|alloc|free)$/i.test(n))return{name:n,pssKb:r}}function gf(e,n,r){return r instanceof t?new t(r.code,r.message,{...r.details??{},metric:e,package:n},r):new t(`COMMAND_FAILED`,`Failed to sample Android ${e} for ${n}`,{metric:e,package:n},r)}function _f(e,t){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),r=e.match(RegExp(`${n}:\\s*([0-9][0-9,]*)`,`i`));if(!r)return;let i=r[1];return i===void 0?void 0:Z(i)??void 0}function vf(e){for(let t of e.split(`
15
15
  `)){let e=t.trim();if(!/^TOTAL\b(?!\s+PSS:)/.test(e))continue;let n=e.split(/\s+/).slice(1).find(e=>Z(e)!==null);return n?Z(n)??void 0:void 0}}async function yf(e,t,n){let r=await T(e,[`dumpsys`,`package`,t],{allowFailure:!0});return r.exitCode===0?kf(r.stdout,n):{requested:void 0,grants:void 0}}async function bf(e){let t=await T(e,[`am`,`get-current-user`],{allowFailure:!0});if(t.exitCode!==0)return;let n=Number.parseInt(t.stdout.trim(),10);return Number.isInteger(n)&&n>=0?n:void 0}const xf=/^\s*User (\d+):/,Sf=/^\s*runtime permissions:\s*$/,Cf=/^\s*([\w.]+): granted=(true|false)\b/,wf=/^\s*Package \[.+?\]/,Tf=/^\s*requested permissions:\s*$/,Ef=/^\s*([A-Za-z][\w.]*)/;function Df(e){return e.split(`
@@ -1 +1 @@
1
- import{Dr as e,Er as t,Mr as n,Or as r,Wr as i}from"./sdk-batch.js";import{t as a}from"./scroll-indicator.js";function o(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{visibility:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=c(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>m(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:h(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&v(e)),t)}}function s(e){if(e.length===0)return new Map;let{hintedContainers:t}=c(e);return p(t.directionsByContainer)}function c(e){let n=t(e),r=n.nodeByIndex,i=new Set,a=[];for(let t of e){if(n.isVisibleInEffectiveViewport(t)){b(t,i,r);continue}a.push(t)}return{visibility:n,visibleNodeIndexes:i,offscreenNodes:a,hintedContainers:f(e,a,i,r)}}function l(e,t){return e.hittable&&r(e.rect,t)}function u(e,t){if(!e.rect)return null;let n=t.resolveEffectiveViewport(e);if(n&&!i(e.rect,n)){let t=d(e.rect,n);if(t)return t}let a=t.resolveViewport(e.rect);if(a&&!r(e.rect,a)){let t=d(e.rect,a);if(t)return t}return null}function d(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function f(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=x(e,n,r);if(!t?.rect)continue;let s=_(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return S(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function p(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function m(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function h(e,t){let n=new Map;for(let r of e){let e=g(r,t);if(!e)continue;let i=n.get(e)??[];i.push(r),n.set(e,i)}return[`above`,`below`].flatMap(e=>{let t=n.get(e);if(!t||t.length===0)return[];let r=y(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=r.length>0?`: ${r.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function g(e,t){if(!e.rect)return null;let n=t.resolveEffectiveViewport(e);return n?_(e.rect,n):null}function _(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function v(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!n(e)}function y(e){let t=new Set,r=[];for(let i of e){let e=n(i);!e||t.has(e)||(t.add(e),r.push(e))}return r}function b(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function x(t,n,r){return e(t,r,e=>n.has(e.index))}function S(e,t,n,r,i){for(let a of e){let e=C(a);if(!e||e.size===0)continue;let o=x(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function C(e){let t=a(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}export{l as i,u as n,s as r,o as t};
1
+ import{Dr as e,Er as t,Gr as n,Mr as r,Or as i}from"./sdk-batch.js";import{t as a}from"./scroll-indicator.js";function o(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{visibility:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=c(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>m(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:h(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&v(e)),t)}}function s(e){if(e.length===0)return new Map;let{hintedContainers:t}=c(e);return p(t.directionsByContainer)}function c(e){let n=t(e),r=n.nodeByIndex,i=new Set,a=[];for(let t of e){if(n.isVisibleInEffectiveViewport(t)){b(t,i,r);continue}a.push(t)}return{visibility:n,visibleNodeIndexes:i,offscreenNodes:a,hintedContainers:f(e,a,i,r)}}function l(e,t){return e.hittable&&i(e.rect,t)}function u(e,t){if(!e.rect)return null;let r=t.resolveEffectiveViewport(e);if(r&&!n(e.rect,r)){let t=d(e.rect,r);if(t)return t}let a=t.resolveViewport(e.rect);if(a&&!i(e.rect,a)){let t=d(e.rect,a);if(t)return t}return null}function d(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function f(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=x(e,n,r);if(!t?.rect)continue;let s=_(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return S(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function p(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function m(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function h(e,t){let n=new Map;for(let r of e){let e=g(r,t);if(!e)continue;let i=n.get(e)??[];i.push(r),n.set(e,i)}return[`above`,`below`].flatMap(e=>{let t=n.get(e);if(!t||t.length===0)return[];let r=y(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=r.length>0?`: ${r.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function g(e,t){if(!e.rect)return null;let n=t.resolveEffectiveViewport(e);return n?_(e.rect,n):null}function _(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function v(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!r(e)}function y(e){let t=new Set,n=[];for(let i of e){let e=r(i);!e||t.has(e)||(t.add(e),n.push(e))}return n}function b(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function x(t,n,r){return e(t,r,e=>n.has(e.index))}function S(e,t,n,r,i){for(let a of e){let e=C(a);if(!e||e.size===0)continue;let o=x(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function C(e){let t=a(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}export{l as i,u as n,s as r,o as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{l as t,w as n}from"./sdk-device.js";import{n as r}from"./gesture-admission.js";const i={visionos:`visionOS uses spatial input and does not support two-finger touch synthesis.`,tvos:`tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.`,macos:`macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.`};function a(a,s){if(!t(a.platform))throw o(s,a.platform);let c=n(a);if(c!==`ios`&&c!==`ipados`||a.kind!==`simulator`)throw c===`ios`||c===`ipados`?new e(`UNSUPPORTED_OPERATION`,`gesture ${s} is not supported on physical iOS devices`,{hint:`Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.`}):o(s,r[c],i[c])}function o(t,n,r){return new e(`UNSUPPORTED_OPERATION`,`gesture ${t} is not supported on ${n}`,r===void 0?void 0:{hint:r})}export{a as n,i as t};
1
+ import{O as e}from"./sdk-contracts.js";import{l as t,w as n}from"./sdk-device.js";import{n as r}from"./gesture-admission.js";const i={visionos:`visionOS uses spatial input and does not support two-finger touch synthesis.`,tvos:`tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.`,macos:`macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.`};function a(a,s){if(!t(a.platform))throw o(s,a.platform);let c=n(a);if(c!==`ios`&&c!==`ipados`||a.kind!==`simulator`)throw c===`ios`||c===`ipados`?new e(`UNSUPPORTED_OPERATION`,`gesture ${s} is not supported on physical iOS devices`,{hint:`Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.`}):o(s,r[c],i[c])}function o(t,n,r){return new e(`UNSUPPORTED_OPERATION`,`gesture ${t} is not supported on ${n}`,r===void 0?void 0:{hint:r})}export{a as n,i as t};
@@ -0,0 +1 @@
1
+ import{I as e,O as t}from"./sdk-contracts.js";import{c as n,r}from"./diagnostics.js";import{f as i,x as a}from"./owner-identity.js";import{c as o,l as s,m as c,r as l}from"./exec.js";import{n as u,t as d}from"./file.js";import"./diagnostics2.js";import"./command.js";import{n as f}from"./retry.js";import{r as p}from"./version.js";import"./process.js";import{C as ee,D as m,c as h,f as g,h as _,n as v,o as y,w as b,y as te}from"./host-file.js";import{a as x}from"./tool-provider.js";import{t as S}from"./apple-runner-platform.js";import{t as C}from"./simctl.js";import w from"node:path";import{createHash as T}from"node:crypto";import E from"node:net";function D(e){let{waitMs:t,signal:n,stop:r,cancelled:i}=e;return new Promise((e,a)=>{let o=()=>l(()=>a(i())),s=()=>l(e),c=setTimeout(()=>l(e),t);function l(e){clearTimeout(c),n?.removeEventListener(`abort`,o),r?.removeEventListener(`abort`,s),e()}n?.addEventListener(`abort`,o,{once:!0}),r?.addEventListener(`abort`,s,{once:!0}),n?.aborted?o():r?.aborted&&s()})}function O(e){let t=e.now??Date.now,n=e.waitGrant??`every-caller`,r=new Map,i=(n,i)=>{let a={status:`pending`,value:void 0,error:void 0,settledAtMs:t(),waitSpent:!1,controller:new AbortController,settled:void 0},o=()=>{};a.settled=new Promise(e=>{o=e}),r.set(n,a);let s=(i,s)=>{a.status=i,i===`ready`?a.value=s:a.error=s,a.settledAtMs=t(),(i===`ready`||e.retryAfterMs===void 0)&&r.get(n)===a&&r.delete(n),o()};try{i(a.controller.signal).then(e=>s(`ready`,e),e=>s(`failed`,e))}catch(e){s(`failed`,e)}return a},a=(n,a)=>{let o=r.get(n);if(!o)return i(n,a);if(o.status!==`failed`)return o;let s=t()-o.settledAtMs;return e.retryAfterMs===void 0||s>=e.retryAfterMs?i(n,a):o};return{value:async(t,r)=>{let i=a(t,r.start);if(i.status===`pending`&&(n===`every-caller`||!i.waitSpent)){i.waitSpent=!0;let t=new AbortController,n=r.wait(e.waitMs,t.signal);n.catch(()=>{});try{await Promise.race([i.settled,n])}finally{t.abort()}}if(i.status===`ready`)return i.value;throw i.status===`failed`?i.error:r.pending()},close:()=>{let e=[...r.values()];r.clear();for(let t of e)t.controller.abort()}}}async function k(e,t){let n=await x(`ps`,[`-p`,String(e),`-o`,`lstart=`],{allowFailure:!0,signal:t.signal,timeoutMs:t.timeoutMs});return n.exitCode===0&&n.stdout.trim()||null}const A={unsupported:`UNSUPPORTED_OPERATION`,"malformed-tree":`COMMAND_FAILED`,"stale-target":`COMMAND_FAILED`,timeout:`COMMAND_FAILED`,cancelled:`COMMAND_FAILED`,"process-crash":`COMMAND_FAILED`,"transport-failure":`COMMAND_FAILED`,preparing:`COMMAND_FAILED`};var j=class extends t{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(A[e],n,{...r,bridgeFailure:e,bridgeFailureCode:t,...e===`cancelled`?{reason:`request_canceled`}:{}},i),this.name=`SnapshotSourceError`,this.failureKind=e,this.failureCode=t}};function M(e,t,n={},r){return new j(e,t,void 0,n,r)}function N(n){return n instanceof j?n:e(n)?M(`cancelled`,`abort-signal`,{},n):n instanceof t&&typeof n.details?.timeoutMs==`number`?M(`timeout`,`host-operation-timeout`,{timeoutMs:n.details.timeoutMs},n):M(`transport-failure`,`unexpected-host-error`,{error:n instanceof Error?n.message:String(n)},n)}function P(e,t,n=Date.now){if(t?.aborted)throw M(`cancelled`,`abort-signal`);return{clock:f.fromTimeoutMs(e,n()),now:n,signal:t}}function F(e,t){if(e.signal?.aborted)throw M(`cancelled`,`abort-signal`);let n=e.clock.remainingMs(e.now());if(n<=0)throw M(`timeout`,t);return Math.max(1,Math.floor(n))}async function I(e,t,n,r){await D({waitMs:Math.min(t,F(e,n)),signal:e.signal,stop:r,cancelled:()=>M(`cancelled`,`abort-signal`)})}const L=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],R=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function z(e,t){let n=await V(e,`xcodebuild`,[`-version`],t),r=await V(e,`sw_vers`,[`-productVersion`],t),i=await V(e,`sw_vers`,[`-buildVersion`],t),a=await V(e,`uname`,[`-m`],t);if(a!==`arm64`&&a!==`x86_64`)throw M(`unsupported`,`simulator-architecture-unsupported`,{architecture:a});return{xcode:n,macosProductVersion:r,macosBuild:i,architecture:a}}async function B(e,t,n){let r=await z(e,n),i=t.trim();if(!i)throw M(`unsupported`,`simulator-runtime-missing`);return{...r,simulatorRuntime:i}}async function V(e,t,n,r){let i=await H(e,t,n,r);if(i.exitCode!==0)throw M(`unsupported`,`toolchain-probe-failed`,{command:t,exitCode:i.exitCode,stderr:i.stderr.slice(0,1024)});let a=(i.stdout||i.stderr).trim();if(!a)throw M(`unsupported`,`toolchain-probe-empty`,{command:t});return a}async function H(e,t,n,r){let i=[],a;for(let o=1;;o+=1){let s;try{s=Math.min(S,F(r,`toolchain-probe-deadline`))}catch(e){throw a??e}i.push(s);try{return await W(e,t,n,r,s)}catch(e){if(!l(e))throw e;if(r.signal?.aborted)throw M(`cancelled`,`abort-signal`);if(a=U(t,i,e),o>=2)throw a}}}function U(e,t,n){let r=t.length;return M(`timeout`,`toolchain-probe-stalled`,{command:e,attemptTimeoutsMs:[...t],hint:`${e} did not answer within ${t[r-1]}ms on ${r} attempt(s). A toolchain probe that cannot answer is a host condition rather than a toolchain defect: run \`${e}\` by hand until it answers, then retry.`},n)}function W(e,t,n,r,i){return e.run(t,n,{allowFailure:!0,signal:r.signal,timeoutMs:i})}const G=65536;function K(){return{projectRoot:p,homeDirectory:g,run:async(e,t,n)=>await o(e,t,n),start:q,connect:J,readText:te,readBinary:_,writeText:m,ensureDirectory:y,chmod:v,exists:h,rename:b,remove:ee,acquireLock:Y,emitDiagnostic:r,withDiagnosticTimer:n,processId:i,readTargetProcessStartTime:k}}function q(e,t,n,r={}){if(r.signal?.aborted)throw M(`cancelled`,`abort-signal`);let i=s(`xcrun`,C(e,[`spawn`,e.udid,t,`serve`,n,`--idle-timeout`,`60`,`--exit-on-disconnect`,`false`]),{allowFailure:!0,captureOutput:!1,detached:!0}),a=i.child.pid??0;if(a<=0)throw M(`transport-failure`,`bridge-process-pid-missing`);let o=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{o=X(o,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{c(a,e)||i.child.kill(e)},readLog:()=>o}}async function J(e,t){if(t.signal?.aborted)throw M(`cancelled`,`abort-signal`);let n=Math.max(1,Math.floor(t.timeoutMs));return await new Promise((r,i)=>{let a=E.createConnection({path:e}),o=!1,s=!1,c=setTimeout(()=>{p(M(`timeout`,`bridge-connect-timeout`)),a.destroy()},n),l=()=>{p(M(`cancelled`,`abort-signal`)),a.destroy()},u=()=>{o=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`error`,d),a.off(`close`,f),a.setTimeout(0),r(a)},d=e=>{p(e),a.destroy()},f=()=>{o||p(M(`transport-failure`,`bridge-closed-before-connect`))},p=e=>{s||o||(s=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`connect`,u),a.off(`error`,d),a.off(`close`,f),i(e))};a.once(`connect`,u),a.once(`error`,d),a.once(`close`,f),t.signal?.addEventListener(`abort`,l,{once:!0}),t.signal?.aborted&&l()})}async function Y(e,t){let n=i(),r=t.deadline,o=d({lockDirPath:e,owner:{pid:n,startTime:a(n),acquiredAtMs:Date.now()},timeoutMs:F(r,`cache-lock-deadline`),pollMs:100,ownerGraceMs:5e3,description:t.description}),s=r.signal;if(!s)return await o;let c=!1,l,u=new Promise((e,t)=>{l=()=>{c=!0,t(M(`cancelled`,`abort-signal`))},s.addEventListener(`abort`,l,{once:!0}),s.aborted&&l()});try{return await Promise.race([o,u])}catch(e){throw c&&o.then(e=>e().catch(()=>void 0),()=>void 0),r.clock.isExpired()&&!(e instanceof j&&e.failureKind===`cancelled`)?M(`timeout`,`cache-lock-deadline`):e}finally{s.removeEventListener(`abort`,l)}}function X(e,t){let n=e+t;return n.length<=G?n:n.slice(n.length-G)}function Z(e,t,n){let r=T(`sha256`).update(t).digest(`hex`).slice(0,12),i=T(`sha256`).update(n).digest(`hex`).slice(0,12);return w.join(`/tmp`,`agent-device-ax-${r}-${e.processId()}-${i}`,`snapshot.sock`)}const Q=`manifest.json`;async function ne(e){let{host:t,deadline:n,cacheRoot:r,binaryFilename:i}=e,a=T(`sha256`).update(JSON.stringify(e.keyInputs)).digest(`hex`).slice(0,32),o=w.join(r,a);return await u({acquire:()=>t.acquireLock(w.join(r,`${a}.lock`),{deadline:n,description:e.lockDescription}),task:async()=>{let s=await re(t,o,i,a,n);if(s)return{path:s,cacheKey:a};F(n,`native-build-deadline`),t.exists(o)&&await t.remove(o),F(n,`native-build-deadline`),await t.ensureDirectory(r);let c=w.join(r,`.${a}.${t.processId()}.tmp`);F(n,`native-build-deadline`),await t.remove(c);try{F(n,`native-build-deadline`),await t.ensureDirectory(c);let r=w.join(c,i);await e.build(r),F(n,`native-build-deadline`),await t.chmod(r,493);let s=await $(t,r),l={...e.keyInputs,cacheKey:a,binarySha256:s};return await t.writeText(w.join(c,Q),`${JSON.stringify(l,null,2)}\n`),F(n,`native-build-deadline`),await t.rename(c,o),{path:w.join(o,i),cacheKey:a}}catch(e){throw await t.remove(c),e}}})}async function re(e,t,n,r,i){let a=w.join(t,n),o=w.join(t,Q);if(!(!e.exists(a)||!e.exists(o)))try{let t=JSON.parse(await e.readText(o));return t.cacheKey!==r||typeof t.binarySha256!=`string`?void 0:(F(i,`native-cache-hash-deadline`),await $(e,a)===t.binarySha256?a:void 0)}catch(e){if(ie(e))throw e;return}}function ie(e){return e instanceof j&&(e.failureKind===`cancelled`||e.failureKind===`timeout`)}async function $(e,t){return T(`sha256`).update(await e.readBinary(t)).digest(`hex`)}async function ae(e,t,n,r){let i=T(`sha256`);for(let a of n){let n=w.join(t,a);if(F(r,`native-source-fingerprint-deadline`),!e.exists(n))throw M(`unsupported`,`native-source-missing`,{filePath:n});i.update(a),i.update(`\0`),i.update(await e.readBinary(n)),i.update(`\0`)}return i.digest(`hex`)}async function oe(e){let t=Math.min(e.budgetMs,F(e.deadline,`native-build-deadline`));try{return await e.host.run(`xcrun`,[...e.argv],{signal:e.deadline.signal,timeoutMs:t,allowFailure:!0})}catch(n){throw l(n)?M(`timeout`,`native-build-stalled`,{timeoutMs:t,hint:`The Simulator SDK toolchain did not answer within ${t}ms, which stopped the ${e.label} build before clang reported anything. Run \`xcrun --sdk iphonesimulator clang --version\` by hand until it answers, then retry.`},n):n}}export{O as _,Z as a,z as c,F as d,I as f,k as g,M as h,K as i,B as l,N as m,oe as n,R as o,j as p,ae as r,L as s,ne as t,P as u,D as v};
@@ -1,2 +1,2 @@
1
- import{D as e}from"./sdk-contracts.js";import{n as t}from"./device-shell.js";const n=`mCurrentFocus=Window{`,r=[n,`mFocusedApp=AppWindowToken{`,`mResumedActivity:`,`ResumedActivity:`],i=[[`dumpsys`,`window`,`windows`],[`dumpsys`,`window`]],a=[[`dumpsys`,`activity`,`activities`],[`dumpsys`,`activity`]],o=RegExp(`(?:${r.map(S).join(`|`)})(.*)$`,`gm`),s=/\bApplication Not Responding:\s*([A-Za-z0-9_.]+)/i,c=/\b([A-Za-z][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)+)\b/,l=new Set([`com.android.permissioncontroller`,`com.google.android.permissioncontroller`,`com.android.packageinstaller`,`com.google.android.packageinstaller`]),u=new Map;function d(n){return Object.freeze({readAppState:async e=>await p(n,e),readBlockingDialog:async e=>await m(n,e),async readAppFocus(e,t,r={}){let i=f(n,e);return r.requireNoBlockingDialog&&(await m(n,e,i)).status===`dialog`?!1:(await p(n,e,i)).package===t},readSnapshotNodes:async e=>await n.readSnapshotNodes(e),async tap(e,r,i){return await n.runAdb(e,t(`adb`,`shell`,[`input`,`tap`,String(Math.round(r)),String(Math.round(i))]),{allowFailure:!0})},openApp:async(e,t)=>await n.openApp(e,t),async readScreenSize(r){let i=(await n.runAdb(r,t(`adb`,`shell`,[`wm`,`size`]))).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!i)throw new e(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(i[1]),height:Number(i[2])}},async isPermissionPackage(e){return l.has(e)}})}function f(e,n){let r=new Map;return i=>{let a=i.join(` `),o=r.get(a)??e.runAdb(n,t(`adb`,`shell`,i),{allowFailure:!0}).then(e=>(g(n,a,e.stdout),e.stdout));return r.set(a,o),o}}async function p(e,t,n=f(e,t)){for(let e of h(t,`foreground`)){let t=v(await n(e));if(t)return t}return{}}async function m(e,t,n=f(e,t)){for(let e of h(t,`blockingDialog`)){let t=y(await n(e));if(t.focus)return{status:`dialog`,focus:t.focus};if(t.focusObserved)return{status:`clear`}}return{status:`unknown`}}function h(e,t){let n=t===`foreground`?[i,a]:[i],r=u.get(e.id);return n.flatMap(e=>{if(!r)return e;let n=e=>r.get(`${t} ${e.join(` `)}`)===!1,i=e.filter(e=>!n(e));return i.length===0||i.length===e.length?e:[...i,...e.filter(n)]})}function g(e,t,i){if(!i)return;let a=u.get(e.id)??new Map;_(a,`foreground ${t}`,x(r).test(i)),_(a,`blockingDialog ${t}`,x([n]).test(i)),u.set(e.id,a)}function _(e,t,n){e.get(t)!==!0&&e.set(t,n)}function v(e){for(let t of e.matchAll(o)){let e=t[1]?.match(/\b([A-Za-z][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)+)\/([A-Za-z0-9_.$]+)/);if(e?.[1]&&e[2])return{package:e[1],activity:e[2]}}return null}function y(e){let t=!1,i=e.split(`
1
+ import{O as e}from"./sdk-contracts.js";import{n as t}from"./device-shell.js";const n=`mCurrentFocus=Window{`,r=[n,`mFocusedApp=AppWindowToken{`,`mResumedActivity:`,`ResumedActivity:`],i=[[`dumpsys`,`window`,`windows`],[`dumpsys`,`window`]],a=[[`dumpsys`,`activity`,`activities`],[`dumpsys`,`activity`]],o=RegExp(`(?:${r.map(S).join(`|`)})(.*)$`,`gm`),s=/\bApplication Not Responding:\s*([A-Za-z0-9_.]+)/i,c=/\b([A-Za-z][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)+)\b/,l=new Set([`com.android.permissioncontroller`,`com.google.android.permissioncontroller`,`com.android.packageinstaller`,`com.google.android.packageinstaller`]),u=new Map;function d(n){return Object.freeze({readAppState:async e=>await p(n,e),readBlockingDialog:async e=>await m(n,e),async readAppFocus(e,t,r={}){let i=f(n,e);return r.requireNoBlockingDialog&&(await m(n,e,i)).status===`dialog`?!1:(await p(n,e,i)).package===t},readSnapshotNodes:async e=>await n.readSnapshotNodes(e),async tap(e,r,i){return await n.runAdb(e,t(`adb`,`shell`,[`input`,`tap`,String(Math.round(r)),String(Math.round(i))]),{allowFailure:!0})},openApp:async(e,t)=>await n.openApp(e,t),async readScreenSize(r){let i=(await n.runAdb(r,t(`adb`,`shell`,[`wm`,`size`]))).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!i)throw new e(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(i[1]),height:Number(i[2])}},async isPermissionPackage(e){return l.has(e)}})}function f(e,n){let r=new Map;return i=>{let a=i.join(` `),o=r.get(a)??e.runAdb(n,t(`adb`,`shell`,i),{allowFailure:!0}).then(e=>(g(n,a,e.stdout),e.stdout));return r.set(a,o),o}}async function p(e,t,n=f(e,t)){for(let e of h(t,`foreground`)){let t=v(await n(e));if(t)return t}return{}}async function m(e,t,n=f(e,t)){for(let e of h(t,`blockingDialog`)){let t=y(await n(e));if(t.focus)return{status:`dialog`,focus:t.focus};if(t.focusObserved)return{status:`clear`}}return{status:`unknown`}}function h(e,t){let n=t===`foreground`?[i,a]:[i],r=u.get(e.id);return n.flatMap(e=>{if(!r)return e;let n=e=>r.get(`${t} ${e.join(` `)}`)===!1,i=e.filter(e=>!n(e));return i.length===0||i.length===e.length?e:[...i,...e.filter(n)]})}function g(e,t,i){if(!i)return;let a=u.get(e.id)??new Map;_(a,`foreground ${t}`,x(r).test(i)),_(a,`blockingDialog ${t}`,x([n]).test(i)),u.set(e.id,a)}function _(e,t,n){e.get(t)!==!0&&e.set(t,n)}function v(e){for(let t of e.matchAll(o)){let e=t[1]?.match(/\b([A-Za-z][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)+)\/([A-Za-z0-9_.$]+)/);if(e?.[1]&&e[2])return{package:e[1],activity:e[2]}}return null}function y(e){let t=!1,i=e.split(`
2
2
  `);for(let e of r)for(let r of i){let i=r.indexOf(e);if(i===-1)continue;e===n&&(t=!0);let a=r.trim(),o=b(r.slice(i+e.length).split(`}`)[0]?.trim()??``,a);if(o)return{focusObserved:t,focus:o}}return{focusObserved:t,focus:null}}function b(e,t){let n=s.exec(e)?.[1];if(n)return{package:n,focusedWindow:`Application Not Responding: ${n}`,raw:t};let r=e.toLowerCase();if(!r.includes(`isn't responding`)&&!r.includes(`is not responding`))return null;let i=e.trim().replaceAll(/\s+/g,` `),a=c.exec(i)?.[1];return{...a?{package:a}:{},focusedWindow:i,raw:t}}function x(e){return new RegExp(e.map(S).join(`|`))}function S(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}export{d as createAndroidObservationAdapter};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{pn as t}from"./sdk-batch.js";import{t as n}from"./script.js";import{t as r}from"./session-paths.js";const i=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function a(t){if(t!==t.trim()||!n.test(t))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(t.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": the AD_* namespace is reserved for built-in replay variables.`);return t}function o(e){return`\${${e}}`}function ee(e){let t=i.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}function s(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const c={kind:`none`};function l(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function te(e){return e.kind===`repair`?{...e,status:`armed`}:e}function u(e){return e.kind===`none`?void 0:e.target}function d(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function f(e){return e.kind===`authoring`&&e.status===`aborted`}function p(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function m(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function h(e){return{kind:`authoring`,status:`armed`,target:l(void 0,e)}}function g(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function _(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function v(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:l(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function y(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function b(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function ne(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function re(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function ie(e){return e.kind===`repair`?e.boundary:void 0}function x(e){return e.kind===`repair`?e.sourcePath:void 0}function S(e){return e.kind===`repair`&&e.status!==`committed`}function C(e){let t=u(e);return t?.kind===`explicit`?t.path:void 0}function w(e){return u(e)?.force===!0}function T(e){return e?.scriptPublication??c}function E(e){let t=T(e);return t.kind===`authoring`&&t.status===`armed`}function D(e,t){e.scriptPublication=h({path:t.path===void 0?void 0:r(t.path),force:t.force===!0})}function O(e){e.scriptPublication=g(T(e))}function k(e){return p(T(e))}function A(e,t){if(!t.saveScript||f(T(e)))return;let n={path:typeof t.saveScript==`string`?r(t.saveScript):void 0,force:t.force===!0},i=T(e);if(i.kind===`repair`){e.scriptPublication=v(i,{requested:n,boundary:i.boundary,sourcePath:i.sourcePath});return}if(i.kind===`authoring`){e.scriptPublication={...i,target:l(i.target,n)};return}e.scriptPublication=h(n)}function j(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:l(n.target,{path:t.explicitPath===void 0?void 0:r(t.explicitPath),force:t.liveForce===!0})})}function M(e,t){e.scriptPublication=_(T(e),t)}function N(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication=_(n,t))}function P(e,t){return t===!0||w(T(e))}function F(e){return m(T(e))}const ae=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),I=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),L=new Set([`cost`,`evidence`,`resolution`,`settle`]),R=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),z=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function B(e,t,n){if(!e)return e;let r=le(e.selectorChain),i=e=>q(e,t);return{...J(e,e=>ce(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function V(e,t){if(!e)return e;let n=Z(t);return J(e,e=>Q(e,n),e=>G(e,t))}function H(e,t){if(!e)return e;let n=Z(t);return{...e,...e.label===void 0?{}:{label:Q(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:Q(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:Q(e.scrollRegion.label,n)}}}:{}}}function U(e,t){return!!(e.label!==void 0&&W(e.label,t)||e.ancestry.some(e=>e.label&&W(e.label,t))||e.scrollRegion?.label&&W(e.scrollRegion.label,t))}function W(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function G(e,t){for(let n of t.keys())if(q(e,n))return!0;return!1}function K(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function q(e,n){return t(e,n)}function J(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[ae.has(e)?e:t(e),oe(r,e,t,n)]))}function oe(e,t,n,r){return typeof e==`string`&&I.has(t)?e:t===`selectorChain`&&$(e)?se(e,r):Y(e,n,r,L.has(t)?t:void 0)}function Y(e,t,n,r){if(typeof e==`string`)return r&&z.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>Y(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?R.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),Y(a,t,n,o?`${r}.${e}`:void 0)]}))}function se(e,t){return e.filter(e=>!t(e))}function ce(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}const X=/\$\{[A-Z_][A-Z0-9_]*\}/y;function Z(e){return[...e].sort(([e],[t])=>t.length-e.length)}function Q(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){X.lastIndex=r;let t=X.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function $(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function le(e){return $(e)?e:void 0}export{s as A,S as C,x as D,ie as E,o as M,a as N,w as O,d as S,b as T,re as _,U as a,te as b,D as c,k as d,F as f,c as g,j as h,H as i,ee as j,C as k,P as l,N as m,K as n,O as o,M as p,V as r,A as s,B as t,E as u,v,y as w,p as x,ne as y};
1
+ import{O as e}from"./sdk-contracts.js";import{pn as t}from"./sdk-batch.js";import{t as n}from"./script.js";import{t as r}from"./session-paths.js";const i=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function a(t){if(t!==t.trim()||!n.test(t))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(t.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": the AD_* namespace is reserved for built-in replay variables.`);return t}function o(e){return`\${${e}}`}function ee(e){let t=i.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}function s(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const c={kind:`none`};function l(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function te(e){return e.kind===`repair`?{...e,status:`armed`}:e}function u(e){return e.kind===`none`?void 0:e.target}function d(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function f(e){return e.kind===`authoring`&&e.status===`aborted`}function p(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function m(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function h(e){return{kind:`authoring`,status:`armed`,target:l(void 0,e)}}function g(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function _(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function v(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:l(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function y(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function b(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function ne(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function re(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function ie(e){return e.kind===`repair`?e.boundary:void 0}function x(e){return e.kind===`repair`?e.sourcePath:void 0}function S(e){return e.kind===`repair`&&e.status!==`committed`}function C(e){let t=u(e);return t?.kind===`explicit`?t.path:void 0}function w(e){return u(e)?.force===!0}function T(e){return e?.scriptPublication??c}function E(e){let t=T(e);return t.kind===`authoring`&&t.status===`armed`}function D(e,t){e.scriptPublication=h({path:t.path===void 0?void 0:r(t.path),force:t.force===!0})}function O(e){e.scriptPublication=g(T(e))}function k(e){return p(T(e))}function A(e,t){if(!t.saveScript||f(T(e)))return;let n={path:typeof t.saveScript==`string`?r(t.saveScript):void 0,force:t.force===!0},i=T(e);if(i.kind===`repair`){e.scriptPublication=v(i,{requested:n,boundary:i.boundary,sourcePath:i.sourcePath});return}if(i.kind===`authoring`){e.scriptPublication={...i,target:l(i.target,n)};return}e.scriptPublication=h(n)}function j(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:l(n.target,{path:t.explicitPath===void 0?void 0:r(t.explicitPath),force:t.liveForce===!0})})}function M(e,t){e.scriptPublication=_(T(e),t)}function N(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication=_(n,t))}function P(e,t){return t===!0||w(T(e))}function F(e){return m(T(e))}const ae=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),I=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),L=new Set([`cost`,`evidence`,`resolution`,`settle`]),R=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),z=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function B(e,t,n){if(!e)return e;let r=le(e.selectorChain),i=e=>q(e,t);return{...J(e,e=>ce(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function V(e,t){if(!e)return e;let n=Z(t);return J(e,e=>Q(e,n),e=>G(e,t))}function H(e,t){if(!e)return e;let n=Z(t);return{...e,...e.label===void 0?{}:{label:Q(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:Q(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:Q(e.scrollRegion.label,n)}}}:{}}}function U(e,t){return!!(e.label!==void 0&&W(e.label,t)||e.ancestry.some(e=>e.label&&W(e.label,t))||e.scrollRegion?.label&&W(e.scrollRegion.label,t))}function W(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function G(e,t){for(let n of t.keys())if(q(e,n))return!0;return!1}function K(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function q(e,n){return t(e,n)}function J(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[ae.has(e)?e:t(e),oe(r,e,t,n)]))}function oe(e,t,n,r){return typeof e==`string`&&I.has(t)?e:t===`selectorChain`&&$(e)?se(e,r):Y(e,n,r,L.has(t)?t:void 0)}function Y(e,t,n,r){if(typeof e==`string`)return r&&z.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>Y(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?R.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),Y(a,t,n,o?`${r}.${e}`:void 0)]}))}function se(e,t){return e.filter(e=>!t(e))}function ce(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}const X=/\$\{[A-Z_][A-Z0-9_]*\}/y;function Z(e){return[...e].sort(([e],[t])=>t.length-e.length)}function Q(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){X.lastIndex=r;let t=X.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function $(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function le(e){return $(e)?e:void 0}export{s as A,S as C,x as D,ie as E,o as M,a as N,w as O,d as S,b as T,re as _,U as a,te as b,D as c,k as d,F as f,c as g,j as h,H as i,ee as j,C as k,P as l,N as m,K as n,O as o,M as p,V as r,A as s,B as t,E as u,v,y as w,p as x,ne as y};