agent-device 0.20.10 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +2 -2
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.apk → agent-device-android-ime-helper-0.21.1.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.manifest.json → agent-device-android-ime-helper-0.21.1.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.10.manifest.json → agent-device-android-snapshot-helper-0.21.1.manifest.json} +6 -6
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
  10. package/apple/snapshot-bridge/LICENSE.idb +23 -0
  11. package/apple/snapshot-bridge/README.md +106 -0
  12. package/apple/snapshot-bridge/SnapshotBridge.m +286 -0
  13. package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
  14. package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
  15. package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +34 -0
  16. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +411 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +677 -83
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +35 -92
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1058 -213
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +296 -14
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +309 -149
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +24 -17
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +124 -199
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +211 -78
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +30 -10
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +254 -24
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +465 -494
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +168 -0
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +802 -247
  49. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
  50. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +185 -0
  51. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
  52. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +83 -5
  53. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +156 -34
  54. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +5 -4
  55. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -318
  56. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
  57. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
  58. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
  59. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
  60. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +56 -23
  61. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +56 -27
  62. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +30 -24
  63. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +126 -80
  64. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
  65. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +47 -86
  66. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +32 -79
  67. package/dist/apple/snapshot-presentation/Package.swift +21 -0
  68. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
  69. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
  70. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
  71. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
  72. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
  73. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
  74. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
  75. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
  76. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
  77. package/dist/src/adapter.js +1 -0
  78. package/dist/src/adb-executor.js +2 -0
  79. package/dist/src/adb-failure.js +1 -0
  80. package/dist/src/adb-host.js +1 -0
  81. package/dist/src/adb.js +1 -0
  82. package/dist/src/agent-browser-lifecycle.js +1 -0
  83. package/dist/src/agent-browser-process-record.js +1 -0
  84. package/dist/src/agent-browser-provider.js +1 -0
  85. package/dist/src/agent-browser-tool.js +1 -1
  86. package/dist/src/agent-device-client.js +2 -2
  87. package/dist/src/ai-sdk.d.ts +2 -2
  88. package/dist/src/ai-sdk.js +1 -1
  89. package/dist/src/alert-contract.js +1 -0
  90. package/dist/src/alert-runtime.js +1 -0
  91. package/dist/src/android-adb.d.ts +27 -19
  92. package/dist/src/android-adb.js +1 -1
  93. package/dist/src/android-input-ownership.js +1 -0
  94. package/dist/src/android-system-chrome.js +1 -0
  95. package/dist/src/android.js +1 -1
  96. package/dist/src/api.js +11 -0
  97. package/dist/src/app-catalog.js +1 -0
  98. package/dist/src/app-deployment-resolution.js +2 -0
  99. package/dist/src/app-helpers.js +1 -1
  100. package/dist/src/app-inventory-contract.js +1 -0
  101. package/dist/src/app-inventory.js +1 -0
  102. package/dist/src/app-launch.js +2 -0
  103. package/dist/src/app-lifecycle-facade.js +1 -0
  104. package/dist/src/app-lifecycle.js +3 -6
  105. package/dist/src/app-lifecycle2.js +2 -2
  106. package/dist/src/app-lifecycle3.js +1 -0
  107. package/dist/src/app-log-files.js +1 -1
  108. package/dist/src/app-log-reconnect.js +1 -1
  109. package/dist/src/app-log-runtime.js +1 -4
  110. package/dist/src/app-log-runtime2.js +4 -0
  111. package/dist/src/app-parsers.js +4 -0
  112. package/dist/src/app-resolution-cache.js +1 -0
  113. package/dist/src/app-resolution-facade.js +1 -0
  114. package/dist/src/app-resolution.js +2 -2
  115. package/dist/src/app-state.js +1 -2
  116. package/dist/src/apple-runner-platform.js +1 -0
  117. package/dist/src/application-lifecycle-interaction.js +1 -0
  118. package/dist/src/application-lifecycle-runtime.js +1 -0
  119. package/dist/src/apps-simctl.js +1 -0
  120. package/dist/src/archive.js +4 -0
  121. package/dist/src/artifact-download.js +1 -0
  122. package/dist/src/artifacts.d.ts +6 -2
  123. package/dist/src/artifacts.js +1 -1
  124. package/dist/src/async-lifecycle.js +1 -0
  125. package/dist/src/audio-probe-result.js +1 -0
  126. package/dist/src/audio-probe-runtime.js +1 -0
  127. package/dist/src/audio-probe-support.js +1 -0
  128. package/dist/src/auth-session.js +1 -1
  129. package/dist/src/auth.js +1 -1
  130. package/dist/src/backend-snapshot-options.js +1 -1
  131. package/dist/src/{url.js → base-url.js} +1 -1
  132. package/dist/src/boot-diagnostics.js +2 -2
  133. package/dist/src/byte-limit-stream.js +1 -1
  134. package/dist/src/capabilities.js +1 -0
  135. package/dist/src/capture.js +1 -0
  136. package/dist/src/catalog.js +1 -0
  137. package/dist/src/cli-command-aliases.js +1 -0
  138. package/dist/src/cli-config.js +1 -1
  139. package/dist/src/cli-help.js +74 -51
  140. package/dist/src/cli-output.js +1 -1
  141. package/dist/src/cli-runner.js +1 -1
  142. package/dist/src/cli.js +4 -6
  143. package/dist/src/click-button.js +1 -0
  144. package/dist/src/client-metro-companion.js +1 -0
  145. package/dist/src/client-metro.js +1 -1
  146. package/dist/src/client-types.d.ts +280 -242
  147. package/dist/src/clipboard.js +1 -0
  148. package/dist/src/code-signature-cache.js +1 -0
  149. package/dist/src/code-signature.js +1 -0
  150. package/dist/src/color.js +1 -0
  151. package/dist/src/command-metadata.js +1 -1
  152. package/dist/src/command-schema.js +3 -3
  153. package/dist/src/command-surface.js +1 -1
  154. package/dist/src/command-tools.js +2 -2
  155. package/dist/src/command.js +1 -0
  156. package/dist/src/compatibility-policy.js +1 -0
  157. package/dist/src/config.js +1 -1
  158. package/dist/src/config2.js +1 -0
  159. package/dist/src/connection-runtime.js +1 -1
  160. package/dist/src/connection.js +5 -5
  161. package/dist/src/contracts.d.ts +1 -1
  162. package/dist/src/contracts.js +1 -1
  163. package/dist/src/daemon-client-lifecycle.js +1 -0
  164. package/dist/src/daemon-process.js +1 -0
  165. package/dist/src/daemon-registration.js +1 -0
  166. package/dist/src/daemon-shutdown-report.js +1 -1
  167. package/dist/src/daemon.js +2 -2
  168. package/dist/src/debug-symbols-facade.js +5 -0
  169. package/dist/src/deploy-result-target.js +1 -0
  170. package/dist/src/device-claim-inspection.js +1 -1
  171. package/dist/src/device-claim-rule.js +1 -0
  172. package/dist/src/device-input-state.d.ts +190 -3
  173. package/dist/src/device-inventory-context.js +1 -0
  174. package/dist/src/device-isolation.js +1 -0
  175. package/dist/src/device-release.js +1 -0
  176. package/dist/src/device-rotation.js +1 -0
  177. package/dist/src/device-selection-resolver.js +1 -0
  178. package/dist/src/device-session.js +1 -0
  179. package/dist/src/device.js +1 -1
  180. package/dist/src/device2.js +3 -2
  181. package/dist/src/diagnostics.js +3 -0
  182. package/dist/src/diagnostics2.js +1 -0
  183. package/dist/src/dispatch-resolve.js +1 -0
  184. package/dist/src/doctor-facade.js +1 -0
  185. package/dist/src/doctor-output.js +1 -0
  186. package/dist/src/doctor.js +1 -0
  187. package/dist/src/doctor2.js +1 -0
  188. package/dist/src/doctor3.js +1 -0
  189. package/dist/src/durable-resource.js +1 -0
  190. package/dist/src/entities.js +1 -1
  191. package/dist/src/error.js +2 -0
  192. package/dist/src/exec.js +1 -0
  193. package/dist/src/file.js +1 -0
  194. package/dist/src/find.js +1 -1
  195. package/dist/src/finders.js +1 -1
  196. package/dist/src/generic-settle.js +1 -1
  197. package/dist/src/generic.js +1 -1
  198. package/dist/src/gesture-admission.js +1 -0
  199. package/dist/src/gesture-plan-types.js +1 -0
  200. package/dist/src/gesture-plan.js +1 -0
  201. package/dist/src/gesture-runtime.js +1 -0
  202. package/dist/src/harmonyos.js +1 -1
  203. package/dist/src/hdc.js +1 -1
  204. package/dist/src/helper.js +2 -2
  205. package/dist/src/host-file.js +1 -0
  206. package/dist/src/human-control-contract.js +1 -0
  207. package/dist/src/human-control.js +1 -0
  208. package/dist/src/index.d.ts +1 -1
  209. package/dist/src/index.js +1 -1
  210. package/dist/src/input-actions.js +1 -4
  211. package/dist/src/input-actions2.js +2 -1
  212. package/dist/src/install-artifact-facade.js +1 -0
  213. package/dist/src/install-source-network-transport.js +1 -0
  214. package/dist/src/install-source.d.ts +3 -10
  215. package/dist/src/install-source2.js +1 -1
  216. package/dist/src/interaction-positionals.js +1 -0
  217. package/dist/src/interaction-ref-policy.js +1 -0
  218. package/dist/src/interaction.js +1 -1
  219. package/dist/src/interaction2.js +1 -1
  220. package/dist/src/interactor-operation-catalog.js +1 -0
  221. package/dist/src/interactor-types.js +1 -0
  222. package/dist/src/interactor.js +6 -2
  223. package/dist/src/interactor2.js +1 -1
  224. package/dist/src/interactors.js +1 -1
  225. package/dist/src/internal/bin.d.ts +1 -1
  226. package/dist/src/internal/bin.js +1 -2
  227. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  228. package/dist/src/internal/companion-tunnel.js +1 -1
  229. package/dist/src/internal/daemon.d.ts +1 -1
  230. package/dist/src/internal/daemon.js +2 -4
  231. package/dist/src/internal/png-worker.d.ts +4 -4
  232. package/dist/src/internal/png-worker.js +1 -1
  233. package/dist/src/internal/run-script-http-child.d.ts +4 -0
  234. package/dist/src/internal/run-script-http-child.js +1 -0
  235. package/dist/src/internal/update-check-entry.d.ts +1 -1
  236. package/dist/src/inventory.js +4 -4
  237. package/dist/src/inventory2.js +1 -1
  238. package/dist/src/inventory3.js +1 -1
  239. package/dist/src/inventory5.js +1 -1
  240. package/dist/src/inventory6.js +1 -1
  241. package/dist/src/ios-client.js +16 -0
  242. package/dist/src/ios-snapshot-acquisition.js +1 -0
  243. package/dist/src/ios-snapshot-adapter.js +1 -0
  244. package/dist/src/ios-snapshot-planning.js +1 -0
  245. package/dist/src/ios-snapshot-runtime.js +1 -0
  246. package/dist/src/ios-system-surface.js +1 -0
  247. package/dist/src/json.js +1 -0
  248. package/dist/src/keyboard-actions.js +1 -0
  249. package/dist/src/launch-console.js +1 -0
  250. package/dist/src/lease-context.js +1 -1
  251. package/dist/src/lease-scope.js +1 -0
  252. package/dist/src/lease.js +1 -1
  253. package/dist/src/limrun-runtime-dependencies.js +1 -1
  254. package/dist/src/limrun.d.ts +1610 -7
  255. package/dist/src/limrun.js +1 -1
  256. package/dist/src/linux.js +1 -1
  257. package/dist/src/local-interactor-operation-set.js +1 -0
  258. package/dist/src/location-coordinates.js +1 -1
  259. package/dist/src/logcat.js +1 -1
  260. package/dist/src/macos-facade.js +1 -0
  261. package/dist/src/managed-device-scope.js +1 -0
  262. package/dist/src/mechanics.js +19 -0
  263. package/dist/src/metro.d.ts +4 -2
  264. package/dist/src/metro.js +1 -1
  265. package/dist/src/metro2.js +1 -1
  266. package/dist/src/mobile-snapshot-semantics.js +1 -1
  267. package/dist/src/multitouch-support.js +1 -0
  268. package/dist/src/numeric.js +1 -0
  269. package/dist/src/observability.js +1 -1
  270. package/dist/src/observation.js +2 -0
  271. package/dist/src/open-target-resolution.js +1 -0
  272. package/dist/src/output-path.js +1 -1
  273. package/dist/src/owner-identity.js +3 -1
  274. package/dist/src/parameterized-recorded-fill.js +1 -0
  275. package/dist/src/parser.js +1 -1
  276. package/dist/src/perf-facade.js +2 -0
  277. package/dist/src/perf-process-identity.js +1 -0
  278. package/dist/src/perf-runtime-operation-builder.js +1 -0
  279. package/dist/src/perf-runtime-plan.js +1 -0
  280. package/dist/src/perf-runtime.js +1 -0
  281. package/dist/src/perf.js +1 -4
  282. package/dist/src/physical-device-control.js +1 -1
  283. package/dist/src/physical-device-facade.js +1 -0
  284. package/dist/src/platform-request-scope.js +1 -0
  285. package/dist/src/platform-runtime-android-adb-host.js +1 -0
  286. package/dist/src/platform-runtime-android-mechanics.js +1 -0
  287. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  288. package/dist/src/platform-runtime-app-log-process.js +1 -1
  289. package/dist/src/platform-runtime-host.js +1 -1
  290. package/dist/src/platform-runtime-managed-owner.js +1 -0
  291. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  292. package/dist/src/platform-runtime-open-target.js +1 -1
  293. package/dist/src/platform-runtime-operation-host.js +4 -4
  294. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  295. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  296. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  297. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  298. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  299. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  300. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  301. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  302. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
  303. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  304. package/dist/src/platform-runtime-unavailable.js +1 -0
  305. package/dist/src/platform-runtime.js +1 -1
  306. package/dist/src/platform-runtime2.js +1 -1
  307. package/dist/src/plist.js +1 -1
  308. package/dist/src/png-worker-contract.js +1 -1
  309. package/dist/src/prepare-kind.js +1 -0
  310. package/dist/src/process-exit.js +1 -1
  311. package/dist/src/process.js +1 -0
  312. package/dist/src/provider-device-runtime.js +1 -0
  313. package/dist/src/provider-session-ownership.js +2 -0
  314. package/dist/src/provider-webdriver.js +1 -1
  315. package/dist/src/provider.js +1 -1
  316. package/dist/src/providers.js +1 -0
  317. package/dist/src/proxy.js +2 -2
  318. package/dist/src/react-native-overlay.js +1 -0
  319. package/dist/src/react-native.js +1 -1
  320. package/dist/src/record-runtime.js +1 -1
  321. package/dist/src/record-trace.js +1 -1
  322. package/dist/src/rect-center.js +1 -0
  323. package/dist/src/register-builtins.js +1 -0
  324. package/dist/src/registry.js +40 -28
  325. package/dist/src/remote-config2.js +1 -1
  326. package/dist/src/replay-divergence.js +2 -0
  327. package/dist/src/replay.js +2 -2
  328. package/dist/src/reporting.js +8 -7
  329. package/dist/src/request-admission.js +1 -0
  330. package/dist/src/request-cancel.js +1 -0
  331. package/dist/src/request-cancellation.js +1 -0
  332. package/dist/src/request-progress-protocol.js +1 -0
  333. package/dist/src/request-providers.js +1 -0
  334. package/dist/src/request-runtime-binding.js +1 -0
  335. package/dist/src/request.js +1 -0
  336. package/dist/src/result-serialization.js +1 -0
  337. package/dist/src/retry.js +1 -0
  338. package/dist/src/rolldown-runtime.js +1 -1
  339. package/dist/src/runner-cache-metadata.js +2 -0
  340. package/dist/src/runner-client.js +1 -1
  341. package/dist/src/runner-disposal.js +1 -1
  342. package/dist/src/runner-operations-facade.js +1 -0
  343. package/dist/src/runner-owner-facade.js +1 -0
  344. package/dist/src/runner-owner-state.js +1 -0
  345. package/dist/src/runner-presentation.js +1 -0
  346. package/dist/src/runner.js +1 -0
  347. package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
  348. package/dist/src/runtime.js +3 -3
  349. package/dist/src/runtime2.js +4 -4
  350. package/dist/src/runtime3.js +1 -1
  351. package/dist/src/runtime4.js +5 -3
  352. package/dist/src/runtime5.js +1 -1
  353. package/dist/src/runtime6.js +1 -1
  354. package/dist/src/runtime7.js +1 -1
  355. package/dist/src/runtime8.js +1 -1
  356. package/dist/src/runtime9.js +1 -1
  357. package/dist/src/scoped-provider.js +1 -1
  358. package/dist/src/screen-recording-completion.js +1 -0
  359. package/dist/src/screen-recording-live-handle.js +1 -0
  360. package/dist/src/screen-recording-options.js +1 -0
  361. package/dist/src/screen-recording-resource-recovery.js +1 -0
  362. package/dist/src/screen-recording-runtime.js +1 -0
  363. package/dist/src/screenshot-density.js +1 -1
  364. package/dist/src/screenshot-result.js +1 -6
  365. package/dist/src/screenshot-runtime.js +1 -0
  366. package/dist/src/screenshot.js +1 -1
  367. package/dist/src/screenshot2.js +1 -0
  368. package/dist/src/screenshot3.js +5 -0
  369. package/dist/src/script.js +1 -0
  370. package/dist/src/scroll-command.js +1 -0
  371. package/dist/src/scroll-gesture.js +1 -0
  372. package/dist/src/scroll-indicator.js +1 -0
  373. package/dist/src/sdk-batch-runner.d.ts +23 -6
  374. package/dist/src/sdk-batch-runner.js +2 -3
  375. package/dist/src/sdk-batch.js +2 -0
  376. package/dist/src/sdk-contracts.d.ts +170 -41
  377. package/dist/src/sdk-contracts.js +2 -2
  378. package/dist/src/sdk-device.js +1 -1
  379. package/dist/src/sdk-finders.d.ts +1 -1
  380. package/dist/src/sdk-finders.js +1 -1
  381. package/dist/src/sdk-io.js +1 -1
  382. package/dist/src/sdk-remote-config.d.ts +1 -1
  383. package/dist/src/sdk-remote-config.js +1 -1
  384. package/dist/src/sdk-selectors.d.ts +524 -140
  385. package/dist/src/sdk-selectors.js +1 -1
  386. package/dist/src/selection.js +1 -0
  387. package/dist/src/selector-runtime.js +1 -1
  388. package/dist/src/selectors.js +1 -1
  389. package/dist/src/semantic-index.js +1 -0
  390. package/dist/src/server.js +4 -4
  391. package/dist/src/session-allocation.js +1 -0
  392. package/dist/src/session-artifact-paths.js +1 -0
  393. package/dist/src/session-observation.js +1 -0
  394. package/dist/src/session-paths.js +1 -0
  395. package/dist/src/session-repair-tombstone.js +1 -0
  396. package/dist/src/session-routing.js +1 -0
  397. package/dist/src/session-runtime-admission.js +1 -0
  398. package/dist/src/session-snapshot.js +1 -0
  399. package/dist/src/session-store.js +4 -0
  400. package/dist/src/session-target-evidence.js +1 -1
  401. package/dist/src/session2.js +5 -27
  402. package/dist/src/settings.js +1 -0
  403. package/dist/src/shared.js +2 -2
  404. package/dist/src/simctl-facade.js +1 -0
  405. package/dist/src/simctl.js +1 -1
  406. package/dist/src/simulator-facade.js +1 -0
  407. package/dist/src/simulator.js +1 -1
  408. package/dist/src/snapshot-capture-annotations.js +1 -0
  409. package/dist/src/snapshot-desktop-projection.js +1 -0
  410. package/dist/src/snapshot-diagnostics.js +1 -0
  411. package/dist/src/snapshot-process.js +1 -0
  412. package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
  413. package/dist/src/snapshot-quality-verdict.js +1 -0
  414. package/dist/src/snapshot-runtime-binding.js +1 -0
  415. package/dist/src/snapshot-runtime.js +1 -1
  416. package/dist/src/snapshot-scope.js +1 -1
  417. package/dist/src/snapshot-state.js +1 -0
  418. package/dist/src/snapshot.js +1 -8
  419. package/dist/src/snapshot2.js +1 -1
  420. package/dist/src/snapshot3.js +1 -1
  421. package/dist/src/snapshot4.js +1 -0
  422. package/dist/src/src.js +1 -1
  423. package/dist/src/src2.js +1 -1
  424. package/dist/src/src3.js +1 -2
  425. package/dist/src/src4.js +1 -1
  426. package/dist/src/src5.js +1 -0
  427. package/dist/src/src6.js +1 -0
  428. package/dist/src/src7.js +2 -0
  429. package/dist/src/src8.js +115 -0
  430. package/dist/src/startup-recovery-fence.js +1 -0
  431. package/dist/src/status-markers.js +1 -0
  432. package/dist/src/string-enum.js +1 -1
  433. package/dist/src/success-text.js +1 -0
  434. package/dist/src/surface-snapshot.js +1 -0
  435. package/dist/src/surface-snapshot2.js +1 -0
  436. package/dist/src/takeover.js +5 -0
  437. package/dist/src/tool-provider-facade.js +1 -0
  438. package/dist/src/tool-provider.js +4 -3
  439. package/dist/src/tool-provider2.js +1 -1
  440. package/dist/src/tool-provider3.js +1 -1
  441. package/dist/src/toolchain-probe.js +2 -0
  442. package/dist/src/touch-reference-frame.js +1 -0
  443. package/dist/src/touch-runtime.js +1 -0
  444. package/dist/src/transport.js +3 -0
  445. package/dist/src/tree.js +1 -0
  446. package/dist/src/ttl-memo.js +1 -0
  447. package/dist/src/tv-remote.js +1 -0
  448. package/dist/src/type-text-runtime.js +1 -0
  449. package/dist/src/undici.js +99 -0
  450. package/dist/src/update-check.js +1 -1
  451. package/dist/src/verified-file.js +1 -1
  452. package/dist/src/version.js +1 -1
  453. package/dist/src/video.js +2 -2
  454. package/dist/src/web.js +2 -1
  455. package/dist/src/web2.js +1 -0
  456. package/dist/src/webdriver-ios-snapshot.js +1 -0
  457. package/dist/src/webdriver-source.js +1 -0
  458. package/dist/src/window-state.js +1 -0
  459. package/linux/atspi-dump.py +54 -9
  460. package/package.json +58 -35
  461. package/server.json +9 -3
  462. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
  463. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
  464. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
  465. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
  466. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
  467. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
  468. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
  469. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
  470. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
  471. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
  472. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
  473. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
  474. package/dist/src/appearance.js +0 -1
  475. package/dist/src/apps.js +0 -5
  476. package/dist/src/audio-probe.js +0 -1
  477. package/dist/src/cli-grammar.js +0 -1
  478. package/dist/src/command-catalog.js +0 -1
  479. package/dist/src/debug-symbols.js +0 -5
  480. package/dist/src/device-input-state.js +0 -2
  481. package/dist/src/device-ready.js +0 -1
  482. package/dist/src/dispatch.js +0 -1
  483. package/dist/src/handler-utils.js +0 -1
  484. package/dist/src/helper-package-install.js +0 -1
  485. package/dist/src/host-process.js +0 -3
  486. package/dist/src/ime-lifecycle.js +0 -2
  487. package/dist/src/ime-recovery-marker.js +0 -1
  488. package/dist/src/input-actions3.js +0 -1
  489. package/dist/src/install-artifact.js +0 -1
  490. package/dist/src/install-artifact2.js +0 -1
  491. package/dist/src/interaction-common.js +0 -1
  492. package/dist/src/interaction-runtime.js +0 -1
  493. package/dist/src/interaction-snapshot.js +0 -1
  494. package/dist/src/manifest.js +0 -1
  495. package/dist/src/method-scope.js +0 -1
  496. package/dist/src/png-resize.js +0 -1
  497. package/dist/src/process-lock.js +0 -1
  498. package/dist/src/runner-lease.js +0 -1
  499. package/dist/src/runner-sequence.js +0 -1
  500. package/dist/src/script-source-bundle.js +0 -16
  501. package/dist/src/sdk-android-adb.d.ts +0 -245
  502. package/dist/src/sdk-android-adb.js +0 -4
  503. package/dist/src/sdk.js +0 -1
  504. package/dist/src/setting-state.js +0 -1
  505. package/dist/src/shell-quote.js +0 -1
  506. package/dist/src/snapshot-session.js +0 -1
  507. package/dist/src/timing-safe-equal.js +0 -1
  508. package/dist/src/unsupported-interactor.js +0 -1
  509. package/dist/src/verdict.js +0 -1
  510. /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
