agent-device 0.21.0 → 0.21.2

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 (328) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.0.apk → agent-device-android-ime-helper-0.21.2.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.2.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.0.manifest.json → agent-device-android-ime-helper-0.21.2.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.2.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.2.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.0.manifest.json → agent-device-android-snapshot-helper-0.21.2.manifest.json} +6 -6
  7. package/apple/snapshot-bridge/README.md +58 -1
  8. package/apple/snapshot-bridge/SnapshotBridge.m +6 -0
  9. package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
  10. package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
  11. package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +1 -0
  12. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +32 -3
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerScrollViewportPolicy.swift +413 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +668 -82
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +48 -4
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1078 -211
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +290 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +250 -74
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -13
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +55 -43
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +144 -7
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +13 -1
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +216 -17
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +289 -42
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +92 -22
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +617 -122
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +79 -4
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +71 -71
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +92 -6
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +67 -67
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +4 -4
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +17 -17
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +30 -30
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +31 -31
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +19 -19
  49. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +55 -17
  50. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +26 -5
  51. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +126 -75
  52. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +8 -12
  53. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +9 -9
  54. package/dist/src/absence-observation-errors.js +1 -0
  55. package/dist/src/adapter.js +1 -1
  56. package/dist/src/adb-executor.js +1 -1
  57. package/dist/src/adb-failure.js +1 -1
  58. package/dist/src/agent-browser-lifecycle.js +1 -1
  59. package/dist/src/agent-browser-process-record.js +1 -1
  60. package/dist/src/agent-browser-provider.js +1 -1
  61. package/dist/src/agent-browser-tool.js +1 -1
  62. package/dist/src/agent-device-client.js +2 -2
  63. package/dist/src/ai-sdk.d.ts +1 -1
  64. package/dist/src/ai-sdk.js +1 -1
  65. package/dist/src/alert-runtime.js +1 -1
  66. package/dist/src/android-input-ownership.js +1 -1
  67. package/dist/src/app-catalog.js +1 -1
  68. package/dist/src/app-deployment-resolution.js +1 -1
  69. package/dist/src/app-helpers.js +1 -1
  70. package/dist/src/app-inventory-contract.js +1 -1
  71. package/dist/src/app-inventory.js +1 -1
  72. package/dist/src/app-launch.js +2 -2
  73. package/dist/src/app-lifecycle.js +3 -3
  74. package/dist/src/app-lifecycle2.js +1 -1
  75. package/dist/src/app-log-files.js +1 -1
  76. package/dist/src/app-log-runtime2.js +3 -3
  77. package/dist/src/app-resolution.js +1 -1
  78. package/dist/src/apple-runner-platform.js +1 -0
  79. package/dist/src/application-lifecycle-interaction.js +1 -1
  80. package/dist/src/archive.js +1 -1
  81. package/dist/src/artifact-download.js +1 -1
  82. package/dist/src/auth-session.js +1 -1
  83. package/dist/src/auth.js +1 -1
  84. package/dist/src/back-mode.js +1 -1
  85. package/dist/src/backend-snapshot-options.js +1 -1
  86. package/dist/src/boot-diagnostics.js +1 -1
  87. package/dist/src/browser-launch.js +1 -0
  88. package/dist/src/capture.js +1 -1
  89. package/dist/src/catalog.js +1 -1
  90. package/dist/src/cli-config.js +1 -1
  91. package/dist/src/cli-help.js +30 -26
  92. package/dist/src/cli.js +4 -4
  93. package/dist/src/click-button.js +1 -1
  94. package/dist/src/client-metro-companion.js +1 -1
  95. package/dist/src/client-metro.js +1 -1
  96. package/dist/src/client-types.d.ts +28 -13
  97. package/dist/src/code-signature-cache.js +1 -1
  98. package/dist/src/code-signature.js +1 -1
  99. package/dist/src/command-metadata.js +1 -1
  100. package/dist/src/command-schema.js +3 -3
  101. package/dist/src/command-tools.js +2 -2
  102. package/dist/src/command.js +1 -1
  103. package/dist/src/config.js +1 -1
  104. package/dist/src/connection-runtime.js +1 -1
  105. package/dist/src/connection.js +3 -3
  106. package/dist/src/contracts.d.ts +1 -1
  107. package/dist/src/contracts.js +1 -1
  108. package/dist/src/daemon-client-lifecycle.js +1 -1
  109. package/dist/src/daemon-process.js +1 -1
  110. package/dist/src/daemon-shutdown-report.js +1 -1
  111. package/dist/src/daemon.js +1 -1
  112. package/dist/src/debug-symbols-facade.js +1 -1
  113. package/dist/src/device-boot.js +1 -0
  114. package/dist/src/device-claim-inspection.js +1 -1
  115. package/dist/src/device-claim-rule.js +1 -1
  116. package/dist/src/device-input-state.d.ts +1 -1
  117. package/dist/src/device-inventory-context.js +1 -1
  118. package/dist/src/device-rotation.js +1 -1
  119. package/dist/src/device-selection-resolver.js +1 -1
  120. package/dist/src/device-session.js +1 -1
  121. package/dist/src/device2.js +1 -1
  122. package/dist/src/diagnostics.js +1 -1
  123. package/dist/src/dispatch-resolve.js +1 -1
  124. package/dist/src/doctor2.js +1 -1
  125. package/dist/src/durable-resource.js +1 -1
  126. package/dist/src/engine-eval-script.js +1 -0
  127. package/dist/src/error.js +1 -1
  128. package/dist/src/exec.js +1 -1
  129. package/dist/src/file.js +1 -1
  130. package/dist/src/find.js +1 -1
  131. package/dist/src/finders.js +1 -1
  132. package/dist/src/format.js +1 -2
  133. package/dist/src/generic-settle.js +1 -1
  134. package/dist/src/gesture-plan.js +1 -1
  135. package/dist/src/gesture-runtime.js +1 -1
  136. package/dist/src/harmonyos.js +1 -1
  137. package/dist/src/hdc.js +1 -1
  138. package/dist/src/helper.js +2 -2
  139. package/dist/src/human-control-contract.js +1 -1
  140. package/dist/src/human-control.js +1 -1
  141. package/dist/src/index.d.ts +1 -1
  142. package/dist/src/index.js +1 -1
  143. package/dist/src/input-actions.js +1 -1
  144. package/dist/src/input-actions2.js +2 -2
  145. package/dist/src/install-artifact-facade.js +1 -1
  146. package/dist/src/install-source-network-transport.js +1 -1
  147. package/dist/src/install-source2.js +1 -1
  148. package/dist/src/interaction-positionals.js +1 -1
  149. package/dist/src/interaction-ref-policy.js +1 -1
  150. package/dist/src/interaction.js +1 -1
  151. package/dist/src/interaction2.js +1 -1
  152. package/dist/src/interactor.js +5 -5
  153. package/dist/src/interactor2.js +1 -1
  154. package/dist/src/interactors.js +1 -1
  155. package/dist/src/internal/bin.js +1 -1
  156. package/dist/src/internal/daemon.js +2 -2
  157. package/dist/src/internal/png-worker.d.ts +3 -0
  158. package/dist/src/internal/png-worker.js +1 -1
  159. package/dist/src/internal/run-script-http-child.js +1 -1
  160. package/dist/src/inventory.js +2 -2
  161. package/dist/src/inventory2.js +1 -1
  162. package/dist/src/inventory3.js +1 -1
  163. package/dist/src/inventory5.js +1 -1
  164. package/dist/src/ios-snapshot-acquisition.js +1 -1
  165. package/dist/src/ios-snapshot-planning.js +1 -1
  166. package/dist/src/ios-snapshot-runtime.js +1 -1
  167. package/dist/src/ios-system-surface.js +1 -0
  168. package/dist/src/lease-scope.js +1 -1
  169. package/dist/src/lease.js +1 -1
  170. package/dist/src/limrun-runtime-dependencies.js +1 -1
  171. package/dist/src/limrun.d.ts +1 -1
  172. package/dist/src/linux.js +1 -1
  173. package/dist/src/local-interactor-operation-set.js +1 -1
  174. package/dist/src/location-coordinates.js +1 -1
  175. package/dist/src/managed-device-scope.js +1 -1
  176. package/dist/src/mechanics.js +16 -16
  177. package/dist/src/mobile-snapshot-semantics.js +1 -1
  178. package/dist/src/mp4-atoms.js +1 -0
  179. package/dist/src/multitouch-support.js +1 -1
  180. package/dist/src/observation.js +1 -1
  181. package/dist/src/open-target-resolution.js +1 -0
  182. package/dist/src/owner-identity.js +3 -3
  183. package/dist/src/parameterized-recorded-fill.js +1 -1
  184. package/dist/src/perf-facade.js +2 -2
  185. package/dist/src/perf-process-identity.js +1 -0
  186. package/dist/src/perf-runtime-operation-builder.js +1 -1
  187. package/dist/src/perf-runtime-plan.js +1 -1
  188. package/dist/src/perf.js +1 -1
  189. package/dist/src/physical-device-control.js +1 -1
  190. package/dist/src/platform-request-scope.js +1 -1
  191. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  192. package/dist/src/platform-runtime-app-log-process.js +1 -1
  193. package/dist/src/platform-runtime-host.js +1 -1
  194. package/dist/src/platform-runtime-managed-owner.js +1 -1
  195. package/dist/src/platform-runtime-open-target.js +1 -1
  196. package/dist/src/platform-runtime-operation-host.js +2 -2
  197. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  198. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  199. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  200. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  201. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  202. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  203. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  204. package/dist/src/platform-runtime-unavailable.js +1 -1
  205. package/dist/src/platform-runtime.js +1 -1
  206. package/dist/src/platform-runtime2.js +1 -1
  207. package/dist/src/png-crop-bytes.js +1 -0
  208. package/dist/src/png-worker-contract.js +1 -1
  209. package/dist/src/png.js +1 -0
  210. package/dist/src/prepare-kind.js +1 -1
  211. package/dist/src/process.js +1 -1
  212. package/dist/src/provider-device-runtime.js +1 -1
  213. package/dist/src/provider-session-ownership.js +1 -1
  214. package/dist/src/provider-webdriver.js +1 -1
  215. package/dist/src/proxy.js +1 -1
  216. package/dist/src/quality-warnings.js +1 -0
  217. package/dist/src/react-native.js +1 -1
  218. package/dist/src/record-runtime.js +1 -1
  219. package/dist/src/rect-center.js +1 -1
  220. package/dist/src/register-builtins.js +1 -1
  221. package/dist/src/registry.js +36 -36
  222. package/dist/src/remote-config2.js +1 -1
  223. package/dist/src/replay-divergence.js +1 -1
  224. package/dist/src/replay.js +2 -2
  225. package/dist/src/reporting.js +9 -8
  226. package/dist/src/request-admission.js +1 -1
  227. package/dist/src/request-cancel.js +1 -1
  228. package/dist/src/request-cancellation.js +1 -1
  229. package/dist/src/request-runtime-binding.js +1 -1
  230. package/dist/src/retry.js +1 -1
  231. package/dist/src/runner-cache-metadata.js +2 -2
  232. package/dist/src/runner-client.js +1 -1
  233. package/dist/src/runner-disposal.js +1 -1
  234. package/dist/src/runner-operations-facade.js +1 -1
  235. package/dist/src/runner-presentation.js +1 -1
  236. package/dist/src/runner.js +1 -1
  237. package/dist/src/runtime-transport-hints.js +1 -1
  238. package/dist/src/runtime.js +3 -3
  239. package/dist/src/runtime10.js +1 -0
  240. package/dist/src/runtime2.js +4 -4
  241. package/dist/src/runtime3.js +1 -1
  242. package/dist/src/runtime4.js +5 -4
  243. package/dist/src/runtime5.js +1 -1
  244. package/dist/src/runtime6.js +1 -1
  245. package/dist/src/runtime7.js +1 -1
  246. package/dist/src/runtime8.js +1 -1
  247. package/dist/src/runtime9.js +1 -1
  248. package/dist/src/screen-recording-live-handle.js +1 -1
  249. package/dist/src/screen-recording-options.js +1 -1
  250. package/dist/src/screen-recording-resource-recovery.js +1 -1
  251. package/dist/src/screenshot-density.js +1 -1
  252. package/dist/src/screenshot-runtime.js +1 -1
  253. package/dist/src/screenshot.js +1 -1
  254. package/dist/src/screenshot3.js +3 -3
  255. package/dist/src/script.js +1 -1
  256. package/dist/src/scroll-command.js +1 -1
  257. package/dist/src/scroll-gesture.js +1 -1
  258. package/dist/src/sdk-batch-runner.js +2 -2
  259. package/dist/src/sdk-batch.js +2 -2
  260. package/dist/src/sdk-contracts.d.ts +69 -26
  261. package/dist/src/sdk-contracts.js +2 -2
  262. package/dist/src/sdk-device.js +1 -1
  263. package/dist/src/sdk-finders.d.ts +1 -1
  264. package/dist/src/sdk-finders.js +1 -1
  265. package/dist/src/sdk-io.js +1 -1
  266. package/dist/src/sdk-remote-config.d.ts +1 -1
  267. package/dist/src/sdk-remote-config.js +1 -1
  268. package/dist/src/sdk-selectors.d.ts +80 -16
  269. package/dist/src/sdk-selectors.js +1 -1
  270. package/dist/src/selection.js +0 -0
  271. package/dist/src/selector-runtime.js +1 -1
  272. package/dist/src/selectors.js +1 -1
  273. package/dist/src/semantic-index.js +1 -1
  274. package/dist/src/server.js +3 -3
  275. package/dist/src/session-allocation.js +1 -1
  276. package/dist/src/session-observation.js +1 -0
  277. package/dist/src/session-routing.js +1 -1
  278. package/dist/src/session-runtime-admission.js +1 -1
  279. package/dist/src/session-snapshot.js +1 -1
  280. package/dist/src/session-store.js +3 -3
  281. package/dist/src/session-target-evidence.js +1 -1
  282. package/dist/src/session2.js +5 -5
  283. package/dist/src/settings.js +1 -1
  284. package/dist/src/simulator-boot.js +3 -0
  285. package/dist/src/simulator.js +1 -1
  286. package/dist/src/snapshot-quality-backend-capabilities.js +1 -1
  287. package/dist/src/snapshot-runtime-binding.js +1 -1
  288. package/dist/src/snapshot-runtime.js +1 -1
  289. package/dist/src/snapshot-state.js +1 -1
  290. package/dist/src/snapshot2.js +1 -1
  291. package/dist/src/snapshot3.js +1 -1
  292. package/dist/src/snapshot4.js +1 -1
  293. package/dist/src/src.js +1 -1
  294. package/dist/src/src7.js +2 -2
  295. package/dist/src/src8.js +2 -2
  296. package/dist/src/string-enum.js +1 -1
  297. package/dist/src/takeover.js +1 -1
  298. package/dist/src/telemetry.js +1 -1
  299. package/dist/src/tool-provider.js +2 -2
  300. package/dist/src/tool-provider2.js +1 -1
  301. package/dist/src/tool-provider3.js +1 -1
  302. package/dist/src/toolchain-probe.js +1 -1
  303. package/dist/src/touch-reference-frame.js +1 -0
  304. package/dist/src/touch-runtime.js +1 -1
  305. package/dist/src/transport.js +1 -1
  306. package/dist/src/tree.js +1 -1
  307. package/dist/src/tv-remote.js +1 -1
  308. package/dist/src/type-text-runtime.js +1 -1
  309. package/dist/src/update-check.js +1 -1
  310. package/dist/src/vars.js +2 -0
  311. package/dist/src/verified-file.js +1 -1
  312. package/dist/src/version.js +1 -1
  313. package/dist/src/video.js +2 -2
  314. package/dist/src/viewport.js +1 -0
  315. package/dist/src/web.js +1 -1
  316. package/dist/src/web2.js +1 -1
  317. package/dist/src/webdriver-ios-snapshot.js +1 -1
  318. package/dist/src/webdriver-source.js +1 -1
  319. package/dist/src/window-state.js +1 -0
  320. package/package.json +4 -2
  321. package/server.json +2 -2
  322. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.0.apk.sha256 +0 -1
  323. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk +0 -0
  324. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk.sha256 +0 -1
  325. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -93
  326. package/dist/src/platform-runtime-apple-resources.js +0 -1
  327. package/dist/src/runner-selector-query.js +0 -1
  328. package/dist/src/snapshot-quality-verdict.js +0 -1
