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
@@ -113,6 +113,7 @@
113
113
  );
114
114
  name = AgentDeviceRunnerUITests;
115
115
  packageProductDependencies = (
116
+ A1B2C3D4E5F60718293A4B5D /* AgentDeviceSnapshotPresentation */,
116
117
  );
117
118
  productName = AgentDeviceRunnerUITests;
118
119
  productReference = 20EA2EDD2F2CFC7C001CF0EF /* AgentDeviceRunnerUITests.xctest */;
@@ -146,6 +147,9 @@
146
147
  );
147
148
  mainGroup = 20EA2EBD2F2CFC7B001CF0EF;
148
149
  minimizedProjectReferenceProxies = 1;
150
+ packageReferences = (
151
+ A1B2C3D4E5F60718293A4B5C /* XCLocalSwiftPackageReference "snapshot-presentation" */,
152
+ );
149
153
  preferredProjectObjectVersion = 77;
150
154
  productRefGroup = 20EA2EC72F2CFC7B001CF0EF /* Products */;
151
155
  projectDirPath = "";
@@ -157,6 +161,21 @@
157
161
  };
158
162
  /* End PBXProject section */
159
163
 
164
+ /* Begin XCLocalSwiftPackageReference section */
165
+ A1B2C3D4E5F60718293A4B5C /* XCLocalSwiftPackageReference "snapshot-presentation" */ = {
166
+ isa = XCLocalSwiftPackageReference;
167
+ relativePath = ../../snapshot-presentation;
168
+ };
169
+ /* End XCLocalSwiftPackageReference section */
170
+
171
+ /* Begin XCSwiftPackageProductDependency section */
172
+ A1B2C3D4E5F60718293A4B5D /* AgentDeviceSnapshotPresentation */ = {
173
+ isa = XCSwiftPackageProductDependency;
174
+ package = A1B2C3D4E5F60718293A4B5C /* XCLocalSwiftPackageReference "snapshot-presentation" */;
175
+ productName = AgentDeviceSnapshotPresentation;
176
+ };
177
+ /* End XCSwiftPackageProductDependency section */
178
+
160
179
  /* Begin PBXResourcesBuildPhase section */
161
180
  20EA2EC42F2CFC7B001CF0EF /* Resources */ = {
162
181
  isa = PBXResourcesBuildPhase;
@@ -49,6 +49,18 @@ FOUNDATION_EXPORT NSString *const RunnerAXSnapshotCustomActionsBlockedKey;
49
49
  customActionLimit:(NSInteger)customActionLimit
50
50
  deadline:(nullable NSDate *)deadline;
51
51
 
52
+ /// The capture behind `snapshotTreeForApplication:`, for an AX client and target
53
+ /// application element that are already resolved. Every request, extension, and
54
+ /// custom-action decision happens here; the application entry point only resolves
55
+ /// the two identities.
56
+ + (NSDictionary<NSString *, id> *)snapshotTreeWithClient:(id)axClient
57
+ target:(id)target
58
+ maxDepth:(NSInteger)maxDepth
59
+ maxNodes:(NSInteger)maxNodes
60
+ deepExtensionCallLimit:(NSInteger)deepExtensionCallLimit
61
+ customActionLimit:(NSInteger)customActionLimit
62
+ deadline:(nullable NSDate *)deadline;
63
+
52
64
  /// Names of the element's UIAccessibilityCustomActions, or nil when it has
53
65
  /// none.
54
66
  ///
@@ -104,7 +104,27 @@ typedef id (*RunnerAXSnapshotMsgSend)(id, SEL, id, id, id, NSError **);
104
104
  if (nil == target) {
105
105
  return [self failure:@"Could not match active AX application for XCTest application"];
106
106
  }
107
+ return [self snapshotTreeWithClient:axClient
108
+ target:target
109
+ maxDepth:maxDepth
110
+ maxNodes:maxNodes
111
+ deepExtensionCallLimit:deepExtensionCallLimit
112
+ customActionLimit:customActionLimit
113
+ deadline:deadline];
114
+ } @catch (NSException *exception) {
115
+ return [self failure:exception.reason ?: exception.name ?: @"AX snapshot bridge exception"];
116
+ }
117
+ }
107
118
 
