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
@@ -30,30 +30,25 @@ struct GestureEvent: Decodable {
30
30
  let edge: String?
31
31
  }
32
32
 
33
- enum OverlayError: Error, CustomStringConvertible {
34
- case invalidArgs(String)
35
- case missingVideoTrack
36
- case exportFailed(String)
33
+ enum ExportQuality: String {
34
+ case medium
35
+ case high
36
+ }
37
37
 
38
- var description: String {
39
- switch self {
40
- case .invalidArgs(let message):
41
- return message
42
- case .missingVideoTrack:
43
- return "Input video does not contain a video track."
44
- case .exportFailed(let message):
45
- return message
38
+
39
+
40
+ @main
41
+ enum RecordingOverlay {
42
+ static func main() {
43
+ do {
44
+ try run()
45
+ } catch {
46
+ fputs("recording-overlay: \(error)\n", stderr)
47
+ exit(1)
46
48
  }
47
49
  }
48
50
  }
49
51
 
50
- do {
51
- try run()
52
- } catch {
53
- fputs("recording-overlay: \(error)\n", stderr)
54
- exit(1)
55
- }
56
-
57
52
  func run() throws {
58
53
  let arguments = Array(CommandLine.arguments.dropFirst())
59
54
  let parsedArgs = try parseArguments(arguments)
@@ -61,9 +56,7 @@ func run() throws {
61
56
  let outputURL = URL(fileURLWithPath: parsedArgs.outputPath)
62
57
  let eventsURL = URL(fileURLWithPath: parsedArgs.eventsPath)
63
58
 
64
- if FileManager.default.fileExists(atPath: outputURL.path) {
65
- try FileManager.default.removeItem(at: outputURL)
66
- }
59
+ try removeStaleOutput(outputURL)
67
60
 
68
61
  let payload = try Data(contentsOf: eventsURL)
69
62
  let envelope = try JSONDecoder().decode(GestureEnvelope.self, from: payload)
@@ -74,27 +67,15 @@ func run() throws {
74
67
  }
75
68
 
76
69
  let asset = AVURLAsset(url: inputURL)
77
- guard let sourceVideoTrack = asset.tracks(withMediaType: .video).first else {
78
- throw OverlayError.missingVideoTrack
79
- }
80
-
81
- let composition = AVMutableComposition()
82
- guard let compositionVideoTrack = composition.addMutableTrack(
83
- withMediaType: .video,
84
- preferredTrackID: kCMPersistentTrackID_Invalid
85
- ) else {
86
- throw OverlayError.exportFailed("Failed to create composition video track.")
87
- }
88
-
70
+ let sourceVideoTrack = try sourceVideoTrack(of: asset)
89
71
  let fullRange = CMTimeRange(start: .zero, duration: asset.duration)
90
- try compositionVideoTrack.insertTimeRange(fullRange, of: sourceVideoTrack, at: .zero)
91
-
92
- if let sourceAudioTrack = asset.tracks(withMediaType: .audio).first,
93
- let compositionAudioTrack = composition.addMutableTrack(
94
- withMediaType: .audio,
95
- preferredTrackID: kCMPersistentTrackID_Invalid
96
- ) {
97
- try? compositionAudioTrack.insertTimeRange(fullRange, of: sourceAudioTrack, at: .zero)
72
+ let composition = try makeRecordingComposition(
73
+ asset: asset,
74
+ videoTrack: sourceVideoTrack,
75
+ timeRange: fullRange
76
+ )
77
+ guard let compositionVideoTrack = composition.tracks(withMediaType: .video).first else {
78
+ throw RecordingScriptError.exportFailed("Failed to create composition video track.")
98
79
  }
99
80
 
100
81
  let renderSize = resolvedRenderSize(for: sourceVideoTrack)
@@ -145,36 +126,21 @@ func run() throws {
145
126
  in: parentLayer
146
127
  )
147
128
 
148
- // Overlay burn-in forces a full re-encode; medium quality keeps simulator videos readable
149
- // while avoiding very slow highest-quality exports. Pass --quality high to opt into
150
- // the slower highest-quality export.
151
- let presetName = exportPresetName(for: parsedArgs.exportQuality, compatibleWith: composition)
152
- guard let exporter = AVAssetExportSession(asset: composition, presetName: presetName) else {
153
- throw OverlayError.exportFailed("Failed to create export session.")
154
- }
155
129
 
156
- exporter.outputURL = outputURL
157
- exporter.outputFileType = .mp4
158
- exporter.videoComposition = videoComposition
159
- exporter.shouldOptimizeForNetworkUse = true
160
130
 
161
- let semaphore = DispatchSemaphore(value: 0)
162
- exporter.exportAsynchronously {
163
- semaphore.signal()
164
- }
165
- if semaphore.wait(timeout: .now() + 120) == .timedOut {
166
- exporter.cancelExport()
167
- throw OverlayError.exportFailed("Touch overlay export timed out.")
168
- }
169
-
170
- if exporter.status != .completed {
171
- throw OverlayError.exportFailed(exporter.error?.localizedDescription ?? "Touch overlay export failed.")
172
- }
173
- }
174
131
 
175
- enum ExportQuality: String {
176
- case medium
177
- case high
132
+ let presetName = exportPresetName(for: parsedArgs.exportQuality, compatibleWith: composition)
133
+ let exporter = try makeRecordingExporter(
134
+ composition,
135
+ presetName: presetName,
136
+ outputURL: outputURL,
137
+ videoComposition: videoComposition
138
+ )
139
+ try runRecordingExport(
140
+ exporter,
141
+ timeoutMessage: "Touch overlay export timed out.",
142
+ failureMessage: "Touch overlay export failed."
143
+ )
178
144
  }
179
145
 
180
146
  func parseArguments(
@@ -183,8 +149,8 @@ func parseArguments(
183
149
  var inputPath: String?
184
150
  var outputPath: String?
185
151
  var eventsPath: String?
186
- // Export quality defaults to medium so existing callers keep the fast, simulator-friendly
187
- // export. Pass --quality high to opt into a slower highest-quality export.
152
+
153
+
188
154
  var exportQuality: ExportQuality = .medium
189
155
  var index = 0
190
156
 
@@ -193,33 +159,28 @@ func parseArguments(
193
159
  let nextIndex = index + 1
194
160
  switch argument {
195
161
  case "--input":
196
- guard nextIndex < arguments.count else { throw OverlayError.invalidArgs("--input requires a value") }
197
- inputPath = arguments[nextIndex]
162
+ inputPath = try recordingOptionValue(arguments, nextIndex, "--input")
198
163
  index += 2
199
164
  case "--output":
200
- guard nextIndex < arguments.count else { throw OverlayError.invalidArgs("--output requires a value") }
201
- outputPath = arguments[nextIndex]
165
+ outputPath = try recordingOptionValue(arguments, nextIndex, "--output")
202
166
  index += 2
203
167
  case "--events":
204
- guard nextIndex < arguments.count else { throw OverlayError.invalidArgs("--events requires a value") }
205
- eventsPath = arguments[nextIndex]
168
+ eventsPath = try recordingOptionValue(arguments, nextIndex, "--events")
206
169
  index += 2
207
170
  case "--quality":
208
- guard nextIndex < arguments.count else {
209
- throw OverlayError.invalidArgs("--quality requires a value")
210
- }
211
- guard let parsed = ExportQuality(rawValue: arguments[nextIndex]) else {
212
- throw OverlayError.invalidArgs("--quality must be one of: medium, high")
171
+ let rawValue = try recordingOptionValue(arguments, nextIndex, "--quality")
172
+ guard let parsed = ExportQuality(rawValue: rawValue) else {
173
+ throw RecordingScriptError.invalidArgs("--quality must be one of: medium, high")
213
174
  }
214
175
  exportQuality = parsed
215
176
  index += 2
216
177
  default:
217
- throw OverlayError.invalidArgs("Unknown argument: \(argument)")
178
+ throw RecordingScriptError.invalidArgs("Unknown argument: \(argument)")
218
179
  }
219
180
  }
220
181
 
221
182
  guard let inputPath, let outputPath, let eventsPath else {
222
- throw OverlayError.invalidArgs(
183
+ throw RecordingScriptError.invalidArgs(
223
184
  "Usage: recording-overlay.swift --input <video> --output <video> --events <json> [--quality <medium|high>]"
224
185
  )
225
186
  }
@@ -234,8 +195,8 @@ func exportPresetName(
234
195
  case .high:
235
196
  return AVAssetExportPresetHighestQuality
236
197
  case .medium:
237
- // Prefer the faster medium preset, falling back to highest quality only when medium is
238
- // not available for this composition.
198
+
199
+
239
200
  let compatible = AVAssetExportSession.exportPresets(compatibleWith: asset)
240
201
  return compatible.contains(AVAssetExportPresetMediumQuality)
241
202
  ? AVAssetExportPresetMediumQuality
@@ -1,102 +1,59 @@
1
1
  import AVFoundation
2
2
  import Foundation
3
3
 
4
- enum TrimError: Error, CustomStringConvertible {
5
- case invalidArgs(String)
6
- case invalidTrimRange
7
- case missingVideoTrack
8
- case exportFailed(String)
9
4
 
10
- var description: String {
11
- switch self {
12
- case .invalidArgs(let message):
13
- return message
14
- case .invalidTrimRange:
15
- return "Trim start must be before the end of the recording."
16
- case .missingVideoTrack:
17
- return "Input video does not contain a video track."
18
- case .exportFailed(let message):
19
- return message
5
+
6
+ @main
7
+ enum RecordingTrim {
8
+ static func main() {
9
+ do {
10
+ try run()
11
+ } catch {
12
+ fputs("recording-trim: \(error)\n", stderr)
13
+ exit(1)
20
14
  }
21
15
  }
22
16
  }
23
17
 
24
- do {
25
- try run()
26
- } catch {
27
- fputs("recording-trim: \(error)\n", stderr)
28
- exit(1)
29
- }
30
-
31
18
  func run() throws {
32
19
  let arguments = Array(CommandLine.arguments.dropFirst())
33
20
  let parsedArgs = try parseArguments(arguments)
34
21
  let inputURL = URL(fileURLWithPath: parsedArgs.inputPath)
35
22
  let outputURL = URL(fileURLWithPath: parsedArgs.outputPath)
36
23
 
37
- if FileManager.default.fileExists(atPath: outputURL.path) {
38
- try FileManager.default.removeItem(at: outputURL)
39
- }
24
+ try removeStaleOutput(outputURL)
40
25
 
41
26
  let asset = AVURLAsset(url: inputURL)
42
- guard let sourceVideoTrack = asset.tracks(withMediaType: .video).first else {
43
- throw TrimError.missingVideoTrack
44
- }
45
-
27
+ let videoTrack = try sourceVideoTrack(of: asset)
46
28
  let trimStart = CMTime(seconds: parsedArgs.trimStartMs / 1000.0, preferredTimescale: 600)
47
29
  guard CMTimeCompare(trimStart, asset.duration) < 0 else {
48
- throw TrimError.invalidTrimRange
30
+ throw RecordingScriptError.invalidTrimRange
49
31
  }
50
32
 
51
33
  let trimmedDuration = CMTimeSubtract(asset.duration, trimStart)
52
34
  guard CMTimeCompare(trimmedDuration, .zero) > 0 else {
53
- throw TrimError.invalidTrimRange
35
+ throw RecordingScriptError.invalidTrimRange
54
36
  }
55
37
 
56
- let composition = AVMutableComposition()
57
- let trimmedRange = CMTimeRange(start: trimStart, duration: trimmedDuration)
38
+ let composition = try makeRecordingComposition(
39
+ asset: asset,
40
+ videoTrack: videoTrack,
41
+ timeRange: CMTimeRange(start: trimStart, duration: trimmedDuration)
42
+ )
43
+ composition.tracks(withMediaType: .video).first?.preferredTransform = videoTrack.preferredTransform
58
44
 
59
- guard let compositionVideoTrack = composition.addMutableTrack(
60
- withMediaType: .video,
61
- preferredTrackID: kCMPersistentTrackID_Invalid
62
- ) else {
63
- throw TrimError.exportFailed("Failed to create composition video track.")
64
- }
65
- try compositionVideoTrack.insertTimeRange(trimmedRange, of: sourceVideoTrack, at: .zero)
66
- compositionVideoTrack.preferredTransform = sourceVideoTrack.preferredTransform
67
45
 
68
- if let sourceAudioTrack = asset.tracks(withMediaType: .audio).first,
69
- let compositionAudioTrack = composition.addMutableTrack(
70
- withMediaType: .audio,
71
- preferredTrackID: kCMPersistentTrackID_Invalid
72
- ) {
73
- try? compositionAudioTrack.insertTimeRange(trimmedRange, of: sourceAudioTrack, at: .zero)
74
- }
75
46
 
76
47
  let presetName = AVAssetExportSession.exportPresets(compatibleWith: composition)
77
48
  .contains(AVAssetExportPresetPassthrough)
78
49
  ? AVAssetExportPresetPassthrough
79
50
  : AVAssetExportPresetHighestQuality
80
- guard let exporter = AVAssetExportSession(asset: composition, presetName: presetName) else {
81
- throw TrimError.exportFailed("Failed to create export session.")
82
- }
83
-
84
- exporter.outputURL = outputURL
85
- exporter.outputFileType = .mp4
86
- exporter.shouldOptimizeForNetworkUse = true
87
-
88
- let semaphore = DispatchSemaphore(value: 0)
89
- exporter.exportAsynchronously {
90
- semaphore.signal()
91
- }
92
- if semaphore.wait(timeout: .now() + 120) == .timedOut {
93
- exporter.cancelExport()
94
- throw TrimError.exportFailed("Trim export timed out.")
95
- }
96
-
97
- if exporter.status != .completed {
98
- throw TrimError.exportFailed(exporter.error?.localizedDescription ?? "Trim export failed.")
99
- }
51
+ let exporter = try makeRecordingExporter(composition, presetName: presetName, outputURL: outputURL)
52
+ try runRecordingExport(
53
+ exporter,
54
+ timeoutMessage: "Trim export timed out.",
55
+ failureMessage: "Trim export failed."
56
+ )
100
57
  }
101
58
 
102
59
  func parseArguments(_ arguments: [String]) throws -> (inputPath: String, outputPath: String, trimStartMs: Double) {
@@ -110,29 +67,25 @@ func parseArguments(_ arguments: [String]) throws -> (inputPath: String, outputP
110
67
  let nextIndex = index + 1
111
68
  switch argument {
112
69
  case "--input":
113
- guard nextIndex < arguments.count else { throw TrimError.invalidArgs("--input requires a value") }
114
- inputPath = arguments[nextIndex]
70
+ inputPath = try recordingOptionValue(arguments, nextIndex, "--input")
115
71
  index += 2
116
72
  case "--output":
117
- guard nextIndex < arguments.count else { throw TrimError.invalidArgs("--output requires a value") }
118
- outputPath = arguments[nextIndex]
73
+ outputPath = try recordingOptionValue(arguments, nextIndex, "--output")
119
74
  index += 2
120
75
  case "--trim-start-ms":
121
- guard nextIndex < arguments.count else {
122
- throw TrimError.invalidArgs("--trim-start-ms requires a value")
123
- }
124
- guard let parsed = Double(arguments[nextIndex]), parsed >= 0 else {
125
- throw TrimError.invalidArgs("--trim-start-ms must be a non-negative number")
76
+ let rawValue = try recordingOptionValue(arguments, nextIndex, "--trim-start-ms")
77
+ guard let parsed = Double(rawValue), parsed >= 0 else {
78
+ throw RecordingScriptError.invalidArgs("--trim-start-ms must be a non-negative number")
126
79
  }
127
80
  trimStartMs = parsed
128
81
  index += 2
129
82
  default:
130
- throw TrimError.invalidArgs("Unknown argument: \(argument)")
83
+ throw RecordingScriptError.invalidArgs("Unknown argument: \(argument)")
131
84
  }
132
85
  }
133
86
 
134
87
  guard let inputPath, let outputPath, let trimStartMs else {
135
- throw TrimError.invalidArgs(
88
+ throw RecordingScriptError.invalidArgs(
136
89
  "Usage: recording-trim.swift --input <video> --output <video> --trim-start-ms <ms>"
137
90
  )
138
91
  }
@@ -0,0 +1,21 @@
1
+ // swift-tools-version: 5.9
2
+ import PackageDescription
3
+
4
+ let package = Package(
5
+ name: "agent-device-snapshot-presentation",
6
+ platforms: [
7
+ .iOS(.v15),
8
+ .macOS(.v13),
9
+ .tvOS(.v15),
10
+ .visionOS(.v1),
11
+ ],
12
+ products: [
13
+ .library(
14
+ name: "AgentDeviceSnapshotPresentation",
15
+ targets: ["AgentDeviceSnapshotPresentation"]
16
+ ),
17
+ ],
18
+ targets: [
19
+ .target(name: "AgentDeviceSnapshotPresentation"),
20
+ ]
21
+ )
@@ -0,0 +1,56 @@
1
+ import Foundation
2
+ import CoreGraphics
3
+
4
+ public enum SnapshotGeometry {
5
+ public static func effectiveFrame(
6
+ reportedFrame: CGRect,
7
+ viewport: CGRect,
8
+ ancestorClip: CGRect?
9
+ ) -> CGRect {
10
+ var frame = reportedFrame
11
+ if !viewport.isInfinite {
12
+ frame = clipped(frame, to: viewport)
13
+ }
14
+ if let ancestorClip {
15
+ frame = clipped(frame, to: ancestorClip)
16
+ }
17
+ return frame
18
+ }
19
+
20
+ public static func snapshotRect(from frame: CGRect, reportedFrame: CGRect) -> SnapshotRect {
21
+ guard !frame.isNull, !frame.isEmpty else {
22
+ return SnapshotRect(
23
+ x: Double(reportedFrame.minX),
24
+ y: Double(reportedFrame.minY),
25
+ width: 0,
26
+ height: 0
27
+ )
28
+ }
29
+ return SnapshotRect(
30
+ x: Double(frame.origin.x),
31
+ y: Double(frame.origin.y),
32
+ width: Double(max(0, frame.size.width)),
33
+ height: Double(max(0, frame.size.height))
34
+ )
35
+ }
36
+
37
+ public static func isGeometricallyActionable(
38
+ enabled: Bool,
39
+ frame: CGRect,
40
+ viewport: CGRect
41
+ ) -> Bool {
42
+ guard enabled, !frame.isNull, !frame.isEmpty else { return false }
43
+ if viewport.isInfinite { return true }
44
+ let center = CGPoint(x: frame.midX, y: frame.midY)
45
+ return viewport.contains(center)
46
+ }
47
+
48
+ private static func clipped(_ frame: CGRect, to clip: CGRect) -> CGRect {
49
+ guard !frame.isNull, !frame.isEmpty else { return frame }
50
+ let intersection = frame.intersection(clip)
51
+ guard !intersection.isNull, !intersection.isEmpty else {
52
+ return CGRect(x: frame.minX, y: frame.minY, width: 0, height: 0)
53
+ }
54
+ return intersection
55
+ }
56
+ }