@@ -11,7 +11,10 @@ private struct RunnerUnsupportedOperationError: LocalizedError {
11
11
  var errorDescription: String? { message }
12
12
  }
13
13
 
14
- private enum RunnerInterfaceOrientation {
14
+ enum RunnerInterfaceOrientation {
15
+
16
+
17
+
15
18
  static let portrait = 1
16
19
  static let portraitUpsideDown = 2
17
20
  static let landscapeRight = 3
@@ -191,11 +194,11 @@ extension RunnerTests {
191
194
  }
192
195
  }
193
196
 
194
- // Maestro-compat gate for the non-hittable coordinate fallback: an element
195
- // with no frame at all cannot be coordinate-tapped, otherwise the decision
196
- // is the shared TapPointPolicy center-in-frame rule (golden parity table
197
- // with the TS twin). app.frame is the frame source here — replay taps
198
- // resolved bounds Maestro-style, so the union frame is intentional.
197
+
198
+
199
+
200
+
201
+
199
202
  private func hasTappableFrame(app: XCUIApplication, element: XCUIElement) -> Bool {
200
203
  let frame = element.frame
201
204
  if frame.isEmpty {
@@ -204,10 +207,10 @@ extension RunnerTests {
204
207
  return TapPointPolicy.isAllowed(elementFrame: frame, windowFrame: app.frame)
205
208
  }
206
209
 
207
- // The tappable on-screen viewport. app.frame is unsuitable: it unions
208
- // transformed subtrees, so a closed drawer at negative x inflates it and
209
- // out-of-window coordinates still pass containment. Falls back to app.frame
210
- // when no window frame is readable.
210
+
211
+
212
+
213
+
211
214
  func onScreenWindowFrame(app: XCUIApplication) -> CGRect {
212
215
  let window = app.windows.element(boundBy: 0)
213
216
  if window.exists {
@@ -220,11 +223,11 @@ extension RunnerTests {
220
223
  }
221
224
 
222
225
  func queryElement(app: XCUIApplication, selectorKey: String, selectorValue: String) -> Response {
223
- // querySelector is a read — it backs get/is/wait and the offscreen-refusal
224
- // double-check, none of which mutate. The fail-closed raw-match rule exists
225
- // to stop a mutation acting on an unseen duplicate; applying it here would
226
- // instead turn a decorative non-hittable duplicate into an AMBIGUOUS_MATCH
227
- // for readers that previously resolved the hittable element.
226
+
227
+
228
+
229
+
230
+
228
231
  let match = findElement(
229
232
  app: app,
230
233
  selectorKey: selectorKey,
@@ -270,8 +273,8 @@ extension RunnerTests {
270
273
  )
271
274
  }
272
275
 
273
- /// Shared ordering for point-hit candidates: smallest area wins, then top-to-bottom,
274
- /// left-to-right, then stable element-type order for ties.
276
+
277
+
275
278
  func smallestElementFirst(_ left: XCUIElement, _ right: XCUIElement) -> Bool {
276
279
  let leftArea = max(1, left.frame.width * left.frame.height)
277
280
  let rightArea = max(1, right.frame.width * right.frame.height)
@@ -315,37 +318,6 @@ extension RunnerTests {
315
318
  return nil
316
319
  }
317
320
 
318
- func textInputAt(app: XCUIApplication, x: Double, y: Double) -> XCUIElement? {
319
- return textInputCandidatesAt(app: app, point: CGPoint(x: x, y: y)).first
320
- }
321
-
322
- private func textInputCandidatesAt(app: XCUIApplication, point: CGPoint) -> [XCUIElement] {
323
- safely("TEXT_INPUT_AT_POINT", []) {
324
- // Query the text-input element types directly instead of enumerating the entire tree
325
- // (app.descendants(.any).allElementsBoundByIndex snapshots every element and is ~10x
326
- // slower — it dominated fill latency because resolveTextEntryElement re-runs this on
327
- // each verify/repair poll once the focused field reference goes stale).
328
- // Prefer the smallest matching field so nested editable controls win over large containers.
329
- [
330
- app.textFields,
331
- app.secureTextFields,
332
- app.searchFields,
333
- app.textViews,
334
- ]
335
- .flatMap { $0.allElementsBoundByIndex }
336
- .filter { element in
337
- guard element.exists else { return false }
338
- let frame = element.frame
339
- return isCoordinateTextInputCandidate(
340
- enabled: element.isEnabled,
341
- frame: frame,
342
- point: point
343
- )
344
- }
345
- .sorted(by: smallestElementFirst)
346
- }
347
- }
348
-
349
321
  private func readableText(for element: XCUIElement) -> String? {
350
322
  let label = element.label.trimmingCharacters(in: .whitespacesAndNewlines)
351
323
  let identifier = element.identifier.trimmingCharacters(in: .whitespacesAndNewlines)
@@ -417,8 +389,8 @@ extension RunnerTests {
417
389
  let coordinate = interactionCoordinate(app: app, x: x, y: y)
418
390
  let interval = desktopScrollEventIntervalSeconds(durationMs: durationMs, eventCount: events.count)
419
391
  for (index, deltas) in events.enumerated() {
420
- // Keep desktop scrolling on XCTest's coordinate API so macOS owns wheel synthesis, natural
421
- // scrolling preference handling, and cursor placement instead of posting raw CGEvents.
392
+
393
+
422
394
  coordinate.scroll(
423
395
  byDeltaX: CGFloat(deltas.horizontal),
424
396
  deltaY: CGFloat(deltas.vertical)
@@ -513,7 +485,7 @@ extension RunnerTests {
513
485
  y2: Double,
514
486
  holdDuration: TimeInterval
515
487
  ) -> RunnerInteractionOutcome {
516
- // tvOS has no coordinate drag. Preserve the direction as a focus move.
488
+
517
489
  let dx = x2 - x
518
490
  let dy = y2 - y
519
491
  let button: TvRemoteButton = abs(dx) > abs(dy)
@@ -525,9 +497,9 @@ extension RunnerTests {
525
497
  return performCoordinateDrag(app: app, x: x, y: y, x2: x2, y2: y2, holdDuration: holdDuration)
526
498
  }
527
499
 
528
- /// Rotates an interface-oriented point into the device-native (portrait) space the
529
- /// synthesized event path consumes — synthesized events skip XCTest's orientation
530
- /// handling, so without this a landscape tap lands in the wrong place.
500
+
501
+
502
+
531
503
  func nativeSynthesizedPoint(
532
504
  orientedX x: Double,
533
505
  orientedY y: Double,
@@ -545,13 +517,13 @@ extension RunnerTests {
545
517
  return CGPoint(x: localY, y: width - localX)
546
518
  case RunnerInterfaceOrientation.portraitUpsideDown:
547
519
  return CGPoint(x: width - localX, y: height - localY)
548
- default: // portrait or unknown
520
+ default:
549
521
  return CGPoint(x: localX, y: localY)
550
522
  }
551
523
  }
552
524
 
553
- /// Rotates an interface-oriented translation vector into the same native
554
- /// coordinate space as `nativeSynthesizedPoint`.
525
+
526
+
555
527
  func nativeSynthesizedVector(
556
528
  orientedDx dx: Double,
557
529
  orientedDy dy: Double,
@@ -564,7 +536,7 @@ extension RunnerTests {
564
536
  return CGVector(dx: dy, dy: -dx)
565
537
  case RunnerInterfaceOrientation.portraitUpsideDown:
566
538
  return CGVector(dx: -dx, dy: -dy)
567
- default: // portrait or unknown
539
+ default:
568
540
  return CGVector(dx: dx, dy: dy)
569
541
  }
570
542
  }
@@ -910,8 +882,8 @@ extension RunnerTests {
910
882
  screenshotSize: CGSize,
911
883
  interfaceOrientation: Int
912
884
  ) -> CGRect? {
913
- // Physical iOS screenshots can retain portrait dimensions after the interface rotates,
914
- // while accessibility frames remain in the logical landscape coordinate space.
885
+
886
+
915
887
  guard screenshotSize.width.isFinite, screenshotSize.height.isFinite,
916
888
  screenshotSize.width > 0,
917
889
  screenshotSize.height > 0
@@ -937,18 +909,6 @@ extension RunnerTests {
937
909
  return CGRect(x: 0, y: 0, width: width, height: height)
938
910
  }
939
911
 
940
- func synthesizedFrameAvoidingKeyboardWhenAllowed(
941
- app: XCUIApplication,
942
- context: SynthesizedCoordinateContext
943
- ) -> CGRect {
944
- #if os(iOS)
945
- guard context.allowsKeyboardProbe else { return context.referenceFrame }
946
- return frameAvoidingKeyboard(app: app, frame: context.referenceFrame)
947
- #else
948
- return context.referenceFrame
949
- #endif
950
- }
951
-
952
912
  func keyboardAvoidingSynthesizedDragPoints(
953
913
  app: XCUIApplication,
954
914
  x: Double,
@@ -1085,8 +1045,8 @@ extension RunnerTests {
1085
1045
  ) -> RunnerInteractionOutcome {
1086
1046
  #if os(iOS)
1087
1047
  let orientation = Int(RunnerSynthesizedGesture.interfaceOrientation(forApplication: app))
1088
- // The portable planner and validation use this exact viewport. Using app.frame here can
1089
- // diverge when XCTest unions transformed/off-screen descendants into the application frame.
1048
+
1049
+
1090
1050
  let frame = CGRect(
1091
1051
  x: plan.viewport.x,
1092
1052
  y: plan.viewport.y,
@@ -1217,4 +1177,220 @@ extension RunnerTests {
1217
1177
  }
1218
1178
  #endif
1219
1179
 
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+
1186
+
1187
+
1188
+
1189
+
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+
1217
+
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+
1227
+
1228
+
1229
+
1230
+
1231
+
1232
+
1233
+
1234
+
1235
+
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+
1242
+
1243
+
1244
+
1245
+
1246
+
1247
+
1248
+
1249
+
1250
+
1251
+
1252
+
1253
+
1254
+
1255
+
1256
+
1257
+
1258
+
1259
+
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+
1286
+
1287
+
1288
+
1289
+
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+
1298
+
1299
+
1300
+
1301
+
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+
1310
+
1311
+
1312
+
1313
+
1314
+
1315
+
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+
1345
+
1346
+
1347
+
1348
+
1349
+
1350
+
1351
+
1352
+
1353
+
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+
1361
+
1362
+
1363
+
1364
+
1365
+
1366
+
1367
+
1368
+
1369
+
1370
+
1371
+
1372
+
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+
1380
+
1381
+
1382
+
1383
+
1384
+
1385
+
1386
+
1387
+
1388
+
1389
+
1390
+
1391
+
1392
+
1393
+
1394
+
1395
+
1220
1396
  }
@@ -2,30 +2,30 @@ import XCTest
2
2
 
3
3
  private enum KeyboardDismissObservationTiming {
4
4
  static let timeout: TimeInterval = 2
5
- // #1542: dismissing the keyboard can trigger the host app's own content-offset
6
- // adjustment (e.g. a ScrollView correcting the inset it grew to keep a focused
7
- // field above the keyboard). That adjustment is a separate, unsynchronized
8
- // animation the keyboard's own `waitForNonExistence` above knows nothing about:
9
- // the keyboard AX element can vanish well before the app settles. The very next
10
- // command is frequently a synthesized, AX-free drag (scroll/gesture — kept
11
- // AX-free so it still works under #1105-family AX degradation), which has no
12
- // XCTest quiescence wait of its own, so it can land mid-animation and net to
13
- // zero. These bounds cap the settle wait this trades in.
14
- // A spring-driven content-offset correction can pass through a near-zero-
15
- // velocity inflection (the top of an overshoot) that two adjacent samples
16
- // alone cannot distinguish from true rest. Requiring 3 consecutive matching
17
- // samples demands ~2 full sample intervals of actual stillness before
18
- // stopping early, so a momentary pause mid-animation cannot look settled.
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
19
  static let settleTimeout: TimeInterval = 2.0
20
20
  static let settleSampleInterval: TimeInterval = 0.15
21
21
  static let settleRequiredConsecutiveMatches: Int = 3
22
22
  }
23
23
 
24
- // The mechanism that actually resigned the keyboard, disclosed to the caller
25
- // (#1598) so a response never claims "dismissed" without saying how — a
26
- // safe-area tap has a very different reliability/side-effect profile than
27
- // tapping the keyboard's own Done key, and callers need to know which one
28
- // fired.
24
+
25
+
26
+
27
+
28
+
29
29
  enum RunnerKeyboardDismissMechanism: String {
30
30
  case dismissKey
31
31
  }
@@ -61,25 +61,25 @@ extension RunnerTests {
61
61
  return (wasVisible: true, dismissed: !visible, visible: visible, mechanism: visible ? nil : .dismissKey)
62
62
  }
63
63
 
64
- // #1606 review P1 (twice): generic background-tap dismissal is
65
- // deliberately UNSUPPORTED. No geometry or role query can prove a
66
- // coordinate is side-effect-free — a full-screen unlabeled Pressable is
67
- // indistinguishable from an inert backdrop, so a "safe-area" tap can
68
- // navigate or submit while reporting a successful dismiss. The dismiss
69
- // key is the only mechanism the runner can vouch for.
64
+
65
+
66
+
67
+
68
+
69
+
70
70
  return (wasVisible: true, dismissed: false, visible: isKeyboardVisible(app: app), mechanism: nil)
71
71
  #endif
72
72
  }
73
73
 
74
74
 
75
- // AX-free on purpose (screenshot bytes, not the accessibility tree) so it holds
76
- // under the same AX degradation the synthesized gesture lane is built to survive.
77
- // Bounded and self-terminating: returns as soon as `requiredConsecutiveMatches`
78
- // consecutive samples match, so an already-settled screen (the common case)
79
- // pays close to nothing. The stopping decision itself
80
- // (`runnerScreenshotStabilitySettled`) is a pure function of the samples taken
81
- // so far, so it is unit-testable without a real screenshot pipeline; this loop
82
- // is the thin, untestable I/O shell around it.
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
83
  private func waitForScreenshotStability(
84
84
  timeout: TimeInterval,
85
85
  sampleInterval: TimeInterval,
@@ -252,15 +252,15 @@ extension RunnerTests {
252
252
  }
253
253
  }
254
254
 
255
- /// True once the `requiredConsecutiveMatches` most recent samples are all present
256
- /// and byte-identical — i.e. the screen held still across that whole run of
257
- /// polls, not just the last two. A spring-driven content-offset correction can
258
- /// pass through a near-zero-velocity inflection that two adjacent samples alone
259
- /// cannot distinguish from true rest; requiring a longer run of matches demands
260
- /// real elapsed stillness before stopping early. `nil` entries (a screenshot
261
- /// capture that failed) never count toward a match, so a flaky capture cannot
262
- /// look like stability; the caller's bounded loop still terminates on its
263
- /// deadline regardless.
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
264
  func runnerScreenshotStabilitySettled(
265
265
  _ samples: [Data?],
266
266
  requiredConsecutiveMatches: Int
@@ -273,3 +273,62 @@ func runnerScreenshotStabilitySettled(
273
273
  return window.allSatisfy { $0 == firstData }
274
274
  }
275
275
 
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
@@ -22,7 +22,7 @@ func runnerCGImage(from image: RunnerImage) -> CGImage? {
22
22
  }
23
23
 
24
24
  extension RunnerTests {
25
- // MARK: - Recording
25
+
26
26
 
27
27
  func captureRunnerFrame() -> RunnerImage? {
28
28
  var image: RunnerImage?
@@ -70,7 +70,7 @@ extension RunnerTests {
70
70
  return (NSTemporaryDirectory() as NSString).appendingPathComponent(safeFileName)
71
71
  }
72
72
 
73
- // MARK: - Target Activation
73
+
74
74
 
75
75
  func ensureRunnerHostAppActive(reason: String) {
76
76
  NSLog(
@@ -103,9 +103,9 @@ extension RunnerTests {
103
103
 
104
104
  func resetTargetAfterExternalRelaunch() -> Response {
105
105
  invalidateCachedTarget(reason: "external_app_relaunch")
106
- // The app process is replaced, but the retained runner survives. Clear
107
- // process-bound capture state explicitly because invalidation drops the
108
- // old PID before refreshCachedTargetIfProcessChanged can observe it.
106
+
107
+
108
+
109
109
  clearSnapshotXCTestChannelPenalty(reason: "external_app_relaunch")
110
110
  clearPrivateAXAcceptedDepth(reason: "external_app_relaunch")
111
111
  beginFirstInteractionStabilization()
@@ -191,7 +191,7 @@ extension RunnerTests {
191
191
  initialState.rawValue,
192
192
  reason
193
193
  )
194
- // activate avoids terminating and relaunching the target app
194
+
195
195
  if initialState == .runningForeground {
196
196
  NSLog(
197
197
  "AGENT_DEVICE_RUNNER_ACTIVATE_SKIPPED bundle=%@ reason=already_foreground",
@@ -229,7 +229,7 @@ extension RunnerTests {
229
229
  performWithQuiescenceSkippedIfSupported(target, operation: operation)
230
230
  }
231
231
 
232
- // Some apps never report post-gesture quiescence, even after XCTest has synthesized the event.
232
+
233
233
  private func performWithQuiescenceSkippedIfSupported(
234
234
  _ target: XCUIApplication,
235
235
  operation: () -> Void
@@ -285,7 +285,7 @@ extension RunnerTests {
285
285
  return false
286
286
  }
287
287
 
288
- // MARK: - Command Classification
288
+
289
289
 
290
290
  func isReadOnlyCommand(_ command: Command) -> Bool {
291
291
  switch command.command.traits.readOnly {
@@ -294,7 +294,7 @@ extension RunnerTests {
294
294
  case .never:
295
295
  return false
296
296
  case .conditional:
297
- // Today only `alert` is conditional: read-only when getting, mutating otherwise.
297
+
298
298
  return (command.action ?? "get").lowercased() == "get"
299
299
  }
300
300
  }
@@ -313,7 +313,7 @@ extension RunnerTests {
313
313
  return command.traits.isLifecycle
314
314
  }
315
315
 
316
- // MARK: - Interaction Stabilization
316
+
317
317
 
318
318
  func applyInteractionStabilizationIfNeeded() {
319
319
  if needsPostSnapshotInteractionDelay {
@@ -326,8 +326,8 @@ extension RunnerTests {
326
326
  }
327
327
  }
328
328
 
329
- /// Start the post-activation settling window. Measured from now, so the time the caller spends
330
- /// getting back to us counts towards it instead of being charged twice.
329
+
330
+
331
331
  func beginFirstInteractionStabilization() {
332
332
  firstInteractionReadyUptime =
333
333
  ProcessInfo.processInfo.systemUptime + firstInteractionAfterActivateDelay
@@ -335,7 +335,7 @@ extension RunnerTests {
335
335
 
336
336
  func sleepFor(_ delay: TimeInterval) {
337
337
  guard delay > 0 else { return }
338
- // Keep XCTest/UI sources moving during command-local pauses such as delayed typing.
338
+
339
339
  if Thread.isMainThread {
340
340
  let deadline = Date().addingTimeInterval(delay)
341
341
  while Date() < deadline {