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
@@ -2,13 +2,13 @@ import XCTest
2
2
  import Network
3
3
 
4
4
  extension RunnerTests {
5
- // MARK: - Connection Lifecycle
5
+
6
6
 
7
7
  func handle(connection: NWConnection) {
8
8
  receiveRequest(connection: connection, buffer: Data())
9
9
  }
10
10
 
11
- // MARK: - Request Parsing
11
+
12
12
 
13
13
  private func receiveRequest(connection: NWConnection, buffer: Data) {
14
14
  connection.receive(minimumIncompleteLength: 1, maximumLength: 1024 * 1024) { [weak self] data, _, _, _ in
@@ -116,9 +116,9 @@ extension RunnerTests {
116
116
  completion((jsonResponse(status: 200, response: executeUptime()), false))
117
117
  return
118
118
  }
119
- // Re-sends of a still-executing commandId (the daemon's transport retry loop) attach to
120
- // the in-flight execution and receive its response instead of piling a second execution
121
- // onto the main queue behind it (#1105 capture pileup).
119
+
120
+
121
+
122
122
  if attachToInFlightCommandIfNeeded(command: command, completion: completion) {
123
123
  return
124
124
  }
@@ -181,16 +181,16 @@ extension RunnerTests {
181
181
  }
182
182
  }
183
183
 
184
- // MARK: - In-Flight Command Coalescing
185
184
 
186
- /// Returns true when this send duplicated a still-executing commandId and was attached as a
187
- /// waiter of the in-flight execution. Otherwise marks the commandId in flight and returns
188
- /// false so the caller enqueues the (single) execution.
185
+
186
+
187
+
188
+
189
189
  private func attachToInFlightCommandIfNeeded(
190
190
  command: Command,
191
191
  completion: @escaping ((data: Data, shouldFinish: Bool)) -> Void
192
192
  ) -> Bool {
193
- guard let commandId = normalizedInFlightCommandId(command.commandId) else { return false }
193
+ guard let commandId = command.commandId?.trimmedNonEmpty else { return false }
194
194
  inFlightCommandLock.lock()
195
195
  if inFlightCommandIds.contains(commandId) {
196
196
  inFlightCommandWaiters[commandId, default: []].append(completion)
@@ -213,7 +213,7 @@ extension RunnerTests {
213
213
  completion: ((data: Data, shouldFinish: Bool)) -> Void
214
214
  ) {
215
215
  var waiters: [((data: Data, shouldFinish: Bool)) -> Void] = []
216
- if let commandId = normalizedInFlightCommandId(command.commandId) {
216
+ if let commandId = command.commandId?.trimmedNonEmpty {
217
217
  inFlightCommandLock.lock()
218
218
  inFlightCommandIds.remove(commandId)
219
219
  waiters = inFlightCommandWaiters.removeValue(forKey: commandId) ?? []
@@ -225,24 +225,53 @@ extension RunnerTests {
225
225
  }
226
226
  }
227
227
 
228
- private func normalizedInFlightCommandId(_ commandId: String?) -> String? {
229
- guard let trimmed = commandId?.trimmingCharacters(in: .whitespacesAndNewlines),
230
- !trimmed.isEmpty
231
- else {
232
- return nil
233
- }
234
- return trimmed
235
- }
236
228
 
237
229
 
238
- // MARK: - Response Encoding
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
239
268
 
240
269
  private func jsonResponse(status: Int, response: Response) -> Data {
241
- // Stamp the gesture-clock uptime at the END of command handling, just before the HTTP
242
- // write, so the warm snapshot and recordStart responses carry the anchor for free. This
243
- // runs AFTER commandJournal.finish, so journal-stored lifecycleResponseJson stays
244
- // unstamped — recovered/status-replayed results carry no anchor and the daemon falls back
245
- // rather than pairing a stale uptime with a much-later receipt time.
270
+
271
+
272
+
273
+
274
+
246
275
  let stamped =
247
276
  response.ok
248
277
  ? response.stampingCurrentUptimeMs(ProcessInfo.processInfo.systemUptime * 1000)
@@ -271,8 +300,8 @@ extension RunnerTests {
271
300
  private func finish() {
272
301
  listener?.cancel()
273
302
  listener = nil
274
- // Guard against double-fulfill: coalesced shutdown sends deliver one result to
275
- // multiple waiters, each of which may ask to finish.
303
+
304
+
276
305
  doneExpectation?.fulfill()
277
306
  doneExpectation = nil
278
307
  }
@@ -2,12 +2,12 @@ import XCTest
2
2
 
3
3
  enum RunnerInteractionOutcome {
4
4
  case performed
5
- /// A capability/state gap, surfaced to the caller as an UNSUPPORTED_OPERATION error.
6
- /// `hint` is an optional actionable next step (mapped to ErrorPayload.hint).
5
+
6
+
7
7
  case unsupported(message: String, hint: String?)
8
8
  }
9
9
 
10
- enum TvRemoteButton {
10
+ enum TvRemoteButton: String {
11
11
  case select
12
12
  case menu
13
13
  case home
@@ -18,6 +18,28 @@ enum TvRemoteButton {
18
18
  }
19
19
 
20
20
  extension RunnerTests {
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
21
43
  func resolveTvRemoteDoublePressDelay() -> TimeInterval {
22
44
  guard
23
45
  let raw = ProcessInfo.processInfo.environment["AGENT_DEVICE_TV_REMOTE_DOUBLE_PRESS_DELAY_MS"],
@@ -47,24 +69,8 @@ extension RunnerTests {
47
69
  }
48
70
 
49
71
  func tvRemoteButton(from raw: String?) -> TvRemoteButton? {
50
- switch raw?.lowercased() {
51
- case "select":
52
- return .select
53
- case "menu":
54
- return .menu
55
- case "home":
56
- return .home
57
- case "up":
58
- return .up
59
- case "down":
60
- return .down
61
- case "left":
62
- return .left
63
- case "right":
64
- return .right
65
- default:
66
- return nil
67
- }
72
+ guard let raw else { return nil }
73
+ return TvRemoteButton(rawValue: raw.lowercased())
68
74
  }
69
75
 
70
76
  func elementHasFocus(_ element: XCUIElement) -> Bool {
@@ -86,9 +92,9 @@ extension RunnerTests {
86
92
  #else
87
93
  let frame = element.frame
88
94
  if !frame.isEmpty {
89
- // XCUIElement.tap() can fail the whole XCTest after navigation because it
90
- // re-resolves the tapped element even after the app removed it. Keep the
91
- // selector target semantic, then activate its resolved stable screen point.
95
+
96
+
97
+
92
98
  return tapAt(app: app, x: frame.midX, y: frame.midY)
93
99
  }
94
100
  return performElementTap(element)
@@ -1,9 +1,9 @@
1
- //
2
- // RunnerTests.swift
3
- // AgentDeviceRunnerUITests
4
- //
5
- // Created by Michał Pierzchała on 30/01/2026.
6
- //
1
+
2
+
3
+
4
+
5
+
6
+
7
7
 
8
8
  import XCTest
9
9
  import Network
@@ -29,8 +29,8 @@ final class RunnerTests: XCTestCase {
29
29
  }
30
30
 
31
31
  static let springboardBundleId = "com.apple.springboard"
32
- // SpringBoard hosts blocking system modals on iOS/visionOS; tvOS (PineBoard/HeadBoard)
33
- // and macOS have no such host, so there is nothing to probe there.
32
+
33
+
34
34
  static let hasSpringBoardSystemModalHost: Bool = {
35
35
  #if os(tvOS) || os(macOS)
36
36
  return false
@@ -48,10 +48,10 @@ final class RunnerTests: XCTestCase {
48
48
  var currentApp: XCUIApplication?
49
49
  var currentBundleId: String?
50
50
  var currentAppProcessIdentifier: Int?
51
- // iOS does not reliably expose hasKeyboardFocus for a bare type request, especially when
52
- // hardware-keyboard input hides the software keyboard. A successful tap on a concrete text
53
- // input is a scoped witness for the immediately-following bare type; lifecycle and non-text
54
- // interactions clear it before it can become stale.
51
+
52
+
53
+
54
+
55
55
  var textEntryTapWitness: TextEntryTapWitness?
56
56
  let maxRequestBytes = 2 * 1024 * 1024
57
57
  let mainThreadExecutionTimeout: TimeInterval = 30
@@ -61,88 +61,133 @@ final class RunnerTests: XCTestCase {
61
61
  let firstInteractionAfterActivateDelay: TimeInterval = 0.25
62
62
  let scrollInteractionIdleTimeoutDefault: TimeInterval = 1.0
63
63
  let tvRemoteDoublePressDelayDefault: TimeInterval = 0.0
64
- // Keep a periodic XCTest liveness marker in runner.log without flooding long-lived sessions.
64
+
65
65
  let xctestIdleKeepaliveInterval: TimeInterval = 60.0
66
66
  let minRecordingFps = 1
67
67
  let maxRecordingFps = 120
68
68
  var needsPostSnapshotInteractionDelay = false
69
- var needsFirstInteractionDelay = false
69
+
70
+
71
+
72
+
73
+ var firstInteractionReadyUptime: TimeInterval?
70
74
  var runnerAccessibilityHealth: RunnerAccessibilityHealth = .unknown
71
75
  var activeRecording: ScreenRecorder?
72
76
  let commandJournal = RunnerCommandJournal()
73
- // Coalesces duplicate transport sends of the same commandId onto the single in-flight
74
- // execution instead of enqueueing them again behind it (#1105 capture pileup).
77
+
78
+
75
79
  let inFlightCommandLock = NSLock()
76
80
  var inFlightCommandIds: Set<String> = []
77
81
  var inFlightCommandWaiters: [String: [((data: Data, shouldFinish: Bool)) -> Void]] = [:]
78
- // Tracks main-queue work abandoned by the execution watchdog so new main-thread commands
79
- // fail fast as busy instead of queueing behind work that cannot be cancelled (#1105).
82
+
83
+
80
84
  let mainThreadWorkLock = NSLock()
81
85
  var abandonedMainThreadWorkCount = 0
82
86
  var abandonedMainThreadWorkSince: Date?
83
- // Past this age the runner stops claiming "busy, retry soon" and reports itself wedged so
84
- // the daemon recycles it — the only cure once the main thread is stuck for good.
87
+
88
+
85
89
  let mainThreadWedgeThreshold: TimeInterval = 120
86
- // Sticky per-bundle hint: after an XCTest-backed snapshot tier ground past its slice (or a
87
- // snapshot was abandoned by the watchdog), later capture plans avoid the XCTest accessibility
88
- // channel when an independent recovery backend exists, or use a bounded XCTest probe when it
89
- // does not, for the same screen class (#1105/#1156).
90
+
91
+
92
+
93
+
90
94
  let snapshotXCTestChannelPenaltyLock = NSLock()
91
95
  var snapshotXCTestChannelPenaltyBundleId: String?
92
96
  var snapshotXCTestChannelPenaltyUntil = Date.distantPast
93
97
  let snapshotXCTestChannelPenaltyDuration: TimeInterval = 120
94
98
  var snapshotXCTestPenaltyWarmupExemptionPending = false
95
- // Sticky per-bundle hint for the private AX depth ladder: deep RN screens reject the default
96
- // depth with kAXErrorIllegalArgument on EVERY capture, so once a shallower rung is accepted
97
- // later captures start there instead of re-paying the rejected deep request (~300ms per
98
- // capture on the Bluesky feed). Shares the penalty's lifetime model: same duration, cleared
99
- // on target process change, so screens that regain deep-capture ability are re-probed.
99
+
100
+
101
+
102
+
103
+
100
104
  let privateAXAcceptedDepthLock = NSLock()
101
105
  var privateAXAcceptedDepthBundleId: String?
102
- // PID-bound: a relaunch (external or A->B->A while inactive) changes the process, and the new
103
- // tree may accept the full depth again. Any invalidation path that drops the cached PID makes
104
- // the memory unmatchable, so every fresh activation re-probes the full requested depth.
106
+
107
+
108
+
105
109
  var privateAXAcceptedDepthProcessIdentifier: Int?
106
110
  var privateAXAcceptedDepth: Int?
107
111
  var privateAXAcceptedDepthUntil = Date.distantPast
108
- // Bluesky-class screens can grind ~4-8s before an XCTest-backed snapshot tier fails; anything
109
- // past this threshold marks the screen hostile so the next capture uses non-XCTest recovery.
112
+
113
+
110
114
  let snapshotXCTestSlowCaptureThreshold: TimeInterval = 3
111
- // The blocking XCTest tree snapshot XPC runs on the main thread with this slice so a
112
- // content-dependent grind (#1105: seconds to minutes on live Bluesky screens) cannot pin
113
- // the capture plan. On timeout the XPC keeps grinding on main; while any abandoned
114
- // tree capture is outstanding, plans skip XCTest-backed tiers (tree, query sweep) until the
115
- // abandoned work drains.
115
+
116
+
117
+
118
+
119
+
116
120
  let treeCaptureLock = NSLock()
117
121
  var abandonedTreeCaptureCount = 0
118
122
  let treeCaptureSliceBudget: TimeInterval = 8
119
- // Bounds the pre-plan SpringBoard system-modal probe, which can otherwise grind for tens of
120
- // seconds on remote-hosted consent dialogs and bypass the plan budget (#1244).
123
+
124
+
121
125
  let systemModalProbeBudget: TimeInterval = 4
122
- // Observability for the record(_:) suppression below: how many AX-broken-screen snapshot
123
- // issues this session muted, so wedge investigations see the volume without grepping logs.
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+ var textInputProbeIssues: TextInputProbeIssues?
124
188
  let suppressedIssueLock = NSLock()
125
189
  var suppressedAxSnapshotIssueCount = 0
126
- let interactiveTypes: Set<XCUIElement.ElementType> = [
127
- .button,
128
- .cell,
129
- .checkBox,
130
- .collectionView,
131
- .link,
132
- .menuItem,
133
- .picker,
134
- .searchField,
135
- .segmentedControl,
136
- .slider,
137
- .stepper,
138
- .switch,
139
- .tabBar,
140
- .textField,
141
- .secureTextField,
142
- .textView,
143
- .webView
144
- ]
145
- // Keep blocker actions narrow to avoid false positives from generic hittable containers.
190
+
146
191
  let actionableTypes: Set<XCUIElement.ElementType> = [
147
192
  .button,
148
193
  .cell,
@@ -152,33 +197,34 @@ final class RunnerTests: XCTestCase {
152
197
  .switch
153
198
  ]
154
199
 
155
- // MARK: - XCTest Entry
200
+
156
201
 
157
202
  override func setUp() {
158
203
  continueAfterFailure = true
159
204
  }
160
205
 
161
- /// True for the one recorded-issue class the runner deliberately mutes: an AX-server error
162
- /// (`kAXError*`) inside a "Failed to get matching snapshot" fetch. The kAXError token
163
- /// intentionally covers kAXErrorIllegalArgument and its sibling AX server codes (e.g.
164
- /// kAXErrorCannotComplete): any AX-server rejection inside a matching-snapshot fetch is the
165
- /// same capture-plan noise the plan already classifies and recovers from. The timeout
166
- /// variant ("Failed to get matching snapshot: Timed out while evaluating UI query.") carries
167
- /// no kAXError token and MUST keep recording — it signals a genuinely hung query, exactly
168
- /// the pathology XCTEST_RECORDED_FAILURE must stay able to see.
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
169
214
  static func isSuppressedAxSnapshotIssueDescription(_ description: String) -> Bool {
170
215
  description.contains("Failed to get matching snapshot") && description.contains("kAXError")
171
216
  }
172
217
 
173
- /// On AX-broken screens (deep RN trees, #758/#1105) XCUIApplication queries record
174
- /// "Failed to get matching snapshot: ... kAXError..." issues; XCTest tears the whole test
175
- /// case down once a few accumulate, killing the long-lived runner right after the command
176
- /// completes and forcing a ~25s restart per capture. This override is deliberately
177
- /// suite-global (all commands, not just snapshot capture): tap-triggered element queries on
178
- /// the same screens record the same noise and would still tear the runner down, and command
179
- /// outcomes stay honest through their own error paths — only this issue side-channel is
180
- /// muted. Everything else still records (and still drives XCTEST_RECORDED_FAILURE).
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
181
226
  override func record(_ issue: XCTIssue) {
227
+ if containTextInputProbeIssue(issue) { return }
182
228
  let description = issue.compactDescription
183
229
  if Self.isSuppressedAxSnapshotIssueDescription(description) {
184
230
  suppressedIssueLock.lock()
@@ -0,0 +1,111 @@
1
+ import AVFoundation
2
+ import Foundation
3
+
4
+
5
+
6
+
7
+
8
+ enum RecordingScriptError: Error, CustomStringConvertible {
9
+ case invalidArgs(String)
10
+ case invalidTrimRange
11
+ case missingVideoTrack
12
+ case exportFailed(String)
13
+
14
+ var description: String {
15
+ switch self {
16
+ case .invalidArgs(let message):
17
+ return message
18
+ case .invalidTrimRange:
19
+ return "Trim start must be before the end of the recording."
20
+ case .missingVideoTrack:
21
+ return "Input video does not contain a video track."
22
+ case .exportFailed(let message):
23
+ return message
24
+ }
25
+ }
26
+ }
27
+
28
+ func recordingOptionValue(_ arguments: [String], _ nextIndex: Int, _ flag: String) throws -> String {
29
+ guard nextIndex < arguments.count else {
30
+ throw RecordingScriptError.invalidArgs("\(flag) requires a value")
31
+ }
32
+ return arguments[nextIndex]
33
+ }
34
+
35
+ func removeStaleOutput(_ outputURL: URL) throws {
36
+ if FileManager.default.fileExists(atPath: outputURL.path) {
37
+ try FileManager.default.removeItem(at: outputURL)
38
+ }
39
+ }
40
+
41
+ func sourceVideoTrack(of asset: AVURLAsset) throws -> AVAssetTrack {
42
+ guard let track = asset.tracks(withMediaType: .video).first else {
43
+ throw RecordingScriptError.missingVideoTrack
44
+ }
45
+ return track
46
+ }
47
+
48
+
49
+
50
+
51
+
52
+ func makeRecordingComposition(
53
+ asset: AVURLAsset,
54
+ videoTrack: AVAssetTrack,
55
+ timeRange: CMTimeRange
56
+ ) throws -> AVMutableComposition {
57
+ let composition = AVMutableComposition()
58
+ guard let compositionVideoTrack = composition.addMutableTrack(
59
+ withMediaType: .video,
60
+ preferredTrackID: kCMPersistentTrackID_Invalid
61
+ ) else {
62
+ throw RecordingScriptError.exportFailed("Failed to create composition video track.")
63
+ }
64
+ try compositionVideoTrack.insertTimeRange(timeRange, of: videoTrack, at: .zero)
65
+
66
+ if let sourceAudioTrack = asset.tracks(withMediaType: .audio).first,
67
+ let compositionAudioTrack = composition.addMutableTrack(
68
+ withMediaType: .audio,
69
+ preferredTrackID: kCMPersistentTrackID_Invalid
70
+ ) {
71
+ try? compositionAudioTrack.insertTimeRange(timeRange, of: sourceAudioTrack, at: .zero)
72
+ }
73
+ return composition
74
+ }
75
+
76
+ func makeRecordingExporter(
77
+ _ composition: AVAsset,
78
+ presetName: String,
79
+ outputURL: URL,
80
+ videoComposition: AVMutableVideoComposition? = nil
81
+ ) throws -> AVAssetExportSession {
82
+ guard let exporter = AVAssetExportSession(asset: composition, presetName: presetName) else {
83
+ throw RecordingScriptError.exportFailed("Failed to create export session.")
84
+ }
85
+ exporter.outputURL = outputURL
86
+ exporter.outputFileType = .mp4
87
+ exporter.videoComposition = videoComposition
88
+ exporter.shouldOptimizeForNetworkUse = true
89
+ return exporter
90
+ }
91
+
92
+
93
+
94
+ func runRecordingExport(
95
+ _ exporter: AVAssetExportSession,
96
+ timeoutMessage: String,
97
+ failureMessage: String
98
+ ) throws {
99
+ let semaphore = DispatchSemaphore(value: 0)
100
+ exporter.exportAsynchronously {
101
+ semaphore.signal()
102
+ }
103
+ if semaphore.wait(timeout: .now() + 120) == .timedOut {
104
+ exporter.cancelExport()
105
+ throw RecordingScriptError.exportFailed(timeoutMessage)
106
+ }
107
+
108
+ if exporter.status != .completed {
109
+ throw RecordingScriptError.exportFailed(exporter.error?.localizedDescription ?? failureMessage)
110
+ }
111
+ }