agent-device 0.20.10 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +2 -2
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.apk → agent-device-android-ime-helper-0.21.1.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.manifest.json → agent-device-android-ime-helper-0.21.1.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.10.manifest.json → agent-device-android-snapshot-helper-0.21.1.manifest.json} +6 -6
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
  10. package/apple/snapshot-bridge/LICENSE.idb +23 -0
  11. package/apple/snapshot-bridge/README.md +106 -0
  12. package/apple/snapshot-bridge/SnapshotBridge.m +286 -0
  13. package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
  14. package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
  15. package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +34 -0
  16. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +411 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +677 -83
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +35 -92
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1058 -213
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +296 -14
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +309 -149
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +24 -17
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +124 -199
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +211 -78
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +30 -10
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +254 -24
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +465 -494
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +168 -0
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +802 -247
  49. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
  50. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +185 -0
  51. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
  52. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +83 -5
  53. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +156 -34
  54. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +5 -4
  55. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -318
  56. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
  57. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
  58. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
  59. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
  60. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +56 -23
  61. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +56 -27
  62. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +30 -24
  63. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +126 -80
  64. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
  65. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +47 -86
  66. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +32 -79
  67. package/dist/apple/snapshot-presentation/Package.swift +21 -0
  68. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
  69. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
  70. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
  71. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
  72. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
  73. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
  74. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
  75. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
  76. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
  77. package/dist/src/adapter.js +1 -0
  78. package/dist/src/adb-executor.js +2 -0
  79. package/dist/src/adb-failure.js +1 -0
  80. package/dist/src/adb-host.js +1 -0
  81. package/dist/src/adb.js +1 -0
  82. package/dist/src/agent-browser-lifecycle.js +1 -0
  83. package/dist/src/agent-browser-process-record.js +1 -0
  84. package/dist/src/agent-browser-provider.js +1 -0
  85. package/dist/src/agent-browser-tool.js +1 -1
  86. package/dist/src/agent-device-client.js +2 -2
  87. package/dist/src/ai-sdk.d.ts +2 -2
  88. package/dist/src/ai-sdk.js +1 -1
  89. package/dist/src/alert-contract.js +1 -0
  90. package/dist/src/alert-runtime.js +1 -0
  91. package/dist/src/android-adb.d.ts +27 -19
  92. package/dist/src/android-adb.js +1 -1
  93. package/dist/src/android-input-ownership.js +1 -0
  94. package/dist/src/android-system-chrome.js +1 -0
  95. package/dist/src/android.js +1 -1
  96. package/dist/src/api.js +11 -0
  97. package/dist/src/app-catalog.js +1 -0
  98. package/dist/src/app-deployment-resolution.js +2 -0
  99. package/dist/src/app-helpers.js +1 -1
  100. package/dist/src/app-inventory-contract.js +1 -0
  101. package/dist/src/app-inventory.js +1 -0
  102. package/dist/src/app-launch.js +2 -0
  103. package/dist/src/app-lifecycle-facade.js +1 -0
  104. package/dist/src/app-lifecycle.js +3 -6
  105. package/dist/src/app-lifecycle2.js +2 -2
  106. package/dist/src/app-lifecycle3.js +1 -0
  107. package/dist/src/app-log-files.js +1 -1
  108. package/dist/src/app-log-reconnect.js +1 -1
  109. package/dist/src/app-log-runtime.js +1 -4
  110. package/dist/src/app-log-runtime2.js +4 -0
  111. package/dist/src/app-parsers.js +4 -0
  112. package/dist/src/app-resolution-cache.js +1 -0
  113. package/dist/src/app-resolution-facade.js +1 -0
  114. package/dist/src/app-resolution.js +2 -2
  115. package/dist/src/app-state.js +1 -2
  116. package/dist/src/apple-runner-platform.js +1 -0
  117. package/dist/src/application-lifecycle-interaction.js +1 -0
  118. package/dist/src/application-lifecycle-runtime.js +1 -0
  119. package/dist/src/apps-simctl.js +1 -0
  120. package/dist/src/archive.js +4 -0
  121. package/dist/src/artifact-download.js +1 -0
  122. package/dist/src/artifacts.d.ts +6 -2
  123. package/dist/src/artifacts.js +1 -1
  124. package/dist/src/async-lifecycle.js +1 -0
  125. package/dist/src/audio-probe-result.js +1 -0
  126. package/dist/src/audio-probe-runtime.js +1 -0
  127. package/dist/src/audio-probe-support.js +1 -0
  128. package/dist/src/auth-session.js +1 -1
  129. package/dist/src/auth.js +1 -1
  130. package/dist/src/backend-snapshot-options.js +1 -1
  131. package/dist/src/{url.js → base-url.js} +1 -1
  132. package/dist/src/boot-diagnostics.js +2 -2
  133. package/dist/src/byte-limit-stream.js +1 -1
  134. package/dist/src/capabilities.js +1 -0
  135. package/dist/src/capture.js +1 -0
  136. package/dist/src/catalog.js +1 -0
  137. package/dist/src/cli-command-aliases.js +1 -0
  138. package/dist/src/cli-config.js +1 -1
  139. package/dist/src/cli-help.js +74 -51
  140. package/dist/src/cli-output.js +1 -1
  141. package/dist/src/cli-runner.js +1 -1
  142. package/dist/src/cli.js +4 -6
  143. package/dist/src/click-button.js +1 -0
  144. package/dist/src/client-metro-companion.js +1 -0
  145. package/dist/src/client-metro.js +1 -1
  146. package/dist/src/client-types.d.ts +280 -242
  147. package/dist/src/clipboard.js +1 -0
  148. package/dist/src/code-signature-cache.js +1 -0
  149. package/dist/src/code-signature.js +1 -0
  150. package/dist/src/color.js +1 -0
  151. package/dist/src/command-metadata.js +1 -1
  152. package/dist/src/command-schema.js +3 -3
  153. package/dist/src/command-surface.js +1 -1
  154. package/dist/src/command-tools.js +2 -2
  155. package/dist/src/command.js +1 -0
  156. package/dist/src/compatibility-policy.js +1 -0
  157. package/dist/src/config.js +1 -1
  158. package/dist/src/config2.js +1 -0
  159. package/dist/src/connection-runtime.js +1 -1
  160. package/dist/src/connection.js +5 -5
  161. package/dist/src/contracts.d.ts +1 -1
  162. package/dist/src/contracts.js +1 -1
  163. package/dist/src/daemon-client-lifecycle.js +1 -0
  164. package/dist/src/daemon-process.js +1 -0
  165. package/dist/src/daemon-registration.js +1 -0
  166. package/dist/src/daemon-shutdown-report.js +1 -1
  167. package/dist/src/daemon.js +2 -2
  168. package/dist/src/debug-symbols-facade.js +5 -0
  169. package/dist/src/deploy-result-target.js +1 -0
  170. package/dist/src/device-claim-inspection.js +1 -1
  171. package/dist/src/device-claim-rule.js +1 -0
  172. package/dist/src/device-input-state.d.ts +190 -3
  173. package/dist/src/device-inventory-context.js +1 -0
  174. package/dist/src/device-isolation.js +1 -0
  175. package/dist/src/device-release.js +1 -0
  176. package/dist/src/device-rotation.js +1 -0
  177. package/dist/src/device-selection-resolver.js +1 -0
  178. package/dist/src/device-session.js +1 -0
  179. package/dist/src/device.js +1 -1
  180. package/dist/src/device2.js +3 -2
  181. package/dist/src/diagnostics.js +3 -0
  182. package/dist/src/diagnostics2.js +1 -0
  183. package/dist/src/dispatch-resolve.js +1 -0
  184. package/dist/src/doctor-facade.js +1 -0
  185. package/dist/src/doctor-output.js +1 -0
  186. package/dist/src/doctor.js +1 -0
  187. package/dist/src/doctor2.js +1 -0
  188. package/dist/src/doctor3.js +1 -0
  189. package/dist/src/durable-resource.js +1 -0
  190. package/dist/src/entities.js +1 -1
  191. package/dist/src/error.js +2 -0
  192. package/dist/src/exec.js +1 -0
  193. package/dist/src/file.js +1 -0
  194. package/dist/src/find.js +1 -1
  195. package/dist/src/finders.js +1 -1
  196. package/dist/src/generic-settle.js +1 -1
  197. package/dist/src/generic.js +1 -1
  198. package/dist/src/gesture-admission.js +1 -0
  199. package/dist/src/gesture-plan-types.js +1 -0
  200. package/dist/src/gesture-plan.js +1 -0
  201. package/dist/src/gesture-runtime.js +1 -0
  202. package/dist/src/harmonyos.js +1 -1
  203. package/dist/src/hdc.js +1 -1
  204. package/dist/src/helper.js +2 -2
  205. package/dist/src/host-file.js +1 -0
  206. package/dist/src/human-control-contract.js +1 -0
  207. package/dist/src/human-control.js +1 -0
  208. package/dist/src/index.d.ts +1 -1
  209. package/dist/src/index.js +1 -1
  210. package/dist/src/input-actions.js +1 -4
  211. package/dist/src/input-actions2.js +2 -1
  212. package/dist/src/install-artifact-facade.js +1 -0
  213. package/dist/src/install-source-network-transport.js +1 -0
  214. package/dist/src/install-source.d.ts +3 -10
  215. package/dist/src/install-source2.js +1 -1
  216. package/dist/src/interaction-positionals.js +1 -0
  217. package/dist/src/interaction-ref-policy.js +1 -0
  218. package/dist/src/interaction.js +1 -1
  219. package/dist/src/interaction2.js +1 -1
  220. package/dist/src/interactor-operation-catalog.js +1 -0
  221. package/dist/src/interactor-types.js +1 -0
  222. package/dist/src/interactor.js +6 -2
  223. package/dist/src/interactor2.js +1 -1
  224. package/dist/src/interactors.js +1 -1
  225. package/dist/src/internal/bin.d.ts +1 -1
  226. package/dist/src/internal/bin.js +1 -2
  227. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  228. package/dist/src/internal/companion-tunnel.js +1 -1
  229. package/dist/src/internal/daemon.d.ts +1 -1
  230. package/dist/src/internal/daemon.js +2 -4
  231. package/dist/src/internal/png-worker.d.ts +4 -4
  232. package/dist/src/internal/png-worker.js +1 -1
  233. package/dist/src/internal/run-script-http-child.d.ts +4 -0
  234. package/dist/src/internal/run-script-http-child.js +1 -0
  235. package/dist/src/internal/update-check-entry.d.ts +1 -1
  236. package/dist/src/inventory.js +4 -4
  237. package/dist/src/inventory2.js +1 -1
  238. package/dist/src/inventory3.js +1 -1
  239. package/dist/src/inventory5.js +1 -1
  240. package/dist/src/inventory6.js +1 -1
  241. package/dist/src/ios-client.js +16 -0
  242. package/dist/src/ios-snapshot-acquisition.js +1 -0
  243. package/dist/src/ios-snapshot-adapter.js +1 -0
  244. package/dist/src/ios-snapshot-planning.js +1 -0
  245. package/dist/src/ios-snapshot-runtime.js +1 -0
  246. package/dist/src/ios-system-surface.js +1 -0
  247. package/dist/src/json.js +1 -0
  248. package/dist/src/keyboard-actions.js +1 -0
  249. package/dist/src/launch-console.js +1 -0
  250. package/dist/src/lease-context.js +1 -1
  251. package/dist/src/lease-scope.js +1 -0
  252. package/dist/src/lease.js +1 -1
  253. package/dist/src/limrun-runtime-dependencies.js +1 -1
  254. package/dist/src/limrun.d.ts +1610 -7
  255. package/dist/src/limrun.js +1 -1
  256. package/dist/src/linux.js +1 -1
  257. package/dist/src/local-interactor-operation-set.js +1 -0
  258. package/dist/src/location-coordinates.js +1 -1
  259. package/dist/src/logcat.js +1 -1
  260. package/dist/src/macos-facade.js +1 -0
  261. package/dist/src/managed-device-scope.js +1 -0
  262. package/dist/src/mechanics.js +19 -0
  263. package/dist/src/metro.d.ts +4 -2
  264. package/dist/src/metro.js +1 -1
  265. package/dist/src/metro2.js +1 -1
  266. package/dist/src/mobile-snapshot-semantics.js +1 -1
  267. package/dist/src/multitouch-support.js +1 -0
  268. package/dist/src/numeric.js +1 -0
  269. package/dist/src/observability.js +1 -1
  270. package/dist/src/observation.js +2 -0
  271. package/dist/src/open-target-resolution.js +1 -0
  272. package/dist/src/output-path.js +1 -1
  273. package/dist/src/owner-identity.js +3 -1
  274. package/dist/src/parameterized-recorded-fill.js +1 -0
  275. package/dist/src/parser.js +1 -1
  276. package/dist/src/perf-facade.js +2 -0
  277. package/dist/src/perf-process-identity.js +1 -0
  278. package/dist/src/perf-runtime-operation-builder.js +1 -0
  279. package/dist/src/perf-runtime-plan.js +1 -0
  280. package/dist/src/perf-runtime.js +1 -0
  281. package/dist/src/perf.js +1 -4
  282. package/dist/src/physical-device-control.js +1 -1
  283. package/dist/src/physical-device-facade.js +1 -0
  284. package/dist/src/platform-request-scope.js +1 -0
  285. package/dist/src/platform-runtime-android-adb-host.js +1 -0
  286. package/dist/src/platform-runtime-android-mechanics.js +1 -0
  287. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  288. package/dist/src/platform-runtime-app-log-process.js +1 -1
  289. package/dist/src/platform-runtime-host.js +1 -1
  290. package/dist/src/platform-runtime-managed-owner.js +1 -0
  291. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  292. package/dist/src/platform-runtime-open-target.js +1 -1
  293. package/dist/src/platform-runtime-operation-host.js +4 -4
  294. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  295. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  296. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  297. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  298. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  299. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  300. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  301. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  302. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
  303. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  304. package/dist/src/platform-runtime-unavailable.js +1 -0
  305. package/dist/src/platform-runtime.js +1 -1
  306. package/dist/src/platform-runtime2.js +1 -1
  307. package/dist/src/plist.js +1 -1
  308. package/dist/src/png-worker-contract.js +1 -1
  309. package/dist/src/prepare-kind.js +1 -0
  310. package/dist/src/process-exit.js +1 -1
  311. package/dist/src/process.js +1 -0
  312. package/dist/src/provider-device-runtime.js +1 -0
  313. package/dist/src/provider-session-ownership.js +2 -0
  314. package/dist/src/provider-webdriver.js +1 -1
  315. package/dist/src/provider.js +1 -1
  316. package/dist/src/providers.js +1 -0
  317. package/dist/src/proxy.js +2 -2
  318. package/dist/src/react-native-overlay.js +1 -0
  319. package/dist/src/react-native.js +1 -1
  320. package/dist/src/record-runtime.js +1 -1
  321. package/dist/src/record-trace.js +1 -1
  322. package/dist/src/rect-center.js +1 -0
  323. package/dist/src/register-builtins.js +1 -0
  324. package/dist/src/registry.js +40 -28
  325. package/dist/src/remote-config2.js +1 -1
  326. package/dist/src/replay-divergence.js +2 -0
  327. package/dist/src/replay.js +2 -2
  328. package/dist/src/reporting.js +8 -7
  329. package/dist/src/request-admission.js +1 -0
  330. package/dist/src/request-cancel.js +1 -0
  331. package/dist/src/request-cancellation.js +1 -0
  332. package/dist/src/request-progress-protocol.js +1 -0
  333. package/dist/src/request-providers.js +1 -0
  334. package/dist/src/request-runtime-binding.js +1 -0
  335. package/dist/src/request.js +1 -0
  336. package/dist/src/result-serialization.js +1 -0
  337. package/dist/src/retry.js +1 -0
  338. package/dist/src/rolldown-runtime.js +1 -1
  339. package/dist/src/runner-cache-metadata.js +2 -0
  340. package/dist/src/runner-client.js +1 -1
  341. package/dist/src/runner-disposal.js +1 -1
  342. package/dist/src/runner-operations-facade.js +1 -0
  343. package/dist/src/runner-owner-facade.js +1 -0
  344. package/dist/src/runner-owner-state.js +1 -0
  345. package/dist/src/runner-presentation.js +1 -0
  346. package/dist/src/runner.js +1 -0
  347. package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
  348. package/dist/src/runtime.js +3 -3
  349. package/dist/src/runtime2.js +4 -4
  350. package/dist/src/runtime3.js +1 -1
  351. package/dist/src/runtime4.js +5 -3
  352. package/dist/src/runtime5.js +1 -1
  353. package/dist/src/runtime6.js +1 -1
  354. package/dist/src/runtime7.js +1 -1
  355. package/dist/src/runtime8.js +1 -1
  356. package/dist/src/runtime9.js +1 -1
  357. package/dist/src/scoped-provider.js +1 -1
  358. package/dist/src/screen-recording-completion.js +1 -0
  359. package/dist/src/screen-recording-live-handle.js +1 -0
  360. package/dist/src/screen-recording-options.js +1 -0
  361. package/dist/src/screen-recording-resource-recovery.js +1 -0
  362. package/dist/src/screen-recording-runtime.js +1 -0
  363. package/dist/src/screenshot-density.js +1 -1
  364. package/dist/src/screenshot-result.js +1 -6
  365. package/dist/src/screenshot-runtime.js +1 -0
  366. package/dist/src/screenshot.js +1 -1
  367. package/dist/src/screenshot2.js +1 -0
  368. package/dist/src/screenshot3.js +5 -0
  369. package/dist/src/script.js +1 -0
  370. package/dist/src/scroll-command.js +1 -0
  371. package/dist/src/scroll-gesture.js +1 -0
  372. package/dist/src/scroll-indicator.js +1 -0
  373. package/dist/src/sdk-batch-runner.d.ts +23 -6
  374. package/dist/src/sdk-batch-runner.js +2 -3
  375. package/dist/src/sdk-batch.js +2 -0
  376. package/dist/src/sdk-contracts.d.ts +170 -41
  377. package/dist/src/sdk-contracts.js +2 -2
  378. package/dist/src/sdk-device.js +1 -1
  379. package/dist/src/sdk-finders.d.ts +1 -1
  380. package/dist/src/sdk-finders.js +1 -1
  381. package/dist/src/sdk-io.js +1 -1
  382. package/dist/src/sdk-remote-config.d.ts +1 -1
  383. package/dist/src/sdk-remote-config.js +1 -1
  384. package/dist/src/sdk-selectors.d.ts +524 -140
  385. package/dist/src/sdk-selectors.js +1 -1
  386. package/dist/src/selection.js +1 -0
  387. package/dist/src/selector-runtime.js +1 -1
  388. package/dist/src/selectors.js +1 -1
  389. package/dist/src/semantic-index.js +1 -0
  390. package/dist/src/server.js +4 -4
  391. package/dist/src/session-allocation.js +1 -0
  392. package/dist/src/session-artifact-paths.js +1 -0
  393. package/dist/src/session-observation.js +1 -0
  394. package/dist/src/session-paths.js +1 -0
  395. package/dist/src/session-repair-tombstone.js +1 -0
  396. package/dist/src/session-routing.js +1 -0
  397. package/dist/src/session-runtime-admission.js +1 -0
  398. package/dist/src/session-snapshot.js +1 -0
  399. package/dist/src/session-store.js +4 -0
  400. package/dist/src/session-target-evidence.js +1 -1
  401. package/dist/src/session2.js +5 -27
  402. package/dist/src/settings.js +1 -0
  403. package/dist/src/shared.js +2 -2
  404. package/dist/src/simctl-facade.js +1 -0
  405. package/dist/src/simctl.js +1 -1
  406. package/dist/src/simulator-facade.js +1 -0
  407. package/dist/src/simulator.js +1 -1
  408. package/dist/src/snapshot-capture-annotations.js +1 -0
  409. package/dist/src/snapshot-desktop-projection.js +1 -0
  410. package/dist/src/snapshot-diagnostics.js +1 -0
  411. package/dist/src/snapshot-process.js +1 -0
  412. package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
  413. package/dist/src/snapshot-quality-verdict.js +1 -0
  414. package/dist/src/snapshot-runtime-binding.js +1 -0
  415. package/dist/src/snapshot-runtime.js +1 -1
  416. package/dist/src/snapshot-scope.js +1 -1
  417. package/dist/src/snapshot-state.js +1 -0
  418. package/dist/src/snapshot.js +1 -8
  419. package/dist/src/snapshot2.js +1 -1
  420. package/dist/src/snapshot3.js +1 -1
  421. package/dist/src/snapshot4.js +1 -0
  422. package/dist/src/src.js +1 -1
  423. package/dist/src/src2.js +1 -1
  424. package/dist/src/src3.js +1 -2
  425. package/dist/src/src4.js +1 -1
  426. package/dist/src/src5.js +1 -0
  427. package/dist/src/src6.js +1 -0
  428. package/dist/src/src7.js +2 -0
  429. package/dist/src/src8.js +115 -0
  430. package/dist/src/startup-recovery-fence.js +1 -0
  431. package/dist/src/status-markers.js +1 -0
  432. package/dist/src/string-enum.js +1 -1
  433. package/dist/src/success-text.js +1 -0
  434. package/dist/src/surface-snapshot.js +1 -0
  435. package/dist/src/surface-snapshot2.js +1 -0
  436. package/dist/src/takeover.js +5 -0
  437. package/dist/src/tool-provider-facade.js +1 -0
  438. package/dist/src/tool-provider.js +4 -3
  439. package/dist/src/tool-provider2.js +1 -1
  440. package/dist/src/tool-provider3.js +1 -1
  441. package/dist/src/toolchain-probe.js +2 -0
  442. package/dist/src/touch-reference-frame.js +1 -0
  443. package/dist/src/touch-runtime.js +1 -0
  444. package/dist/src/transport.js +3 -0
  445. package/dist/src/tree.js +1 -0
  446. package/dist/src/ttl-memo.js +1 -0
  447. package/dist/src/tv-remote.js +1 -0
  448. package/dist/src/type-text-runtime.js +1 -0
  449. package/dist/src/undici.js +99 -0
  450. package/dist/src/update-check.js +1 -1
  451. package/dist/src/verified-file.js +1 -1
  452. package/dist/src/version.js +1 -1
  453. package/dist/src/video.js +2 -2
  454. package/dist/src/web.js +2 -1
  455. package/dist/src/web2.js +1 -0
  456. package/dist/src/webdriver-ios-snapshot.js +1 -0
  457. package/dist/src/webdriver-source.js +1 -0
  458. package/dist/src/window-state.js +1 -0
  459. package/linux/atspi-dump.py +54 -9
  460. package/package.json +58 -35
  461. package/server.json +9 -3
  462. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
  463. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
  464. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
  465. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
  466. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
  467. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
  468. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
  469. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
  470. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
  471. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
  472. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
  473. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
  474. package/dist/src/appearance.js +0 -1
  475. package/dist/src/apps.js +0 -5
  476. package/dist/src/audio-probe.js +0 -1
  477. package/dist/src/cli-grammar.js +0 -1
  478. package/dist/src/command-catalog.js +0 -1
  479. package/dist/src/debug-symbols.js +0 -5
  480. package/dist/src/device-input-state.js +0 -2
  481. package/dist/src/device-ready.js +0 -1
  482. package/dist/src/dispatch.js +0 -1
  483. package/dist/src/handler-utils.js +0 -1
  484. package/dist/src/helper-package-install.js +0 -1
  485. package/dist/src/host-process.js +0 -3
  486. package/dist/src/ime-lifecycle.js +0 -2
  487. package/dist/src/ime-recovery-marker.js +0 -1
  488. package/dist/src/input-actions3.js +0 -1
  489. package/dist/src/install-artifact.js +0 -1
  490. package/dist/src/install-artifact2.js +0 -1
  491. package/dist/src/interaction-common.js +0 -1
  492. package/dist/src/interaction-runtime.js +0 -1
  493. package/dist/src/interaction-snapshot.js +0 -1
  494. package/dist/src/manifest.js +0 -1
  495. package/dist/src/method-scope.js +0 -1
  496. package/dist/src/png-resize.js +0 -1
  497. package/dist/src/process-lock.js +0 -1
  498. package/dist/src/runner-lease.js +0 -1
  499. package/dist/src/runner-sequence.js +0 -1
  500. package/dist/src/script-source-bundle.js +0 -16
  501. package/dist/src/sdk-android-adb.d.ts +0 -245
  502. package/dist/src/sdk-android-adb.js +0 -4
  503. package/dist/src/sdk.js +0 -1
  504. package/dist/src/setting-state.js +0 -1
  505. package/dist/src/shell-quote.js +0 -1
  506. package/dist/src/snapshot-session.js +0 -1
  507. package/dist/src/timing-safe-equal.js +0 -1
  508. package/dist/src/unsupported-interactor.js +0 -1
  509. package/dist/src/verdict.js +0 -1
  510. /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