119
+ + (NSDictionary<NSString *, id> *)snapshotTreeWithClient:(id)axClient
120
+ target:(id)target
121
+ maxDepth:(NSInteger)maxDepth
122
+ maxNodes:(NSInteger)maxNodes
123
+ deepExtensionCallLimit:(NSInteger)deepExtensionCallLimit
124
+ customActionLimit:(NSInteger)customActionLimit
125
+ deadline:(nullable NSDate *)deadline
126
+ {
127
+ @try {
108
128
  NSArray *attributes = [self snapshotAttributes];
109
129
  NSError *error = nil;
110
130
  id root = [self requestSnapshotFromClient:axClient
@@ -0,0 +1,36 @@
1
+ struct RunnerAlertPresentation: Equatable {
2
+ let title: String
3
+ let content: [String]
4
+ let buttons: [String]
5
+ }
6
+
7
+ enum RunnerAlertObservation {
8
+ case visible(RunnerAlertPresentation)
9
+ case absent
10
+ case unavailable
11
+ case deadlineExceeded
12
+ }
13
+
14
+ enum RunnerAlertVerification: Equatable {
15
+ case disappeared
16
+ case presentationChanged
17
+ case stillVisible
18
+ case unconfirmed
19
+ case timedOut
20
+
21
+ static func verify(
22
+ original: RunnerAlertPresentation,
23
+ observation: RunnerAlertObservation
24
+ ) -> RunnerAlertVerification {
25
+ switch observation {
26
+ case .visible(let current):
27
+ return original == current ? .stillVisible : .presentationChanged
28
+ case .absent:
29
+ return .disappeared
30
+ case .unavailable:
31
+ return .unconfirmed
32
+ case .deadlineExceeded:
33
+ return .timedOut
34
+ }
35
+ }
36
+ }
@@ -20,26 +20,26 @@ enum DirectSelectorCandidateDecision: Equatable {
20
20
  case ambiguous
21
21
  }
22
22
 
23
- /// How many raw exact matches a dispatch may discard before hittability is
24
- /// allowed to pick a winner. The two rows differ because the cost of guessing
25
- /// wrong differs, not because the matching differs.
23
+
24
+
25
+
26
26
  enum DirectSelectorRawMatchPolicy: Equatable {
27
- /// Mutations fail closed: every raw exact match counts, so a hittable
28
- /// element can never silently win over a same-selector duplicate the caller
29
- /// never saw and act on the wrong one.
27
+
28
+
29
+
30
30
  case rejectDistinctMatches
31
- /// Reads prefer the single hittable match and ignore non-hittable
32
- /// same-selector duplicates. A read has no side effect to guard, and
33
- /// `querySelector` backs `get`/`is`/`wait` — failing those closed turns a
34
- /// decorative duplicate into an error where the reader previously got its
35
- /// answer.
31
+
32
+
33
+
34
+
35
+
36
36
  case preferHittableMatch
37
37
  }
38
38
 
39
- /// Normal direct selector mutations count every raw exact match before
40
- /// hittability can choose a winner. Reads keep the hittable-preference rule,
41
- /// and Maestro's explicitly requested coordinate fallback keeps its
42
- /// point-filtered compatibility behavior.
39
+
40
+
41
+
42
+
43
43
  func classifyDirectSelectorCandidates(
44
44
  _ candidates: [SelectorCandidateFacts],
45
45
  allowNonHittableFallback: Bool,
@@ -0,0 +1,8 @@
1
+ import Foundation
2
+
3
+ extension String {
4
+ var trimmedNonEmpty: String? {
5
+ let trimmed = trimmingCharacters(in: .whitespacesAndNewlines)
6
+ return trimmed.isEmpty ? nil : trimmed
7
+ }
8
+ }
@@ -2,6 +2,10 @@
2
2
 
3
3
  NS_ASSUME_NONNULL_BEGIN
4
4
 
5
+ FOUNDATION_EXPORT NSInteger RunnerContinuousDragFrameCount(double durationMs);
6
+ FOUNDATION_EXPORT NSInteger RunnerControlledScrollFrameCount(double durationMs);
7
+ FOUNDATION_EXPORT double RunnerControlledScrollProgress(double t);
8
+
5
9
  @interface RunnerSynthesizedGesture : NSObject
6
10
 
7
11
  + (NSString * _Nullable)synthesizeSwipeWithApplication:(id)application
@@ -15,9 +19,16 @@ NS_ASSUME_NONNULL_BEGIN
15
19
  x:(double)x
16
20
  y:(double)y
17
21
  x2:(double)x2
18
- y2:(double)y2
22
+ y2:(double)y2
19
23
  durationMs:(double)durationMs;
20
24
 
25
+ + (NSString * _Nullable)synthesizeControlledScrollWithApplication:(id)application
26
+ x:(double)x
27
+ y:(double)y
28
+ x2:(double)x2
29
+ y2:(double)y2
30
+ durationMs:(double)durationMs;
31
+
21
32
  + (NSString * _Nullable)synthesizeTapWithApplication:(id)application
22
33
  x:(double)x
23
34
  y:(double)y;
@@ -29,6 +29,7 @@ typedef id (*RunnerDragPointerPathFactory)(
29
29
  CGPoint,
30
30
  double
31
31
  );
32
+ typedef double (*RunnerDragProgressFunction)(double);
32
33
 
33
34
  static NSString * _Nullable RunnerResolveGestureEventBridge(
34
35
  id application,
@@ -56,6 +57,21 @@ static id RunnerContinuousDragPointerPath(
56
57
  CGPoint end,
57
58
  double durationMs
58
59
  );
60
+ static id RunnerControlledScrollPointerPath(
61
+ const RunnerGestureEventBridge *bridge,
62
+ CGPoint start,
63
+ CGPoint end,
64
+ double durationMs
65
+ );
66
+ static id RunnerSampledDragPointerPath(
67
+ const RunnerGestureEventBridge *bridge,
68
+ CGPoint start,
69
+ CGPoint end,
70
+ double durationMs,
71
+ RunnerDragProgressFunction progress,
72
+ NSInteger frameCount
73
+ );
74
+ static double RunnerSmoothstepProgress(double t);
59
75
  static NSString * _Nullable RunnerTrySynthesizeDrag(
60
76
  id application,
61
77
  CGPoint start,
@@ -68,6 +84,8 @@ static NSString * _Nullable RunnerTrySynthesizeTap(id application, CGPoint point
68
84
  // XCTest's proven swipe profile reaches the endpoint in 100 ms, then holds for the planned
69
85
  // fling duration. Fast movement is what lets UIKit distinguish a fling from a timed pan.
70
86
  static const NSTimeInterval RunnerSwipeMovementDurationSeconds = 0.1;
87
+ static const double RunnerDragSampleIntervalMs = 16.0;
88
+ static const NSInteger RunnerControlledScrollMaxFrameCount = 30;
71
89
  static id RunnerTapPointerPath(
72
90
  const RunnerGestureEventBridge *bridge,
73
91
  CGPoint point
@@ -115,6 +133,26 @@ static id RunnerTapPointerPath(
115
133
  }
116
134
  }
117
135
 
136
+ + (NSString * _Nullable)synthesizeControlledScrollWithApplication:(id)application
137
+ x:(double)x
138
+ y:(double)y
139
+ x2:(double)x2
140
+ y2:(double)y2
141
+ durationMs:(double)durationMs {
142
+ @try {
143
+ return RunnerTrySynthesizeDrag(
144
+ application,
145
+ CGPointMake(x, y),
146
+ CGPointMake(x2, y2),
147
+ durationMs,
148
+ @"agent-device-controlled-scroll",
149
+ RunnerControlledScrollPointerPath
150
+ );
151
+ } @catch (NSException *exception) {
152
+ return RunnerFormatXCTestException(exception, @"private XCTest event synthesis failed");
153
+ }
154
+ }
155
+
118
156
  + (NSString * _Nullable)synthesizeTapWithApplication:(id)application
119
157
  x:(double)x
120
158
  y:(double)y {
@@ -351,6 +389,46 @@ static id RunnerContinuousDragPointerPath(
351
389
  CGPoint start,
352
390
  CGPoint end,
353
391
  double durationMs
392
+ ) {
393
+ // This is velocity shaping, not just interpolation density: smoothstep's endpoint slope is zero,
394
+ // while a planned linear segment reaches lift with nonzero velocity unless a destination hold
395
+ // follows it. UIKit uses finger-up velocity for scroll deceleration. See ADR 0013 and issue #1586.
396
+ return RunnerSampledDragPointerPath(
397
+ bridge,
398
+ start,
399
+ end,
400
+ durationMs,
401
+ RunnerSmoothstepProgress,
402
+ RunnerContinuousDragFrameCount(durationMs)
403
+ );
404
+ }
405
+
406
+ static id RunnerControlledScrollPointerPath(
407
+ const RunnerGestureEventBridge *bridge,
408
+ CGPoint start,
409
+ CGPoint end,
410
+ double durationMs
411
+ ) {
412
+ // A stationary hold is not a reliable zero-velocity release in XCTest. Cubic ease-out decreases
413
+ // velocity from the first movement and reaches near zero before lift. Profiles that accelerate
414
+ // after pan recognition can still be classified as flings despite a slow final sample.
415
+ return RunnerSampledDragPointerPath(
416
+ bridge,
417
+ start,
418
+ end,
419
+ durationMs,
420
+ RunnerControlledScrollProgress,
421
+ RunnerControlledScrollFrameCount(durationMs)
422
+ );
423
+ }
424
+
425
+ static id RunnerSampledDragPointerPath(
426
+ const RunnerGestureEventBridge *bridge,
427
+ CGPoint start,
428
+ CGPoint end,
429
+ double durationMs,
430
+ RunnerDragProgressFunction progress,
431
+ NSInteger frameCount
354
432
  ) {
355
433
  id path =
356
434
  ((RunnerMsgSendInitPath)objc_msgSend)([bridge->core.pathClass alloc], bridge->initPathSelector, start, 0.0);
@@ -358,14 +436,10 @@ static id RunnerContinuousDragPointerPath(
358
436
  return nil;
359
437
  }
360
438
 
361
- // This is velocity shaping, not just interpolation density: smoothstep's endpoint slope is zero,
362
- // while a planned linear segment reaches lift with nonzero velocity unless a destination hold
363
- // follows it. UIKit uses finger-up velocity for scroll deceleration. See ADR 0013 and issue #1586.
364
- int frameCount = MAX(3, (int)(durationMs / 16.0));
365
439
  NSTimeInterval durationSeconds = durationMs / 1000.0;
366
- for (int index = 1; index <= frameCount; index += 1) {
440
+ for (NSInteger index = 1; index <= frameCount; index += 1) {
367
441
  double t = (double)index / (double)frameCount;
368
- double easedT = t * t * (3.0 - 2.0 * t);
442
+ double easedT = progress(t);
369
443
  CGPoint point = CGPointMake(
370
444
  start.x + (end.x - start.x) * easedT,
371
445
  start.y + (end.y - start.y) * easedT
@@ -377,6 +451,26 @@ static id RunnerContinuousDragPointerPath(
377
451
  return path;
378
452
  }
379
453
 
454
+ static double RunnerSmoothstepProgress(double t) {
455
+ return t * t * (3.0 - 2.0 * t);
456
+ }
457
+
458
+ NSInteger RunnerContinuousDragFrameCount(double durationMs) {
459
+ return MAX(3, (NSInteger)(durationMs / RunnerDragSampleIntervalMs));
460
+ }
461
+
462
+ NSInteger RunnerControlledScrollFrameCount(double durationMs) {
463
+ return MIN(
464
+ RunnerControlledScrollMaxFrameCount,
465
+ MAX(3, (NSInteger)ceil(durationMs / RunnerDragSampleIntervalMs) - 1)
466
+ );
467
+ }
468
+
469
+ double RunnerControlledScrollProgress(double t) {
470
+ double remaining = 1.0 - t;
471
+ return 1.0 - remaining * remaining * remaining;
472
+ }
473
+
380
474
  static id RunnerTapPointerPath(
381
475
  const RunnerGestureEventBridge *bridge,
382
476
  CGPoint point
@@ -0,0 +1,72 @@
1
+ import Foundation
2
+
3
+
4
+
5
+
6
+
7
+ enum SystemSurfaceHostKind: String {
8
+ case webAuth = "web-auth"
9
+ }
10
+
11
+ struct SystemSurfaceHost: Equatable {
12
+ let bundleId: String
13
+ let kind: SystemSurfaceHostKind
14
+ }
15
+
16
+ enum SystemSurfaceHostRegistry {
17
+ static let hosts: [SystemSurfaceHost] = [
18
+ SystemSurfaceHost(bundleId: "com.apple.SafariViewService", kind: .webAuth)
19
+ ]
20
+
21
+ static func host(forBundleId bundleId: String?) -> SystemSurfaceHost? {
22
+ guard let bundleId else { return nil }
23
+ return hosts.first { $0.bundleId == bundleId }
24
+ }
25
+
26
+ static func isSystemSurfaceHost(_ bundleId: String?) -> Bool {
27
+ host(forBundleId: bundleId) != nil
28
+ }
29
+ }
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
@@ -1,19 +1,19 @@
1
1
  import XCTest
2
2
 
3
- // The tap-point rule the runner shares with the TS runtime (ADR 0011 Layer 2).
4
- //
5
- // RULE: the tap point is the element frame's CENTER; a tap is allowed iff that
6
- // center lies inside the window frame, edges inclusive. An empty or invalid
7
- // window frame fails open (allowed): resolving the best available frame is the
8
- // impure caller's job (onScreenWindowFrame / app.frame), and the policy must
9
- // not turn a missing frame into a refusal.
10
- //
11
- // This is pure geometry on purpose — no XCUIElement — so the exact decision
12
- // can be proven against the golden fixture table shared with the TS twin:
13
- // table: contracts/fixtures/tap-point-policy.json
14
- // TS twin: src/snapshot/mobile-snapshot-semantics.ts#isTapPointInsideViewport
15
- // TS test: src/snapshot/__tests__/tap-point-policy-parity.test.ts
16
- // Drift on either side turns CI red without needing a simulator.
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
17
  enum TapPointPolicy {
18
18
  static func isAllowed(elementFrame: CGRect, windowFrame: CGRect) -> Bool {
19
19
  if windowFrame.isNull || windowFrame.isEmpty || windowFrame.isInfinite {
@@ -26,3 +26,52 @@ enum TapPointPolicy {
26
26
  }
27
27
  }
28
28
 
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+