@@ -1 +1 @@
1
- import{E as e,_ as t,h as n,s as r,v as i}from"./sdk-contracts.js";import{Kn as a,S as o,h as s,m as c,p as l}from"./sdk-batch-runner.js";import{_ as u,l as d,s as f}from"./sdk-device.js";import{Pt as p,st as m,yn as h}from"./script-source-bundle.js";import{A as ee,D as g,E as te,G as ne,I as re,P as ie,T as _,U as ae,W as oe,x as se}from"./interaction.js";import{L as ce,Q as v}from"./screenshot-result.js";import{n as y}from"./command-catalog.js";import{n as le,t as ue}from"./verdict.js";import{i as de}from"./runtime.js";import{A as b}from"./sdk-android-adb.js";import{t as fe}from"./timeouts.js";import{j as pe}from"./runner-disposal.js";import{o as me}from"./interactors.js";import{a as x,o as S,s as C,t as he,u as w}from"./dispatch.js";import{Ct as ge,Mt as _e,St as ve,bt as ye,ht as T,lt as E,mt as be,pt as D,ut as xe,yt as Se}from"./internal/daemon.js";import{C as O,S as Ce,_ as we,c as Te,d as Ee,f as De,g as Oe,h as ke,l as Ae,n as je,p as Me,r as Ne,v as Pe,x as k,y as Fe}from"./selector-runtime.js";import{t as A}from"./interaction-runtime.js";import{t as j}from"./interaction-snapshot.js";import{n as M,r as Ie,t as N}from"./interaction-common.js";function Le(e){let n=e.flags?.recordAs;if(n!==void 0){if(ce(n),e.flags?.noRecord)throw new t(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!v(e.session)&&!e.replayPlanStep)throw new t(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}function P(e){try{return F(e),null}catch(e){if(e instanceof t)return x(e.code,e.message,e.details);throw e}}function F(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,r=Se({session:e.session,refBody:n,mintedGeneration:e.mintedGeneration});if(r.admitted)return;let i=ge(e.session);throw new t(`COMMAND_FAILED`,ze(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:ve(e.session),scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??Re})}const Re=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function ze(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}async function I(e,t){if(!_e(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){b({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function L(e,t){return!d(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:x(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Be=new Set(s());function Ve(e){return Ue({fields:He(e.command),input:e.input??{},data:e.data,controlledFields:Be})}function He(e){let t=o(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Ue(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}const We=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function Ge(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!We.has(e)))}function R(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=qe(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ke({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...h(o)})}function Ke(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function qe(e,t,n){let r=z(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Je(t,n),a=Ye(e);if(a)return Ze(a,e??{},i);if(i)return Xe(e,i)}function z(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Je(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ye(e){let t=z(e,`ref`);return t===void 0?z(e,`selector`):`@${t}`}function Xe(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:e?.gesture===`hover`?`Hovered${t}`:`Tapped${t}`}function Ze(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:t.gesture===`hover`?`Hovered ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}const Qe={source:`direct-ios`,kind:`not-observed`};function B(e,t){if(!$e(e))return t;let{resolution:n,...r}=t;return r}function $e(e){return e.maestroCoordinateFallbackDispatched===!0}function V(e){return H({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function H(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...B(t,{resolution:t.kind===`runner-payload`?Qe:t.resolution}),...r??{}};return{result:R({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:R({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...B(t,Oe(i)),...nt(i.settle,e.settleRefsGeneration),...r??{}},o=R({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...tt(i)}}),s=R({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=rt(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...et(i)}}function et(e){let t=U(e)?.node??(`node`in e?e.node:void 0),n=`preActionNodes`in e?e.preActionNodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function tt(e){let t=U(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function U(e){return`recordingTarget`in e?e.recordingTarget:void 0}function nt(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function rt(e,t){return t?e?`${e} ${t}`:t:e}async function it(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Ie({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):M(n.snapshot?.nodes??[]);return H({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:D(n,r.settle)})}function W(e){let t=f(e.session.device.platform)?Ge(e.data):e.data;return e.command?Ve({command:e.command,input:e.flags,data:t}):t}function at(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function G(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function K(e){return[String(e.x),String(e.y)]}function ot(e,n){if(n.code!==`AMBIGUOUS_MATCH`)return n;let r=p(n.details);return r.length===0||e.snapshotGeneration===void 0?n:(be(e,r),new t(n.code,n.message,{...n.details,refsGeneration:e.snapshotGeneration},n.cause))}async function q(e){if(!st(e))return;let t=lt(e.session.snapshot);if(!t)return;let n=await ut(e,t.snapshot.snapshotQuality,t.presentation);if(!(!n||!dt(t.snapshot,n,e.command)))return ft(t.snapshot,n,e.command)}function st(e){return ct(e.command)&&i(e.error).code===`XCTEST_RECORDED_FAILURE`&&De(e.session,{skipPendingPostGestureStabilization:!1})}function ct(e){return e===`click`||e===`press`}function lt(e){if(!J(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){b({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=pt(e.presentationKey);if(n){if(n.raw){b({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function ut(e,t,n){try{let r=le(t);return await e.captureSnapshotForSession(e.session,vt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:pe(e.requestId)})}catch(t){b({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function dt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(b({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey?!0:(b({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function ft(e,t,n){if(!J(t))return;let r=m(e.nodes),i=m(t.nodes);if(r.digest!==i.digest)return b({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function J(e){return!!(e&&e.nodes.length>0&&!ue(e.snapshotQuality))}function pt(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return mt(t)}function mt(e){let t=ht(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!gt(t.depth)||!_t(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function ht(e){return typeof e==`object`&&e?e:void 0}function gt(e){return e==null||typeof e==`number`}function _t(e){return e==null||typeof e==`string`}function vt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function yt(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function bt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await E({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=P({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning});if(t)return{aborted:!0,response:t}}let a=await r();return await E({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function Y(e,t){let n=e.sessionStore.get(e.sessionName);if(!n)return S();let r=A(e),a=Date.now();try{let i,o=await bt(n,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(r);return i=await t.afterRun?.(e),e});if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...i?[i]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return N({session:n,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:wt(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(r){let o=ot(n,i(r));if(Ae(o))throw o;return o.code===`AMBIGUOUS_MATCH`?X(o):await xt({error:o,handlerParams:e,session:n,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||X(o)}}async function xt(e){if(!e.target)return;let t=de(e.error);if(!t&&v(e.session))return;let n=await q({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=St({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:M(e.session.snapshot?.nodes??[]),extra:e.extra});return N({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function St(e){return e.resolvedTarget?H({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):V({targetKind:e.target.kind,point:Ct(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...yt(e.target),...e.extra??{}}})}function Ct(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function X(t){return{ok:!1,error:e(t)}}function wt(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?K(t.point):void 0}async function Tt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=L(i,`fill`);if(e)return e;let t=C(`fill`,i.device);if(t)return t}if(!i)return S();Le({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=O(`fill`,t.flags);if(a)return a;let o=we(t.positionals??[]);if(!o.ok)return o.response;let s=await Et(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return await Y(e,{refContext:o.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0?{ref:o.target.ref,mintedGeneration:o.refGeneration,staleRefsWarning:c}:void 0,run:async e=>await e.interactions.fill(o.target,o.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:k(t.flags),expectedResolvedTarget:l,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>Dt({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function Et(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?T({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:P({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await I(e,t),{staleRefsWarning:i})}function Dt(e){let{session:t,result:n}=e,r=G(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:M(t.snapshot?.nodes??[]);return H({source:{kind:`runtime`,result:n,publicData:W({session:t,command:`fill`,flags:e.flags,data:n.backendResult}),maestroCoordinateFallbackDispatched:r.used},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:D(t,n.settle)})}async function Ot(e,t,n){return await kt({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function kt(t){let{params:n,session:r,selector:i,command:a,positionals:o,extra:s,fallbackPhase:c}=t,l=Date.now();ye(r);try{let e=await he(r.device,a,o,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,r.appBundleId,r.trace?.outPath),directElementSelector:i,surface:r.surface})??{},t=Date.now(),c=jt(e),u=W({session:r,command:at(n.req.command,a),flags:n.req.flags,data:e}),d=G(i.allowNonHittableCoordinateFallback===!0,e),{result:f,responseData:p}=H({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:u,point:c,maestroCoordinateFallbackDispatched:d.used},referenceFrame:Mt(e),extra:{...s,...d.extra}});return N({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:K(c),flags:n.req.flags,result:f,responseData:p,actionStartedAt:l,actionFinishedAt:t})}catch(t){return await At({error:t,handlerParams:n,session:r,extra:s,positionals:o,actionStartedAt:l})||(Ee(t,{delegateSemanticFailures:i.allowNonHittableCoordinateFallback!==!0})?(b({level:`debug`,phase:c,data:{selector:i.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)})}}async function At(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await q({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=V({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return N({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function jt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Mt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Nt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return n!==`click`||r.kind!==`selector`||v(t)||It(i)||c(n)&&i?.verify===!0||l(n)&&i?.settle===!0?null:Pt(t,r.selector,i)}function Pt(e,t,n){let r=Me({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const Ft=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function It(e){return Ft.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}const Lt=new Set([`press`,`click`]);async function Rt(e,t){let{req:n,sessionStore:r,sessionName:i}=e,a=r.get(i);if(!a)return{response:S()};let o=t===`click`?`click`:t,s=zt(a,t,o,n.flags);if(s)return{response:s};let c=n.positionals??[],l=t===`longpress`?Pe(c):Fe(c,o);if(!l.ok)return{response:l.response};let u=Vt(a,n,l),d=await Ut(e,a,t,l,u);if(d.response)return{response:d.response};let f=ne(n.flags);return{admitted:{session:a,commandLabel:o,clickButton:f,resultButtonTag:ae(f),target:l.target,durationMs:t===`longpress`?l.durationMs:void 0,staleRefsWarning:u,androidFreshnessBaseline:d.androidFreshnessBaseline,refContext:Ht(n,l,u)}}}function zt(e,t,n,r){let i=t===`click`?`press`:t;return L(e,n)||C(i,e.device,t===`hover`?{message:`hover is not supported on this device: hover is a pointer state that only web targets have (--platform web). Touch platforms have no hover; use longpress for hold gestures.`}:void 0)||O(t,r)||Bt(e,t,n,r)}function Bt(e,t,n,r){let i=ne(r);if(!Lt.has(t)||i===`primary`)return;let a=oe({commandLabel:n,platform:u(e.device),button:i,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(a)return x(a.code,a.message,a.details)}function Vt(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return T({session:e,ref:n.target.ref,mintedGeneration:n.refGeneration})}function Ht(e,t,n){if(t.target.kind===`ref`&&e.internal?.findResolvedTarget===void 0)return{ref:t.target.ref,mintedGeneration:t.refGeneration,staleRefsWarning:n}}async function Ut(e,t,n,r,i){let{req:a}=e;if(r.target.kind!==`ref`)return{};let o=e.refSnapshotFlagGuardResponse(n===`click`?`press`:n,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:P({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i});return s?{response:s}:{androidFreshnessBaseline:await I(e,t)}}async function Z(e,t){let n=await Rt(e,t);if(`response`in n)return n.response;let{admitted:r}=n,i=e.req.internal?.replayTargetGuard?null:Nt({session:r.session,commandLabel:r.commandLabel,target:r.target,flags:e.req.flags});if(i){let t=await Ot(e,r.session,i);if(t)return t}return await Y(e,Wt(e,t,r))}function Wt(e,t,n){let{req:r,sessionName:i}=e,{session:a,target:o,durationMs:s,staleRefsWarning:c,resultButtonTag:l}=n,u=t===`longpress`?{...s===void 0?{}:{durationMs:s},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l;return{androidFreshnessBaseline:n.androidFreshnessBaseline,refContext:n.refContext,iosTapCorroboration:{target:o,extra:u},run:async e=>await Gt({runtime:e,command:t,target:o,sessionName:i,requestId:r.meta?.requestId,clickButton:n.clickButton,flags:r.flags,durationMs:s,expectedResolvedTarget:r.internal?.replayTargetGuard,preresolvedTarget:r.internal?.findResolvedTarget}),afterRun:async e=>{if(!a.lease?.leaseProvider)return await Te(a,ke(o,e))},buildPayloads:async n=>{let i=Kt(n);return await it({params:e,session:a,result:n,staleRefsWarning:c,publicData:W({session:a,command:t===`longpress`||t===`hover`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l})}}}async function Gt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c={session:i,requestId:a,settle:k(o),expectedResolvedTarget:s};switch(n){case`longpress`:return await t.interactions.longPress(r,{...c,durationMs:e.durationMs});case`hover`:return await t.interactions.hover(r,c);case`click`:return await t.interactions.click(r,Q(e,c));case`press`:return await t.interactions.press(r,Q(e,c))}}function Q(e,t){let{flags:n}=e;return{...t,button:e.clickButton,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap,verify:n?.verify,preresolvedTarget:e.preresolvedTarget}}function Kt(e){return`durationMs`in e?e.durationMs:void 0}async function qt(e){switch(e.req.command){case`press`:return await Z(e,`press`);case`click`:return await Z(e,`click`);case`longpress`:return await Z(e,`longpress`);case`hover`:return await Z(e,`hover`);case`fill`:return await Tt(e);default:return null}}function $(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}async function Jt(e){return await en(e,`gesture`,async t=>Yt(e,t))}async function Yt(e,t){let n=ee(e.req.input),r=nn(n,t);return r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile),w(r,t.device),Zt(n,r,await Xt($t(e),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags)}async function Xt(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function Zt(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:an(e,i),flags:fn(e,r),responseData:$(n,{executionProfile:tn(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function Qt(e){return await en(e,`swipe`,async t=>{let n=on(e.req.input);w(g(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await un($t(e),e,n,r,i,a);return{positionals:ln(n),flags:e.req.flags,responseData:$(o,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:o.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:r,pauseMs:i,pattern:a})}})}function $t(e){return A({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function en(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return S();let a=Date.now();try{let e=me(i.device),o=e?{status:`clear`}:await E({session:i,command:n,phase:`before-command`}),s=await r(i);e||await E({session:i,command:n,phase:`after-command`});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),N({session:i,sessionStore:t.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(t){return{ok:!1,error:e(t)}}}function tn(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function nn(e,t){let n=te(e);return n.intent===`drag`?{...n,source:rn(n.source,t),destination:rn(n.destination,t)}:n}function rn(e,i){if(!e.startsWith(`@`))return e;let a=n(e);if(!a)throw new t(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:r});return F({session:i,ref:a.base,mintedGeneration:a.generation}),a.base}function an(e,t){return e.kind!==`drag`||!t?_(e):_({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function on(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);se(e);let n=e,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new t(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:cn(n.from,`swipe from`),to:cn(n.to,`swipe to`),count:a(n,`count`,{min:1,max:200}),pauseMs:a(n,`pauseMs`,{min:0,max:ie}),pattern:r};return sn(i),i}function sn(e){let n=e.count??1,r=e.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new t(`INVALID_ARGS`,`Swipe series must fit within ${re}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function cn(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a point`);let r=e;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new t(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new t(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function ln(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function un(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=g(dn(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await fe(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function dn(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function fn(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function pn(e){let t=await qt({...e,captureSnapshotForSession:j,refSnapshotFlagGuardResponse:Ce});if(t)return t;switch(e.req.command){case y.gesture:return await Jt({...e,captureSnapshotForSession:j});case y.swipe:return await Qt({...e,captureSnapshotForSession:j});case y.type:return await mn({...e,captureSnapshotForSession:j});case`get`:return await je(e);case`is`:return await Ne(e);default:return null}}async function mn(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?C(y.type,r.device)||await hn(r)||await gn(e,r):S()}async function hn(e){return e.device.platform===`android`&&e.screenRecording&&(await xe({session:e})).status===`failed`?x(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function gn(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=A(t),c=Date.now();try{let e=await E({session:n,command:r.command,phase:`before-command`}),t=await s.interactions.typeText(o,{session:i,requestId:r.meta?.requestId,delayMs:r.flags?.delayMs});await E({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...h(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),N({session:n,sessionStore:a,command:r.command,positionals:r.positionals??[],flags:r.flags,result:u,responseData:u,actionStartedAt:c,actionFinishedAt:l})}catch(t){return{ok:!1,error:e(t)}}}export{pn as handleInteractionCommands};
1
+ import{C as e,M as t,P as n,c as r,w as i,x as a}from"./sdk-contracts.js";import{f as o}from"./sdk-batch-runner.js";import{u as s,v as c}from"./sdk-device.js";import{S as l,f as u,m as d,p as f}from"./sdk-batch.js";import{a as p,s as ee}from"./scroll-gesture.js";import{C as m,E as te,S as ne,v as re,x as h}from"./script.js";import{N as ie,f as g}from"./parameterized-recorded-fill.js";import{h as ae,s as _}from"./runtime.js";import{n as v}from"./catalog.js";import{n as oe}from"./success-text.js";import{i as y,n as se,r as ce}from"./click-button.js";import{r as le,t as ue}from"./interaction-positionals.js";import{r as b}from"./diagnostics.js";import{t as de}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import"./gesture-plan.js";import{r as fe}from"./request-cancel.js";import"./request.js";import{r as pe}from"./provider-device-runtime.js";import{a as x,i as S}from"./request-runtime-binding.js";import{C as me,E as C,T as w,d as he,n as ge,r as T,t as _e,u as ve}from"./session-snapshot.js";import{n as E,t as ye}from"./touch-reference-frame.js";import{n as be,t as xe}from"./snapshot-quality-verdict.js";import{i as Se,r as D}from"./internal/daemon.js";import{a as Ce,c as we,i as O,l as Te,n as k,o as A,r as j,s as Ee,t as De}from"./interaction-ref-policy.js";import{t as M}from"./gesture-runtime.js";import{_ as N,d as Oe,f as ke,i as Ae,r as je}from"./selector-runtime.js";import{n as Me}from"./type-text-runtime.js";function Ne(t){let n=t.flags?.recordAs;if(n!==void 0){if(ie(n),t.flags?.noRecord)throw new e(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!t.isSessionRecording&&!t.replayPlanStep)throw new e(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}async function P(e,t){if(!me(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){b({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function F(e,t){return!s(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:S(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Pe=new Set(d()),Fe=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function I(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Fe.has(e)))}function Ie(e){return Re({fields:Le(e.command),input:e.input??{},data:I(e.data),controlledFields:Pe})}function Le(e){let t=l(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Re(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function ze(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a,observation:o}=e,s=t.screenRecording?.handle;if(!s)return;let c=s.inspect().touchReferenceFrame;if(c)return c;if(t.device.platform===`android`&&!t.lease?.leaseProvider&&!pe(t.device)){if(!o)throw Error(`Android observation was not injected into the request`);let e=await o.readScreenSize(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return s.setTouchReferenceFrame(n),n}let l=ye(t.snapshot);if(l)return s.setTouchReferenceFrame(l),l;let u=await a(t,n,r,i,{interactiveOnly:!0}),d=ye(u);return d&&s.setTouchReferenceFrame(d),d}async function Be(e){try{return await ze(e)}catch(t){b({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:e.session.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function L(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=He(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ve({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...oe(o)})}function Ve(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function He(e,t,n){let r=R(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Ue(t,n),a=We(e);if(a)return Ke(a,e??{},i);if(i)return Ge(e,i)}function R(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Ue(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function We(e){let t=R(e,`ref`);return t===void 0?R(e,`selector`):`@${t}`}function Ge(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:e?.gesture===`hover`?`Hovered${t}`:`Tapped${t}`}function Ke(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:t.gesture===`hover`?`Hovered ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}function z(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function B(e,t){let n=z(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=N(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:S(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function qe(e){let t=z(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...$e(e[2])};let n=Qe(e),r=B(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function V(e){return{ok:!1,response:S(`INVALID_ARGS`,`fill requires text after ${e} (use "" to clear the field)`)}}function Je(e){let t=Ye(e);if(!t)return{ok:!1,response:S(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)};switch(t.kind){case`ref`:{let n=N(e[0]??``);return n.ok?t.text===void 0?V(`ref`):{ok:!0,target:{kind:`ref`,ref:n.ref},refGeneration:n.generation,text:t.text}:{ok:!1,response:n.response}}case`point`:return t.text===void 0?V(`coordinates`):{ok:!0,target:{kind:`point`,x:t.target.x,y:t.target.y},text:t.text};case`selector`:return t.text===void 0||t.text.length>0&&!t.text.trim()?V(`selector`):{ok:!0,target:{kind:`selector`,selector:t.target.selector},text:t.text}}}function Ye(e){try{return ue(e)}catch{return null}}function Xe(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:le(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Ze(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function Qe(e){let t=e.at(-1);return e.length>1&&et(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function $e(e){return e===void 0?{}:{durationMs:Number(e)}}function et(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}const tt={source:`direct-ios`,kind:`not-observed`};function H(e,t){if(!nt(e))return t;let{resolution:n,...r}=t;return r}function nt(e){return`dispatchPath`in e&&e.dispatchPath===`maestro-non-hittable-fallback`}function U(e){return W({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function W(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...H(t,{resolution:t.kind===`runner-payload`?tt:t.resolution}),...r??{}};return{result:L({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:L({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...H(t,Xe(i)),...at(i.settle,e.settleRefsGeneration),...r??{}},o=L({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...it(i)}}),s=L({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=ot(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...rt(i)}}function rt(e){let t=G(e)?.node??(`node`in e?e.node:void 0),n=`preAction`in e?e.preAction?.nodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function it(e){let t=G(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function G(e){return`recordingTarget`in e?e.recordingTarget:void 0}function at(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function ot(e,t){return t?e?`${e} ${t}`:t:e}async function st(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Be({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession,observation:t.androidObservation}):E(n.snapshot?.nodes??[]);return W({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:_e(n,r.settle)})}function K(e){return e.command?Ie({command:e.command,input:e.flags,data:e.data}):I(e.data)}function ct(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function q(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function J(e){return[String(e.x),String(e.y)]}function lt(t){let{error:r,snapshotGeneration:i,publishPartialRefs:a}=t;if(r.code!==`AMBIGUOUS_MATCH`)return r;let o=n(r.details);return o.length===0||i===void 0?r:(a(o),new e(r.code,r.message,{...r.details,refsGeneration:i},r.cause))}async function ut(t,n,r){let i=await Oe(t,r);if(i){if(i.permissionDialog)return`press ${n} opened an Android permission dialog (${i.foregroundPackage}) over ${i.expectedPackage}. ${i.hint}`;throw new e(`COMMAND_FAILED`,`press ${n} left ${t.appBundleId} and foregrounded ${i.foregroundPackage}. The tap likely escaped the app.`,i)}}function dt(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}async function Y(e){if(!ft(e))return;let t=mt(e.session.snapshot);if(!t)return;let n=await ht(e,t.snapshot.snapshotQuality,t.presentation);if(!(!n||!gt(t.snapshot,n,e.command)))return yt(t.snapshot,n,e.command)}function ft(e){return pt(e.command)&&i(e.error).code===`XCTEST_RECORDED_FAILURE`&&we(e.session,{skipPendingPostGestureStabilization:!1})}function pt(e){return e===`click`||e===`press`}function mt(e){if(!X(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){b({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=bt(e.presentationKey);if(n){if(n.raw){b({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function ht(e,t,n){try{let r=be(t);return await e.captureSnapshotForSession(e.session,Tt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:fe(e.requestId)})}catch(t){b({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function gt(e,t,n){let r=_t(e,t);return r===void 0?vt(e,t,n):r?!0:(b({level:`debug`,phase:`ios_tap_failure_corroboration_identity_mismatch`,data:{command:n}}),!1)}function _t(e,t){if(e.comparisonKey!==void 0||t.comparisonKey!==void 0)return e.comparisonKey!==void 0&&e.comparisonKey===t.comparisonKey}function vt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(b({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey||(b({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function yt(e,t,n){if(!X(t))return;let r=_(e.nodes),i=_(t.nodes);if(r.digest!==i.digest)return b({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function X(e){return!!(e&&e.nodes.length>0&&!xe(e.snapshotQuality))}function bt(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return xt(t)}function xt(e){let t=St(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!Ct(t.depth)||!wt(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function St(e){return typeof e==`object`&&e?e:void 0}function Ct(e){return e==null||typeof e==`number`}function wt(e){return e==null||typeof e==`string`}function Tt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function Et(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function Dt(e,t,n,r,i){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let a=await D({session:e,command:t,phase:`before-command`,observation:i});if(n.refContext&&a.status===`recovered`){let t=k({ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning,frame:C({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration})});if(t)return{aborted:!0,response:t}}let o=await r();return await D({session:e,command:t,phase:`after-command`,observation:i}),{aborted:!1,readiness:a,runtimeResult:o}}async function Z(e,t){let n=e.sessionStore.get(e.sessionName);if(!n)return x();let r=Ce({...e,touchExecutor:t.touchExecutor}),a=Date.now();try{let i,o=await Dt(n,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(r);return i=await t.afterRun?.(e),e},e.androidObservation);if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...i?[i]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return A({session:n,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:Mt(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(r){let o=lt({error:i(r),snapshotGeneration:n.snapshotGeneration,publishPartialRefs:e=>ge(n,e)});if(dt(o))throw o;return o.code===`AMBIGUOUS_MATCH`?jt(o):await Ot({error:o,handlerParams:e,session:n,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||jt(o)}}async function Ot(e){if(!e.target)return;let t=ae(e.error);if(!t&&g(e.session))return;let n=await Y({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=kt({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:E(e.session.snapshot?.nodes??[]),extra:e.extra});return A({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function kt(e){return e.resolvedTarget?W({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):U({targetKind:e.target.kind,point:At(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...Et(e.target),...e.extra??{}}})}function At(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function jt(e){return{ok:!1,error:t(e)}}function Mt(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?J(t.point):void 0}async function Nt(e,t,n,r){let i=await he({device:t.device,command:n,requiresCapture:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?{ok:!0,touchExecutor:ve(i.runtime,e.contextFromFlags(e.req.flags,t.appBundleId,t.trace?.outPath))}:i}async function Pt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=F(i,`fill`);if(e)return e}if(!i)return x();let a=Je(t.positionals??[]);if(!a.ok)return a.response;let o=await Nt(e,i,`fill`,a.target.kind!==`point`);if(!o.ok)return o.response;let{touchExecutor:s}=o;Ne({flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0,isSessionRecording:g(i)});let c=O(`fill`,t.flags);if(c)return c;let l=await Ft(e,i,a.target,a.refGeneration);if(l.response)return l.response;let{staleRefsWarning:u}=l,d=t.internal?.replayTargetGuard;return await Z(e,{touchExecutor:s,refContext:a.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0?{ref:a.target.ref,mintedGeneration:a.refGeneration,staleRefsWarning:u}:void 0,run:async e=>await e.interactions.fill(a.target,a.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:j(t.flags),expectedResolvedTarget:d,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>It({session:i,result:e,text:a.text,flags:t.flags,staleRefsWarning:u})})}async function Ft(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?T({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:k({ref:n.ref,mintedGeneration:r,staleRefsWarning:i,frame:C({session:t,ref:n.ref,mintedGeneration:r})});return o?{response:o,staleRefsWarning:i}:(await P(e,t),{staleRefsWarning:i})}function It(e){let{session:t,result:n}=e,r=q(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:E(t.snapshot?.nodes??[]);return W({source:{kind:`runtime`,result:n,publicData:K({command:`fill`,flags:e.flags,data:n.backendResult}),...r.used?{dispatchPath:`maestro-non-hittable-fallback`}:{}},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:_e(t,n.settle)})}async function Lt(e,n,r,i){let a=e,o={selector:r.raw},s=Date.now();w(n);try{let e=await i(r)??{},t=Date.now(),c=zt(e),l=K({command:ct(a.req.command,`press`),flags:a.req.flags,data:e}),u=q(r.allowNonHittableCoordinateFallback===!0,e),{result:d,responseData:f}=W({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:l,point:c,dispatchPath:u.used?`maestro-non-hittable-fallback`:`maestro-direct-selector`},referenceFrame:Bt(e),extra:{...o,...u.extra}});return A({session:n,sessionStore:a.sessionStore,command:a.req.command,positionals:a.req.positionals??[],retryPositionals:J(c),flags:a.req.flags,result:d,responseData:f,actionStartedAt:s,actionFinishedAt:t})}catch(e){return await Rt({error:e,handlerParams:a,session:n,extra:o,positionals:[],actionStartedAt:s})||(Ee(e,{delegateSemanticFailures:r.allowNonHittableCoordinateFallback!==!0})?(b({level:`debug`,phase:`ios_direct_selector_tap_fallback`,data:{selector:r.raw,error:e instanceof Error?e.message:String(e)}}),null):{ok:!1,error:t(e)})}}async function Rt(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await Y({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=U({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return A({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function zt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Bt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Vt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return!e.tapElementSelectorAvailable||i?.maestro?.allowNonHittableCoordinateFallback!==!0||n!==`click`||r.kind!==`selector`||g(t)||Wt(i)||f(n)&&i?.verify===!0||u(n)&&i?.settle===!0?null:Ht(t,r.selector,i)}function Ht(e,t,n){let r=Te({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const Ut=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function Wt(e){return Ut.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}const Gt=new Set([`press`,`click`]);async function Kt(e,t){let{req:n,sessionStore:r,sessionName:i}=e,a=r.get(i);if(!a)return{response:x()};let o=t===`click`?`click`:t,s=qt(a,t,o,n.flags);if(s)return{response:s};let c=n.positionals??[],l=t===`longpress`?qe(c):B(c,o);if(!l.ok)return{response:l.response};let u=Yt(a,n,l),d=Zt(e,a,t,l,u);if(d.response)return{response:d.response};let f=y(n.flags);return{admitted:{session:a,commandLabel:o,clickButton:f,resultButtonTag:se(f),target:l.target,durationMs:t===`longpress`?l.durationMs:void 0,staleRefsWarning:u,refContext:Xt(n,l,u)}}}function qt(e,t,n,r){return F(e,n)||O(t,r)||Jt(e,t,n,r)}function Jt(e,t,n,r){let i=y(r);if(!Gt.has(t)||i===`primary`)return;let a=ce({commandLabel:n,platform:c(e.device),button:i,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(a)return S(a.code,a.message,a.details)}function Yt(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return T({session:e,ref:n.target.ref,mintedGeneration:n.refGeneration})}function Xt(e,t,n){if(t.target.kind===`ref`&&e.internal?.findResolvedTarget===void 0)return{ref:t.target.ref,mintedGeneration:t.refGeneration,staleRefsWarning:n}}function Zt(e,t,n,r,i){let{req:a}=e;if(r.target.kind!==`ref`)return{};let o=e.refSnapshotFlagGuardResponse(n===`click`?`press`:n,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:k({ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i,frame:C({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration})});return s?{response:s}:{}}async function Q(e,t){let n=await Kt(e,t);if(`response`in n)return n.response;let{admitted:r}=n,i=await Nt(e,r.session,t,r.target.kind!==`point`);if(!i.ok)return i.response;let{touchExecutor:a}=i,o=r.target.kind===`ref`?await P(e,r.session):void 0,s={...r,androidFreshnessBaseline:o},c=e.req.internal?.replayTargetGuard?null:Vt({session:s.session,commandLabel:s.commandLabel,target:s.target,flags:e.req.flags,tapElementSelectorAvailable:a.tapElementSelector!==void 0});if(c&&a.tapElementSelector){let t=await Lt(e,s.session,c,a.tapElementSelector);if(t)return t}return await Z(e,{...Qt(e,t,s),touchExecutor:a})}function Qt(e,t,n){let{req:r,sessionName:i}=e,{session:a,target:o,durationMs:s,staleRefsWarning:c,resultButtonTag:l}=n,u=t===`longpress`?{...s===void 0?{}:{durationMs:s},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l;return{androidFreshnessBaseline:n.androidFreshnessBaseline,refContext:n.refContext,iosTapCorroboration:{target:o,extra:u},run:async e=>await $t({runtime:e,command:t,target:o,sessionName:i,requestId:r.meta?.requestId,clickButton:n.clickButton,flags:r.flags,durationMs:s,expectedResolvedTarget:r.internal?.replayTargetGuard,preresolvedTarget:r.internal?.findResolvedTarget}),afterRun:async t=>{if(!a.lease?.leaseProvider)return await ut(a,Ze(o,t),e.androidObservation)},buildPayloads:async n=>{let i=tn(n);return await st({params:e,session:a,result:n,staleRefsWarning:c,publicData:K({command:t===`longpress`||t===`hover`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l})}}}async function $t(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c={session:i,requestId:a,settle:j(o),expectedResolvedTarget:s};switch(n){case`longpress`:return await t.interactions.longPress(r,{...c,durationMs:e.durationMs});case`hover`:return await t.interactions.hover(r,c);case`click`:return await t.interactions.click(r,en(e,c));case`press`:return await t.interactions.press(r,en(e,c))}}function en(e,t){let{flags:n}=e;return{...t,button:e.clickButton,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap,verify:n?.verify,preresolvedTarget:e.preresolvedTarget}}function tn(e){return`durationMs`in e?e.durationMs:void 0}function nn(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}function rn(e){return`refused`in e}async function an(e){return await un(e,`gesture`,async t=>on(e,t))}async function on(e,t){let n=te(e.req.input),r=fn(n,t);r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile);let i=await M({device:t.device,input:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?cn(n,r,await sn($(e,i.gestures),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags):{refused:i.response}}async function sn(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function cn(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:mn(e,i),flags:xn(e,r),responseData:nn(n,{executionProfile:dn(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function ln(e){return await un(e,`swipe`,async t=>{let n=hn(e.req.input),r=await M({device:t.device,input:m(n).gesture,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!r.ok)return{refused:r.response};let i=n.count??1,a=n.pauseMs??0,o=n.pattern??`one-way`,s=await yn($(e,r.gestures),e,n,i,a,o);return{positionals:vn(n),flags:e.req.flags,responseData:nn(s,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:s.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:i,pauseMs:a,pattern:o})}})}function $(e,t){return Ce({...e,gestures:t,pairedGestureViewport:e.req.internal?.gestureViewport})}async function un(e,n,r){let i=e.sessionStore.get(e.sessionName);if(!i)return x();let a=Date.now();try{let t=pe(i.device),o=t?{status:`clear`}:await D({session:i,command:n,phase:`before-command`,observation:e.androidObservation}),s=await r(i);if(rn(s))return s.refused;t||await D({session:i,command:n,phase:`after-command`,observation:e.androidObservation});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),A({session:i,sessionStore:e.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(e){return{ok:!1,error:t(e)}}}function dn(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function fn(e,t){let n=ne(e);return n.intent===`drag`?{...n,source:pn(n.source,t),destination:pn(n.destination,t)}:n}function pn(t,n){if(!t.startsWith(`@`))return t;let i=a(t);if(!i)throw new e(`INVALID_ARGS`,`Invalid ref "${t}" — malformed generation suffix.`,{hint:r});return De({ref:i.base,mintedGeneration:i.generation,frame:C({session:n,ref:i.base,mintedGeneration:i.generation})}),i.base}function mn(e,t){return e.kind!==`drag`||!t?h(e):h({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function hn(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`swipe requires structured object input`);re(t);let n=t,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new e(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:_n(n.from,`swipe from`),to:_n(n.to,`swipe to`),count:o(n,`count`,{min:1,max:200}),pauseMs:o(n,`pauseMs`,{min:0,max:p}),pattern:r};return gn(i),i}function gn(t){let n=t.count??1,r=t.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new e(`INVALID_ARGS`,`Swipe series must fit within ${ee}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function _n(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be a point`);let r=t;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new e(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new e(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function vn(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function yn(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=m(bn(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await de(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function bn(e,t,n){return t!==`ping-pong`||n%2!=1?e:{...e,from:e.to,to:e.from}}function xn(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function Sn(e){let t={...e,refSnapshotFlagGuardResponse:ke};switch(e.req.command){case`press`:return await Q(t,`press`);case`click`:return await Q(t,`click`);case`longpress`:return await Q(t,`longpress`);case`hover`:return await Q(t,`hover`);case`fill`:return await Pt(t);case v.gesture:return await an(e);case v.swipe:return await ln(e);case v.type:return await Cn(e);case`get`:return await je(e);case`is`:return await Ae(e);default:return null}}async function Cn(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);if(!r)return x();let i=await Me({device:r.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!i.ok)return i.response;let a=await wn(r,e.androidObservation);return a.response?a.response:await Tn(e,r,i.typeText,a.warning)}async function wn(e,t){if(e.device.platform===`android`&&e.screenRecording){let n=await Se({session:e,observation:t});if(n.status===`failed`)return{response:S(`COMMAND_FAILED`,`Android system dialog blocked the recording session`)};if(n.status===`unknown`)return{warning:n.warning}}return{}}async function Tn(e,n,r,i){let{req:a,sessionStore:o}=e,s=Date.now();try{let t=await D({session:n,command:a.command,phase:`before-command`,observation:e.androidObservation});w(n);let c=await r(a.positionals??[],e.contextFromFlags(a.flags,n.appBundleId,n.trace?.outPath));await D({session:n,command:a.command,phase:`after-command`,observation:e.androidObservation});let l=Date.now(),u={...c};return En(u,i,t),A({session:n,sessionStore:o,command:a.command,positionals:a.positionals??[],flags:a.flags,result:u,responseData:u,actionStartedAt:s,actionFinishedAt:l})}catch(e){return{ok:!1,error:t(e)}}}function En(e,t,n){let r=[typeof e.warning==`string`?e.warning:void 0,t];n.status===`recovered`&&r.push(n.warning);let i=r.filter(e=>typeof e==`string`&&e.length>0).join(` `);i.length>0&&(e.warning=i)}export{Sn as handleInteractionCommands};
@@ -0,0 +1 @@
1
+ import{a as e,o as t}from"./touch-runtime.js";import{S as n,_ as r,c as i,f as a,h as o,l as s,n as c,o as l,p as u,r as d,u as f,y as p}from"./alert-runtime.js";const m=[{operation:`back`,label:`back`,bind:n},{operation:`home`,label:`home`,bind:p},{operation:`setOrientation`,label:`orientation`,bind:r},{operation:`tvRemote`,label:`tv-remote`,bind:o},{operation:`keyboardStatus`,label:a.keyboardStatus,bind:(e,t)=>u(`keyboardStatus`,e,t)},{operation:`keyboardDismiss`,label:a.keyboardDismiss,bind:(e,t)=>u(`keyboardDismiss`,e,t)},{operation:`keyboardEnter`,label:a.keyboardEnter,bind:(e,t)=>u(`keyboardEnter`,e,t)},{operation:`readClipboard`,label:`clipboard read`,bind:s},{operation:`writeClipboard`,label:`clipboard write`,bind:f},{operation:`appSwitcher`,label:`app-switcher`,bind:i},{operation:`triggerAppEvent`,label:`trigger-app-event`,bind:l},{operation:`setSetting`,label:`settings`,bind:d},{operation:`readAlert`,label:`alert get`,bind:(e,t)=>c(`readAlert`,e,t)},{operation:`awaitAlert`,label:`alert wait`,bind:(e,t)=>c(`awaitAlert`,e,t)},{operation:`acceptAlert`,label:`alert accept`,bind:(e,t)=>c(`acceptAlert`,e,t)},{operation:`dismissAlert`,label:`alert dismiss`,bind:(e,t)=>c(`dismissAlert`,e,t)}];function h(e,t){let n={};for(let r of m)e.facts[r.operation]?.available&&Object.assign(n,r.bind(e.signal,t(r)));return n}function g(t){return h(t,()=>e(t))}function _(e){return h(e,n=>t({...e,operation:n.label}))}export{_ as n,g as t};
@@ -0,0 +1 @@
1
+ const e=[`xctest-element`,`synthesized-first-responder`,`synthesized-first-responder-replacement`,`xctest-application-fallback`],t=[`focused-element`,`keyboard-shown`];export{e as n,t};
@@ -1,2 +1,6 @@
1
- import{_ as e}from"./sdk-contracts.js";import{Ft as t}from"./sdk-batch-runner.js";import{c as n,l as r,m as i}from"./sdk-device.js";import{L as a,b as o,f as s,h as c,l,o as u,z as d}from"./interaction.js";import{r as f}from"./verdict.js";import{t as p}from"./device.js";import{F as m}from"./sdk-android-adb.js";import{t as ee}from"./method-scope.js";import{a as h}from"./verified-file.js";import{a as g,n as _}from"./runner-client.js";import{a as v,c as te,i as y,l as b,n as x,o as S,r as C,s as w}from"./apps.js";import{a as T}from"./helper.js";import{n as E,t as D}from"./runner-sequence.js";function O(e,t,n,r={includeDuration:!0}){let i=A(e.referenceWidth),a=A(e.referenceHeight);if(i===void 0||a===void 0)return j(e,{amount:n?.amount});let o=d({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return j(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function k(e,t={includeDuration:!0}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t?.includeDuration&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{}}}function A(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function j(e,t){let{x1:n,y1:r,x2:i,y2:a}=N(e),o=A(e.referenceWidth),s=A(e.referenceHeight),c=M(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function M(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function N(e){let t=A(e.x),n=A(e.y),r=A(e.x2),i=A(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function P(e,t,n,r,i,a){return O(await e(t,{command:`desktopScroll`,direction:i,...k(a,{includeDuration:!0}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function F(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function I(e){return e===`system`?`backSystem`:`backInApp`}function L(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await _(e,W(e,t,r,i),n),tapElementSelector:async r=>await _(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await _(e,D([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return E(a),a},longPress:async(r,i,a)=>await _(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await _(e,W(e,t,r,i),n),type:async(r,i)=>R(await _(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
2
- `?void 0:`append`,appBundleId:t.appBundleId},n)),fillElementSelector:async(r,i,a)=>await _(e,{command:`type`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,text:i,delayMs:a,textEntryMode:`replace`,appBundleId:t.appBundleId},n),fill:async(r,i,a,o,s)=>await _(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await K(_,e,t,n,r,i),performGesture:async r=>await H(e,t,n,r),gestureViewport:async()=>B(await _(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}function R(e){let t=e.textEntryRoute;return z(t)?{textEntryRoute:t}:{}}function z(e){return typeof e==`string`&&c.includes(e)}function B(t){let n=V(t.x),r=V(t.y),i=V(t.x2),a=V(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function V(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function H(e,n,a,s){if(s.topology===`two`&&t(e,s.intent),s.topology===`single`&&r(e)){let{start:t,end:r}=o(s);return await _(e,{command:`drag`,x:t.x,y:t.y,x2:r.x,y2:r.y,durationMs:s.durationMs,appBundleId:n.appBundleId},a)}if(s.topology===`single`&&i(e)){let{start:t,end:r}=o(s);return await _(e,{command:`swipe`,direction:U(t,r),appBundleId:n.appBundleId},a)}return await _(e,{command:`gesture`,gesturePlan:s,appBundleId:n.appBundleId},a)}function U(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function W(e,t,n,r){return{command:`tap`,x:n,y:r,...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function G(e){return n(e)&&!i(e)}async function K(e,t,n,o,c,u){return s(u?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${l}`}),i(t)?j(await e(t,F(c,n.appBundleId,u?.durationMs),o),{amount:u?.amount,durationMs:u?.durationMs}):(a(u??{}),r(t)?await P(e,t,n,o,c,u):O(await e(t,{command:`scroll`,direction:c,...k(u),appBundleId:n.appBundleId},o),c,u))}function q(t,n,r){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=L(t,n),s={open:(e,n)=>S(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:o}),openDevice:()=>w(t),close:e=>v(t,e,o),screenshot:(e,n)=>ne(t,e,n,o),snapshot:async e=>await J(t,e,o),back:async e=>{if(i(t)){await _(t,F(`menu`,n.appBundleId),o);return}await _(t,{command:I(e),appBundleId:n.appBundleId},o)},home:async()=>{if(i(t)){await _(t,F(`home`,n.appBundleId),o);return}await _(t,{command:`home`,appBundleId:n.appBundleId},o)},setOrientation:async r=>{let i=Z(await _(t,{command:`rotate`,orientation:r,appBundleId:n.appBundleId},o));if(i!==r)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${r}`,{requestedOrientation:r,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await _(t,{command:`appSwitcher`,appBundleId:n.appBundleId},o)},tvRemote:async(e,r)=>{await _(t,F(u(e),n.appBundleId,r),o)},readClipboard:()=>C(t),writeClipboard:e=>y(t,e),setSetting:(e,n,r,i)=>x(t,e,n,r,i),...a};return r?Q(t,n,s,r):s}async function J(e,t,n){return r(e)&&t?.surface&&t.surface!==`app`?await h(t,t.signal):await Y(e,t,n)}async function Y(t,n,r){let i=ie(await m(`snapshot_capture`,async()=>await _(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},X(r,n?.signal)),{backend:`xctest`})),a=i.nodes??[];if(a.length===0&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:a,truncated:i.truncated??!1,backend:`xctest`,...i.quality?{quality:i.quality}:{},...!i.quality&&i.message?{warnings:[i.message]}:{}}}function X(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Z(t){let n=t.orientation;if(typeof n==`string`&&p.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function Q(e,t,n,r){return ee({...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),writeClipboard:async()=>$(`writeClipboard`),setSetting:async()=>$(`setSetting`)},n=>g(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function ne(e,t,n={},r){if(re(e,n.surface)){await T(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await te(e,t,n.appBundleId,n.fullscreen,r);return}await b(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function re(e,t){return r(e)&&t!==void 0&&t!==`app`}function ie(e){return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:f(e.snapshotQuality),message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}export{q as createAppleInteractor};
1
+ import{C as e}from"./sdk-contracts.js";import{h as t,l as n,u as r}from"./sdk-device.js";import{r as i}from"./snapshot-scope.js";import{c as a,u as o}from"./scroll-gesture.js";import{a as s,n as c}from"./alert-contract.js";import{a as l,c as u,n as d,s as f}from"./location-coordinates.js";import{n as ee,s as te,t as ne}from"./scroll-command.js";import"./device.js";import{t as re}from"./device-rotation.js";import{c as ie,r as p}from"./diagnostics.js";import{_ as ae}from"./owner-identity.js";import{a as m}from"./exec.js";import{t as oe}from"./timeouts.js";import{a as se}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{i as ce,n as le}from"./retry.js";import"./process.js";import{a as ue}from"./gesture-plan.js";import{n as de}from"./scoped-provider.js";import{n as fe,r as pe}from"./ios-snapshot-planning.js";import{r as me}from"./device-isolation.js";import{i as he,r as ge}from"./snapshot-quality-verdict.js";import{r as h}from"./ios-snapshot-acquisition.js";import{a as _e,t as ve}from"./ios-system-surface.js";import{i as ye,n as be}from"./screenshot-density.js";import{n as xe}from"./interactor-types.js";import{a as g,o as Se,t as Ce}from"./runner-presentation.js";import{C as we,g as Te,r as Ee}from"./host-file.js";import{a as De,c as Oe,d as ke,l as Ae,u as je}from"./config2.js";import{o as Me}from"./tool-provider.js";import{n as Ne,r as _,t as Pe}from"./physical-device-control.js";import{n as Fe}from"./simctl.js";import{n as v,r as Ie}from"./apps-simctl.js";import{n as y,r as b,s as Le}from"./runner.js";import{t as Re}from"./runner-cache-metadata.js";import{m as x,p as ze}from"./runner-client.js";import{n as Be,r as Ve,t as S}from"./app-launch.js";import{r as C,t as w}from"./simulator.js";import{a as He,d as Ue,f as We,g as Ge,h as T,m as Ke,p as qe}from"./app-resolution.js";import{a as Je,i as Ye,o as Xe}from"./helper.js";import{n as Ze}from"./multitouch-support.js";import{t as Qe}from"./surface-snapshot.js";import E from"node:path";async function $e(e){return r(e)?await Ue():(C(e,`clipboard`),await w(e),m(await v(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replaceAll(`\r
2
+ `,`
3
+ `).replace(/\n$/,``))}async function et(e,t){if(r(e)){await qe(t);return}C(e,`clipboard`),await w(e),m(await v(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t}),`Failed to write iOS simulator clipboard`)}const tt=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],nt={0:`hide`,1:`wifi`,6:`3g`,7:`4g`,8:`lte`,9:`lte-a`,10:`lte+`,11:`5g`,12:`5g+`,13:`5g-uwb`,14:`5g-uc`},rt={1:`searching`,2:`failed`,3:`active`},it={0:`notSupported`,1:`searching`,2:`failed`,3:`active`};function D(e,t,n){return Fe(e,t,n)}const O=new Set;async function at(e){let t=null,n=!1;if(ct(e))n=!0;else try{t=await lt(e),n=!0}catch(t){j(e,`snapshot_failed`,t)}try{(!n||t)&&await ut(e),await dt(e,tt)}catch(t){j(e,`prepare_failed`,t)}return async()=>{await ot(e,n?t:null)}}async function ot(e,t){if(await ut(e),!t){st(e);return}await dt(e,pt(t)),k(e)}function k(e){O.delete(A(e))}function st(e){O.add(A(e))}function ct(e){return O.has(A(e))}function A(e){return`${e.platform}:${e.kind}:${e.id}`}async function lt(e){return ft(m(await D(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function ut(e){await D(e,[`status_bar`,e.id,`clear`])}async function dt(e,t){t.length!==0&&await D(e,[`status_bar`,e.id,`override`,...t])}function ft(t){let n={},r=t.split(`
4
+ `).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let t of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(t);if(r){let t=Number(r[1]),i=nt[t];if(!i)throw new e(`COMMAND_FAILED`,`Unsupported simulator data network type: ${t}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(t);if(i){let e=rt[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(t);if(a){let t=Number(a[1]),r=it[t];if(!r)throw new e(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${t}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(t);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function pt(e){let t=[];return e.dataNetwork&&t.push(`--dataNetwork`,e.dataNetwork),e.wifiMode&&t.push(`--wifiMode`,e.wifiMode),e.wifiBars!==void 0&&(e.dataNetwork===`wifi`||e.wifiMode)&&t.push(`--wifiBars`,e.wifiBars),e.cellularMode&&t.push(`--cellularMode`,e.cellularMode),e.cellularBars!==void 0&&(e.cellularMode||mt(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function mt(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function j(e,t,n){p({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,..._(n)}})}let M=null,N;async function ht(t,n,i,a,o){if(r(t)){let t=n.toLowerCase();if(t===`appearance`){await We(i);return}if(t===`permission`){let t=f(i);if(t===`deny`)throw new e(`INVALID_ARGS`,l(`permission`));let n=_t(o?.permissionTarget);return await Je(t,n)}throw new e(`INVALID_ARGS`,l(n))}C(t,`settings`),await w(t);let s=n.toLowerCase();switch(s){case`clear-app-state`:{if(i.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let n=await gt(t,a);return{bundleId:n.bundleId,containerPath:n.containerPath,cleared:!0}}case`reset-keychain`:if(i.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings reset-keychain only supports clear.`);return await v(t,[`keychain`,t.id,`reset`]),{scope:`simulator`,cleared:!0,message:`Reset the whole iOS simulator keychain. This clears keychain-backed credentials for every installed app, not just the app under test.`};case`wifi`:{let e=T(i)?`active`:`failed`;await v(t,[`status_bar`,t.id,`override`,`--wifiMode`,e]),k(t);return}case`airplane`:T(i)?(await v(t,[`status_bar`,t.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),k(t)):(await v(t,[`status_bar`,t.id,`clear`]),st(t));return;case`location`:{if(i.toLowerCase()===`set`){let{latitude:e,longitude:n}=d(o);return await v(t,[`location`,t.id,`set`,`${e},${n}`]),{latitude:e,longitude:n}}let n=T(i);if(!a)throw new e(`INVALID_ARGS`,`location setting requires an active app in session`);let r=n?`grant`:`revoke`;await v(t,[`privacy`,t.id,r,`location`,a]);return}case`faceid`:case`touchid`:{let e=s,n=bt[e];await Dt(t,Et(i,e),{settingName:e,label:n.label,modalityAliases:n.modalityAliases});return}case`appearance`:{let e=await vt(t,i);await v(t,[`ui`,t.id,`appearance`,e]);return}case`permission`:if(!a)throw new e(`INVALID_ARGS`,`permission setting requires an active app in session`);await St(t,xt(f(i)),Tt(o?.permissionTarget,o?.permissionMode),a);return;default:throw new e(`INVALID_ARGS`,`Unsupported setting: ${n}`)}}async function gt(t,r){if(!n(t)||t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let i=await He(t,r);await w(t),await S(t,i);let a=m(await v(t,[`get_app_container`,t.id,i,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${i}`).stdout.trim();if(!a)throw new e(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${i}`);let o=await Te(a);return await Promise.all(o.map(e=>we(E.join(a,e)))),{bundleId:i,containerPath:a}}function _t(t){let n=t?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new e(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}async function vt(t,n){let r=Ke(n);if(r!==`toggle`)return r;let i=m(await v(t,[`ui`,t.id,`appearance`],{allowFailure:!0}),`Failed to read current iOS appearance`),a=yt(i.stdout,i.stderr);if(!a)throw new e(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:i.stdout,stderr:i.stderr});return a===`dark`?`light`:`dark`}function yt(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`dark`?`dark`:r===`light`?`light`:null}const bt={faceid:{label:`Face ID`,modalityAliases:[`face`]},touchid:{label:`Touch ID`,modalityAliases:[`finger`,`touch`]}};function xt(e){return e===`deny`?`revoke`:e}async function St(t,n,r,i){let a=await Ct(t);if(!a.has(r))throw new e(`UNSUPPORTED_OPERATION`,`iOS simctl privacy does not support service "${r}" on this runtime.`,{deviceId:t.id,appBundleId:i,hint:`Supported services: ${Array.from(a).sort().join(`, `)}`});let o=[`privacy`,t.id,n,r,i],s=r===`notifications`;if(!(n===`reset`&&s))try{await v(t,o);return}catch(n){throw s&&P(n)?new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting notifications permission via simctl privacy on this runtime.`,{deviceId:t.id,appBundleId:i,hint:`Use reset notifications for reprompt behavior, or toggle notifications manually in Settings.`}):n}try{await v(t,o);return}catch(e){if(!P(e))throw e}try{await v(t,[`privacy`,t.id,`reset`,`all`,i])}catch(n){throw new e(`COMMAND_FAILED`,`iOS simulator blocked direct notifications reset. Fallback reset-all also failed.`,{deviceId:t.id,appBundleId:i,hint:`Use reinstall to force a fresh notifications prompt, or reset simulator content and settings.`},n instanceof Error?n:void 0)}}function P(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=String(t.details?.stderr??``).toLowerCase();return(n.includes(`failed to grant access`)||n.includes(`failed to revoke access`)||n.includes(`failed to reset access`))&&n.includes(`operation not permitted`)}async function Ct(t){let n=me(t.simulatorSetPath),r=`${ae(`PATH`)??``}::${n??``}`;if(M&&N===r)return M;let i=await v(t,[`privacy`,`help`],{allowFailure:!0}),a=wt(`${i.stdout}\n${i.stderr}`);if(a.size===0)throw new e(`COMMAND_FAILED`,`Unable to determine supported simctl privacy services`,{stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:"Run `xcrun simctl privacy help` manually to verify available services for this runtime."});return M=a,N=r,a}function wt(e){let t=new Set,n=!1;for(let r of e.split(`
5
+ `)){let e=r.trim();if(!e)continue;if(e===`service`){n=!0;continue}if(!n)continue;if(e.startsWith(`bundle identifier`))break;let i=/^([a-z-]+)\s+-\s+/.exec(e)?.[1];i!==void 0&&t.add(i)}return t}function Tt(t,n){let r=u(t);if(r!==`photos`&&n?.trim())throw new e(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);if(r===`camera`)return`camera`;if(r===`microphone`)return`microphone`;if(r===`contacts`)return`contacts`;if(r===`contacts-limited`)return`contacts-limited`;if(r===`notifications`)return`notifications`;if(r===`calendar`)return`calendar`;if(r===`location`)return`location`;if(r===`location-always`)return`location-always`;if(r===`media-library`)return`media-library`;if(r===`motion`)return`motion`;if(r===`reminders`)return`reminders`;if(r===`siri`)return`siri`;if(r===`photos`){let t=n?.trim().toLowerCase();if(!t||t===`full`)return`photos`;if(t===`limited`)return`photos-add`;throw new e(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}throw new e(`INVALID_ARGS`,`Unsupported permission target: ${t}. Use camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri.`)}function Et(t,n){let r=t.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new e(`INVALID_ARGS`,`Invalid ${n} state: ${t}. Use match|nonmatch|enroll|unenroll.`)}async function Dt(t,n,r){let i=Ot(t.id,n,r.modalityAliases),a=[];for(let e of i){let n=Ie(t,e),r=await Me(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=Ge(a);throw a.length>0&&a.every(e=>kt(e.stdout,e.stderr))?new e(`UNSUPPORTED_OPERATION`,`${r.label} simulation is not supported on this simulator runtime.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o}):new e(`COMMAND_FAILED`,`Failed to simulate ${r.settingName}.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o})}function Ot(e,t,n){let r=n.length>0?n:[`face`];switch(t){case`match`:return r.flatMap(t=>[[`biometric`,e,`match`,t],[`biometric`,`match`,e,t]]);case`nonmatch`:return r.flatMap(t=>[[`biometric`,e,`nonmatch`,t],[`biometric`,e,`nomatch`,t],[`biometric`,`nonmatch`,e,t],[`biometric`,`nomatch`,e,t]]);case`enroll`:return[[`biometric`,e,`enroll`,`yes`],[`biometric`,e,`enroll`,`1`],[`biometric`,`enroll`,e,`yes`],[`biometric`,`enroll`,e,`1`]];case`unenroll`:return[[`biometric`,e,`enroll`,`no`],[`biometric`,e,`enroll`,`0`],[`biometric`,`enroll`,e,`no`],[`biometric`,`enroll`,e,`0`]]}}function kt(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unrecognized subcommand`)||n.includes(`unknown subcommand`)||n.includes(`not supported`)||n.includes(`unavailable`)||n.includes(`biometric`)&&n.includes(`invalid`)}function F(e,t,n){return Fe(e,t,n)}const At={ensureBooted:w,prepareStatusBarForScreenshot:at,captureWithRetry:Nt,normalizeDensity:zt,captureWithRunner:R,shouldFallbackToRunner:V},I=new Map,L=new Map;async function jt(e,t,n={}){if(r(e)){await R(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Mt(e,t,n);return}await Pe(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:x})}async function Mt(t,n,r={}){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...At,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(t);let a=async()=>{};if(r.normalizeStatusBar===!0)try{a=await i.prepareStatusBarForScreenshot(t)}catch(e){B(t,`prepare_failed`,e)}try{try{await i.captureWithRetry(t,n),await i.normalizeDensity(t,n,r.pixelDensity);return}catch(e){let a=e;if(r.skipIosSimulatorBootCheck&&Rt(e)){await i.ensureBooted(t);try{await i.captureWithRetry(t,n),await i.normalizeDensity(t,n,r.pixelDensity);return}catch(e){a=e}}if(!i.shouldFallbackToRunner(a))throw a;It(t,`simctl_screenshot`,a)}await i.captureWithRunner(t,n,r.appBundleId,r.fullscreen,r.runnerOptions),await i.normalizeDensity(t,n,r.pixelDensity)}finally{await a().catch(e=>B(t,`restore_failed`,e))}}async function Nt(e,t){let n=le.fromTimeoutMs(ke);await ce(async({deadline:n})=>{await F(e,[`io`,e.id,`screenshot`,t],{timeoutMs:Math.max(1e3,n?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Oe,maxDelayMs:Ae,jitter:.2,shouldRetry:e=>V(e)},{deadline:n,phase:`ios_simulator_screenshot`})}async function R(t,n,i,a,o){if(t.kind===`device`&&!r(t)){await Pe(t).captureScreenshot(t,n,{appBundleId:i,fullscreen:a,runnerOptions:o,preferRunner:!0,runRunnerCommand:x});return}let s=(await x(t,{command:`screenshot`,appBundleId:i,fullscreen:a,inlineScreenshot:!1},o)).message;if(!s)throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);if(r(t)){await Ee(s,n);return}if(t.kind===`simulator`){await Pt(t,s,n);return}throw new e(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function Pt(t,n,r){let i=le.fromTimeoutMs(De),a=`Unable to locate runner container for simulator screenshot`,o=L.get(t.id);if(o){let e=await z(o,n,r);if(e.copied)return;a=e.error,L.delete(t.id)}for(let e of Re){let o=await F(t,[`get_app_container`,t.id,e,`data`],{allowFailure:!0,timeoutMs:Ft(i,De,`runner screenshot container lookup`)});if(o.exitCode!==0){let e=o.stderr.trim();e&&(a=e);continue}let s=o.stdout.trim();if(!s){a=`simctl get_app_container returned empty output`;continue}let c=await z(s,n,r);if(c.copied){L.set(t.id,s);return}a=c.error}throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function z(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of Lt(e,t))try{return await Ee(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function Ft(t,n,r){let i=t.remainingMs();if(i>0)return i;throw new e(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function It(e,t,n){let r=_(n);p({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function B(e,t,n){p({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,..._(n)}})}function Lt(e,t){let n=E.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=E.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(E.join(n,s)),E.isAbsolute(r)&&o(E.normalize(r)),c.startsWith(`tmp/`))o(E.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(E.join(n,t))}}let l=E.basename(r);return l&&o(E.join(n,`tmp`,l)),i}function V(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ne(t);return n.includes(`timeout waiting for screen surfaces`)||n.includes(`nsposixerrordomain`)&&n.includes(`code=60`)&&n.includes(`screenshot`)||n.includes(`timed out`)&&n.includes(`screenshot`)}function Rt(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ne(t);return n.includes(`not booted`)||n.includes(`current state: shutdown`)||n.includes(`current state is shutdown`)||n.includes(`current state=shutdown`)||n.includes(`state: shutdown`)||n.includes(`state=shutdown`)}async function zt(e,t,n){let r=await Bt(e),i=be(await ye(t),r,n);i&&await he(t,i.width,i.height)}async function Bt(t){let n=I.get(t.id);if(n!==void 0)return n;let r=await F(t,[`getenv`,t.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:je}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new e(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return I.set(t.id,i),i}function Vt(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:ne},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function H(e,t,n,r={includeDuration:!0}){let i=W(e.referenceWidth),a=W(e.referenceHeight);if(i===void 0||a===void 0)return G(e,{amount:n?.amount});let s=o({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return G(e,{amount:n?.amount,pixels:s.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function U(e,t={}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t.includeDuration!==!1&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{},...t.includeReleaseBehavior!==!1&&e?.releaseBehavior!==void 0?{scrollReleaseBehavior:e.releaseBehavior}:{}}}function W(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function G(e,t){let{x1:n,y1:r,x2:i,y2:a}=Ut(e),o=W(e.referenceWidth),s=W(e.referenceHeight),c=Ht(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function Ht(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function Ut(e){let t=W(e.x),n=W(e.y),r=W(e.x2),i=W(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function Wt(e,t,n,r,i,a){return H(await e(t,{command:`desktopScroll`,direction:i,...U(a,{includeDuration:!0,includeReleaseBehavior:!1}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function K(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function Gt(e){return e===`system`?`backSystem`:`backInApp`}function Kt(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await x(e,J(e,t,r,i),n),pressPoint:async(r,i)=>await qt(e,t,n,r,i),tapElementSelector:async r=>await x(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...nn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await x(e,y([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return b(a),a},longPress:async(r,i,a)=>await x(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await x(e,J(e,t,r,i),n),type:async(r,i)=>Zt(await x(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
6
+ `?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await x(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await rn(x,e,t,n,r,i),performGesture:async r=>await en(e,t,n,r),gestureViewport:async()=>$t(await x(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function qt(e,t,n,i,a){return r(e)&&a.surface&&a.surface!==`app`?await Jt(t,i,a):a.button===`primary`?a.count===1?await Xt(e,t,n,i,a):await ze(e,i,a,t.appBundleId,async t=>await x(e,t,n)):await Yt(e,t,n,i,a.button)}async function Jt(t,n,r){if(r.button!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await import(`./helper.js`).then(e=>e.t);return await i(n.x,n.y,{bundleId:t.appBundleId,surface:r.surface}),{}}async function Yt(e,t,n,r,i){return await x(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function Xt(e,t,n,r,i){if(i.doubleTap){let i=await x(e,y([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return b(i),i}return i.holdMs>0?await x(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await x(e,J(e,t,r.x,r.y),n)}function Zt(e){let t=e.textEntryRoute;return Qt(t)?{textEntryRoute:t}:{}}function Qt(e){return typeof e==`string`&&xe.includes(e)}function $t(t){let n=q(t.x),r=q(t.y),i=q(t.x2),a=q(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function en(e,n,i,a){if(a.topology===`two`&&Ze(e,a.intent),a.topology===`single`&&r(e)){let{start:t,end:r}=ue(a);return await x(e,{command:`drag`,x:t.x,y:t.y,x2:r.x,y2:r.y,durationMs:a.durationMs,appBundleId:n.appBundleId},i)}if(a.topology===`single`&&t(e)){let{start:t,end:r}=ue(a);return await x(e,{command:`swipe`,direction:tn(t,r),appBundleId:n.appBundleId},i)}return await x(e,{command:`gesture`,gesturePlan:a,appBundleId:n.appBundleId},i)}function tn(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function J(e,t,n,r){return{command:`tap`,x:n,y:r,...nn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function nn(e){return n(e)&&!t(e)}async function rn(e,n,i,o,s,c){if(te(c?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ee}`}),t(n))return G(await e(n,K(s,i.appBundleId,c?.durationMs),o),{amount:c?.amount,durationMs:c?.durationMs});if(a(c??{}),r(n))return await Wt(e,n,i,o,s,c);let l=Vt(c);return H(await e(n,{command:`scroll`,direction:s,...U(l),appBundleId:i.appBundleId},o),s,l)}function Y(e,t,n){if(r(e)){let e=n?.surface===`frontmost-app`?{surface:n.surface}:{bundleId:n?.appBundleId,surface:n?.surface};return async t=>await Ye(t,e)}return async(r,i)=>await x(e,{command:`alert`,action:r,appBundleId:n?.appBundleId,timeoutMs:i},t)}async function an(e,t,n){return await Y(e,t,n)(`get`,s)}async function on(t,n,r){let i=Y(t,n,r),a=r?.timeoutMs??1e4,o=Date.now(),s=!0;for(;Date.now()-o<a;){try{let e=s?a:cn(o,a);return s=!1,await i(`get`,e)}catch(e){if(!X(e))throw e}await oe(300)}throw new e(`COMMAND_FAILED`,`alert wait timed out`)}async function sn(e,t,r,i){let a=Y(e,t,i),o=n(e)?s:c,l=Date.now(),u,d=!0;for(;Date.now()-l<c;){try{let e=d?o:cn(l,c);return d=!1,await a(r,e)}catch(e){if(u=e,!X(e))break}await oe(300)}throw ln(u)}function cn(e,t){return Math.max(1,t-(Date.now()-e))}function ln(t){return!(t instanceof e)||!X(t)?t:new e(t.code,t.message,{...t.details??{},hint:`If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref.`})}function X(t){if(!(t instanceof e))return!1;let n=t.details??{};return n.runnerErrorCode===`ALERT_NOT_FOUND`||n.reason===`alert-not-found`}function un(e){let t=dn(e.systemSurface);return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:ge(e.snapshotQuality),qualityPayload:pn(e.qualityPayload),runnerFatal:e.runnerFatal===!0,...t?{systemSurface:t}:{},message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function dn(e){if(!gn(e))return;let t=e.bundleId,n=e.kind;if(!(typeof t!=`string`||!_e(t))&&typeof n==`string`)return{bundleId:t,kind:n}}function fn(e,t,n){let r=n.nodes??[];if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return r;let i=pe({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),a=mn(r,n.qualityPayload?.nodes),o={stage:`presented`,presentation:{producer:`apple-runner`,intent:`full`,payload:{nodes:r,truncated:n.truncated??!1,...n.quality?.effectiveDepth===void 0?{}:{effectiveDepth:n.quality.effectiveDepth}},...n.qualityPayload?{qualityPayload:n.qualityPayload}:{}},validation:{presentationKey:fe(i),viewport:a,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{return Ce(o,i).nodes}catch(e){Z(e)}}function pn(e){if(e!==void 0)return(!gn(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new g(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`)),e.scope!==void 0&&e.scope!==null&&Z(new g(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`})),{nodes:e.nodes,truncated:e.truncated,scope:null}}function mn(e,t){return h(hn(t),{fallbackToLargestRoot:!0})??h(hn(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function hn(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function gn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(t){throw t instanceof g?new e(`COMMAND_FAILED`,t.message,Se(t),t):t}function _n(n,r,i){if(n.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=Kt(n,r),s={open:(e,t)=>Be(n,e,{appBundleId:t?.appBundleId,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,terminateRunningApp:t?.terminateRunningApp,url:t?.url,runnerOptions:o}),openDevice:()=>Ve(n),close:e=>S(n,e,o),screenshot:(e,t)=>Dn(n,e,t,o),snapshot:async e=>await vn(n,e,o),readTextAtPoint:async(e,t)=>kn(n,t?.surface)?await An(e,t):await jn(n,e,t,o),findText:async(e,t)=>({found:(await x(n,{command:`findText`,text:e,appBundleId:t?.appBundleId},t?.signal?{...o,signal:t.signal}:o))?.found===!0}),back:async e=>{if(t(n)){await x(n,K(`menu`,r.appBundleId),o);return}await x(n,{command:Gt(e),appBundleId:r.appBundleId},o)},home:async()=>{if(t(n)){await x(n,K(`home`,r.appBundleId),o);return}await x(n,{command:`home`,appBundleId:r.appBundleId},o)},setOrientation:async t=>{let i=Tn(await x(n,{command:`rotate`,orientation:t,appBundleId:r.appBundleId},o));if(i!==t)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${t}`,{requestedOrientation:t,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await x(n,{command:`appSwitcher`,appBundleId:r.appBundleId},o)},tvRemote:async(e,t)=>{await x(n,K(se(e),r.appBundleId,t),o)},keyboardDismiss:async()=>{let e=await x(n,{command:`keyboardDismiss`,appBundleId:r.appBundleId},o);return{kind:`mechanism`,wasVisible:Q(e,`wasVisible`),dismissed:Q(e,`dismissed`),visible:Q(e,`visible`),mechanism:wn(e,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let e=await x(n,{command:`keyboardReturn`,appBundleId:r.appBundleId},o);return{kind:`visibility-echo`,visible:Q(e,`visible`),wasVisible:Q(e,`wasVisible`)}},readClipboard:()=>$e(n),writeClipboard:e=>et(n,e),setSetting:(e,t,r,i)=>ht(n,e,t,r,i),readAlert:e=>an(n,o,e),awaitAlert:e=>on(n,o,e),acceptAlert:e=>sn(n,o,`accept`,e),dismissAlert:e=>sn(n,o,`dismiss`,e),...a};return i?En(n,r,s,i):s}async function vn(e,t,n){return r(e)&&t?.surface&&t.surface!==`app`?await Qe(t,t.signal):await yn(e,t,n)}async function yn(t,n,r){let i=un(await ie(`snapshot_capture`,async()=>await x(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},Cn(r,n?.signal)),{backend:`xctest`})),a=i.nodes??[],o=Sn(n,i.quality);if(a.length===0&&t.kind===`simulator`&&!o)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);let s=bn(i);return{nodes:xn(t,n,i),truncated:i.truncated??!1,backend:`xctest`,producer:`apple-runner`,...i.quality?{quality:i.quality}:{},...i.systemSurface?{systemSurface:i.systemSurface}:{},...s.length>0?{warnings:s}:{}}}function bn(e){let t=[];return!e.quality&&e.message&&t.push(e.message),e.systemSurface&&t.push(ve),t}function xn(e,t,n){return r(e)?n.nodes??[]:fn(e.id,t,n)}function Sn(e,t){return i(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function Cn(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Q(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function wn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Tn(t){let n=t.orientation;if(typeof n==`string`&&re.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function En(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),writeClipboard:async()=>$(`writeClipboard`),setSetting:async()=>$(`setSetting`)};return de(i,n=>Le(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function Dn(e,t,n={},r){if(On(e,n.surface)){await Xe(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await R(e,t,n.appBundleId,n.fullscreen,r);return}await jt(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function On(e,t){return r(e)&&t!==void 0&&t!==`app`}function kn(e,t){return r(e)&&t!==void 0&&t!==`app`}async function An(e,t){let{runMacOsReadTextAction:n}=await import(`./helper.js`).then(e=>e.t);return(await n(e.x,e.y,{bundleId:t?.appBundleId,surface:t?.surface})).text}async function jn(e,t,n,r){let i=await x(e,{command:`readText`,x:t.x,y:t.y,appBundleId:n?.appBundleId},n?.signal?{...r,signal:n.signal}:r);return typeof i.text==`string`?i.text:typeof i.message==`string`?i.message:void 0}export{_n as createAppleInteractor};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{J as t}from"./sdk-batch-runner.js";import{s as n}from"./interaction.js";import{h as r}from"./sdk-android-adb.js";import{t as i}from"./unsupported-interactor.js";import{t as a}from"./tool-provider3.js";const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){r(await a().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){r(await a().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){r(await a().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,t,i){let o=n(t);r(await a().pressRemote(e.id,o,i,{allowFailure:!0,timeoutMs:1e4+(i??0)}),`Failed to press Vega TV remote ${t}`,{button:t,deviceId:e.id})}const d=[{matches:(e,n)=>t(e)||!!n?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...i(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
1
+ import{C as e}from"./sdk-contracts.js";import{r as t}from"./sdk-batch-runner.js";import{a as n}from"./exec.js";import{o as r}from"./tv-remote.js";import"./command.js";import{t as i}from"./tool-provider3.js";function a(t){let n=async n=>{throw new e(`UNSUPPORTED_OPERATION`,`${n} is not supported on ${t}`)};return{open:()=>n(`open`),openDevice:()=>n(`openDevice`),close:()=>n(`close`),tap:()=>n(`tap`),doubleTap:()=>n(`doubleTap`),longPress:()=>n(`longPress`),focus:()=>n(`focus`),type:()=>n(`type`),fill:()=>n(`fill`),scroll:()=>n(`scroll`),screenshot:()=>n(`screenshot`),snapshot:()=>n(`snapshot`),back:()=>n(`back`),home:()=>n(`home`),setOrientation:()=>n(`setOrientation`),appSwitcher:()=>n(`appSwitcher`),tvRemote:()=>n(`tvRemote`),readClipboard:()=>n(`readClipboard`),writeClipboard:()=>n(`writeClipboard`),setSetting:()=>n(`setSetting`),readAlert:()=>n(`readAlert`),awaitAlert:()=>n(`awaitAlert`),acceptAlert:()=>n(`acceptAlert`),dismissAlert:()=>n(`dismissAlert`)}}const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){n(await i().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){n(await i().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){n(await i().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,t,a){let o=r(t);n(await i().pressRemote(e.id,o,a,{allowFailure:!0,timeoutMs:1e4+(a??0)}),`Failed to press Vega TV remote ${t}`,{button:t,deviceId:e.id})}const d=[{matches:(e,n)=>t(e)||!!n?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...a(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{jt as n}from"./sdk-batch-runner.js";import{_ as r,m as i,s as a,x as o}from"./sdk-device.js";import{n as s}from"./command-catalog.js";import{AsyncLocalStorage as c}from"node:async_hooks";let l=[];const u=new c;async function d(e,t){return await u.run([...e],t)}function f(e,t){for(let n of m()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function p(e){return m().some(t=>t.ownsDevice(e))}function m(){return u.getStore()??l}function ee(e,t={}){C(e);let n=e.map(e=>e.provider);return{providerRuntimes:Object.freeze([...e]),providerRuntimeIds:n,providerRuntimeRequiredIds:y([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:b(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:v(e),cloudArtifactProvider:x(e),deviceInventorySource:S(e),appleRunnerProvider:h(e),appleRunnerScreenRecordingTransport:te(e),providerDeviceRuntimeScope:async t=>await d(e,t)}}function te(e){if(e.some(_))return t=>{for(let n of e){if(!_(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerScreenRecordingTransport(t.device);if(e)return e}}}function h(e){if(e.some(g))return t=>{for(let n of e){if(!g(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider(t.device);if(e)return e}}}function g(e){return`getAppleRunnerProvider`in e&&typeof e.getAppleRunnerProvider==`function`}function _(e){return`getAppleRunnerScreenRecordingTransport`in e&&typeof e.getAppleRunnerScreenRecordingTransport==`function`}function v(e){if(e.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=e.find(e=>E(e,n.leaseProvider));if(!r?.recoverExpiredLease)throw new t(`UNSUPPORTED_OPERATION`,`Provider ${n.leaseProvider??`unknown`} cannot recover an expired lease.`,{provider:n.leaseProvider,leaseId:n.leaseId});await r.recoverExpiredLease(n)}}function y(e){return[...new Set(e)]}function b(e){if(e.length!==0)return{allocate:async(t,n)=>await T(e,`allocate`,t,n),heartbeat:async(t,n)=>await T(e,`heartbeat`,t,n),release:async(t,n)=>await T(e,`release`,t,n)}}function x(e){if(e.length!==0)return{listCloudArtifacts:async t=>await w(e,t)}}function S(e){if(e.length!==0)return{discover:async(t,n)=>{n.throwIfAborted();for(let r of e){if(!E(r,t.leaseProvider))continue;let e=await r.deviceInventoryProvider(t,n);if(n.throwIfAborted(),e!=null)return{kind:`inventory`,devices:e}}return{kind:`declined`}}}}function C(e){let t=new Set;for(let n of e){if(t.has(n.provider))throw TypeError(`Duplicate provider device runtime: ${n.provider}`);t.add(n.provider)}}async function w(e,t){for(let n of e){if(!E(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function T(e,t,n,r){for(let i of e){if(!E(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function E(e,t){return e.provider===t}const D=new Map;function O(e){for(let t of e.platforms){if(D.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);D.set(t,e)}}function k(e){let n=D.get(e);if(!n)throw new t(`UNSUPPORTED_PLATFORM`,`Unsupported platform: ${e}`);return n}function A(e){return D.get(e)}const j={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},M={ios:j,ipados:j,visionos:{appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1}};function N(e){return a(e.platform)?M[o(e)]:void 0}const P=e=>{let t=N(e);return t?t.appAndDeviceLifecycle:!0},F=e=>e.platform!==`apple`||e.kind!==`device`||e.iosPhysicalDeviceBackend!==`xctest`,I=e=>{let t=N(e);return t?t.keyboard:e.platform===`android`},L=e=>{let t=N(e);return t?t.orientation:e.platform===`android`},R=e=>{let t=N(e);return t&&t.physicalDeviceSurfaces||e.kind===`simulator`},z=e=>e.platform===`android`||e.platform===`apple`&&o(e)===`ios`||R(e),B=e=>e.platform===`android`?e.target===`tv`:i(e),V={[s.perf]:F,[s.home]:P,[s.appSwitcher]:P,[s.clipboard]:e=>e.platform===`android`||e.platform===`linux`||R(e),[s.keyboard]:I,[s.orientation]:L,[s.tvRemote]:B,[s.alert]:z,[s.settings]:e=>e.platform===`android`||R(e),[s.audio]:n},H={[s.perf]:U,[s.viewport]:e=>e.platform===`apple`?`viewport resizes web targets only (--platform web). Apple screen geometry is fixed by the selected simulator or device type — open a different simulator to test another screen size.`:void 0,[s.tvRemote]:e=>e.platform===`android`?e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`:N(e)?i(e)?void 0:`tv-remote is supported only on tvOS devices.`:void 0};function U(e){if(!F(e))return`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`}const W={id:`apple`,platforms:[`apple`],familySelector:`apple`,capability:{bucket:`apple`,supportsByDefault:V,unsupportedHintByDefault:H},perf:{supportsObservations:()=>!0},providers:{platformGatedResolvers:[`appleRunnerProvider`,`appleToolProvider`]},createInteractor:async(e,t)=>{let{createAppleInteractor:n}=await import(`./interactor.js`);return n(e,t)}},G=[s.back,s.home,s.tvRemote],K=e=>e.target===`tv`,q=e=>e.kind===`emulator`&&K(e),J={id:`vega`,platforms:[`vega`],capability:{bucket:`vega`,supportsByDefault:Object.fromEntries(G.map(e=>[e,K])),unsupportedHintByDefault:Object.fromEntries(G.map(e=>[e,t=>q(t)?void 0:`${e} currently supports only Vega Virtual Devices.`]))},providers:{platformGatedResolvers:[`vegaToolProvider`]},createInteractor:async(e,t)=>{let{createVegaInteractor:n}=await import(`./interactor2.js`);return n(e,t)}},Y=[W,{id:`android`,platforms:[`android`],capability:{bucket:`android`,supportsByDefault:{[s.audio]:n,[s.tvRemote]:e=>e.target===`tv`},unsupportedHintByDefault:{[s.tvRemote]:e=>e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`}},perf:{supportsObservations:()=>!0},providers:{platformGatedResolvers:[`androidAdbProvider`]},createInteractor:async(e,t)=>{let{createAndroidInteractor:n}=await import(`./android.js`).then(e=>e.t);return n(e,void 0,t)}},{id:`harmonyos`,platforms:[`harmonyos`],capability:{bucket:`harmonyos`},perf:{supportsObservations:()=>!0},createInteractor:async(e,t)=>{let{createHarmonyInteractor:n}=await import(`./harmonyos.js`);return n(e,t)}},J,{id:`linux`,platforms:[`linux`],capability:{bucket:`linux`},providers:{platformGatedResolvers:[`linuxToolProvider`]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import(`./linux.js`);return e()}},{id:`web`,platforms:[`web`],capability:{bucket:`web`},providers:{platformGatedResolvers:[`webProvider`]},createInteractor:async()=>{let{createWebInteractor:e}=await import(`./web.js`);return e()}}];let X=!1;function Z(){if(!X){for(let e of Y)O(e);X=!0}}var ne=e({getInteractor:()=>Q,getLocalInteractor:()=>$});Z();async function Q(e,n){if(p(e)){let i=f(e,n);if(i)return i;throw new t(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:e.id,platform:r(e)})}return await $(e,n)}async function $(e,t){return await k(e.platform).createInteractor(e,t)}export{ee as a,A as i,ne as n,p as o,Z as r,Q as t};
1
+ import{C as e}from"./sdk-contracts.js";import{v as t}from"./sdk-device.js";import{n,r}from"./provider-device-runtime.js";import{n as i,t as a}from"./register-builtins.js";a();async function o(i,a){if(r(i)){let r=n(i,a);if(r)return r;throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:i.id,platform:t(i)})}return await s(i,a)}async function s(e,t){return await i(e.platform).createInteractor(e,t)}export{o as getInteractor,s as getLocalInteractor};
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -1,2 +1 @@
1
- const e=new Map([{alias:`long-press`,command:`longpress`},{alias:`tap`,command:`press`},{alias:`launch`,command:`open`},{alias:`relaunch`,command:`open`,impliedFlags:[`relaunch`]},{alias:`metrics`,command:`perf`}].map(e=>[e.alias,e]));function t(t){return e.get(t.toLowerCase())?.command??t}function n(t){return e.get(t.toLowerCase())}const r=process.argv.slice(2);i(r)||(r[0]===`mcp`&&!r.includes(`--help`)&&!r.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(g):h(r));function i(e){return a(e)||o(e)||s(e)}function a(e){return e.length!==1||!m(e[0])?!1:(process.stdout.write(`0.20.10
2
- `),!0)}function o(e){return e.length===0?(import(`../cli-help.js`).then(e=>e.r).then(async({buildUsageText:e})=>{process.stdout.write(`${e()}\n`);let{exitAfterFlush:t}=await import(`../process-exit.js`);await t(1)}).catch(g),!0):!1}function s(e){let n=c(e);return n===void 0?!1:(import(`../cli-help.js`).then(e=>e.r).then(({buildCommandUsageText:r,buildUsageText:i})=>{if(n===null){process.stdout.write(`${i()}\n`);return}let a=r(t(n));if(a){process.stdout.write(a);return}h(e)}).catch(g),!0)}function c(e){switch(e.length){case 1:return l(e[0]);case 2:return u(e[0],e[1]);default:return}}function l(e){return e===`help`||p(e)?null:void 0}function u(e,t){return f(e)?t:d(e,t)}function d(e,t){return p(t)?e:void 0}function f(e){return e===`help`}function p(e){return e===`--help`||e===`-h`}function m(e){return e===`--version`||e===`-V`}function h(e){import(`../process-entry.js`).then(({runCliProcess:t})=>t(e)).catch(g)}function g(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),import(`../process-exit.js`).then(({exitAfterFlush:e})=>e(1)).catch(()=>process.exit(1))}export{t as n,n as t};
1
+ async function e(e,n,r){try{await t(e,n,r)}catch(e){r.stderr(`${e instanceof Error?e.message:String(e)}\n`),await(await n.processExit()).exitAfterFlush(1)}}async function t(e,t,l){if(e.length===0)return await n(t,l);if(o(e))return await r(t,l);let u=c(e);if(u!==void 0)return await i(u,e,t,l);if(s(e))return await(await t.mcp()).runAgentDeviceMcpServer();await a(e,t)}async function n(e,t){t.stdout(`${(await e.help()).buildUsageText()}\n`),await(await e.processExit()).exitAfterFlush(1)}async function r(e,t){t.stdout(`${t.bundledVersion??(await e.version()).readVersion()}\n`)}async function i(e,t,n,r){let i=await n.help(),o=e===null?`${i.buildUsageText()}\n`:i.resolveHelpTargetUsageText(e);if(o===null)return await a(t,n);r.stdout(o)}async function a(e,t){await(await t.cli()).runCliProcess(e)}function o(e){return e.length===1&&(e[0]===`--version`||e[0]===`-V`)}function s(e){return e[0]===`mcp`&&!e.some(l)}function c(e){let[t,n]=e;if(e.length===1)return t===`help`||l(t)?null:void 0;if(e.length===2)return t===`help`?n:l(n)?t:void 0}function l(e){return e===`--help`||e===`-h`}e(process.argv.slice(2),{help:()=>import(`../cli-help.js`).then(e=>e.n),cli:()=>import(`../process-entry.js`),mcp:()=>import(`../server.js`),version:()=>import(`../version.js`).then(e=>e.t),processExit:()=>import(`../process-exit.js`)},{bundledVersion:`0.21.1`,stdout:e=>{process.stdout.write(e)},stderr:e=>{process.stderr.write(e)}}).catch(()=>process.exit(1));export{};
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -1 +1 @@
1
- import{_ as e,a as t,c as n,d as r,f as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,s as f,u as p}from"../url.js";import m from"node:fs";import{setTimeout as h}from"node:timers/promises";const g=5e3,_=6e4;var v=class extends Error{retryable;retryAfterMs;constructor(e,t,n){super(e),this.retryable=t,this.retryAfterMs=n}};function y(e,t){return{authorization:`Bearer ${t}`,"content-type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function b(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length>300?`${t.slice(0,300)}...`:t}function x(e){return e.registerPath}function S(e){return e.unregisterPath??null}function C(e){return{...e.bridgeScope,...e.session?{session:e.session}:{},local_base_url:l(e.localBaseUrl),...e.devicePort?{device_port:e.devicePort}:{},...e.launchUrl?{launch_url:e.launchUrl}:{}}}async function w(e){let t=x(e),n;try{n=await fetch(`${l(e.serverBaseUrl)}${t}`,{method:`POST`,headers:y(e.serverBaseUrl,e.bearerToken),body:JSON.stringify(C(e)),signal:AbortSignal.timeout(g)})}catch(n){throw n instanceof Error&&n.name===`TimeoutError`?Error(`${t} timed out after ${g}ms calling ${l(e.serverBaseUrl)}${t}`):n}let r=await n.text(),i;try{i=r?JSON.parse(r):{}}catch{throw new v(`Failed to register companion (${n.status}): invalid JSON response: ${b(r)}`,T(n.status,void 0),E(n,{}))}if(!n.ok||i.ok!==!0||typeof i.data?.ws_url!=`string`)throw new v(`Failed to register companion (${n.status}): ${JSON.stringify(i)}`,T(n.status,i.error?.code),E(n,i));return{wsUrl:i.data.ws_url}}function T(e,t){return t===`RATE_LIMITED`?!0:t===`UNAUTHORIZED`||t===`INVALID_ARGS`||t===`SESSION_NOT_FOUND`?!1:e===408||e===409||e===425||e===429||e>=500}function E(e,t){let n=t.error?.details?.retryAfterMs;if(typeof n==`number`&&Number.isFinite(n))return D(n);let r=e.headers.get(`retry-after`);if(!r)return;let i=Number(r);if(Number.isFinite(i))return D(i*1e3);let a=Date.parse(r);if(Number.isFinite(a))return D(a-Date.now())}function D(e){return Math.max(0,Math.min(_,Math.ceil(e)))}function O(e){return Math.min(e*2,_)}async function k(e){let t=S(e);if(t)try{await fetch(`${l(e.serverBaseUrl)}${t}`,{method:`POST`,headers:y(e.serverBaseUrl,e.bearerToken),body:JSON.stringify(C(e)),signal:AbortSignal.timeout(2e3)})}catch(e){console.error(e instanceof Error?e.message:String(e))}}async function A(e){return typeof e==`string`?Buffer.from(e,`utf8`):e instanceof ArrayBuffer?Buffer.from(e):ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):typeof Blob<`u`&&e instanceof Blob?Buffer.from(await e.arrayBuffer()):Buffer.from(String(e),`utf8`)}async function j(e){let t=(await A(e.data)).toString(`utf8`);return JSON.parse(t)}function M(e,t){let n=new URL(t,`${l(e)}/`);return n.protocol=n.protocol===`https:`?`wss:`:`ws:`,n.toString()}function N(e){return typeof e!=`number`||!Number.isInteger(e)?1011:e===1e3||e>=3e3&&e<=4999||e>=1001&&e<=1015&&e!==1004&&e!==1005&&e!==1006?e:1011}function P(e){return e===1e3||e>=3e3&&e<=4999?e:3001}function F(e,t){e.readyState===1&&e.send(JSON.stringify(t))}async function I(e,t){e.readyState!==1&&await new Promise((n,r)=>{let i=()=>{s(),n()},a=()=>{s(),r(Error(`${t} WebSocket failed before opening.`))},o=()=>{s(),r(Error(`${t} WebSocket closed before opening.`))},s=()=>{e.removeEventListener(`open`,i),e.removeEventListener(`error`,a),e.removeEventListener(`close`,o)};e.addEventListener(`open`,i,{once:!0}),e.addEventListener(`error`,a,{once:!0}),e.addEventListener(`close`,o,{once:!0})})}async function L(e){e.readyState>=WebSocket.CLOSING||await new Promise(t=>{let n=()=>{r(),t()},r=()=>{e.removeEventListener(`close`,n),e.removeEventListener(`error`,n)};e.addEventListener(`close`,n,{once:!0}),e.addEventListener(`error`,n,{once:!0}),e.readyState>=WebSocket.CLOSING&&n()})}function R(e,t,n){try{e.close(P(t),n)}catch{}}function z(e){return!e.statePath||m.existsSync(e.statePath)}async function B(e,t,n){try{let r=await fetch(new URL(t.path,`${l(n.localBaseUrl)}/`),{method:t.method,headers:t.headers,...t.bodyBase64?{body:Buffer.from(t.bodyBase64,`base64`)}:{}}),i=Buffer.from(await r.arrayBuffer());F(e,{type:`http-response`,requestId:t.requestId,status:r.status,headers:Object.fromEntries(r.headers.entries()),...i.length>0?{bodyBase64:i.toString(`base64`)}:{}})}catch(n){F(e,{type:`http-error`,requestId:t.requestId,message:n instanceof Error?n.message:String(n)})}}async function V(e,t,n,r){let i=new WebSocket(M(n.localBaseUrl,t.path));i.binaryType=`arraybuffer`;let a=!1;i.addEventListener(`message`,n=>{(async()=>{if(!a)return;let r=await A(n.data);F(e,{type:`ws-frame`,streamId:t.streamId,dataBase64:r.toString(`base64`),binary:typeof n.data!=`string`})})().catch(e=>{console.error(e instanceof Error?e.message:String(e))})}),i.addEventListener(`close`,n=>{r.delete(t.streamId),a&&F(e,{type:`ws-close`,streamId:t.streamId,code:n.code,reason:n.reason})}),i.addEventListener(`error`,()=>{a&&F(e,{type:`ws-close`,streamId:t.streamId,code:1011,reason:`Upstream WebSocket error.`})}),r.set(t.streamId,i);try{await I(i,`Upstream`),a=!0,F(e,{type:`ws-open-result`,streamId:t.streamId,success:!0,headers:{}})}catch(n){r.delete(t.streamId),R(i,1011,`open failed`),F(e,{type:`ws-open-result`,streamId:t.streamId,success:!1,error:n instanceof Error?n.message:String(n)})}}function H(e,t){let n=t.get(e.streamId);if(!n||n.readyState!==1)return;let r=Buffer.from(e.dataBase64,`base64`);n.send(e.binary?r:r.toString(`utf8`))}function U(e,t){let n=t.get(e.streamId);n&&(t.delete(e.streamId),R(n,N(e.code),e.reason??`bridge requested close`))}async function W(e,t,n,r){switch(t.type){case`ping`:F(e,{type:`pong`,timestamp:t.timestamp});return;case`http-request`:await B(e,t,n);return;case`ws-open`:await V(e,t,n,r);return;case`ws-frame`:H(t,r);return;case`ws-close`:U(t,r);return}}async function G(e,t={}){let n=new Map,r=!1,i=null,a=!1,o=null,s=t.delay??h,c,l=new Promise(e=>{c=e}),u=()=>{t.exit?.(0)},d=async()=>{!a&&!o||(o??=k(e).finally(()=>{a=!1,o=null}),await o)},f=()=>{r||(r=!0,c(),a&&d().finally(u),i&&R(i,1e3,`companion stopping`),t.exit&&setTimeout(u,900).unref())};t.registerProcessSignals&&(process.once(`SIGTERM`,f),process.once(`SIGINT`,f));let p=setInterval(()=>{z(e)||(f(),u())},t.leaseCheckIntervalMs??250);p.unref();let m=t.reconnectDelayMs??1e3;try{for(;!r&&z(e);){let o=!1,c;try{a=!1;let s=await w(e);if(m=t.reconnectDelayMs??1e3,o=!0,a=!0,r||!z(e)){await d(),o=!1;break}let c=new WebSocket(s.wsUrl);i=c,c.binaryType=`arraybuffer`;try{await I(c,`Bridge`),c.addEventListener(`message`,t=>{(async()=>{let r=await j(t);await W(c,r,e,n)})().catch(e=>{console.error(e instanceof Error?e.message:String(e))})}),await Promise.race([L(c),l])}finally{i=null,n.forEach(e=>R(e,1012,`bridge disconnected`)),n.clear(),o&&=(await d(),!1)}}catch(t){if(i=null,o&&=(await d(),!1),r||!z(e)||(console.error(t instanceof Error?t.message:String(t)),t instanceof v&&!t.retryable))break;c=t instanceof v?t.retryAfterMs:void 0}if(r||!z(e))break;let u=c??m;c===void 0&&(m=O(m)),await s(u)}}finally{clearInterval(p),t.registerProcessSignals&&(process.off(`SIGTERM`,f),process.off(`SIGINT`,f))}}function K(e){if(!e?.trim())return;let t=Number.parseInt(e,10);if(!Number.isInteger(t)||t<1||t>65535)throw Error(`Companion worker received invalid device port configuration.`);return t}function q(l,m){let h=l[0];if(h!==`--agent-device-run-metro-companion`&&h!==`--agent-device-run-react-devtools-companion`)return null;let g=m[i]?.trim(),_=m[o]?.trim(),v=m[f]?.trim();if(!g||!_||!v)throw new e(`Companion tunnel worker is missing required environment configuration.`);let y=m[r]?.trim(),b=m[p]?.trim(),x=m[s]?.trim();if(!y||!b||!x)throw new e(`Companion tunnel worker is missing required bridge scope configuration.`);let S=m[n]?.trim();if(!S)throw new e(`Companion tunnel worker is missing required register path configuration.`);return{serverBaseUrl:g,bearerToken:_,localBaseUrl:v,registerPath:S,bridgeScope:{tenantId:y,runId:b,leaseId:x},launchUrl:m[u]?.trim(),statePath:m[c]?.trim(),unregisterPath:m[a]?.trim(),devicePort:K(m[t]?.trim()),session:m[d]?.trim()}}async function J(e,t){let n=q(e,t);return n?(await G(n,{exit:e=>process.exit(e),registerProcessSignals:!0}),!0):!1}J(process.argv.slice(2),process.env).catch(t=>{if(t instanceof e){console.error(t.message),process.exitCode=1;return}console.error(t instanceof Error?t.stack??t.message:String(t)),process.exitCode=1});export{};
1
+ import{a as e,c as t,d as n,f as r,g as i,i as a,l as o,m as s,o as c,p as l,r as u,s as d,t as f,u as p}from"../base-url.js";import m from"node:fs";import{setTimeout as h}from"node:timers/promises";const g=5e3,_=6e4;var v=class extends Error{retryable;retryAfterMs;constructor(e,t,n){super(e),this.retryable=t,this.retryAfterMs=n}};function y(e,t){return{authorization:`Bearer ${t}`,"content-type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function b(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length>300?`${t.slice(0,300)}...`:t}function x(e){return e.registerPath}function S(e){return e.unregisterPath??null}function C(e){return{...e.bridgeScope,...e.session?{session:e.session}:{},local_base_url:f(e.localBaseUrl),...e.devicePort?{device_port:e.devicePort}:{},...e.launchUrl?{launch_url:e.launchUrl}:{}}}async function w(e){let t=x(e),n;try{n=await fetch(`${f(e.serverBaseUrl)}${t}`,{method:`POST`,headers:y(e.serverBaseUrl,e.bearerToken),body:JSON.stringify(C(e)),signal:AbortSignal.timeout(g)})}catch(n){throw n instanceof Error&&n.name===`TimeoutError`?Error(`${t} timed out after ${g}ms calling ${f(e.serverBaseUrl)}${t}`):n}let r=await n.text(),i;try{i=r?JSON.parse(r):{}}catch{throw new v(`Failed to register companion (${n.status}): invalid JSON response: ${b(r)}`,T(n.status,void 0),E(n,{}))}if(!n.ok||i.ok!==!0||typeof i.data?.ws_url!=`string`)throw new v(`Failed to register companion (${n.status}): ${JSON.stringify(i)}`,T(n.status,i.error?.code),E(n,i));return{wsUrl:i.data.ws_url}}function T(e,t){return t===`RATE_LIMITED`?!0:t===`UNAUTHORIZED`||t===`INVALID_ARGS`||t===`SESSION_NOT_FOUND`?!1:e===408||e===409||e===425||e===429||e>=500}function E(e,t){let n=t.error?.details?.retryAfterMs;if(typeof n==`number`&&Number.isFinite(n))return D(n);let r=e.headers.get(`retry-after`);if(!r)return;let i=Number(r);if(Number.isFinite(i))return D(i*1e3);let a=Date.parse(r);if(Number.isFinite(a))return D(a-Date.now())}function D(e){return Math.max(0,Math.min(_,Math.ceil(e)))}function O(e){return Math.min(e*2,_)}async function k(e){let t=S(e);if(t)try{await fetch(`${f(e.serverBaseUrl)}${t}`,{method:`POST`,headers:y(e.serverBaseUrl,e.bearerToken),body:JSON.stringify(C(e)),signal:AbortSignal.timeout(2e3)})}catch(e){console.error(e instanceof Error?e.message:String(e))}}async function A(e){return typeof e==`string`?Buffer.from(e,`utf8`):e instanceof ArrayBuffer?Buffer.from(e):ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):typeof Blob<`u`&&e instanceof Blob?Buffer.from(await e.arrayBuffer()):Buffer.from(String(e),`utf8`)}async function j(e){let t=(await A(e.data)).toString(`utf8`);return JSON.parse(t)}function M(e,t){let n=new URL(t,`${f(e)}/`);return n.protocol=n.protocol===`https:`?`wss:`:`ws:`,n.toString()}function N(e){return typeof e!=`number`||!Number.isInteger(e)?1011:e===1e3||e>=3e3&&e<=4999||e>=1001&&e<=1015&&e!==1004&&e!==1005&&e!==1006?e:1011}function P(e){return e===1e3||e>=3e3&&e<=4999?e:3001}function F(e,t){e.readyState===1&&e.send(JSON.stringify(t))}async function I(e,t){e.readyState!==1&&await new Promise((n,r)=>{let i=()=>{s(),n()},a=()=>{s(),r(Error(`${t} WebSocket failed before opening.`))},o=()=>{s(),r(Error(`${t} WebSocket closed before opening.`))},s=()=>{e.removeEventListener(`open`,i),e.removeEventListener(`error`,a),e.removeEventListener(`close`,o)};e.addEventListener(`open`,i,{once:!0}),e.addEventListener(`error`,a,{once:!0}),e.addEventListener(`close`,o,{once:!0})})}async function L(e){e.readyState>=WebSocket.CLOSING||await new Promise(t=>{let n=()=>{r(),t()},r=()=>{e.removeEventListener(`close`,n),e.removeEventListener(`error`,n)};e.addEventListener(`close`,n,{once:!0}),e.addEventListener(`error`,n,{once:!0}),e.readyState>=WebSocket.CLOSING&&n()})}function R(e,t,n){try{e.close(P(t),n)}catch{}}function z(e){return!e.statePath||m.existsSync(e.statePath)}async function B(e,t,n){try{let r=await fetch(new URL(t.path,`${f(n.localBaseUrl)}/`),{method:t.method,headers:t.headers,...t.bodyBase64?{body:Buffer.from(t.bodyBase64,`base64`)}:{}}),i=Buffer.from(await r.arrayBuffer());F(e,{type:`http-response`,requestId:t.requestId,status:r.status,headers:Object.fromEntries(r.headers.entries()),...i.length>0?{bodyBase64:i.toString(`base64`)}:{}})}catch(n){F(e,{type:`http-error`,requestId:t.requestId,message:n instanceof Error?n.message:String(n)})}}async function V(e,t,n,r){let i=new WebSocket(M(n.localBaseUrl,t.path));i.binaryType=`arraybuffer`;let a=!1;i.addEventListener(`message`,n=>{(async()=>{if(!a)return;let r=await A(n.data);F(e,{type:`ws-frame`,streamId:t.streamId,dataBase64:r.toString(`base64`),binary:typeof n.data!=`string`})})().catch(e=>{console.error(e instanceof Error?e.message:String(e))})}),i.addEventListener(`close`,n=>{r.delete(t.streamId),a&&F(e,{type:`ws-close`,streamId:t.streamId,code:n.code,reason:n.reason})}),i.addEventListener(`error`,()=>{a&&F(e,{type:`ws-close`,streamId:t.streamId,code:1011,reason:`Upstream WebSocket error.`})}),r.set(t.streamId,i);try{await I(i,`Upstream`),a=!0,F(e,{type:`ws-open-result`,streamId:t.streamId,success:!0,headers:{}})}catch(n){r.delete(t.streamId),R(i,1011,`open failed`),F(e,{type:`ws-open-result`,streamId:t.streamId,success:!1,error:n instanceof Error?n.message:String(n)})}}function H(e,t){let n=t.get(e.streamId);if(!n||n.readyState!==1)return;let r=Buffer.from(e.dataBase64,`base64`);n.send(e.binary?r:r.toString(`utf8`))}function U(e,t){let n=t.get(e.streamId);n&&(t.delete(e.streamId),R(n,N(e.code),e.reason??`bridge requested close`))}async function W(e,t,n,r){switch(t.type){case`ping`:F(e,{type:`pong`,timestamp:t.timestamp});return;case`http-request`:await B(e,t,n);return;case`ws-open`:await V(e,t,n,r);return;case`ws-frame`:H(t,r);return;case`ws-close`:U(t,r);return}}async function G(e,t={}){let n=new Map,r=!1,i=null,a=!1,o=null,s=t.delay??h,c,l=new Promise(e=>{c=e}),u=()=>{t.exit?.(0)},d=async()=>{!a&&!o||(o??=k(e).finally(()=>{a=!1,o=null}),await o)},f=()=>{r||(r=!0,c(),a&&d().finally(u),i&&R(i,1e3,`companion stopping`),t.exit&&setTimeout(u,900).unref())};t.registerProcessSignals&&(process.once(`SIGTERM`,f),process.once(`SIGINT`,f));let p=setInterval(()=>{z(e)||(f(),u())},t.leaseCheckIntervalMs??250);p.unref();let m=t.reconnectDelayMs??1e3;try{for(;!r&&z(e);){let o=!1,c;try{a=!1;let s=await w(e);if(m=t.reconnectDelayMs??1e3,o=!0,a=!0,r||!z(e)){await d(),o=!1;break}let c=new WebSocket(s.wsUrl);i=c,c.binaryType=`arraybuffer`;try{await I(c,`Bridge`),c.addEventListener(`message`,t=>{(async()=>{let r=await j(t);await W(c,r,e,n)})().catch(e=>{console.error(e instanceof Error?e.message:String(e))})}),await Promise.race([L(c),l])}finally{i=null,n.forEach(e=>R(e,1012,`bridge disconnected`)),n.clear(),o&&=(await d(),!1)}}catch(t){if(i=null,o&&=(await d(),!1),r||!z(e)||(console.error(t instanceof Error?t.message:String(t)),t instanceof v&&!t.retryable))break;c=t instanceof v?t.retryAfterMs:void 0}if(r||!z(e))break;let u=c??m;c===void 0&&(m=O(m)),await s(u)}}finally{clearInterval(p),t.registerProcessSignals&&(process.off(`SIGTERM`,f),process.off(`SIGINT`,f))}}function K(e){if(!e?.trim())return;let t=Number.parseInt(e,10);if(!Number.isInteger(t)||t<1||t>65535)throw Error(`Companion worker received invalid device port configuration.`);return t}function q(f,m){let h=f[0];if(h!==`--agent-device-run-metro-companion`&&h!==`--agent-device-run-react-devtools-companion`)return null;let g=m[n]?.trim(),_=m[u]?.trim(),v=m[c]?.trim();if(!g||!_||!v)throw new i(`Companion tunnel worker is missing required environment configuration.`);let y=m[p]?.trim(),b=m[o]?.trim(),x=m[t]?.trim();if(!y||!b||!x)throw new i(`Companion tunnel worker is missing required bridge scope configuration.`);let S=m[d]?.trim();if(!S)throw new i(`Companion tunnel worker is missing required register path configuration.`);return{serverBaseUrl:g,bearerToken:_,localBaseUrl:v,registerPath:S,bridgeScope:{tenantId:y,runId:b,leaseId:x},launchUrl:m[e]?.trim(),statePath:m[l]?.trim(),unregisterPath:m[s]?.trim(),devicePort:K(m[a]?.trim()),session:m[r]?.trim()}}async function J(e,t){let n=q(e,t);return n?(await G(n,{exit:e=>process.exit(e),registerProcessSignals:!0}),!0):!1}J(process.argv.slice(2),process.env).catch(e=>{if(e instanceof i){console.error(e.message),process.exitCode=1;return}console.error(e instanceof Error?e.stack??e.message:String(e)),process.exitCode=1});export{};
@@ -1 +1 @@
1
- export { };
1
+ export {}