@@ -1,168 +0,0 @@
1
- import XCTest
2
-
3
- struct FlatSnapshotFilterNode {
4
- let isRoot: Bool
5
- let label: String
6
- let identifier: String
7
- let valueText: String?
8
- let visible: Bool
9
-
10
- func matchesScope(_ scope: String) -> Bool {
11
- let haystack = [label, identifier, valueText ?? ""].joined(separator: "\n")
12
- return haystack.localizedCaseInsensitiveContains(scope)
13
- }
14
- }
15
-
16
- struct FlatSnapshotFilterDecision {
17
- let include: Bool
18
- let insideMatchedScope: Bool
19
- }
20
-
21
- enum FlatSnapshotVisibilityPolicy {
22
- case interactiveOnly
23
- case viewportProjected
24
- }
25
-
26
- enum FlatSnapshotGeometry {
27
- case geometryless
28
- case framed(intersectsViewportAndScrollClip: Bool)
29
- }
30
-
31
- enum FlatSnapshotDescendantVisibility: Equatable {
32
- case independent
33
- case owned
34
- }
35
-
36
- struct FlatSnapshotProjectionCursor {
37
- static let root = FlatSnapshotProjectionCursor(ancestorProjectedOut: false)
38
-
39
- private let ancestorProjectedOut: Bool
40
-
41
- var isProjectedOut: Bool { ancestorProjectedOut }
42
-
43
- func project(
44
- geometry: FlatSnapshotGeometry,
45
- descendantVisibility: FlatSnapshotDescendantVisibility
46
- ) -> FlatSnapshotProjectionDecision {
47
- let nodeProjectedOut: Bool
48
- switch geometry {
49
- case .geometryless:
50
- nodeProjectedOut = false
51
- case .framed(let intersectsViewportAndScrollClip):
52
- nodeProjectedOut = !intersectsViewportAndScrollClip
53
- }
54
- let presentationVisible = !ancestorProjectedOut && !nodeProjectedOut
55
- let descendantsProjectedOut = ancestorProjectedOut
56
- || (nodeProjectedOut && descendantVisibility == .owned)
57
- return FlatSnapshotProjectionDecision(
58
- presentationVisible: presentationVisible,
59
- descendants: FlatSnapshotProjectionCursor(
60
- ancestorProjectedOut: descendantsProjectedOut
61
- )
62
- )
63
- }
64
- }
65
-
66
- struct FlatSnapshotProjectionDecision {
67
- let presentationVisible: Bool
68
- let descendants: FlatSnapshotProjectionCursor
69
- }
70
-
71
- struct FlatSnapshotProjectionTransition {
72
- let decision: FlatSnapshotProjectionDecision
73
- let hiddenContentFrame: CGRect?
74
- }
75
-
76
- extension RunnerTests {
77
- func flatSnapshotGeometry(
78
- frame: CGRect,
79
- intersectsViewportAndScrollClip: Bool
80
- ) -> FlatSnapshotGeometry {
81
- if frame.isNull || frame.isEmpty { return .geometryless }
82
- return .framed(intersectsViewportAndScrollClip: intersectsViewportAndScrollClip)
83
- }
84
-
85
- func flatSnapshotDescendantVisibility(
86
- elementType: XCUIElement.ElementType?,
87
- hasChildren: Bool
88
- ) -> FlatSnapshotDescendantVisibility {
89
- guard hasChildren, let elementType else { return .independent }
90
- if elementType == .cell || Self.scrollContainerTypes.contains(elementType) {
91
- return .owned
92
- }
93
- return .independent
94
- }
95
-
96
- func flatSnapshotProjectionTransition(
97
- frame: CGRect,
98
- intersectsViewportAndScrollClip: Bool,
99
- elementType: XCUIElement.ElementType?,
100
- hasChildren: Bool,
101
- cursor: FlatSnapshotProjectionCursor
102
- ) -> FlatSnapshotProjectionTransition {
103
- let hasFrame = !frame.isNull && !frame.isEmpty
104
- return FlatSnapshotProjectionTransition(
105
- decision: cursor.project(
106
- geometry: flatSnapshotGeometry(
107
- frame: frame,
108
- intersectsViewportAndScrollClip: intersectsViewportAndScrollClip
109
- ),
110
- descendantVisibility: flatSnapshotDescendantVisibility(
111
- elementType: elementType,
112
- hasChildren: hasChildren
113
- )
114
- ),
115
- hiddenContentFrame: !cursor.isProjectedOut && hasFrame
116
- && !intersectsViewportAndScrollClip ? frame : nil
117
- )
118
- }
119
-
120
- func flatSnapshotFilterDecision(
121
- _ node: FlatSnapshotFilterNode,
122
- options: PresentationOptions,
123
- visibilityPolicy: FlatSnapshotVisibilityPolicy,
124
- insideMatchedScope: Bool
125
- ) -> FlatSnapshotFilterDecision {
126
- let scope = options.scope?.trimmingCharacters(in: .whitespacesAndNewlines)
127
- let scopeActive = scope?.isEmpty == false
128
- let matchesScope: Bool
129
- if scopeActive, let scope {
130
- matchesScope = node.matchesScope(scope)
131
- } else {
132
- matchesScope = false
133
- }
134
- let nowInsideScope = insideMatchedScope || matchesScope
135
-
136
- let include: Bool
137
- if node.isRoot {
138
- include = true
139
- } else if scopeActive && !nowInsideScope {
140
- include = false
141
- } else if !node.visible
142
- && (options.interactiveOnly || visibilityPolicy == .viewportProjected)
143
- {
144
- include = false
145
- } else {
146
- include = true
147
- }
148
-
149
- return FlatSnapshotFilterDecision(include: include, insideMatchedScope: nowInsideScope)
150
- }
151
-
152
- func privateAXInteractiveCandidate(rawElementType: Int) -> Bool {
153
- guard let type = flatSnapshotElementType(rawElementType: rawElementType) else {
154
- return false
155
- }
156
- return interactiveTypes.contains(type) || Self.scrollContainerTypes.contains(type)
157
- }
158
-
159
- func flatSnapshotElementType(rawElementType: Int) -> XCUIElement.ElementType? {
160
- guard let raw = UInt(exactly: rawElementType),
161
- let type = XCUIElement.ElementType(rawValue: raw)
162
- else {
163
- return nil
164
- }
165
- return type
166
- }
167
-
168
- }
@@ -1,4 +0,0 @@
1
- import XCTest
2
-
3
- extension RunnerTests {
4
- }
@@ -1,183 +0,0 @@
1
- import Foundation
2
-
3
- /// Backend-owned snapshot output before it crosses the presentation seam.
4
- ///
5
- /// The incremental #1797 migration still carries derived fields that later semantic layers move
6
- /// behind `SnapshotPresentation`. Eligibility is no longer one of those backend-owned decisions.
7
- struct RawAXNode {
8
- let index: Int
9
- let type: String
10
- let label: String?
11
- let identifier: String?
12
- let value: String?
13
- let rect: SnapshotRect
14
- let enabled: Bool
15
- let focused: Bool?
16
- let selected: Bool?
17
- let hittable: Bool
18
- let depth: Int
19
- let parentIndex: Int?
20
- let hiddenContentAbove: Bool?
21
- let hiddenContentBelow: Bool?
22
- var actions: [String]? = nil
23
- }
24
-
25
- /// One backend attempt after acquisition and its current backend-specific interpretation.
26
- ///
27
- /// Step 2 makes this the only input accepted by snapshot presentation. Later #1797 steps move the
28
- /// interpretation that still precedes this value into `SnapshotPresentation` without changing the
29
- /// capture-plan seam.
30
- struct SnapshotAcquisition {
31
- let nodes: [RawAXNode]
32
- let truncated: Bool
33
- let effectiveDepth: Int?
34
- var customActions: SnapshotCustomActionCoverage? = nil
35
- }
36
-
37
- /// The only snapshot node shape accepted by response payload assembly.
38
- ///
39
- /// Its initializer is private so a backend cannot bypass `SnapshotPresentation`. The encoded shape
40
- /// intentionally remains byte-for-byte compatible with the former `SnapshotNode` wire model.
41
- struct PresentedNode: Codable {
42
- let index: Int
43
- let type: String
44
- let label: String?
45
- let identifier: String?
46
- let value: String?
47
- let rect: SnapshotRect
48
- let enabled: Bool
49
- let focused: Bool?
50
- let selected: Bool?
51
- let hittable: Bool
52
- let depth: Int
53
- let parentIndex: Int?
54
- let hiddenContentAbove: Bool?
55
- let hiddenContentBelow: Bool?
56
- let actions: [String]?
57
-
58
- fileprivate init(presenting raw: RawAXNode) {
59
- self.init(
60
- presenting: raw,
61
- index: raw.index,
62
- depth: raw.depth,
63
- parentIndex: raw.parentIndex
64
- )
65
- }
66
-
67
- fileprivate init(presenting raw: RawAXNode, index: Int, depth: Int, parentIndex: Int?) {
68
- self.index = index
69
- type = raw.type
70
- label = raw.label
71
- identifier = raw.identifier
72
- value = raw.value
73
- rect = raw.rect
74
- enabled = raw.enabled
75
- focused = raw.focused
76
- selected = raw.selected
77
- hittable = raw.hittable
78
- self.depth = depth
79
- self.parentIndex = parentIndex
80
- hiddenContentAbove = raw.hiddenContentAbove
81
- hiddenContentBelow = raw.hiddenContentBelow
82
- actions = raw.actions
83
- }
84
- }
85
-
86
- enum SnapshotPresentation {
87
- private static let eligibleInteractiveTypes: Set<String> = [
88
- "Button",
89
- "Cell",
90
- "CheckBox",
91
- "CollectionView",
92
- "Link",
93
- "MenuItem",
94
- "Picker",
95
- "SearchField",
96
- "SecureTextField",
97
- "SegmentedControl",
98
- "Slider",
99
- "ScrollView",
100
- "Stepper",
101
- "Switch",
102
- "TabBar",
103
- "Table",
104
- "TextField",
105
- "TextView",
106
- "WebView",
107
- ]
108
-
109
- /// The capture plan's single presentation route for every snapshot backend.
110
- ///
111
- /// Eligibility is the first intentional step-3 semantic delta: regular presentation keeps a
112
- /// root carrier plus nodes with an interactive type or non-empty semantic content. Raw snapshots
113
- /// retain their acquired membership until the dedicated raw-projection migration lands.
114
- static func present(
115
- _ acquisition: SnapshotAcquisition,
116
- options: PresentationOptions
117
- ) -> SnapshotBackendCapture {
118
- SnapshotBackendCapture(
119
- payload: DataPayload(
120
- nodes: presentedNodes(from: acquisition.nodes, options: options),
121
- truncated: acquisition.truncated
122
- ),
123
- effectiveDepth: acquisition.effectiveDepth,
124
- customActions: acquisition.customActions
125
- )
126
- }
127
-
128
- /// Explicit carve-out for selector queries and system-modal reads that intentionally return one
129
- /// already-resolved element instead of traversing a snapshot backend.
130
- static func singleElementRead(_ node: RawAXNode) -> PresentedNode {
131
- PresentedNode(presenting: node)
132
- }
133
-
134
- private static func presentedNodes(
135
- from rawNodes: [RawAXNode],
136
- options: PresentationOptions
137
- ) -> [PresentedNode] {
138
- if options.raw {
139
- return rawNodes.map(PresentedNode.init(presenting:))
140
- }
141
-
142
- var nodes: [PresentedNode] = []
143
- var nearestPresentedNodeByRawIndex: [Int: (index: Int, depth: Int)] = [:]
144
- for raw in rawNodes {
145
- let presentedParent = raw.parentIndex.flatMap {
146
- nearestPresentedNodeByRawIndex[$0]
147
- }
148
- guard isEligibleForRegularPresentation(raw) else {
149
- if let presentedParent {
150
- nearestPresentedNodeByRawIndex[raw.index] = presentedParent
151
- }
152
- continue
153
- }
154
-
155
- let presentedIndex = nodes.count
156
- let presentedDepth = presentedParent.map { $0.depth + 1 } ?? 0
157
- nearestPresentedNodeByRawIndex[raw.index] = (presentedIndex, presentedDepth)
158
- nodes.append(
159
- PresentedNode(
160
- presenting: raw,
161
- index: presentedIndex,
162
- depth: presentedDepth,
163
- parentIndex: presentedParent?.index
164
- )
165
- )
166
- }
167
- return nodes
168
- }
169
-
170
- private static func isEligibleForRegularPresentation(_ node: RawAXNode) -> Bool {
171
- // The top-level carrier owns viewport geometry and must survive even for query-sweep's
172
- // deliberately unlabeled synthetic Application node.
173
- if node.parentIndex == nil { return true }
174
- return eligibleInteractiveTypes.contains(node.type) || hasSemanticContent(node)
175
- }
176
-
177
- private static func hasSemanticContent(_ node: RawAXNode) -> Bool {
178
- [node.label, node.identifier, node.value].contains { value in
179
- guard let value else { return false }
180
- return !value.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
181
- }
182
- }
183
- }
@@ -1 +0,0 @@
1
- import{_ as e}from"./sdk-contracts.js";function t(t){let n=t.trim().toLowerCase();if(n===`light`)return`light`;if(n===`dark`)return`dark`;if(n===`toggle`)return`toggle`;throw new e(`INVALID_ARGS`,`Invalid appearance state: ${t}. Use light|dark|toggle.`)}export{t};
package/dist/src/apps.js DELETED
@@ -1,5 +0,0 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{a as n,c as r,n as i,s as a}from"./location-coordinates.js";import{J as o,K as s,X as c,Y as l,q as u}from"./sdk-batch-runner.js";import{c as d,l as f}from"./sdk-device.js";import"./observability.js";import{A as p,f as m,h}from"./sdk-android-adb.js";import{i as g,o as ee}from"./boot-diagnostics.js";import{n as te,t as _}from"./setting-state.js";import{t as ne}from"./appearance.js";import{n as re,r as ie,s as ae}from"./simctl.js";import{t as oe}from"./png-resize.js";import{i as se,n as ce}from"./screenshot-density.js";import{a as v,i as y}from"./tool-provider.js";import{a as b,i as x,l as le,n as S,o as C,r as w}from"./physical-device-control.js";import{a as T,c as ue,d as de,f as fe,l as pe,t as E,u as me}from"./config.js";import{n as D}from"./runner-client.js";import{n as he,r as O,t as k}from"./simulator.js";import{i as ge}from"./helper.js";import{a as _e,c as ve,i as A,l as ye,n as be,o as xe,r as Se,s as Ce,u as we}from"./app-resolution.js";import j from"node:path";import{promises as M}from"node:fs";import"node:os";const Te=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],Ee={0:`hide`,1:`wifi`,6:`3g`,7:`4g`,8:`lte`,9:`lte-a`,10:`lte+`,11:`5g`,12:`5g+`,13:`5g-uwb`,14:`5g-uc`},De={1:`searching`,2:`failed`,3:`active`},Oe={0:`notSupported`,1:`searching`,2:`failed`,3:`active`};function N(e,t,n){return ie(e,t,n)}const P=new Set;async function ke(e){let t=null,n=!1;if(Me(e))n=!0;else try{t=await Ne(e),n=!0}catch(t){R(e,`snapshot_failed`,t)}try{(!n||t)&&await Pe(e),await L(e,Te)}catch(t){R(e,`prepare_failed`,t)}return async()=>{await Ae(e,n?t:null)}}async function Ae(e,t){if(await Pe(e),!t){je(e);return}await L(e,Ie(t)),F(e)}function F(e){P.delete(I(e))}function je(e){P.add(I(e))}function Me(e){return P.has(I(e))}function I(e){return`${e.platform}:${e.kind}:${e.id}`}async function Ne(e){return Fe(h(await N(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function Pe(e){await N(e,[`status_bar`,e.id,`clear`])}async function L(e,t){t.length!==0&&await N(e,[`status_bar`,e.id,`override`,...t])}function Fe(e){let n={},r=e.split(`
2
- `).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let e of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(e);if(r){let e=Number(r[1]),i=Ee[e];if(!i)throw new t(`COMMAND_FAILED`,`Unsupported simulator data network type: ${e}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(e);if(i){let e=De[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(e);if(a){let e=Number(a[1]),r=Oe[e];if(!r)throw new t(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${e}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(e);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function Ie(e){let t=[];return e.dataNetwork&&t.push(`--dataNetwork`,e.dataNetwork),e.wifiMode&&t.push(`--wifiMode`,e.wifiMode),e.wifiBars!==void 0&&(e.dataNetwork===`wifi`||e.wifiMode)&&t.push(`--wifiBars`,e.wifiBars),e.cellularMode&&t.push(`--cellularMode`,e.cellularMode),e.cellularBars!==void 0&&(e.cellularMode||Le(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function Le(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function R(e,t,n){p({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...x(n)}})}function z(e,t,n){return ie(e,t,n)}const Re={ensureBooted:k,prepareStatusBarForScreenshot:ke,captureWithRetry:Ve,normalizeDensity:qe,captureWithRunner:H,shouldFallbackToRunner:G},B=new Map,V=new Map;async function ze(e,t,n={}){if(f(e)){await H(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Be(e,t,n);return}await S(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:D})}async function Be(e,n,r={}){if(e.kind!==`simulator`)throw new t(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...Re,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(e);let a=async()=>{};if(r.normalizeStatusBar===!0)try{a=await i.prepareStatusBarForScreenshot(e)}catch(t){W(e,`prepare_failed`,t)}try{try{await i.captureWithRetry(e,n),await i.normalizeDensity(e,n,r.pixelDensity);return}catch(t){let a=t;if(r.skipIosSimulatorBootCheck&&Ke(t)){await i.ensureBooted(e);try{await i.captureWithRetry(e,n),await i.normalizeDensity(e,n,r.pixelDensity);return}catch(e){a=e}}if(!i.shouldFallbackToRunner(a))throw a;We(e,`simctl_screenshot`,a)}await i.captureWithRunner(e,n,r.appBundleId,r.fullscreen,r.runnerOptions),await i.normalizeDensity(e,n,r.pixelDensity)}finally{await a().catch(t=>W(e,`restore_failed`,t))}}async function Ve(e,t){let n=g.fromTimeoutMs(de);await ee(async({deadline:n})=>{await z(e,[`io`,e.id,`screenshot`,t],{timeoutMs:Math.max(1e3,n?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:ue,maxDelayMs:pe,jitter:.2,shouldRetry:e=>G(e)},{deadline:n,phase:`ios_simulator_screenshot`})}async function H(e,n,r,i,a){if(e.kind===`device`&&!f(e)){await S(e).captureScreenshot(e,n,{appBundleId:r,fullscreen:i,runnerOptions:a,preferRunner:!0,runRunnerCommand:D});return}let o=(await D(e,{command:`screenshot`,appBundleId:r,fullscreen:i,inlineScreenshot:!1},a)).message;if(!o)throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);if(f(e)){await M.copyFile(o,n);return}if(e.kind===`simulator`){await He(e,o,n);return}throw new t(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function He(e,n,r){let i=g.fromTimeoutMs(T),a=`Unable to locate runner container for simulator screenshot`,o=V.get(e.id);if(o){let t=await U(o,n,r);if(t.copied)return;a=t.error,V.delete(e.id)}for(let t of le){let o=await z(e,[`get_app_container`,e.id,t,`data`],{allowFailure:!0,timeoutMs:Ue(i,T,`runner screenshot container lookup`)});if(o.exitCode!==0){let e=o.stderr.trim();e&&(a=e);continue}let s=o.stdout.trim();if(!s){a=`simctl get_app_container returned empty output`;continue}let c=await U(s,n,r);if(c.copied){V.set(e.id,s);return}a=c.error}throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function U(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of Ge(e,t))try{return await M.copyFile(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function Ue(e,n,r){let i=e.remainingMs();if(i>0)return i;throw new t(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function We(e,t,n){let r=x(n);p({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function W(e,t,n){p({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...x(n)}})}function Ge(e,t){let n=j.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=j.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replace(/\\/g,`/`);if(s&&o(j.join(n,s)),j.isAbsolute(r)&&o(j.normalize(r)),c.startsWith(`tmp/`))o(j.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(j.join(n,t))}}let l=j.basename(r);return l&&o(j.join(n,`tmp`,l)),i}function G(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=w(e);return n.includes(`timeout waiting for screen surfaces`)||n.includes(`nsposixerrordomain`)&&n.includes(`code=60`)&&n.includes(`screenshot`)||n.includes(`timed out`)&&n.includes(`screenshot`)}function Ke(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=w(e);return n.includes(`not booted`)||n.includes(`current state: shutdown`)||n.includes(`current state is shutdown`)||n.includes(`current state=shutdown`)||n.includes(`state: shutdown`)||n.includes(`state=shutdown`)}async function qe(e,t,n){let r=await Je(e),i=ce(await se(t),r,n);i&&await oe(t,i.width,i.height)}async function Je(e){let n=B.get(e.id);if(n!==void 0)return n;let r=await z(e,[`getenv`,e.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:me}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new t(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return B.set(e.id,i),i}function K(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=e.details??{};if(n.exitCode!==4)return!1;let r=String(n.stderr??``).toLowerCase();return r.includes(`fbsopenapplicationserviceerrordomain`)&&r.includes(`the request to open`)}async function Ye(e,t){let n=await v(re(e,[`get_app_container`,e.id,t]),{allowFailure:!0});if(n.exitCode!==0)return{installed:!1};let r=n.stdout.trim();if(!r)return{installed:!1};let i=await y(`plutil`,[`-extract`,`CFBundleExecutable`,`raw`,`-o`,`-`,`${r}/Info.plist`],{allowFailure:!0});if(i.exitCode!==0||!i.stdout.trim())return{installed:!0};let a=await y(`otool`,[`-l`,`${r}/${i.stdout.trim()}`],{allowFailure:!0});if(a.exitCode!==0)return{installed:!0};let o=a.stdout.toLowerCase();return{installed:!0,simulatorCompatible:o.includes(`iossimulator`)||o.includes(`platform 7`)}}function Xe(e){return e.installed?e.simulatorCompatible===!1?`ARCH_MISMATCH`:`PERSISTENT_LAUNCH_FAIL`:`APP_NOT_INSTALLED`}function Ze(e){switch(e){case`ARCH_MISMATCH`:return`The app binary was not built for the simulator platform. Rebuild with a simulator destination or use a physical device.`;case`APP_NOT_INSTALLED`:return`The app bundle is not installed on this simulator. Run install before open.`;case`PERSISTENT_LAUNCH_FAIL`:return`The simulator repeatedly refused to launch the app. Inspect crash logs in Console.app or ~/Library/Logs/DiagnosticReports/ and consider reinstalling the app.`;default:return`The simulator failed to launch the app. Retry with --debug and inspect diagnostics log for details.`}}const q=25e3;async function Qe(e,n,r){let i=r?.launchConsole?.trim(),a=r?.launchArgs;if(i&&(!d(e)||e.kind!==`simulator`))throw new t(`UNSUPPORTED_OPERATION`,u);if(f(e)){if(a&&a.length>0)throw new t(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on macOS; launch arguments are currently iOS-only.`);await Ce(e,n,r);return}let p=r?.url?.trim();if(p){if(i)throw new t(`INVALID_ARGS`,s);if(!o(p))throw new t(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(e.kind===`simulator`){let t=!!a||l(p);if(r?.terminateRunningApp||t){let i=r?.appBundleId??await A(e,n);t?await Z(e,i,{...a?{launchArgs:a}:{},...r?.terminateRunningApp?{terminateRunningApp:!0}:{}}):await X(e,i)}await J(e,p,void 0);return}let u=c(r?.appBundleId??await A(e,n),p);if(!u)throw new t(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await Q(e,u,{payloadUrl:p,launchArgs:a,runnerOptions:r?.runnerOptions});return}let m=n.trim();if(o(m)){if(i)throw new t(`INVALID_ARGS`,s);if(e.kind===`simulator`){await J(e,m,a);return}let n=c(r?.appBundleId,m);if(!n)throw new t(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await Q(e,n,{payloadUrl:m,launchArgs:a,runnerOptions:r?.runnerOptions});return}let h=r?.appBundleId??await A(e,n);if(e.kind===`simulator`){await Z(e,h,{...i?{launchConsole:i}:{},...a?{launchArgs:a}:{},...r?.terminateRunningApp?{terminateRunningApp:!0}:{}});return}await Q(e,h,{launchArgs:a,runnerOptions:r?.runnerOptions})}async function J(e,n,r){if(r&&r.length>0)throw new t(`INVALID_ARGS`,`--launch-args is not supported with iOS simulator URL opens (simctl openurl ignores launch args). Launch the app first with --launch-args, then issue the URL open in a separate call.`);await k(e),await b(e,[`openurl`,e.id,n])}async function $e(e){f(e)||e.kind===`simulator`&&await he(e)!==`Booted`&&await k(e)}async function Y(e,t,n){if(f(e)){await xe(e,t);return}let r=await A(e,t);if(e.kind===`simulator`){await X(e,r);return}await S(e).terminateApp(e,r,{runnerOptions:n,runRunnerCommand:D})}async function X(e,n){await k(e);let r=C(e,[`terminate`,e.id,n]),i=await v(r,{allowFailure:!0,timeoutMs:fe});if(i.exitCode!==0&&!i.stderr.toLowerCase().includes(`found nothing to terminate`))throw new t(`COMMAND_FAILED`,`xcrun exited with code ${i.exitCode}`,m(i,{cmd:`xcrun`,args:r}))}async function Z(e,n,r){await k(e);let i=0,a=g.fromTimeoutMs(E);try{await ee(async({deadline:i})=>{if(i?.isExpired())throw new t(`COMMAND_FAILED`,`App launch deadline exceeded`,{timeoutMs:E});let a=C(e,et(e.id,n,r)),o=r?.launchConsole?await tt(a,r.launchConsole):await v(a,{allowFailure:!0});if(o.exitCode!==0)throw new t(`COMMAND_FAILED`,`xcrun exited with code ${o.exitCode}`,m(o,{cmd:`xcrun`,args:a}))},{maxAttempts:10,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry(e){return K(e)?(i+=1,i<3):!1}},{deadline:a})}catch(t){if(K(t)){let r=t,i=Xe(await Ye(e,n));r.details={...r.details,hint:Ze(i)}}throw t}}function et(e,t,n){let r=[`launch`];return n?.launchConsole&&r.push(`--console-pty`),n?.terminateRunningApp&&r.push(`--terminate-running-process`),r.push(e,t),n?.launchArgs&&n.launchArgs.length>0&&r.push(...n.launchArgs),r}async function tt(e,n){await M.mkdir(j.dirname(n),{recursive:!0});try{let t=await v(e,{allowFailure:!0,timeoutMs:q});return await nt(n,t.stdout,t.stderr),t}catch(e){let r=(e instanceof t?e:void 0)?.details;if(r?.timeoutMs===q){let e=typeof r.stdout==`string`?r.stdout:``,t=typeof r.stderr==`string`?r.stderr:``;return await nt(n,e,t),p({level:`warn`,phase:`ios_simulator_launch_console_capture_timeout`,data:{timeoutMs:q,logPath:n,stdoutBytes:Buffer.byteLength(e),stderrBytes:Buffer.byteLength(t)}}),{stdout:e,stderr:t,exitCode:0}}throw e}}async function nt(e,t,n){await M.writeFile(e,rt(t,n),`utf8`)}function rt(e,t){return!e||!t||e.endsWith(`
3
- `)||e.endsWith(`\r`)?`${e}${t}`:`${e}\n${t}`}async function Q(e,t,n){await S(e).launchApp(e,t,{...n,runRunnerCommand:D})}async function it(e){return f(e)?await ve():(O(e,`clipboard`),await k(e),h(await b(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replace(/\r\n/g,`
4
- `).replace(/\n$/,``))}async function at(e,t){if(f(e)){await we(t);return}O(e,`clipboard`),await k(e),h(await b(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t}),`Failed to write iOS simulator clipboard`)}let $=null,ot;async function st(e,r,o,s,c){if(f(e)){let e=r.toLowerCase();if(e===`appearance`){await ye(o);return}if(e===`permission`){let e=a(o);if(e===`deny`)throw new t(`INVALID_ARGS`,n(`permission`));return await ge(e,lt(c?.permissionTarget))}throw new t(`INVALID_ARGS`,n(r))}O(e,`settings`),await k(e);let l=r.toLowerCase();switch(l){case`clear-app-state`:{if(o.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!s)throw new t(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let n=await ct(e,s);return{bundleId:n.bundleId,containerPath:n.containerPath,cleared:!0}}case`wifi`:{let t=_(o)?`active`:`failed`;await b(e,[`status_bar`,e.id,`override`,`--wifiMode`,t]),F(e);return}case`airplane`:_(o)?(await b(e,[`status_bar`,e.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),F(e)):(await b(e,[`status_bar`,e.id,`clear`]),je(e));return;case`location`:{if(o.toLowerCase()===`set`){let{latitude:t,longitude:n}=i(c);return await b(e,[`location`,e.id,`set`,`${t},${n}`]),{latitude:t,longitude:n}}let n=_(o);if(!s)throw new t(`INVALID_ARGS`,`location setting requires an active app in session`);let r=n?`grant`:`revoke`;await b(e,[`privacy`,e.id,r,`location`,s]);return}case`faceid`:case`touchid`:{let t=l,n=ft[t];await bt(e,yt(o,t),{settingName:t,label:n.label,modalityAliases:n.modalityAliases});return}case`appearance`:{let t=await ut(e,o);await b(e,[`ui`,e.id,`appearance`,t]);return}case`permission`:if(!s)throw new t(`INVALID_ARGS`,`permission setting requires an active app in session`);await mt(e,pt(a(o)),vt(c?.permissionTarget,c?.permissionMode),s);return;default:throw new t(`INVALID_ARGS`,`Unsupported setting: ${r}`)}}async function ct(e,n){if(!d(e)||e.kind!==`simulator`)throw new t(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let r=await A(e,n);await k(e),await Y(e,r);let i=h(await b(e,[`get_app_container`,e.id,r,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${r}`).stdout.trim();if(!i)throw new t(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${r}`);let a=await M.readdir(i);return await Promise.all(a.map(e=>M.rm(j.join(i,e),{recursive:!0,force:!0}))),{bundleId:r,containerPath:i}}function lt(e){let n=e?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new t(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}async function ut(e,n){let r=ne(n);if(r!==`toggle`)return r;let i=h(await b(e,[`ui`,e.id,`appearance`],{allowFailure:!0}),`Failed to read current iOS appearance`),a=dt(i.stdout,i.stderr);if(!a)throw new t(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:i.stdout,stderr:i.stderr});return a===`dark`?`light`:`dark`}function dt(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`dark`?`dark`:r===`light`?`light`:null}const ft={faceid:{label:`Face ID`,modalityAliases:[`face`]},touchid:{label:`Touch ID`,modalityAliases:[`finger`,`touch`]}};function pt(e){return e===`deny`?`revoke`:e}async function mt(e,n,r,i){let a=await gt(e);if(!a.has(r))throw new t(`UNSUPPORTED_OPERATION`,`iOS simctl privacy does not support service "${r}" on this runtime.`,{deviceId:e.id,appBundleId:i,hint:`Supported services: ${Array.from(a).sort().join(`, `)}`});let o=[`privacy`,e.id,n,r,i],s=r===`notifications`;if(!(n===`reset`&&s))try{await b(e,o);return}catch(n){throw s&&ht(n)?new t(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting notifications permission via simctl privacy on this runtime.`,{deviceId:e.id,appBundleId:i,hint:`Use reset notifications for reprompt behavior, or toggle notifications manually in Settings.`}):n}try{await b(e,o);return}catch(e){if(!ht(e))throw e}try{await b(e,[`privacy`,e.id,`reset`,`all`,i])}catch(n){throw new t(`COMMAND_FAILED`,`iOS simulator blocked direct notifications reset. Fallback reset-all also failed.`,{deviceId:e.id,appBundleId:i,hint:`Use reinstall to force a fresh notifications prompt, or reset simulator content and settings.`},n instanceof Error?n:void 0)}}function ht(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=String(e.details?.stderr??``).toLowerCase();return(n.includes(`failed to grant access`)||n.includes(`failed to revoke access`)||n.includes(`failed to reset access`))&&n.includes(`operation not permitted`)}async function gt(e){let n=ae(e.simulatorSetPath),r=`${process.env.PATH??``}::${n??``}`;if($&&ot===r)return $;let i=await b(e,[`privacy`,`help`],{allowFailure:!0}),a=_t(`${i.stdout}\n${i.stderr}`);if(a.size===0)throw new t(`COMMAND_FAILED`,`Unable to determine supported simctl privacy services`,{stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:"Run `xcrun simctl privacy help` manually to verify available services for this runtime."});return $=a,ot=r,a}function _t(e){let t=new Set,n=!1;for(let r of e.split(`
5
- `)){let e=r.trim();if(!e)continue;if(e===`service`){n=!0;continue}if(!n)continue;if(e.startsWith(`bundle identifier`))break;let i=/^([a-z-]+)\s+-\s+/.exec(e)?.[1];i!==void 0&&t.add(i)}return t}function vt(e,n){let i=r(e);if(i!==`photos`&&n?.trim())throw new t(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);if(i===`camera`)return`camera`;if(i===`microphone`)return`microphone`;if(i===`contacts`)return`contacts`;if(i===`contacts-limited`)return`contacts-limited`;if(i===`notifications`)return`notifications`;if(i===`calendar`)return`calendar`;if(i===`location`)return`location`;if(i===`location-always`)return`location-always`;if(i===`media-library`)return`media-library`;if(i===`motion`)return`motion`;if(i===`reminders`)return`reminders`;if(i===`siri`)return`siri`;if(i===`photos`){let e=n?.trim().toLowerCase();if(!e||e===`full`)return`photos`;if(e===`limited`)return`photos-add`;throw new t(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}throw new t(`INVALID_ARGS`,`Unsupported permission target: ${e}. Use camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri.`)}function yt(e,n){let r=e.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new t(`INVALID_ARGS`,`Invalid ${n} state: ${e}. Use match|nonmatch|enroll|unenroll.`)}async function bt(e,n,r){let i=xt(e.id,n,r.modalityAliases),a=[];for(let t of i){let n=C(e,t),r=await v(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=te(a);throw a.length>0&&a.every(e=>St(e.stdout,e.stderr))?new t(`UNSUPPORTED_OPERATION`,`${r.label} simulation is not supported on this simulator runtime.`,{deviceId:e.id,action:n,setting:r.settingName,attempts:o}):new t(`COMMAND_FAILED`,`Failed to simulate ${r.settingName}.`,{deviceId:e.id,action:n,setting:r.settingName,attempts:o})}function xt(e,t,n){let r=n.length>0?n:[`face`];switch(t){case`match`:return r.flatMap(t=>[[`biometric`,e,`match`,t],[`biometric`,`match`,e,t]]);case`nonmatch`:return r.flatMap(t=>[[`biometric`,e,`nonmatch`,t],[`biometric`,e,`nomatch`,t],[`biometric`,`nonmatch`,e,t],[`biometric`,`nomatch`,e,t]]);case`enroll`:return[[`biometric`,e,`enroll`,`yes`],[`biometric`,e,`enroll`,`1`],[`biometric`,`enroll`,e,`yes`],[`biometric`,`enroll`,e,`1`]];case`unenroll`:return[[`biometric`,e,`enroll`,`no`],[`biometric`,e,`enroll`,`0`],[`biometric`,`enroll`,e,`no`],[`biometric`,`enroll`,e,`0`]]}}function St(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unrecognized subcommand`)||n.includes(`unknown subcommand`)||n.includes(`not supported`)||n.includes(`unavailable`)||n.includes(`biometric`)&&n.includes(`invalid`)}var Ct=e({findIosSimulatorInstalledApp:()=>be,listIosApps:()=>Se,resolveIosApp:()=>A,resolveIosSimulatorDeepLinkBundleId:()=>_e});export{Y as a,H as c,at as i,ze as l,st as n,Qe as o,it as r,$e as s,Ct as t};
@@ -1 +0,0 @@
1
- import{c as e}from"./sdk-device.js";import{o as t}from"./helper.js";const n={platform:`host-system-audio`,source:`system-audio`,backend:`macos-screencapturekit`,sourceCount:1,start:t,notes:r};function r(t){return[`Audio probe samples host system audio through ScreenCaptureKit for this ${e(t)?`iOS simulator`:t.platform===`android`?`Android emulator`:`macOS session`}; it is not app-instrumented audio.`,`Screen Recording permission is required for host system audio capture.`,`Other audible host apps can contribute to the measured buckets.`]}export{n as macOsScreenCaptureKitAudioProbeBackend};
@@ -1 +0,0 @@
1
- import{n as e}from"./registry.js";const t=e();function n(e,n,r){let i=t[e];if(!i)throw Error(`Missing CLI reader for command: ${e}`);return i(n,r)}export{n as t};
@@ -1 +0,0 @@
1
- import{g as e}from"./sdk-batch-runner.js";const t=s(`public`),n=s(`internal`),r=s(`local-cli`),i={help:`help`};function a(){return[...Object.values(t),...Object.values(r)].sort()}function o(e){return Object.values(i).includes(e)||Object.values(n).includes(e)?!0:a().includes(e)}function s(t){let n={};for(let[r,i]of e(t))n[r]=i;return n}export{a as i,t as n,o as r,n as t};
@@ -1,5 +0,0 @@
1
- import{_ as e}from"./sdk-contracts.js";import{Lr as t}from"./sdk-batch-runner.js";import{_ as n,h as r}from"./sdk-android-adb.js";import i from"node:path";import a from"node:fs/promises";const o=/^[0-9a-fA-F-]{32,36}$/;function s(e){if(!(!e||!o.test(e)))return e.replaceAll(`-`,``).toUpperCase()}function c(e,t){return`${e.uuid}:${l(t)}`}function l(e){return`0x${e.toString(16)}`}function u(e){return typeof e==`string`&&e.length>0?e:void 0}function d(...e){for(let t of e){let e=u(t);if(e)return e}}function f(e){let t=e.filter(e=>!!e);return t.length>0?t.join(` `):void 0}function p(e){try{let n=JSON.parse(e);return t(n)?n:null}catch{return null}}function m(e){if(typeof e==`number`&&Number.isSafeInteger(e))return e;if(typeof e==`string`){let t=e.startsWith(`0x`)?Number.parseInt(e,16):Number(e);return Number.isSafeInteger(t)?t:void 0}}function h(e,t,n){if(!Object.hasOwn(e,t))return;let r=m(e[t]);if(r!==void 0)return r;v(n,t)}function g(e,t,n){if(!Object.hasOwn(e,t))return;let r=_(e[t]);if(r!==void 0)return r;v(n,t)}function _(e){if(typeof e==`bigint`)return e;if(typeof e==`number`&&Number.isSafeInteger(e)||typeof e==`string`&&/^(?:0x[0-9a-fA-F]+|\d+)$/.test(e))return BigInt(e)}function v(t,n){throw new e(`INVALID_ARGS`,`Invalid ${t} numeric field: ${n}`,{hint:`Crash artifact numeric fields must be integer numbers or integer numeric strings.`})}function y(e){return e.length===1?e[0]:void 0}function b(e){return[...new Set(e)]}function x(e){let t=e.match(/^(.*) \+ (\d+)$/);return t?{symbol:t[1],location:Number(t[2])}:{symbol:e}}const S=/^(?:arm64e?|arm64_32|x86_64|armv7[sk]?|i386)$/;function ee(e){return te(e)??w(e)}function te(e){let t=ne(e);if(!t)return null;let n=(Array.isArray(t.payload.usedImages)?t.payload.usedImages:[]).flatMap((e,t)=>C(e,t));if(n.length===0)return null;let r=re(Array.isArray(t.payload.threads)?t.payload.threads:[],n);return{format:`ips`,images:n,addresses:r.map(({frame:e,...t})=>t),document:t,frameMatches:r,write:e=>oe(t,r,e)}}function ne(e){let t=p(e);if(t)return{payload:t};let n=e.indexOf(`
2
- `);if(n===-1)return null;let r=e.slice(0,n),i=p(e.slice(n+1));return i?{header:r,payload:i}:null}function re(e,t){let n=new Map(t.map(e=>[e.index,e]));return e.flatMap((e,t)=>ie(e).flatMap((e,r)=>ae(e,n,t,r)))}function ie(e){return!t(e)||!Array.isArray(e.frames)?[]:e.frames.filter(t)}function ae(e,t,n,r){let i=h(e,`imageIndex`,`IPS frame`),a=g(e,`imageOffset`,`IPS frame`);if(i===void 0||a===void 0)return[];let o=t.get(i);return o?[{frame:e,frameIndex:r,threadIndex:n,image:o,address:o.base+a}]:[]}function oe(e,t,n){for(let e of t){let t=n.get(c(e.image,e.address))?.text;t&&se(e.frame,t)}e.payload.agentDeviceSymbolication={tool:`agent-device debug symbols`,symbolicatedFrames:[...n.values()].filter(e=>e.text).length};let r=`${JSON.stringify(e.payload,null,2)}\n`;return e.header?`${e.header}\n${r}`:r}function se(e,t){let n=x(t);e.symbol=n.symbol,n.location!==void 0&&(e.symbolLocation=n.location)}function C(e,n){if(!t(e))return[];let r=s(u(e.uuid)),a=g(e,`base`,`IPS usedImages`);if(!r||a===void 0)return[];let o=u(e.path);return[{index:n,name:u(e.name)??(o?i.basename(o):`image-${n}`),uuid:r,arch:u(e.arch),base:a,path:o}]}function w(e){let t=e.split(`
3
- `),n=T(t);if(n.length===0)return null;let r=O(t,n);return{format:`text`,images:n,addresses:r,lines:t,frameMatches:r,write(e){let n=new Map(r.map(e=>[e.lineIndex,e]));return t.map((t,r)=>{let i=n.get(r);if(!i)return t;let a=e.get(c(i.image,i.address))?.text;return!a||t.includes(a)?t:`${t} // ${a}`}).join(`
4
- `)}}}function T(e){let t=[],n=e.findIndex(e=>/^Binary Images:/i.test(e.trim()));if(n===-1)return t;for(let r of e.slice(n+1)){let e=E(r);e&&t.push(e)}return t}function E(e){let t=e.match(/^\s*(0x[0-9a-fA-F]+)\s*-\s*(0x[0-9a-fA-F]+)\s+\+?(.+?)\s+<([0-9a-fA-F-]{32,36})>\s+(.+)$/);if(!t)return null;let n=s(t[4]);if(!n)return null;let r=D(t[3].trim(),t[5].trim());return{name:r.name,arch:r.arch,uuid:n,base:BigInt(t[1]),end:BigInt(t[2]),path:t[5].trim()}}function D(e,t){let n=e.split(/\s+/),r=n.at(-1);if(r&&S.test(r))return{name:n.slice(0,-1).join(` `).trim(),arch:r};let a=i.basename(t);return{name:e.startsWith(a)?a:e}}function O(e,t){let n=[],r;for(let[i,a]of e.entries()){let e=a.match(/^Thread\s+(\d+)\s+Crashed:/);e?r=Number(e[1]):(a.trim().length===0||/^Thread\s+\d+/.test(a))&&(r=void 0);let o=k(a,t),s=a.match(/^\s*(\d+)/);o&&s&&n.push({...o,frameIndex:Number(s[1]),lineIndex:i,threadIndex:r})}return n}function k(e,t){let n=e.match(/^\s*\d+\s+(.+?)\s+(0x[0-9a-fA-F]+)\b/);if(!n)return null;let r=n[1].trim(),i=BigInt(n[2]),a=A(t,r,i);return a?{image:a,address:i}:null}function A(e,t,n){let r=e.filter(e=>e.name===t);return r.find(e=>j(e,n))??y(r)}function j(e,t){return e.end!==void 0&&e.base<=t&&t<=e.end}const M=1e4;async function N(e){return e.dsym&&e.searchPath?[H(e.cwd,e.dsym),...await P(H(e.cwd,e.searchPath))]:e.dsym?[H(e.cwd,e.dsym)]:e.searchPath?await P(H(e.cwd,e.searchPath)):[]}async function P(t){let n=[],r=0;async function o(s){if(n.length>=200)return;if(r+=1,r>M)throw new e(`COMMAND_FAILED`,`debug symbols search-path scan exceeded bounds.`,{searchPath:t,maxEntries:M,hint:`Pass --dsym <App.dSYM> directly or narrow --search-path to the build products directory.`});if(!(await F(s,t)).isDirectory()){s===t&&I(t);return}if(s.endsWith(`.dSYM`)){n.push(s);return}let c=await a.readdir(s,{withFileTypes:!0});for(let e of c)e.isDirectory()&&await o(i.join(s,e.name))}return await o(t),n}async function F(t,n){try{return await a.stat(t)}catch{throw new e(`INVALID_ARGS`,`debug symbols search path does not exist: ${n}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}}function I(t){throw new e(`INVALID_ARGS`,`debug symbols search path is not a directory: ${t}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}async function L(t,n){let r=(await Promise.all(b(t).map(e=>R(e,n)))).flat();if(r.length===0)throw new e(`COMMAND_FAILED`,`No UUIDs found in dSYM bundle.`,{hint:`Verify the path points to a built .dSYM bundle with DWARF contents.`});return r}async function R(e,t){return await z(e),B(e,r(await n(t,[`--uuid`,e],{timeoutMs:15e3,allowFailure:!0}),`Failed to inspect dSYM UUIDs: ${e}`,{hint:`Verify the dSYM bundle is valid and readable.`}).stdout)}async function z(t){if(!((await a.stat(t).catch(()=>null))?.isDirectory()&&t.endsWith(`.dSYM`)))throw new e(`INVALID_ARGS`,`Not a .dSYM bundle: ${t}`,{hint:`Pass the .dSYM bundle path, not the DWARF executable inside it.`})}function B(e,t){return t.split(`
5
- `).flatMap(t=>{let n=t.match(/^UUID:\s+([0-9a-fA-F-]{32,36})\s+\(([^)]+)\)\s+(.+)$/),r=s(n?.[1]);return n&&r?[{dsymPath:e,uuid:r,arch:n[2],binaryPath:n[3].trim()}]:[]})}function V(t,n,r){let i=new Map;for(let e of t){let t=n.find(t=>t.uuid===e.uuid&&(e.arch===void 0||t.arch===void 0||t.arch===e.arch));t&&i.set(e.uuid,{image:e,dsym:t})}if(i.size>0)return i;let a=b(t.map(e=>e.uuid)),o=b(n.map(e=>e.uuid));throw new e(`COMMAND_FAILED`,r?`dSYM UUID does not match any Apple image in the crash artifact.`:`No matching dSYM UUID found under search path.`,{artifactUuidCount:a.length,artifactUuidSample:a.slice(0,5),dsymUuidCount:o.length,dsymUuidSample:o.slice(0,5),hint:`Use dwarfdump --uuid <App.dSYM> and compare it with the crash Binary Images or usedImages UUID, then pass the matching dSYM/search path.`})}function H(e,t){return i.resolve(e,t)}function U(e,t){return e.format===`ips`?W(e.document,e.frameMatches,t):ve(e.lines,e.frameMatches,t)}function W(e,t,n){let r=me(e.payload),i={format:`ips`,...G(e),crashedThread:r,topFrames:_e(t,r,n),findings:[]};return{...i,findings:Y(i)}}function G(e){let t=e.payload,n=pe(e.header);return{appName:K(t,n),bundleId:ce(t,n),version:le(t,n),incident:ue(t,n),timestamp:de(t,n),exceptionType:fe(t.exception),exceptionCodes:he(t.exception),terminationReason:ge(t.termination)}}function K(e,t){return d(e.procName,t?.app_name,t?.name)}function ce(e,n){return d((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleIdentifier,n?.bundleID)}function le(e,n){return d((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleShortVersionString,n?.app_version)}function ue(e,t){return d(e.incident,t?.incident_id)}function de(e,t){return d(e.captureTime,t?.timestamp)}function fe(e){return t(e)?u(e.type):void 0}function pe(e){return e?p(e):null}function me(e){let n=m(e.faultingThread);if(n!==void 0)return n;let r=(Array.isArray(e.threads)?e.threads:[]).findIndex(e=>t(e)&&e.triggered===!0);return r===-1?void 0:r}function he(e){return t(e)?d(e.codes,e.rawCodes):void 0}function ge(e){if(t(e))return f([u(e.namespace),u(e.code),u(e.reason)])}function _e(e,t,n){return e.filter(e=>t===void 0||e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function ve(e,t,n){let r=be(e),i={format:`text`,appName:ye(e),bundleId:q(e,`Identifier`),version:q(e,`Version`),incident:q(e,`Incident Identifier`),timestamp:q(e,`Date/Time`),exceptionType:q(e,`Exception Type`),exceptionCodes:q(e,`Exception Codes`),terminationReason:q(e,`Termination Reason`),crashedThread:r,topFrames:xe(t,r,n),findings:[]};return{...i,findings:Y(i)}}function ye(e){return q(e,`Process`)?.replace(/\s+\[\d+\]$/,``)}function q(e,t){let n=`${t}:`,r=e.find(e=>e.trimStart().startsWith(n));return r&&r.slice(r.indexOf(`:`)+1).trim()||void 0}function be(e){let t=q(e,`Triggered by Thread`),n=t?Number.parseInt(t,10):NaN;if(Number.isSafeInteger(n))return n;for(let t of e){let e=t.match(/^Thread\s+(\d+)\s+Crashed:/);if(e)return Number(e[1])}}function xe(e,t,n){return t===void 0?[]:e.filter(e=>e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function J(e,t,n,r){return{index:e,image:t.name,address:l(n),symbol:r.get(c(t,n))?.text}}function Y(e){return[Se(e),e.exceptionType?`Exception: ${e.exceptionType}`:void 0,e.terminationReason?`Termination: ${e.terminationReason}`:void 0].filter(e=>!!e).slice(0,3)}function Se(e){let t=e.topFrames.find(e=>e.symbol);return t?`Start with ${t.symbol} in ${t.image}; it is the first symbolicated frame captured on the crashed thread.`:e.topFrames.length>0?`No symbolicated frame was found on the crashed thread; verify matching dSYMs for the top images.`:void 0}async function Ce(e,t,n){let r=new Map;for(let i of we(e,t).values())for(let e of await Te(n,i))r.set(c(e.image,e.address),e);return r}function we(e,t){let n=new Map;for(let r of e){let e=t.get(r.image.uuid);if(!e)continue;let i=`${r.image.uuid}:${e.dsym.binaryPath}`,a=n.get(i)??{...e,addresses:[]};a.addresses.push(r.address),n.set(i,a)}return n}async function Te(e,t){let i=b(t.addresses.map(l)),a=r(await n(e,Ee(t,i),{timeoutMs:3e4,allowFailure:!0}),`atos failed while symbolicating crash frames.`,{hint:`Verify the crash artifact and dSYM were produced from the same build and architecture.`});return De(t.image,i,a.stdout)}function Ee(e,t){return[`-arch`,e.image.arch??e.dsym.arch??`arm64`,`-o`,e.dsym.binaryPath,`-l`,l(e.image.base),...t]}function De(e,t,n){let r=Oe(n);return t.map((t,n)=>{let i=r[n]?.trim();return{image:e,address:BigInt(t),text:ke(i,t)?i:void 0}})}function Oe(e){let t=e.split(/\r?\n/);return t.at(-1)===``&&t.pop(),t}function ke(e,t){if(!e)return!1;let n=e.trim().toLowerCase();return!n||n===`??`||n===t.toLowerCase()?!1:!n.startsWith(`0x`)}async function Ae(){return{dwarfdump:await X(`dwarfdump`),atos:await X(`atos`)}}async function X(t){try{let e=await n(`xcrun`,[`--find`,t],{timeoutMs:5e3,allowFailure:!0}),r=e.stdout.trim();if(e.exitCode===0&&r.length>0)return r}catch{}throw new e(`TOOL_MISSING`,`Apple symbolication tool not found: ${t}`,{hint:`Install Xcode Command Line Tools and verify xcrun --find dwarfdump and xcrun --find atos succeed.`})}const Z=64*1024*1024;async function je(t){if(t.action!==void 0&&t.action!==`symbols`)throw new e(`INVALID_ARGS`,`debug supports only the symbols workflow.`,{hint:`Use debug symbols --artifact <crash.ips|crash.log> --dsym <App.dSYM> or --search-path <dir> --out <path>.`});let n=t.cwd??process.cwd(),r=$(n,t.artifact),o=$(n,t.out??Pe(r)),s=ee(await Me(r,`crash artifact`));s||Q();let c=await N({cwd:n,dsym:t.dsym,searchPath:t.searchPath});if(c.length===0)throw new e(`INVALID_ARGS`,`debug symbols requires --dsym or --search-path.`,{hint:`Pass a matching .dSYM bundle directly, or pass --search-path <dir> so agent-device can match crash image UUIDs to local dSYMs.`});let l=await Ae(),u=await L(c,l.dwarfdump),d=V(s.images,u,!!t.dsym),f=await Ce(s.addresses,d,l.atos),p=s.write(f);await a.mkdir(i.dirname(o),{recursive:!0}),await a.writeFile(o,p,`utf8`);let m=[...d.values()].map(({image:e,dsym:t})=>({name:e.name,uuid:e.uuid,arch:e.arch??t.arch,dsymPath:t.dsymPath,binaryPath:t.binaryPath})),h=[...f.values()].filter(e=>e.text).length,g=s.images.length-m.length,_=g>0?[`${g} Apple image${g===1?``:`s`} had no matching dSYM and were left unchanged.`]:void 0;return{kind:`debugSymbols`,platform:`apple`,artifactPath:r,outPath:o,crash:U(s,f),matchedImages:m,symbolicatedFrames:h,skippedImages:g,warnings:_,message:`Symbolicated ${h} frame${h===1?``:`s`} -> ${o}`}}function Q(){throw new e(`UNSUPPORTED_OPERATION`,`debug symbols currently supports Apple crash artifacts with Binary Images or IPS usedImages.`,{hint:`For Android Java/R8 crashes, use retrace with mapping.txt. For Android native crashes, use ndk-stack or addr2line with unstripped .so symbols. Capture the crash with logs, then symbolicate externally until Android support is added.`})}async function Me(t,n){await Ne(t,n);try{return await a.readFile(t,`utf8`)}catch(r){let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}async function Ne(t,n){try{let r=await a.stat(t);if(r.size<=Z)return;throw new e(`INVALID_ARGS`,`${n} is too large: ${t}`,{actualBytes:r.size,maxBytes:Z,hint:`Pass a bounded Apple .ips/.crash artifact. For very large logs, first narrow the log to the crash report, or use logs grep/tail for lead-up context.`})}catch(r){if(r instanceof e)throw r;let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}function $(e,t){return i.resolve(e,t)}function Pe(e){let t=i.extname(e);return`${t?e.slice(0,-t.length):e}-symbolicated${t||`.log`}`}export{je as symbolicateCrashArtifact};
@@ -1,2 +0,0 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{Gt as n,Ht as r,Kt as i,qt as a}from"./sdk-batch-runner.js";import{A as o,n as s,o as c}from"./sdk-android-adb.js";import{n as l}from"./shell-quote.js";import{t as u}from"./timeouts.js";import{h as d}from"./app-lifecycle.js";var f=e({dismissAndroidKeyboard:()=>y,dismissAndroidKeyboardWithAdb:()=>b,getAndroidKeyboardState:()=>_,getAndroidKeyboardStatusWithAdb:()=>v,readAndroidClipboardText:()=>j,readAndroidClipboardWithAdb:()=>M,writeAndroidClipboardText:()=>N,writeAndroidClipboardWithAdb:()=>P});const p=[`mInputShown`,`mIsInputViewShown`,`isInputViewShown`,`mDecorViewVisible`,`mWindowVisible`,`mInShowWindow`],m=new Map([[2,`number`],[3,`phone`],[4,`datetime`]]),h=new Set([32,208]),g=new Set([128,224,144]);async function _(e){return await v(c(e))}async function v(e){let t=await e([`shell`,`dumpsys`,`input_method`],{allowFailure:!0});if(t.exitCode!==0)throw s(`Failed to query Android keyboard state`,t);return x(t.stdout)}async function y(e){return await b(c(e))}async function b(e){let n=await v(e),r=n,i=0;for(;r.visible&&i<2;)await e([`shell`,`input`,`keyevent`,`111`]),i+=1,await u(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 x(e){let t=E(e)??S(e),n=C(e),i=w(e,/\bpackageName=([A-Za-z0-9_.]+)\b/g),o=w(e,/\b(?:resourceId|resource-id)=([^\s,}]+)/g),s=a(e),c=r(i,o,s);return T(i,o,s),{visible:t??!1,inputType:n,type:n?A(n):void 0,inputMethodPackage:s,focusedPackage:i,focusedResourceId:o,inputOwner:c}}function S(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)!=0}function C(e){let t=w(e,/\binputType=0x([0-9a-fA-F]+)\b/gi);return t?`0x${t.toLowerCase()}`:void 0}function w(e,t){let n;for(let r of e.matchAll(t))n=r[1];return n}function T(e,t,r){r||!n(e)&&!i(t)||o({level:`warn`,phase:`android_input_ownership_fallback`,data:{focusedPackage:e,focusedResourceId:t}})}function E(e){return O(D(e,p))}function D(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 O(e){if(e.size===0)return null;let t=k(e,[`mWindowVisible`,`mDecorViewVisible`,`mInShowWindow`]);if(t!==void 0)return t;let n=e.get(`mInputShown`);return n===void 0?k(e,[`mIsInputViewShown`,`isInputViewShown`])??null:n}function k(e,t){for(let n of t){let t=e.get(n);if(t!==void 0)return t}}function A(e){let t=Number.parseInt(e.replace(/^0x/i,``),16);if(Number.isNaN(t))return`unknown`;let n=t&15,r=m.get(n);if(r)return r;if(n!==1)return`unknown`;let i=t&4080;return h.has(i)?`email`:g.has(i)?`password`:`text`}async function j(e){return await M(c(e))}async function M(e){return I(await F(e,[`shell`,`cmd`,`clipboard`,`get`,`text`],`read`))}async function N(e,t){await P(c(e),t)}async function P(e,t){await F(e,[`shell`,`cmd`,`clipboard`,`set`,`text`,l(t)],`write`)}async function F(e,n,r){let i=await e(n,{allowFailure:!0});if(d(i.stdout,i.stderr))throw new t(`UNSUPPORTED_OPERATION`,`Android shell clipboard ${r} is not supported on this device.`);if(i.exitCode!==0)throw s(`Failed to ${r} Android clipboard text`,i);return i.stdout}function I(e){let t=e.replace(/\r\n/g,`
2
- `).replace(/\n$/,``),n=t.match(/^clipboard text:\s*(.*)$/i);return n?n[1]??``:t.trim().toLowerCase()===`null`?``:t}export{j as a,P as c,v as i,b as n,M as o,_ as r,N as s,f as t};
@@ -1 +0,0 @@
1
- import{c as e}from"./sdk-device.js";import{o as t}from"./interactors.js";import{n}from"./physical-device-control.js";import{p as r}from"./config.js";const i=r({ttlMs:5e3});async function a(r,a={}){if(t(r))return;let c=s(r);if(i.get(c)===!0){if(!a.focusExisting)return;i.delete(c)}if(e(r)){if(r.kind===`simulator`){let{ensureBootedSimulator:e}=await import(`./simulator.js`).then(e=>e.i);await e(r,{deviceHub:a.deviceHub,focusExisting:a.focusExisting,onColdBootStart:a.onIosSimulatorColdBootStart}),o(c);return}if(r.kind===`device`){await n(r).ensureReady(r),o(c);return}}if(r.platform===`android`){let{waitForAndroidBoot:e}=await import(`./app-lifecycle.js`).then(e=>e.l);await e(r.id),o(c)}}function o(e){i.set(e,!0)}function s(e){let t=e.kind===`simulator`?e.simulatorSetPath??``:``;return JSON.stringify([e.platform,e.kind,e.id,e.target??``,t])}export{a as t};
@@ -1 +0,0 @@
1
- import{_ as e}from"./sdk-contracts.js";import{D as t,t as n}from"./location-coordinates.js";import{Ft as r,a as i,f as a}from"./sdk-batch-runner.js";import{_ as o,b as s,c,h as l,l as u,m as d,s as f,y as ee}from"./sdk-device.js";import{bn as p,c as m,ft as h,ht as te,mt as ne,pt as re,yn as g}from"./script-source-bundle.js";import{G as _,V as ie,W as v,d as y,f as ae,i as oe,m as se,p as ce,u as le}from"./interaction.js";import{M as ue}from"./screenshot-result.js";import{a as de}from"./device.js";import{s as fe}from"./runtime.js";import{A as b,F as x}from"./sdk-android-adb.js";import{t as pe}from"./timeouts.js";import{i as S,r as me,t as C}from"./interactors.js";import{o as he,s as ge}from"./simctl.js";import{d as _e,f as ve,u as ye}from"./verified-file.js";import be from"node:path";import{promises as xe}from"node:fs";import{AsyncLocalStorage as Se}from"node:async_hooks";const w=new Se;async function Ce(t,n,r){let i=await we(t,n,r);if(i)return i;let a=await E(t,n,r);if(r.allowLocalSimulatorFallback!==!1&&O(n,a)){let e;try{[e]=await ye({platform:n.platform??`ios`,target:n.target,iosSimulatorSetPath:r.simulatorSetPath,kind:`simulator`})}catch(e){if(ve(e))throw e}if(e)return e}if(a)return a;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function we(t,n,r){let i=r.appleSimulatorAppTarget?.trim();if(!i||k(n)||r.allowLocalSimulatorFallback===!1)return;let a=t.filter(e=>l(e,n)&&c(e)&&e.kind===`simulator`&&e.booted===!0);if(a.length<2)return;let{findIosSimulatorInstalledApp:o}=await import(`./apps.js`).then(e=>e.t),s=(await Promise.all(a.map(async e=>await o(e,i)?e:void 0))).filter(e=>e!==void 0);if(s.length===1)return s[0];throw s.length===0?new e(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${i} installed`,{appTarget:i,...T(a),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`}):new e(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${i} installed`,{appTarget:i,...T(s),hint:`Pass --udid to select the intended simulator explicitly.`})}function T(e){return{devices:e.map(e=>({id:e.id,name:e.name}))}}async function E(e,t,n){try{return await s(e,t,n)}catch(e){if(D(e,t))return;throw e}}function D(t,n){return!k(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function O(e,t){return!k(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}function k(e){return!!(e.udid||e.serial||e.deviceName)}async function Te(e,t={}){let n={...A(e),androidAvdSelection:t.androidAvdSelection??`running-only`},{iosSimulatorSetPath:r,...i}=n,a=Ae(n,t),o={simulatorSetPath:r},c={platform:n.platform,target:e.target,cacheHit:!1};return await x(`resolve_target_device`,async()=>{let e=ke(a);if(e)return c.cacheHit=!0,e;let l=await _e(n),u=[...l.devices];return Oe(i)?j(a,await Ce(u,i,{simulatorSetPath:r,allowLocalSimulatorFallback:l.source===`local`||n.leaseProvider===void 0,appleSimulatorAppTarget:t.appleSimulatorAppTarget})):j(a,await s(u,i,o))},c)}function A(t){let n=t.platform;if(t.target&&!n)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let r=ee({simulatorSetPath:ge(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=he(t.androidDeviceAllowlist);return{platform:n,target:t.target,deviceName:t.device,udid:t.udid,serial:t.serial,leaseId:t.leaseId,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0}}async function Ee(e){return w.getStore()?await e():await w.run(new Map,e)}function De(e){return f(e.platform)}function Oe(e){return De(e)}function ke(e){let t=w.getStore()?.get(e);if(t)return{...t}}function j(e,t){return w.getStore()?.set(e,{...t}),t}function Ae(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}me();const je={device:!0},Me={emulator:!0,device:!0},Ne=new Set([`perf`,`back`,`app-switcher`,`click`,`fill`,`find`,`focus`,`get`,`home`,`gesture`,`keyboard`,`is`,`longpress`,`press`,`screenshot`,`scroll`,`settings`,`swipe`,`type`,`wait`]),Pe=[`audio`,`find`,`get`,`is`,`screenshot`,`wait`],Fe=[`click`,`fill`,`focus`,`hover`,`press`,`scroll`,`type`],Ie=[`viewport`],M=new Set([...Pe,...Fe,...Ie]),N=Le(i(a));function Le(e){let t={};for(let[n,r]of Object.entries(e))t[n]=Ne.has(n)?{...r,harmonyos:Me}:r;return Re(t)}function Re(e){let t={};for(let[n,r]of Object.entries(e))t[n]=M.has(n)?{...r,web:je}:r;for(let t of M)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}function P(e,t){let n=N[e];if(!n)return!0;let r=S(t.platform);if(!r)return!1;let i=n[r.capability.bucket];if(!i)return!1;let a=r.capability.supportsByDefault?.[e];return a&&!a(t)?!1:i[t.kind??`unknown`]===!0}function ze(e,t){return S(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t)}function Be(){return a.filter(e=>e.catalog.group===`public`&&(`capability`in e&&e.capability!==void 0||e.platformExecution.kind===`device-runtime`)).map(e=>e.name).sort()}function Ve(e){let t=N[e];if(!t)return[];let n=[`apple`,`android`,`harmonyos`,`vega`,`linux`,`web`],r=[];for(let e of n){let n=t[e];n&&Object.values(n).some(e=>e===!0)&&r.push(e)}return r}function He(e,t){if(e.intent===`drag`){Ue(e,t);return}if(t.platform===`web`||t.appleOs===`watchos`)throw I(e,F(e,t));if(Ge(e)){Ke(e,t);return}if(t.appleOs===`visionos`)throw I(e,F(e,t));if(e.intent===`fling`&&`direction`in e&&t.platform===`linux`)throw I(e,`gesture fling is not supported on Linux`)}function Ue(e,t){if(!We(t))throw I(e,F(e,t),`Target-authored drag requires an adapter that preserves source hold, timed movement, and destination hold; it is supported on Android touch devices and iOS/iPadOS.`)}function We(e){return e.platform===`android`?e.target!==`tv`:e.platform===`apple`?e.appleOs===void 0?e.target!==`desktop`&&e.target!==`tv`:e.appleOs===`ios`||e.appleOs===`ipados`:!1}function Ge(e){return e.intent===`pan`?(`pointerCount`in e?e.pointerCount:1)===2:e.intent===`pinch`||e.intent===`rotate`||e.intent===`transform`}function Ke(e,t){if(t.platform===`android`){if(t.target!==`tv`)return;throw I(e,`gesture ${e.intent} is not supported on Android TV`,`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`)}if(t.platform!==`apple`)throw I(e,F(e,t));r(t,e.intent)}function F(e,t){return`gesture ${e.intent} is not supported on ${t.appleOs??t.platform}`}function I(t,n,r){return new e(`UNSUPPORTED_OPERATION`,n,{gesture:t.intent,...r?{hint:r}:{}})}const L=`No active session. Run open first.`;function R(e,t,n,r){return{ok:!1,error:{code:e,message:t,...r?.hint?{hint:r.hint}:{},...r?.retriable===void 0?{}:{retriable:r.retriable},...n?{details:n}:{}}}}function qe(){return R(`SESSION_NOT_FOUND`,L)}function Je(e,t,n){if(P(e,t))return null;let r=n?.hint?ze(e,t):void 0;return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:n?.message??`${e} is not supported on this device`,...r?{hint:r}:{}}}}const Ye=/^[A-Za-z0-9_.:-]{1,64}$/,z=8*1024,B=4*1024;function Xe(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Ye.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:Qe(r,n)}}function Ze(t,n,r){let i=o(t),a=$e(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let s=r?JSON.stringify(r):``,c=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(s)).replaceAll(`{platform}`,encodeURIComponent(i));if(c.length>B)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:c.length,maxLength:B});return c}function Qe(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>z)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${z} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function $e(e){return((c(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:u(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}function et(e){let t=e?e.textEntryReadiness:void 0,n=at(t)?{textEntryReadiness:t}:{},r=tt(e);return r?{...n,...r}:n}function tt(e){if(!nt(e))return null;let t=rt(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function nt(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&V(e.before)&&V(e.after))}function rt(e){if(!H(e)||!it(e))return null;let t=ot(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function it(e){return V(e.resourceId)&&V(e.className)&&V(e.packageName)}function at(e){return typeof e==`string`&&ce.includes(e)}function V(e){return e===null||typeof e==`string`}function ot(e){return!H(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function H(e){return!!e&&typeof e==`object`}const U=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function st(e,t){return f(e.platform)&&t>1}function ct(e,t,n=2e4){if(e.length===0)return[];let r=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>n,c=a.length>=r;(s||c)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}function W(e,t){if(t<=0)return[0,0];let[n,r]=U[e%U.length];return[n*t,r*t]}async function lt(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await pe(t)}async function ut(e,t){let{x:n,y:r}=G(t,`longpress requires x y [durationMs]`,{hint:`Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs.`}),i=t[2]?Number(t[2]):void 0;return await e.longPress(n,r,i),{x:n,y:r,durationMs:i,...g(`Long pressed (${n}, ${r})`)}}async function dt(t,n){let{x:r,y:i}=G(n,`hover requires x y`,{hint:`Direct platform hover requires coordinates. In an open daemon session, use agent-device hover @ref|selector; otherwise run snapshot -i, use the target rect center as x y, then retry hover x y.`});if(!t.hover)throw new e(`UNSUPPORTED_OPERATION`,`hover is not supported on this platform`,{hint:`hover raises pointer hover state and is available on web targets only. On touch platforms use longpress for hold gestures.`});return await t.hover(r,i),{x:r,y:i,...g(`Hovered (${r}, ${i})`)}}async function ft(e,t){let{x:n,y:r}=G(t,`focus requires x y`);return await e.focus(n,r),{x:n,y:r,...g(`Focused (${n}, ${r})`)}}async function pt(t,n,r){let i=Lt(n);if(i)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});let a=n.join(` `);if(!a)throw new e(`INVALID_ARGS`,`type requires text`);let o=h(r?.delayMs??0,`delay-ms`,0,1e4),s=(await t.type(a,o))?.textEntryRoute;return{...s===void 0?{}:{textEntryRoute:s},text:a,delayMs:o,...g(Y(`Typed`,a))}}async function mt(t,n,r){if(r?.directElementSelector)return await ht(t,r.directElementSelector,n,r);let i=Number(n[0]),a=Number(n[1]),o=n.slice(2).join(` `);if(Number.isNaN(i)||Number.isNaN(a)||!o)throw new e(`INVALID_ARGS`,`fill requires x y text`);let s=h(r?.delayMs??0,`delay-ms`,0,1e4),c=await t.fill(i,a,o,s,{allowNonHittableCoordinateFallback:r?.allowNonHittableCoordinateFallback===!0});return{x:i,y:a,text:o,delayMs:s,...c?.maestroNonHittableCoordinateFallbackUsed===!0?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...et(c),...g(Y(`Filled`,o))}}async function ht(t,n,r,i){if(!t.fillElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector fill is not supported`);let a=r.join(` `);if(!a)throw new e(`INVALID_ARGS`,`fill requires text`);let o=h(i.delayMs??0,`delay-ms`,0,1e4),s=await t.fillElementSelector(n,a,o);return{selector:n.raw,text:a,delayMs:o,...s??{},...g(Y(`Filled`,a))}}async function gt(e,t,n,r){if(r?.directElementSelector&&c(e))return await _t(t,r.directElementSelector);let{x:i,y:a}=G(n,`press requires x y`);if(u(e)&&r?.surface&&r.surface!==`app`)return await vt(i,a,r);let o=_(r);if(o!==`primary`)return await yt(e,i,a,o,r);let s=St(r);return Ct(s),st(e,s.count)?await Tt(e,i,a,s,r):await Ot(t,i,a,s)}async function _t(t,n){if(!t.tapElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector tap is not supported`);let r=await t.tapElementSelector(n),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:n.raw,...r??{},...g(i?se:`Tapped ${n.raw}`)}}function G(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}async function vt(t,n,r){let i=_(r);if(i!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${i} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.t);return await a(t,n,{bundleId:r.appBundleId,surface:r.surface}),{x:t,y:n,...g(J({x:t,y:n}))}}async function yt(e,t,n,r,i){if(bt(e,r,i),e.platform===`linux`)return await xt(t,n,r);let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.r);return await a(e,{command:`mouseClick`,x:t,y:n,button:r,appBundleId:i?.appBundleId},q(i)),{x:t,y:n,button:r,...g(J({x:t,y:n,button:r}))}}function bt(e,t,n){let r=v({commandLabel:`click`,platform:o(e),button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}async function xt(e,t,n){if(n===`secondary`){let{rightClickLinux:n}=await import(`./input-actions3.js`);await n(e,t)}else{let{middleClickLinux:n}=await import(`./input-actions3.js`);await n(e,t)}return{x:e,y:t,button:n,...g(J({x:e,y:t,button:n}))}}function St(e){return{count:K(e?.count,1,`count`,1,200),intervalMs:K(e?.intervalMs,0,`interval-ms`,0,1e4),holdMs:K(e?.holdMs,0,`hold-ms`,0,1e4),jitterPx:K(e?.jitterPx,0,`jitter-px`,0,100),doubleTap:!!e?.doubleTap}}function K(e,t,n,r,i){return h(e===void 0?t:e,n,r,i)}function Ct({doubleTap:t,holdMs:n,jitterPx:r}){if(t&&n>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t&&r>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}async function wt(e,t,n){let{runAppleRunnerCommand:r}=await import(`./runner-client.js`).then(e=>e.r),{MAX_RUNNER_SEQUENCE_STEPS:i,buildRunnerSequenceCommand:a,parseRunnerSequenceResult:o}=await import(`./runner-sequence.js`).then(e=>e.r),s=ct(t,i),c,l,u=0,d=[],f=0;for(let t of s){let i=await r(e,a(t,n?.appBundleId),q(n));c??=i,l=i;let s;try{s=o(i)}catch(e){throw Dt(e,f)}u+=s.completedSteps,d.push(...s.results),f+=t.length}return{...c??{},completedSteps:u,sequenceResults:d,...l?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:l.gestureEndUptimeMs}}}async function Tt(e,t,n,r,i){let a=await wt(e,Et(e,t,n,r),i);return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:`runner-sequence`,...a,...g(J({x:t,y:n}))}}function Et(e,t,n,r){let i=r.doubleTap?`doubleTap`:r.holdMs>0?`longPress`:`tap`,a=i===`tap`&&c(e)&&!d(e);return Array.from({length:r.count},(e,o)=>{let[s,c]=W(o,r.jitterPx),l=o===r.count-1;return{kind:i,x:t+s,y:n+c,...a?{synthesized:!0}:{},...r.holdMs>0?{durationMs:r.holdMs}:{},...!l&&r.intervalMs>0?{pauseMs:r.intervalMs}:{}}})}function Dt(t,n){if(n===0||!(t instanceof e)||!t.details)return t;let r=t.details.failedStepIndex;if(typeof r!=`number`)return t;let i=t.details.completedSteps;return new e(t.code,t.message,{...t.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},t.cause)}async function Ot(e,t,n,r){let i;return await lt(r.count,r.intervalMs,async a=>{let[o,s]=W(a,r.jitterPx),c=t+o,l=n+s;if(r.doubleTap){let t=await e.doubleTap(c,l);i??=t??void 0;return}if(r.holdMs>0){let t=await e.longPress(c,l,r.holdMs);i??=t??void 0}else{let t=await e.tap(c,l);i??=t??void 0}}),p({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},J({x:t,y:n}))}function q(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function kt(t,n,r){let i=n[0],a=n[1]?Number(n[1]):void 0,o=r?.pixels,s=r?.durationMs;if(!i)throw new e(`INVALID_ARGS`,`scroll requires direction`);At(a,o,s);let c=Ft(i),l={amount:a,pixels:o,durationMs:s},{interactionResult:u,completedPasses:d}=await Mt(t,r,c,l);return p(Nt(c,l,d,u),ne(c.direction,c.edge,d,a,o))}function At(e,t,n){jt(e),ae(n),le({amount:e,pixels:t})}function jt(t){if(t!==void 0&&!Number.isFinite(t))throw new e(`INVALID_ARGS`,`scroll amount must be a number`)}async function Mt(e,t,n,r){if(n.edge){let i=n.edge,a=await te({edge:i,captureState:async n=>await Pt(e,t,i,n),scroll:async()=>await e.scroll(n.direction,r)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(n.direction,r)??{},completedPasses:1}}function Nt(e,t,n,r){let i=y(r);return{direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...i===void 0?{}:{durationMs:i},...r}}async function Pt(t,n,r,i){if(typeof t.snapshot!=`function`)throw new e(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let a=t.snapshot;return await re({edge:r,scope:i,captureNodes:async e=>(await a({appBundleId:n?.appBundleId,scope:e})).nodes??[]})}function Ft(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:ie(e)}}async function It(e,t,n){let{x:r,y:i}=G(t,`read requires x y`);if(e.platform===`android`){let{readAndroidTextAtPoint:t}=await import(`./input-actions.js`).then(e=>e.s);return{action:`read`,text:await t(e,r,i)??``}}if(e.platform===`linux`){let{readLinuxTextAtPoint:e}=await import(`./snapshot3.js`);return{action:`read`,text:await e(r,i,n?.surface)}}if(u(e)&&n?.surface&&n.surface!==`app`){let{runMacOsReadTextAction:e}=await import(`./helper.js`).then(e=>e.t);return{action:`read`,text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.r),o=await a(e,{command:`readText`,x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId,iosXctestrunFile:n?.iosXctestrunFile,iosXctestDerivedDataPath:n?.iosXctestDerivedDataPath,iosXctestEnvDir:n?.iosXctestEnvDir});return{action:`read`,text:typeof o.text==`string`?o.text:typeof o.message==`string`?o.message:``}}function Lt(e){return fe(e[0])}function J(e){return e.button&&e.button!==`primary`?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function Y(e,t){return`${e} ${Array.from(t).length} chars`}async function Rt(e,t,n,r,i){let a=X(i);return await zt(e,await C(e,a),t,n,r,i,a)}async function zt(e,t,n,r,i,a,o){return b({level:`debug`,phase:`platform_command_prepare`,data:{command:n,platform:e.platform,kind:e.kind}}),await x(`platform_command`,async()=>await Ht(e,t,n,r,i,a,o),{command:n,platform:e.platform})}async function Bt(t,n,r){let i=await C(t,X(r));if(!i.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`Gesture execution is unavailable`);return await i.performGesture(n)}async function Vt(e,t){return await(await C(e,X(t))).gestureViewport?.()}function X(e){return{requestId:e?.requestId,signal:e?.signal,appBundleId:e?.appBundleId,verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir,runnerLeaseContext:e?.runnerLeaseContext}}const Z={press:({device:e,interactor:t,positionals:n,context:r})=>gt(e,t,n,r),longpress:({interactor:e,positionals:t})=>ut(e,t),hover:({interactor:e,positionals:t})=>dt(e,t),focus:({interactor:e,positionals:t})=>ft(e,t),type:({interactor:e,positionals:t,context:n})=>pt(e,t,n),fill:({interactor:e,positionals:t,context:n})=>mt(e,t,n),scroll:({interactor:e,positionals:t,context:n})=>kt(e,t,n),"trigger-app-event":({device:e,interactor:t,positionals:n,context:r})=>Ut(e,t,n,r),screenshot:({interactor:e,positionals:t,outPath:n,context:r})=>Wt(e,t,n,r),viewport:({interactor:e,positionals:t})=>Gt(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:`back`,mode:t?.backMode??`in-app`,...g(`Back`)}),home:async({interactor:e})=>(await e.home(),{action:`home`,...g(`Home`)}),orientation:async({interactor:e,positionals:t})=>{let n=de(t[0]),r=(await e.setOrientation(n))?.orientation??n;return{action:`orientation`,orientation:r,...g(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:`app-switcher`,...g(`Opened app switcher`)}),clipboard:({interactor:e,positionals:t})=>Kt(e,t),keyboard:({device:e,positionals:t,context:n,runnerCtx:r})=>Q(e,t,n,r),"tv-remote":({device:e,interactor:t,positionals:n,context:r})=>qt(e,t,n,r),settings:({device:e,interactor:t,positionals:n,context:r})=>Qt(e,t,n,r),read:({device:e,positionals:t,context:n})=>It(e,t,n)};async function Ht(t,n,r,i,a,o,s){let c=Object.hasOwn(Z,r)?Z[r]:void 0;if(!c)throw new e(`INVALID_ARGS`,`Unknown command: ${r}`);return await c({device:t,interactor:n,positionals:i,outPath:a,context:o,runnerCtx:s})}async function Ut(e,t,n,r){let{eventName:i,payload:a}=Xe(n),o=Ze(e,i,a);return await t.open(o,{appBundleId:r?.appBundleId}),{event:i,eventUrl:o,transport:`deep-link`,...g(`Triggered app event: ${i}`)}}async function Wt(e,n,r,i){let a=n[0]??r??`./screenshot-${Date.now()}.png`;await xe.mkdir(be.dirname(a),{recursive:!0});let o=t(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,pixelDensity:o.pixelDensity,fullscreen:o.fullscreen,normalizeStatusBar:o.normalizeStatusBar,stabilize:o.stabilize,surface:i?.surface,skipIosSimulatorBootCheck:i?.skipIosSimulatorBootCheck,captureBackend:i?.screenshotCaptureBackend}),{path:a,...g(`Saved screenshot: ${a}`)}}async function Gt(t,n){if(n.length!==2)throw new e(`INVALID_ARGS`,`viewport requires exactly two arguments: <width> <height>`);let r=m(n[0],`width`),i=m(n[1],`height`);if(!t.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by this backend`);return await t.setViewport(r,i),{width:r,height:i,...g(`Viewport set: ${r}x${i}`)}}async function Kt(t,n){let r=(n[0]??``).toLowerCase();if(r!==`read`&&r!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);if(r===`read`){if(n.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:r,text:await t.readClipboard()}}if(n.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `);return await t.writeClipboard(i),{action:r,textLength:Array.from(i).length,...g(`Clipboard updated`)}}async function qt(t,n,r,i){if(t.target!==`tv`)throw new e(`UNSUPPORTED_OPERATION`,`tv-remote is supported only on TV targets`,{hint:`Select an Android TV, tvOS, or Vega OS target with --target tv.`});if(r.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button`);let a=oe(r[0]),o=i?.durationMs===void 0?void 0:h(i.durationMs,`durationMs`,0,1e4);return await n.tvRemote(a,o),{action:`tv-remote`,button:a,...o===void 0?{}:{durationMs:o},...g(`Pressed TV remote ${a}`)}}async function Q(t,n,r,i){let a=(n[0]??`status`).toLowerCase();if(!ue(a))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(n.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);if(t.platform===`android`)return await Yt(t,a);if(t.platform===`harmonyos`)return await Jt(t,a);if(c(t))return await Xt(t,a,r,i);throw new e(`UNSUPPORTED_OPERATION`,`keyboard is supported only on Android, HarmonyOS, and iOS`)}async function Jt(t,n){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is not available through the public HarmonyOS HDC API; use keyboard dismiss or enter`);let{pressHarmonyKeyboardKey:r}=await import(`./input-actions2.js`);return await r(t,n===`dismiss`?`Back`:`Enter`),{platform:`harmonyos`,action:n===`dismiss`?`dismiss`:`enter`,...g(n===`dismiss`?`Keyboard dismissed`:`Keyboard enter pressed`)}}async function Yt(e,t){if(t===`enter`||t===`return`){let{pressAndroidEnter:t}=await import(`./input-actions.js`).then(e=>e.s);return await t(e),{platform:`android`,action:`enter`,...g(`Keyboard enter pressed`)}}if(t===`dismiss`){let{dismissAndroidKeyboard:t}=await import(`./device-input-state.js`).then(e=>e.t),n=await t(e);return{platform:`android`,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import(`./device-input-state.js`).then(e=>e.t),r=await n(e);return{platform:`android`,action:`status`,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function Xt(t,n,r,i){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS`);if(n===`enter`||n===`return`){let{runAppleRunnerCommand:e}=await import(`./runner-client.js`).then(e=>e.r),n=await e(t,{command:`keyboardReturn`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...g(`Keyboard enter pressed`)}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.r),o=await a(t,{command:`keyboardDismiss`,appBundleId:r?.appBundleId},i),s=typeof o.keyboardDismissMechanism==`string`?o.keyboardDismissMechanism:void 0;return{platform:`ios`,action:`dismiss`,wasVisible:o.wasVisible,dismissed:o.dismissed,visible:o.visible,mechanism:s,...g(Zt(o.dismissed===!0,s))}}function Zt(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Qt(t,n,r,i){let[a,o,s,c]=r;if(!a||!o&&a!==`clear-app-state`)throw new e(`INVALID_ARGS`,`settings requires setting state`);if(a===`clear-app-state`)return await $t(t,n,o,s,i);if(!o)throw new e(`INVALID_ARGS`,`settings requires setting state`);return await en(t,n,a,o,s,c,r,i)}async function $t(t,n,r,i,a){let o=(r===`clear`?i:r)??a?.appBundleId;if(!o)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);b({level:`debug`,phase:`settings_apply`,data:{setting:`clear-app-state`,state:`clear`,appBundleId:o,platform:t.platform}});let s=await n.setSetting(`clear-app-state`,`clear`,o);return s&&typeof s==`object`?p({setting:`clear-app-state`,state:`clear`,...s},$(s)??`Cleared user data for ${o}`):{setting:`clear-app-state`,state:`clear`,...g(`Cleared user data for ${o}`)}}async function en(e,t,n,r,i,a,o,s){let c=n===`location`&&r===`set`,l=(n===`permission`||c?o[4]:o[2])??s?.appBundleId;b({level:`debug`,phase:`settings_apply`,data:nn(e,n,r,i,a,l,c)});let u=await t.setSetting(n,r,l,tn(n,i,a,c));return u&&typeof u==`object`?p({setting:n,state:r,...u},$(u)??`Updated setting: ${n}`):{setting:n,state:r,...g(`Updated setting: ${n}`)}}function tn(e,t,r,i){if(e===`permission`)return{permissionTarget:t,permissionMode:r};if(i)return{latitude:n(t,`latitude`),longitude:n(r,`longitude`)}}function nn(e,t,n,r,i,a,o){return o?{setting:t,state:n,latitude:r,longitude:i,platform:e.platform}:t===`permission`?{setting:t,state:n,permissionTarget:r,permissionMode:i,platform:e.platform}:{setting:t,state:n,appBundleId:a,platform:e.platform}}function $(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}export{R as a,P as c,Ve as d,A as f,L as i,Be as l,Ee as m,Bt as n,qe as o,Te as p,Vt as r,Je as s,Rt as t,He as u};
@@ -1 +0,0 @@
1
- import"./screenshot-result.js";function e(e,t,n,r,i,a){t&&e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}export{e as t};
@@ -1 +0,0 @@
1
- import{E as e,_ as t}from"./sdk-contracts.js";import{a as n,i as r,n as i}from"./sdk-android-adb.js";import{n as a,t as o}from"./version.js";import s from"node:path";import c from"node:crypto";import l from"node:os";import u from"node:fs/promises";function d(e){let t={status:[],results:[],currentStatus:null,currentResult:null};for(let n of e.split(/\r?\n/))f(n,t);return p(t),{status:t.status,results:t.results}}function f(e,t){if(e.startsWith(`INSTRUMENTATION_STATUS: `)){t.currentStatus??={},g(e.slice(24),t.currentStatus);return}if(e.startsWith(`INSTRUMENTATION_STATUS_CODE: `)){m(t);return}if(e.startsWith(`INSTRUMENTATION_RESULT: `)){t.currentResult??={},g(e.slice(24),t.currentResult);return}e.startsWith(`INSTRUMENTATION_CODE: `)&&h(t)}function p(e){m(e),h(e)}function m(e){e.currentStatus&&=(e.status.push(e.currentStatus),null)}function h(e){e.currentResult&&=(e.results.push(e.currentResult),null)}function g(e,t){let n=e.indexOf(`=`);n<0||(t[e.slice(0,n)]=e.slice(n+1))}function _(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function v(e){if(e===`true`)return!0;if(e===`false`)return!1}function y(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 b(e,n,r,i){if(e!==r)throw new t(`INVALID_ARGS`,`Android ${i} manifest ${n} must be "${r}".`);return r}function x(e,n,r){if(typeof e!=`string`||e.length===0)throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} is required.`);return e}function S(e,n){let r=x(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}const C=1e4;async function w(e){let{adb:t,adbProvider:n,packageName:a,versionCode:o,apkPath:s,sha256:c,cache:l,deviceKey:u,installTimeoutMs:d,helperLabel:f}=e,p=`${u}\0${a}\0${o}\0${c}`;if(l.has(p))return{packageName:a,versionCode:o,installedSha256:c,installed:!1,reason:`current`};await j(s,c,f);let m=await T({adb:t,adbProvider:n,packageName:a,versionCode:o,sha256:c});if(m.reason===`current`)return l.add(p),{packageName:a,versionCode:o,...m,installed:!1};let h=await r(s,{provider:n,replace:!0,allowTestPackages:!0,allowFailure:!0,timeoutMs:d});if(h.exitCode!==0)throw i(`Failed to install ${f}`,h,{packageName:a,versionCode:o,reason:m.reason});return l.add(p),{packageName:a,versionCode:o,...m,installed:!0}}async function T(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:a,signal:o}=e,s=await O(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 k(t,n,r,o);return{installedVersionCode:s,installedSha256:e,reason:e===a?`current`:`mismatched`}}catch{return o?.throwIfAborted(),{installedVersionCode:s,reason:`unverifiable`}}}async function E(n){let r=a(),i=s.join(o(),`android`,n.helperDirName,`dist`),c=s.join(i,n.manifestFileName(r));try{let e=n.parseManifest(JSON.parse(await u.readFile(c,`utf8`))),t=s.join(i,e.assetName);return await u.access(t),{apkPath:t,manifest:e}}catch(r){throw new t(`UNSUPPORTED_OPERATION`,n.unavailableMessage,{manifestPath:c,error:e(r).message},r)}}function D(e){return async t=>await w({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 O(e,t,n){let r=await e([`shell`,`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:5e3,signal:n});if(r.exitCode!==0)return;let i=RegExp(`package:${N(t)}(?:\\s|$).*versionCode:(\\d+)`).exec(`${r.stdout}\n${r.stderr}`);return i?Number(i[1]):void 0}async function k(e,r,a,o){let c=await e([`shell`,`pm`,`path`,a],{allowFailure:!0,timeoutMs:C,signal:o}),d=A(`${c.stdout}\n${c.stderr}`);if(c.exitCode!==0||!d)throw new t(`COMMAND_FAILED`,`Could not resolve installed Android helper APK`);let f=await u.mkdtemp(s.join(l.tmpdir(),`agent-device-helper-`)),p=s.join(f,`base.apk`);try{let e=await n(d,p,{provider:r,allowFailure:!0,timeoutMs:C,signal:o});if(e.exitCode!==0)throw i(`Could not read installed Android helper APK`,e,{packageName:a,remotePath:d});return await M(p)}finally{await u.rm(f,{recursive:!0,force:!0})}}function A(e){return e.split(/\r?\n/).map(e=>e.startsWith(`package:`)?e.slice(8).trim():``).find(e=>e.endsWith(`/base.apk`))}async function j(e,n,r){let i=await M(e);if(i!==n)throw new t(`COMMAND_FAILED`,`${r} APK checksum mismatch`,{apkPath:e,expectedSha256:n,actualSha256:i})}async function M(e){let t=c.createHash(`sha256`);return t.update(await u.readFile(e)),t.digest(`hex`)}function N(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}export{d as a,S as c,_ as d,j as i,x as l,D as n,y as o,E as r,b as s,T as t,v as u};
@@ -1,3 +0,0 @@
1
- import{S as e,_ as t}from"./sdk-android-adb.js";import{t as n}from"./timeouts.js";const r=1e3,i=process.platform===`win32`?`ps`:`/bin/ps`;function a(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function o(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,0),!0}catch(e){return e.code===`EPERM`}}function s(e){return d(e,`lstart=`)}function c(e){return d(e,`command=`)}function l(e){return d(e,`state=`)?.startsWith(`Z`)??!1}function u(t){let n=new Map,i=h(t);if(i.length===0)return n;try{let t=e(`ps`,[`-p`,i.join(`,`),`-o`,`pid=,state=,lstart=`],{allowFailure:!0,timeoutMs:r});if(t.exitCode!==0)return n;for(let e of t.stdout.split(`
2
- `)){let t=/^\s*(\d+)\s+(\S+)\s+(.+?)\s*$/.exec(e);if(!t)continue;let r=Number.parseInt(t[1],10);!Number.isInteger(r)||r<=0||n.set(r,{state:t[2],startTime:t[3]})}}catch{}return n}function d(t,n){if(!Number.isInteger(t)||t<=0)return null;try{let a=e(i,[`-p`,String(t),`-o`,n],{allowFailure:!0,timeoutMs:r});if(a.exitCode!==0)return null;let o=a.stdout.trim();return o.length>0?o:null}catch{return null}}function f(e){let t=[];for(let n of e.split(`
3
- `)){let e=/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10),i=Number.parseInt(e[2],10),a=e[3];!Number.isInteger(r)||r<=0||t.push({pid:r,ppid:Number.isInteger(i)&&i>0?i:void 0,command:a})}return t}async function p(e){let n=await(e.runCommand??t)(e.runCommand?`ps`:i,[`-ax`,`-o`,`pid=,ppid=,command=`],{allowFailure:!0,timeoutMs:e.timeoutMs});return n.exitCode===0?f(n.stdout):[]}function m(e,t){let n=new Set(h(e)),r=!0;for(;r;){r=!1;for(let e of t)e.ppid===void 0||!n.has(e.ppid)||n.has(e.pid)||(n.add(e.pid),r=!0)}return t.filter(e=>n.has(e.pid))}function h(e,t={}){return[...new Set(e)].filter(e=>Number.isInteger(e)&&e>0&&e!==t.excludePid)}function g(e,t){let n=h(e,{excludePid:process.pid}),r=0;for(let e of n)try{process.kill(e,t),r+=1}catch{}return r}async function _(e,t){if(!a(e))return!0;let r=Date.now();for(;Date.now()-r<t;)if(await n(50),!a(e))return!0;return!a(e)}async function v(e){let t=h(e.pids,{excludePid:process.pid});t.length!==0&&(g(t,`SIGTERM`),await Promise.all(t.map(async t=>await _(t,e.termTimeoutMs))),g(t.filter(e=>a(e)),`SIGKILL`),await Promise.all(t.map(async t=>await _(t,e.killTimeoutMs))))}export{p as a,s as c,_ as d,l as i,g as l,a as n,u as o,o as r,c as s,m as t,v as u};
@@ -1,2 +0,0 @@
1
- import{n as e}from"./rolldown-runtime.js";import{E as t,_ as n}from"./sdk-contracts.js";import{mt as r}from"./sdk-batch-runner.js";import{A as i,_ as a,n as o,o as s,s as c}from"./sdk-android-adb.js";import{c as l,l as u,n as d,o as f,r as p,s as m}from"./helper-package-install.js";import{t as h}from"./keyed-lock.js";import{i as g,r as _,t as v}from"./ime-recovery-marker.js";const y=`IME helper`,b=`android-ime-helper-v1`;async function x(e){return e.imeHelperArtifact??await S()}async function S(){return await p({helperDirName:`ime-helper`,manifestFileName:e=>`agent-device-android-ime-helper-${e}.manifest.json`,parseManifest:C,unavailableMessage:`Android test IME text entry requires the bundled Android IME helper artifact, but it was not found or could not be read`})}function C(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`Android IME helper manifest must be an object.`);let t=e;return{name:m(t.name,`name`,`android-ime-helper`,y),version:u(t.version,`version`,y),assetName:u(t.assetName,`assetName`,y),sha256:l(t.sha256,y),packageName:m(t.packageName,`packageName`,`com.callstack.agentdevice.imehelper`,y),versionCode:f(t.versionCode,`versionCode`,y),serviceComponent:m(t.serviceComponent,`serviceComponent`,`com.callstack.agentdevice.imehelper/.TestInputMethodService`,y),broadcastProtocol:m(t.broadcastProtocol,`broadcastProtocol`,b,y)}}const w=d({cache:new Set,installTimeoutMs:3e4,helperLabel:`Android IME helper`});function T(e){return`${e.platform}:${e.id}`}async function E(e,t,n){await O(e,t,`com.callstack.agentdevice.imehelper.ACTION_INPUT_TEXT_B64`,{text:Buffer.from(n,`utf8`).toString(`base64`)})}async function D(e,t){await O(e,t,`com.callstack.agentdevice.imehelper.ACTION_CLEAR_TEXT`,{})}async function O(e,t,n,r){let i=[`shell`,`am`,`broadcast`,`-p`,t,`-a`,n];i.push(`--es`,`protocol`,b);for(let[e,t]of Object.entries(r))i.push(`--es`,e,t);let a=await e(i,{allowFailure:!0,timeoutMs:1e4});if(a.exitCode!==0)throw o(`Android IME helper broadcast failed`,a,{action:n,packageName:t})}var k=e({ANDROID_TEST_IME_SETTINGS_KEYS:()=>Z,activateAndroidTestIme:()=>I,isAndroidTestImeActive:()=>F,listAndroidAdbSerialsQuick:()=>X,readAndroidDefaultInputMethod:()=>U,restoreAndroidTestIme:()=>R,restoreOrphanedAndroidTestImeOnDaemonStartup:()=>V});const A=`agent_device_ime_helper_previous_ime`,j=`secure`,M=`default_input_method`,N=new Set,P=new Map;function F(e){return N.has(T(e))}async function I(e,t){return await r(t.stateDir),await H(t.stateDir,e.id,async()=>await L(e,t))}async function L(e,n){let r=s(e),a=c(e),o=T(e),l;try{l=await x(a),await w({adb:r,adbProvider:a,artifact:l,deviceKey:o})}catch(e){return{outcome:`helper-unavailable`,reason:t(e).message}}let{manifest:u}=l,d=await U(r);if(d===u.serviceComponent){let t=await g(n.stateDir,e.id),i=await W(r);return t&&N.add(o),{outcome:`settled`,activated:!1,alreadyActive:!0,...t?{}:{persistFailed:!0},previousIme:i,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName}}let f=await W(r);if(!await G(r,d))return await q(r,f,e.id),i({level:`warn`,phase:`android_test_ime_persist_failed`,data:{device:e.id,previousIme:d}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName};let p=(await _(n.stateDir)).includes(e.id);if(!await g(n.stateDir,e.id))return await q(r,f,e.id),i({level:`warn`,phase:`android_test_ime_marker_persist_failed`,data:{device:e.id,previousIme:d}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName};await r([`shell`,`ime`,`enable`,u.serviceComponent],{allowFailure:!0,timeoutMs:1e4});let m=await r([`shell`,`ime`,`set`,u.serviceComponent],{allowFailure:!0,timeoutMs:1e4}),h=await U(r);return h===u.serviceComponent?(N.add(o),i({phase:`android_test_ime_activated`,data:{device:e.id,previousIme:d}}),{outcome:`settled`,activated:!0,alreadyActive:!1,previousIme:d,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName}):(N.delete(o),await q(r,f,e.id),p||await v(n.stateDir,e.id),i({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,activeIme:h,stderr:m.stderr.trim()}}),{outcome:`settled`,activated:!1,alreadyActive:!1,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName})}async function R(e,t){return await H(t.stateDir,e.id,async()=>{let n=T(e);if(!N.has(n))return{restored:!1,reason:`no-record`};N.delete(n);let r=await B(s(e),e);return z(r.reason)&&await v(t.stateDir,e.id),r})}function z(e){return e===`ok`||e===`helper-not-active`||e===`no-record`}async function B(e,t){let n=t.id;if(N.has(T(t)))return{restored:!1,reason:`owned-by-live-session`};let r=await W(e);if(!r)return{restored:!1,reason:`no-record`};let a=await U(e);if(a!==`com.callstack.agentdevice.imehelper/.TestInputMethodService`)return i({level:`debug`,phase:`android_test_ime_restore_skipped`,data:{device:n,currentIme:a,previousIme:r}}),{restored:!1,previousIme:r,reason:`helper-not-active`};await e([`shell`,`ime`,`set`,r],{allowFailure:!0,timeoutMs:1e4});let o=await U(e);return o===r?(await K(e).catch(()=>{}),i({phase:`android_test_ime_restored`,data:{device:n,previousIme:r}}),{restored:!0,previousIme:r,reason:`ok`}):(i({level:`warn`,phase:`android_test_ime_restore_failed`,data:{device:n,previousIme:r,afterIme:o}}),{restored:!1,previousIme:r,reason:`set-failed`})}async function V(e){let n=await _(e.stateDir);if(n.length===0)return;let r;try{r=new Set(await e.listSerials())}catch(e){i({level:`debug`,phase:`android_test_ime_startup_scan_failed`,data:{error:t(e).message}});return}for(let a of n){if(!r.has(a))continue;let n={platform:`android`,id:a,name:a,kind:a.startsWith(`emulator-`)?`emulator`:`device`,booted:!0};try{await H(e.stateDir,a,async()=>{let t=await B(s(n),n);t.restored&&i({level:`warn`,phase:`android_test_ime_orphan_restored`,data:{device:a,previousIme:t.previousIme}}),z(t.reason)&&await v(e.stateDir,a)})}catch(e){i({level:`debug`,phase:`android_test_ime_orphan_restore_failed`,data:{device:a,error:t(e).message}})}}}function H(e,t,n){return h(P,`${e}:${t}`,n)}async function U(e){let t=await e([`shell`,`settings`,`get`,j,M],{allowFailure:!0,timeoutMs:5e3});return Y(t.exitCode===0?t.stdout:``)}async function W(e){let t=await e([`shell`,`settings`,`get`,j,A],{allowFailure:!0,timeoutMs:5e3});return Y(t.exitCode===0?t.stdout:``)||void 0}async function G(e,t){return(await e([`shell`,`settings`,`put`,j,A,t],{allowFailure:!0,timeoutMs:5e3})).exitCode===0?await W(e)===t:!1}async function K(e){await e([`shell`,`settings`,`delete`,j,A],{allowFailure:!0,timeoutMs:5e3})}async function q(e,n,r){try{(n?await G(e,n):await J(e))||i({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0}})}catch(e){i({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0,error:t(e).message}})}}async function J(e){return await K(e),await W(e)===void 0}function Y(e){let t=e.trim();return!t||t===`null`?``:t}async function X(){try{return(await a(`adb`,[`devices`],{timeoutMs:5e3})).stdout.split(`
2
- `).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 Z={previousIme:A,defaultInputMethod:M};export{D as a,E as c,U as i,k as n,S as o,F as r,x as s,Z as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./rolldown-runtime.js";import{E as t}from"./sdk-contracts.js";import{A as n}from"./sdk-android-adb.js";import r from"node:path";import{randomUUID as i}from"node:crypto";import a from"node:fs/promises";var o=e({clearAndroidTestImeRecoveryMarker:()=>d,readAndroidTestImeRecoveryMarkers:()=>f,writeAndroidTestImeRecoveryMarker:()=>l});function s(e){return r.join(e,`android-test-ime-pending`)}function c(e,t){return r.join(s(e),encodeURIComponent(t))}async function l(e,o){let l,d,f,m=!1;try{let t=s(e);if(f=c(e,o),await a.mkdir(t,{recursive:!0}),(await p(f))?.serial===o)return!0;l=r.join(t,`.${encodeURIComponent(o)}.${i()}.tmp`);let n={version:1,serial:o};if(d=await a.open(l,`wx`,384),await d.writeFile(`${JSON.stringify(n)}\n`,`utf8`),await d.sync(),await d.close(),d=void 0,await a.rename(l,f),l=void 0,m=!0,await u(t),(await p(f))?.serial!==o)throw Error(`Android test IME marker read-back did not match the requested device.`);return!0}catch(r){return d&&await d.close().catch(()=>{}),l&&await a.rm(l,{force:!0}).catch(()=>{}),m&&f&&await a.rm(f,{force:!0}).catch(()=>{}),n({level:`debug`,phase:`android_test_ime_marker_write_failed`,data:{stateDir:e,serial:o,error:t(r).message}}),!1}}async function u(e){let t;try{t=await a.open(e,`r`),await t.sync()}catch{}finally{t&&await t.close().catch(()=>{})}}async function d(e,t){await a.rm(c(e,t),{force:!0}).catch(()=>{})}async function f(e){let t;try{t=await a.readdir(s(e))}catch{return[]}let n=[];for(let i of t)try{let t=r.join(s(e),i),a=await p(t);a&&c(e,a.serial)===t&&n.push(a.serial)}catch{}return[...new Set(n)].sort()}async function p(e){try{return m(await a.readFile(e,`utf8`))}catch{return}}function m(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}}export{l as i,o as n,f as r,d as t};