agent-device 0.20.9 → 0.21.0

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 (492) hide show
  1. package/README.md +2 -2
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.9.apk → agent-device-android-ime-helper-0.21.0.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.0.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.9.manifest.json → agent-device-android-ime-helper-0.21.0.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.9.manifest.json → agent-device-android-snapshot-helper-0.21.0.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 +49 -0
  12. package/apple/snapshot-bridge/SnapshotBridge.m +280 -0
  13. package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +33 -0
  14. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +382 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +2 -2
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +21 -12
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +21 -88
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +110 -107
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +6 -14
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +85 -114
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -6
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +72 -175
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +10 -11
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +78 -64
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +17 -9
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +47 -13
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +232 -438
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +98 -0
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +229 -168
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +110 -0
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +147 -25
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +21 -18
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +24 -307
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +19 -0
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +49 -16
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +2 -11
  49. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +4 -19
  50. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +16 -20
  51. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
  52. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +42 -81
  53. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +35 -82
  54. package/dist/apple/snapshot-presentation/Package.swift +21 -0
  55. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
  56. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
  57. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
  58. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
  59. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
  60. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
  61. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
  62. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
  63. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
  64. package/dist/src/adapter.js +1 -0
  65. package/dist/src/adb-executor.js +2 -0
  66. package/dist/src/adb-failure.js +1 -0
  67. package/dist/src/adb-host.js +1 -0
  68. package/dist/src/adb.js +1 -0
  69. package/dist/src/agent-browser-lifecycle.js +1 -0
  70. package/dist/src/agent-browser-process-record.js +1 -0
  71. package/dist/src/agent-browser-provider.js +1 -0
  72. package/dist/src/agent-browser-tool.js +1 -1
  73. package/dist/src/agent-device-client.js +2 -2
  74. package/dist/src/ai-sdk.d.ts +61 -0
  75. package/dist/src/ai-sdk.js +1 -0
  76. package/dist/src/alert-contract.js +1 -0
  77. package/dist/src/alert-runtime.js +1 -0
  78. package/dist/src/android-adb.d.ts +27 -19
  79. package/dist/src/android-adb.js +1 -1
  80. package/dist/src/android-input-ownership.js +1 -0
  81. package/dist/src/android-system-chrome.js +1 -0
  82. package/dist/src/android.js +1 -1
  83. package/dist/src/api.js +11 -0
  84. package/dist/src/app-catalog.js +1 -0
  85. package/dist/src/app-deployment-resolution.js +2 -0
  86. package/dist/src/app-helpers.js +1 -1
  87. package/dist/src/app-inventory-contract.js +1 -0
  88. package/dist/src/app-inventory.js +1 -0
  89. package/dist/src/app-launch.js +2 -0
  90. package/dist/src/app-lifecycle-facade.js +1 -0
  91. package/dist/src/app-lifecycle.js +3 -6
  92. package/dist/src/app-lifecycle2.js +2 -2
  93. package/dist/src/app-lifecycle3.js +1 -0
  94. package/dist/src/app-log-files.js +1 -1
  95. package/dist/src/app-log-reconnect.js +1 -1
  96. package/dist/src/app-log-runtime.js +1 -4
  97. package/dist/src/app-log-runtime2.js +4 -0
  98. package/dist/src/app-parsers.js +4 -0
  99. package/dist/src/app-resolution-cache.js +1 -0
  100. package/dist/src/app-resolution-facade.js +1 -0
  101. package/dist/src/app-resolution.js +2 -2
  102. package/dist/src/app-state.js +1 -2
  103. package/dist/src/application-lifecycle-interaction.js +1 -0
  104. package/dist/src/application-lifecycle-runtime.js +1 -0
  105. package/dist/src/apps-simctl.js +1 -0
  106. package/dist/src/archive.js +4 -0
  107. package/dist/src/artifact-download.js +1 -0
  108. package/dist/src/artifacts.d.ts +6 -2
  109. package/dist/src/artifacts.js +1 -1
  110. package/dist/src/async-lifecycle.js +1 -0
  111. package/dist/src/audio-probe-result.js +1 -0
  112. package/dist/src/audio-probe-runtime.js +1 -0
  113. package/dist/src/audio-probe-support.js +1 -0
  114. package/dist/src/auth-session.js +1 -1
  115. package/dist/src/auth.js +1 -1
  116. package/dist/src/back-mode.js +1 -0
  117. package/dist/src/{url.js → base-url.js} +1 -1
  118. package/dist/src/boot-diagnostics.js +2 -2
  119. package/dist/src/byte-limit-stream.js +1 -1
  120. package/dist/src/capabilities.js +1 -0
  121. package/dist/src/capture.js +1 -0
  122. package/dist/src/catalog.js +1 -0
  123. package/dist/src/cli-command-aliases.js +1 -0
  124. package/dist/src/cli-config.js +1 -1
  125. package/dist/src/cli-help.js +77 -51
  126. package/dist/src/cli-output.js +1 -1
  127. package/dist/src/cli-runner.js +1 -1
  128. package/dist/src/cli.js +5 -7
  129. package/dist/src/click-button.js +1 -0
  130. package/dist/src/client-metro-companion.js +1 -0
  131. package/dist/src/client-metro.js +1 -1
  132. package/dist/src/client-types.d.ts +1606 -0
  133. package/dist/src/clipboard.js +1 -0
  134. package/dist/src/code-signature-cache.js +1 -0
  135. package/dist/src/code-signature.js +1 -0
  136. package/dist/src/color.js +1 -0
  137. package/dist/src/command-metadata.js +1 -1
  138. package/dist/src/command-schema.js +3 -3
  139. package/dist/src/command-surface.js +1 -1
  140. package/dist/src/command-tools.js +2 -0
  141. package/dist/src/command.js +1 -0
  142. package/dist/src/{selector-vocabulary.js → compatibility-policy.js} +1 -1
  143. package/dist/src/config.js +1 -1
  144. package/dist/src/config2.js +1 -0
  145. package/dist/src/connection-runtime.js +1 -1
  146. package/dist/src/connection.js +5 -5
  147. package/dist/src/contracts.d.ts +1 -1
  148. package/dist/src/contracts.js +1 -1
  149. package/dist/src/daemon-client-lifecycle.js +1 -0
  150. package/dist/src/daemon-process.js +1 -0
  151. package/dist/src/daemon-registration.js +1 -0
  152. package/dist/src/daemon-shutdown-report.js +1 -1
  153. package/dist/src/daemon.js +2 -2
  154. package/dist/src/debug-symbols-facade.js +5 -0
  155. package/dist/src/deploy-result-target.js +1 -0
  156. package/dist/src/device-claim-inspection.js +1 -1
  157. package/dist/src/device-claim-rule.js +1 -0
  158. package/dist/src/device-input-state.d.ts +190 -3
  159. package/dist/src/device-inventory-context.js +1 -0
  160. package/dist/src/device-isolation.js +1 -0
  161. package/dist/src/device-release.js +1 -0
  162. package/dist/src/device-rotation.js +1 -0
  163. package/dist/src/device-selection-resolver.js +1 -0
  164. package/dist/src/device-session.js +1 -0
  165. package/dist/src/device.js +1 -1
  166. package/dist/src/device2.js +3 -2
  167. package/dist/src/diagnostics.js +3 -0
  168. package/dist/src/diagnostics2.js +1 -0
  169. package/dist/src/dispatch-resolve.js +1 -0
  170. package/dist/src/doctor-facade.js +1 -0
  171. package/dist/src/doctor-output.js +1 -0
  172. package/dist/src/doctor.js +1 -0
  173. package/dist/src/doctor2.js +1 -0
  174. package/dist/src/doctor3.js +1 -0
  175. package/dist/src/durable-resource.js +1 -0
  176. package/dist/src/entities.js +1 -1
  177. package/dist/src/error.js +2 -0
  178. package/dist/src/exec.js +1 -0
  179. package/dist/src/file.js +1 -0
  180. package/dist/src/find.js +1 -1
  181. package/dist/src/finders.js +1 -1
  182. package/dist/src/format.js +2 -0
  183. package/dist/src/generic-settle.js +1 -1
  184. package/dist/src/generic.js +1 -1
  185. package/dist/src/gesture-admission.js +1 -0
  186. package/dist/src/gesture-plan-types.js +1 -0
  187. package/dist/src/gesture-plan.js +1 -0
  188. package/dist/src/gesture-runtime.js +1 -0
  189. package/dist/src/harmonyos.js +1 -1
  190. package/dist/src/hdc.js +1 -1
  191. package/dist/src/helper.js +2 -2
  192. package/dist/src/host-file.js +1 -0
  193. package/dist/src/human-control-contract.js +1 -0
  194. package/dist/src/human-control.js +1 -0
  195. package/dist/src/index.d.ts +2 -1578
  196. package/dist/src/index.js +1 -1
  197. package/dist/src/input-actions.js +1 -4
  198. package/dist/src/input-actions2.js +2 -1
  199. package/dist/src/install-artifact-facade.js +1 -0
  200. package/dist/src/install-source-network-transport.js +1 -0
  201. package/dist/src/install-source.d.ts +3 -10
  202. package/dist/src/install-source2.js +1 -1
  203. package/dist/src/interaction-positionals.js +1 -0
  204. package/dist/src/interaction-ref-policy.js +1 -0
  205. package/dist/src/interaction.js +1 -1
  206. package/dist/src/interaction2.js +1 -1
  207. package/dist/src/interactor-operation-catalog.js +1 -0
  208. package/dist/src/interactor-types.js +1 -0
  209. package/dist/src/interactor.js +6 -2
  210. package/dist/src/interactor2.js +1 -1
  211. package/dist/src/interactors.js +1 -1
  212. package/dist/src/internal/bin.d.ts +1 -1
  213. package/dist/src/internal/bin.js +1 -2
  214. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  215. package/dist/src/internal/companion-tunnel.js +1 -1
  216. package/dist/src/internal/daemon.d.ts +1 -1
  217. package/dist/src/internal/daemon.js +2 -4
  218. package/dist/src/internal/png-worker.d.ts +4 -4
  219. package/dist/src/internal/png-worker.js +1 -1
  220. package/dist/src/internal/run-script-http-child.d.ts +4 -0
  221. package/dist/src/internal/run-script-http-child.js +1 -0
  222. package/dist/src/internal/update-check-entry.d.ts +1 -1
  223. package/dist/src/inventory.js +4 -4
  224. package/dist/src/inventory2.js +1 -1
  225. package/dist/src/inventory3.js +1 -1
  226. package/dist/src/inventory5.js +1 -1
  227. package/dist/src/inventory6.js +1 -1
  228. package/dist/src/ios-client.js +16 -0
  229. package/dist/src/ios-snapshot-acquisition.js +1 -0
  230. package/dist/src/ios-snapshot-adapter.js +1 -0
  231. package/dist/src/ios-snapshot-planning.js +1 -0
  232. package/dist/src/ios-snapshot-runtime.js +1 -0
  233. package/dist/src/json.js +1 -0
  234. package/dist/src/keyboard-actions.js +1 -0
  235. package/dist/src/launch-console.js +1 -0
  236. package/dist/src/lease-context.js +1 -1
  237. package/dist/src/lease-scope.js +1 -0
  238. package/dist/src/lease.js +1 -1
  239. package/dist/src/limrun-runtime-dependencies.js +1 -1
  240. package/dist/src/limrun.d.ts +1618 -7
  241. package/dist/src/limrun.js +1 -1
  242. package/dist/src/linux.js +1 -1
  243. package/dist/src/local-interactor-operation-set.js +1 -0
  244. package/dist/src/location-coordinates.js +1 -1
  245. package/dist/src/logcat.js +1 -1
  246. package/dist/src/macos-facade.js +1 -0
  247. package/dist/src/managed-device-scope.js +1 -0
  248. package/dist/src/mechanics.js +19 -0
  249. package/dist/src/metro.d.ts +4 -2
  250. package/dist/src/metro.js +1 -1
  251. package/dist/src/metro2.js +1 -1
  252. package/dist/src/mobile-snapshot-semantics.js +1 -0
  253. package/dist/src/multitouch-support.js +1 -0
  254. package/dist/src/numeric.js +1 -0
  255. package/dist/src/observability.js +1 -1
  256. package/dist/src/observation.js +2 -0
  257. package/dist/src/output-path.js +1 -1
  258. package/dist/src/owner-identity.js +3 -1
  259. package/dist/src/parameterized-recorded-fill.js +1 -0
  260. package/dist/src/parser.js +1 -1
  261. package/dist/src/perf-facade.js +2 -0
  262. package/dist/src/perf-runtime-operation-builder.js +1 -0
  263. package/dist/src/perf-runtime-plan.js +1 -0
  264. package/dist/src/perf-runtime.js +1 -0
  265. package/dist/src/perf.js +1 -4
  266. package/dist/src/physical-device-control.js +1 -1
  267. package/dist/src/physical-device-facade.js +1 -0
  268. package/dist/src/platform-request-scope.js +1 -0
  269. package/dist/src/platform-runtime-android-adb-host.js +1 -0
  270. package/dist/src/platform-runtime-android-mechanics.js +1 -0
  271. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  272. package/dist/src/platform-runtime-app-log-process.js +1 -1
  273. package/dist/src/platform-runtime-apple-resources.js +1 -0
  274. package/dist/src/platform-runtime-host.js +1 -1
  275. package/dist/src/platform-runtime-managed-owner.js +1 -0
  276. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  277. package/dist/src/platform-runtime-open-target.js +1 -1
  278. package/dist/src/platform-runtime-operation-host.js +4 -4
  279. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  280. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  281. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  282. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  283. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  284. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  285. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  286. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  287. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
  288. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  289. package/dist/src/platform-runtime-unavailable.js +1 -0
  290. package/dist/src/platform-runtime.js +1 -1
  291. package/dist/src/platform-runtime2.js +1 -1
  292. package/dist/src/plist.js +1 -1
  293. package/dist/src/png-worker-contract.js +1 -1
  294. package/dist/src/prepare-kind.js +1 -15
  295. package/dist/src/process-exit.js +1 -1
  296. package/dist/src/process.js +1 -0
  297. package/dist/src/provider-device-runtime.js +1 -0
  298. package/dist/src/provider-session-ownership.js +2 -0
  299. package/dist/src/provider-webdriver.js +1 -1
  300. package/dist/src/provider.js +1 -1
  301. package/dist/src/providers.js +1 -0
  302. package/dist/src/proxy.js +2 -2
  303. package/dist/src/react-native-overlay.js +1 -0
  304. package/dist/src/react-native.js +1 -1
  305. package/dist/src/record-runtime.js +1 -1
  306. package/dist/src/record-trace.js +1 -1
  307. package/dist/src/rect-center.js +1 -0
  308. package/dist/src/register-builtins.js +1 -0
  309. package/dist/src/registry.js +39 -28
  310. package/dist/src/remote-config2.js +1 -1
  311. package/dist/src/replay-divergence.js +2 -0
  312. package/dist/src/replay.js +2 -2
  313. package/dist/src/reporting.js +8 -8
  314. package/dist/src/request-admission.js +1 -0
  315. package/dist/src/request-cancel.js +1 -0
  316. package/dist/src/request-cancellation.js +1 -0
  317. package/dist/src/request-progress-protocol.js +1 -0
  318. package/dist/src/request-providers.js +1 -0
  319. package/dist/src/request-runtime-binding.js +1 -0
  320. package/dist/src/request.js +1 -0
  321. package/dist/src/result-serialization.js +1 -0
  322. package/dist/src/retry.js +1 -0
  323. package/dist/src/rolldown-runtime.js +1 -1
  324. package/dist/src/runner-cache-metadata.js +2 -0
  325. package/dist/src/runner-client.js +1 -1
  326. package/dist/src/runner-disposal.js +1 -1
  327. package/dist/src/runner-operations-facade.js +1 -0
  328. package/dist/src/runner-owner-facade.js +1 -0
  329. package/dist/src/runner-owner-state.js +1 -0
  330. package/dist/src/runner-presentation.js +1 -0
  331. package/dist/src/runner-selector-query.js +1 -0
  332. package/dist/src/runner.js +1 -0
  333. package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
  334. package/dist/src/runtime.js +3 -3
  335. package/dist/src/runtime2.js +4 -4
  336. package/dist/src/runtime3.js +1 -1
  337. package/dist/src/runtime4.js +4 -3
  338. package/dist/src/runtime5.js +1 -1
  339. package/dist/src/runtime6.js +1 -1
  340. package/dist/src/runtime7.js +1 -1
  341. package/dist/src/runtime8.js +1 -1
  342. package/dist/src/runtime9.js +1 -1
  343. package/dist/src/scoped-provider.js +1 -1
  344. package/dist/src/screen-recording-completion.js +1 -0
  345. package/dist/src/screen-recording-live-handle.js +1 -0
  346. package/dist/src/screen-recording-options.js +1 -0
  347. package/dist/src/screen-recording-resource-recovery.js +1 -0
  348. package/dist/src/screen-recording-runtime.js +1 -0
  349. package/dist/src/screenshot-density.js +1 -1
  350. package/dist/src/screenshot-result.js +1 -6
  351. package/dist/src/screenshot-runtime.js +1 -0
  352. package/dist/src/screenshot.js +1 -1
  353. package/dist/src/screenshot2.js +1 -0
  354. package/dist/src/screenshot3.js +5 -0
  355. package/dist/src/script.js +1 -0
  356. package/dist/src/scroll-command.js +1 -0
  357. package/dist/src/scroll-gesture.js +1 -0
  358. package/dist/src/scroll-indicator.js +1 -0
  359. package/dist/src/sdk-batch-runner.d.ts +23 -6
  360. package/dist/src/sdk-batch-runner.js +2 -3
  361. package/dist/src/sdk-batch.js +2 -0
  362. package/dist/src/sdk-contracts.d.ts +222 -99
  363. package/dist/src/sdk-contracts.js +2 -2
  364. package/dist/src/sdk-device.js +1 -1
  365. package/dist/src/sdk-finders.d.ts +1 -1
  366. package/dist/src/sdk-finders.js +1 -1
  367. package/dist/src/sdk-io.js +1 -1
  368. package/dist/src/sdk-remote-config.d.ts +1 -1
  369. package/dist/src/sdk-remote-config.js +1 -1
  370. package/dist/src/sdk-selectors.d.ts +539 -199
  371. package/dist/src/sdk-selectors.js +1 -1
  372. package/dist/src/selection.js +1 -0
  373. package/dist/src/selector-runtime.js +1 -1
  374. package/dist/src/selectors.js +1 -1
  375. package/dist/src/semantic-index.js +1 -0
  376. package/dist/src/server.js +10 -3
  377. package/dist/src/session-allocation.js +1 -0
  378. package/dist/src/session-artifact-paths.js +1 -0
  379. package/dist/src/session-paths.js +1 -0
  380. package/dist/src/session-repair-tombstone.js +1 -0
  381. package/dist/src/session-routing.js +1 -0
  382. package/dist/src/session-runtime-admission.js +1 -0
  383. package/dist/src/session-snapshot.js +1 -0
  384. package/dist/src/session-store.js +4 -0
  385. package/dist/src/session-target-evidence.js +1 -1
  386. package/dist/src/session2.js +5 -28
  387. package/dist/src/settings.js +1 -0
  388. package/dist/src/shared.js +2 -2
  389. package/dist/src/simctl-facade.js +1 -0
  390. package/dist/src/simctl.js +1 -1
  391. package/dist/src/simulator-facade.js +1 -0
  392. package/dist/src/simulator.js +1 -1
  393. package/dist/src/snapshot-capture-annotations.js +1 -0
  394. package/dist/src/snapshot-desktop-projection.js +1 -0
  395. package/dist/src/snapshot-diagnostics.js +1 -0
  396. package/dist/src/snapshot-process.js +1 -0
  397. package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
  398. package/dist/src/snapshot-quality-verdict.js +1 -0
  399. package/dist/src/snapshot-runtime-binding.js +1 -0
  400. package/dist/src/snapshot-runtime.js +1 -1
  401. package/dist/src/snapshot-scope.js +1 -0
  402. package/dist/src/snapshot-state.js +1 -0
  403. package/dist/src/snapshot.js +1 -8
  404. package/dist/src/snapshot2.js +1 -1
  405. package/dist/src/snapshot3.js +1 -1
  406. package/dist/src/snapshot4.js +1 -0
  407. package/dist/src/src.js +1 -1
  408. package/dist/src/src2.js +1 -1
  409. package/dist/src/src3.js +1 -2
  410. package/dist/src/src4.js +1 -0
  411. package/dist/src/src5.js +1 -0
  412. package/dist/src/src6.js +1 -0
  413. package/dist/src/src7.js +2 -0
  414. package/dist/src/src8.js +115 -0
  415. package/dist/src/startup-recovery-fence.js +1 -0
  416. package/dist/src/status-markers.js +1 -0
  417. package/dist/src/string-enum.js +1 -1
  418. package/dist/src/success-text.js +1 -0
  419. package/dist/src/surface-snapshot.js +1 -0
  420. package/dist/src/surface-snapshot2.js +1 -0
  421. package/dist/src/takeover.js +5 -0
  422. package/dist/src/tool-provider-facade.js +1 -0
  423. package/dist/src/tool-provider.js +4 -3
  424. package/dist/src/tool-provider2.js +1 -1
  425. package/dist/src/tool-provider3.js +1 -0
  426. package/dist/src/toolchain-probe.js +2 -0
  427. package/dist/src/touch-runtime.js +1 -0
  428. package/dist/src/transport.js +3 -0
  429. package/dist/src/tree.js +1 -0
  430. package/dist/src/ttl-memo.js +1 -0
  431. package/dist/src/tv-remote.js +1 -0
  432. package/dist/src/type-text-runtime.js +1 -0
  433. package/dist/src/undici.js +99 -0
  434. package/dist/src/update-check.js +1 -1
  435. package/dist/src/verified-file.js +1 -1
  436. package/dist/src/version.js +1 -1
  437. package/dist/src/video.js +2 -2
  438. package/dist/src/web.js +2 -1
  439. package/dist/src/web2.js +1 -0
  440. package/dist/src/webdriver-ios-snapshot.js +1 -0
  441. package/dist/src/webdriver-source.js +1 -0
  442. package/linux/atspi-dump.py +54 -9
  443. package/package.json +73 -38
  444. package/server.json +9 -3
  445. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.9.apk.sha256 +0 -1
  446. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.apk +0 -0
  447. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.apk.sha256 +0 -1
  448. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
  449. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -75
  450. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
  451. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
  452. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
  453. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
  454. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
  455. package/dist/src/appearance.js +0 -1
  456. package/dist/src/apps.js +0 -5
  457. package/dist/src/audio-probe.js +0 -1
  458. package/dist/src/cancel.js +0 -1
  459. package/dist/src/cli-grammar.js +0 -1
  460. package/dist/src/command-catalog.js +0 -1
  461. package/dist/src/debug-symbols.js +0 -5
  462. package/dist/src/device-input-state.js +0 -2
  463. package/dist/src/device-ready.js +0 -1
  464. package/dist/src/dispatch.js +0 -1
  465. package/dist/src/handler-utils.js +0 -1
  466. package/dist/src/helper-package-install.js +0 -1
  467. package/dist/src/host-process.js +0 -3
  468. package/dist/src/ime-lifecycle.js +0 -2
  469. package/dist/src/ime-recovery-marker.js +0 -1
  470. package/dist/src/input-actions3.js +0 -1
  471. package/dist/src/install-artifact.js +0 -1
  472. package/dist/src/install-artifact2.js +0 -1
  473. package/dist/src/interaction-common.js +0 -1
  474. package/dist/src/interaction-runtime.js +0 -1
  475. package/dist/src/interaction-snapshot.js +0 -1
  476. package/dist/src/manifest.js +0 -1
  477. package/dist/src/method-scope.js +0 -1
  478. package/dist/src/png-resize.js +0 -1
  479. package/dist/src/process-lock.js +0 -1
  480. package/dist/src/runner-lease.js +0 -1
  481. package/dist/src/runner-sequence.js +0 -1
  482. package/dist/src/screenshot-geometry.js +0 -1
  483. package/dist/src/sdk-android-adb.d.ts +0 -245
  484. package/dist/src/sdk-android-adb.js +0 -4
  485. package/dist/src/sdk.js +0 -1
  486. package/dist/src/setting-state.js +0 -1
  487. package/dist/src/shell-quote.js +0 -1
  488. package/dist/src/snapshot-session.js +0 -1
  489. package/dist/src/timing-safe-equal.js +0 -1
  490. package/dist/src/unsupported-interactor.js +0 -1
  491. package/dist/src/verdict.js +0 -1
  492. /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
package/dist/src/index.js CHANGED
@@ -1 +1 @@
1
- import{S as e,_ as t,u as n,x as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{t as AppError,n as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,r as isAgentDeviceError,e as normalizeAgentDeviceError};
1
+ import{D as e,T as t,d as n,y as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{r as AppError,n as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,t as isAgentDeviceError,e as normalizeAgentDeviceError};
@@ -1,4 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{Rt as n}from"./sdk-batch-runner.js";import{_ as r,a as i,v as a,y as o,z as s}from"./interaction.js";import{n as c}from"./device.js";import{A as l,F as u,c as d,f,l as ee,o as p,s as m}from"./sdk-android-adb.js";import{n as te}from"./shell-quote.js";import{t as h}from"./timeouts.js";import{g}from"./app-lifecycle.js";import{r as _}from"./device-input-state.js";import{c as v,d as ne,f as re,h as ie,l as ae,m as oe,o as se,p as ce,t as y}from"./snapshot.js";import{a as le,d as b,r as ue}from"./helper-package-install.js";import{a as de,c as x,r as S,s as C}from"./ime-lifecycle.js";function fe(e,t){if(!t)return{expected:e,actual:null,failureReason:`text_mismatch`,targetInput:null,actualInput:null};let n=he(t),r={failureReason:t.reason??`text_mismatch`,targetInput:T(t.targetInput),actualInput:T(t.actualInput)};return n?{...r,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??``).length}:{...r,expected:e,actual:t.actual}}function w(e){return e?e.password?!0:pe(e.text):!1}function pe(e){return e?Array.from(e).every(me):!1}function T(e){if(!e)return null;let t=w(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function me(e){return e===`•`||e===`*`||e===`●`}function he(e){return e.masked===!0||w(e.targetInput)||w(e.actualInput)}async function E(e,t,n,r){let i=[0,150,350],a=null,o=null,s=await j(e);for(let c of i){c>0&&await h(c);let i=await Ce(e,t,n,r,s);if(a=i,i.reason===`ime_capture`)return i;o=i.ok?i:null}return o??a??{ok:!1,actual:null,reason:`text_mismatch`,targetInput:null,actualInput:null}}async function ge(e,t,n){return be(await y(e),t,n)}async function _e(e,t,n){let r=await j(e);return k(await y(e),t,n,r).targetInput}async function ve(e,t,n){try{return await _e(e,t,n)}catch(e){return l({level:`warn`,phase:`android_fill_pre_action_target_capture_failed`,data:{error:e instanceof Error?e.message:String(e)}}),null}}function D(e,n,r){if(r?.ok)return;let i=r?O(e,n,r):null;if(i)return i;throw new t(`COMMAND_FAILED`,xe(r),Se(e,r))}function O(e,t,n){let r=n.targetInput,i=n.actualInput;if(n.reason===`ime_capture`||!t||!r||!i||w(t)||w(r)||w(i)||!N(t,r)||!N(t,i)||t.text===n.actual)return null;let a=Fe(t);return l({level:`warn`,phase:`android_fill_verification_unconfirmed`,data:{target:a}}),{verification:`unconfirmed`,requested:e,before:t.text,after:n.actual,target:a}}function ye(e,t,n,r,i={}){let a=k(e,t,n,i);return we(a)?{ok:!1,actual:a.actualInput?.text??null,reason:`ime_capture`,targetInput:a.targetInput,actualInput:a.actualInput}:Te(a,r)??Ee(a,r)}function be(e,t,n){return k(e,t,n).targetInput?.text??null}function xe(e){return e?.reason===`ime_capture`?`Android fill input was captured by the active keyboard instead of the app field`:e?.reason===`masked_unverified`?`Android fill verification could not confirm masked text value`:`Android fill verification failed`}function Se(e,t){let n=fe(e,t);return t?.reason===`ime_capture`&&(n.hint=`The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill.`),n}async function Ce(e,t,n,r,i){return ye(await y(e),t,n,r,i)}function k(e,t,n,r={}){let i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let a of ie(e)){let e=ke(a,r);e&&Ae(i,e,t,n)}return Me(i)}function we(e){let{targetInput:t,actualInput:n}=e;return!t||!n||n===t?!1:n.inputMethodOwned&&!t.inputMethodOwned}function Te(e,t){let n=e.actualInput;if(!n||!Pe(n))return null;let r=n.text??null,i=Array.from(r??``).length,a=Array.from(t).length,o=r!==null&&i>0&&a>0&&i===a;return{ok:o,actual:r,reason:o?void 0:`masked_unverified`,masked:!0,targetInput:e.targetInput,actualInput:n}}function Ee(e,t){let n=e.actualInput?.text??null;return{ok:De(n,t),actual:n,reason:`text_mismatch`,targetInput:e.targetInput,actualInput:e.actualInput}}function De(e,t){if(e===t)return!0;let n=A(e),r=A(t);return!n||!r?!1:!!(n===r||Oe(n,r))}function A(e){return(e??``).replace(/\s+/g,` `).trim()}function Oe(e,t){if(e.length!==t.length||e.length===0||e.slice(1)!==t.slice(1))return!1;let n=e[0],r=t[0];return!n||!r?!1:r.toLowerCase()===r&&n===r.toUpperCase()}function ke(e,t){if(!e.rect)return null;let r=e.text??``,i=Math.max(1,e.rect.width*e.rect.height);return{text:r||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:e.password===!0,inputMethodOwned:n({packageName:e.packageName,resourceId:e.resourceId,activeInputMethodPackage:t.activeInputMethodPackage}),area:i,editText:Ne(e.className??``)}}async function j(e){try{return{activeInputMethodPackage:(await _(e)).inputMethodPackage}}catch(e){return l({level:`warn`,phase:`android_fill_verification_input_method_probe_failed`,data:{error:e instanceof Error?e.message:String(e)}}),{}}}function Ae(e,t,n,r){let i=je(t.rect,n,r);if(i&&t.editText&&(e.editAtPoint=M(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=M(e.focusedEdit,t);return}i&&t.text&&(e.anyAtPoint=M(e.anyAtPoint,t))}function je(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function M(e,t){return e&&e.area<t.area?e:t}function Me(e){let t=e.editAtPoint??e.anyAtPoint;return{targetInput:t,actualInput:(e.focusedEdit?.text?e.focusedEdit:null)??t}}function Ne(e){let t=e.toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)}function Pe(e){return w(e)}function N(e,t){return e.resourceId||t.resourceId?e.resourceId===t.resourceId&&e.packageName===t.packageName:e.className===t.className&&e.packageName===t.packageName&&e.rect.x===t.rect.x&&e.rect.y===t.rect.y&&e.rect.width===t.rect.width&&e.rect.height===t.rect.height}function Fe(e){return{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:e.rect}}function P(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return e}const F=45e3,I=`ANDROID_TOUCH_HELPER_NO_FINAL_RESULT`,L=`ANDROID_TOUCH_HELPER_REPORTED_FAILURE`;async function Ie(e,t){let n=await z(e),r=ze(t),i=Math.max(45e3,r.durationMs+15e3),a=Buffer.from(JSON.stringify({protocol:`android-touch-plan-v1`,...r})).toString(`base64`),o=await u(`android_touch_helper_gesture`,async()=>{let e=await v({deviceKey:n.deviceKey,action:`gesture`,helper:R(n.artifact),payloadBase64:a,timeoutMs:i});return e?{...V(e),helperTransport:`persistent-session`}:{...await B({adb:n.adb,runner:n.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`gesture`,`-e`,`payloadBase64`,a],timeoutMs:i,readResult:V}),helperTransport:`instrumentation`}},{packageName:n.artifact.manifest.packageName,version:n.artifact.manifest.version});return{backend:`android-helper`,helperVersion:n.artifact.manifest.version,installReason:n.install.reason,...o}}async function Le(e){let t=await z(e);try{let e=await v({deviceKey:t.deviceKey,action:`viewport`,helper:R(t.artifact),timeoutMs:F});if(e)return H(e)}catch(e){await ae(t.deviceKey),l({level:`warn`,phase:`android_touch_helper_viewport_session_fallback`,data:{reason:e instanceof Error?e.message:String(e)}})}return await B({adb:t.adb,runner:t.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`viewport`],timeoutMs:F,readResult:H})}function R(e){return{packageName:e.manifest.packageName,runner:e.manifest.instrumentationRunner,helperVersion:e.manifest.version,helperVersionCode:e.manifest.versionCode,sha256:e.manifest.sha256}}async function z(e){let t=m(e),n=t.snapshotHelperArtifact??await Re(),r=ne(e);await re({deviceKey:r,adb:t.exec});let i=await u(`android_touch_helper_install`,async()=>await se({adb:t.exec,adbProvider:t,artifact:n,deviceKey:r,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode});return l({phase:`android_touch_helper_install_decision`,data:i}),i.installed&&await ae(r),{adb:t.exec,artifact:n,install:i,deviceKey:r}}async function Re(){return await ue({helperDirName:`snapshot-helper`,manifestFileName:e=>`agent-device-android-snapshot-helper-${e}.manifest.json`,parseManifest:e=>{let t=ce(e);return{...t,assetName:t.assetName??`agent-device-android-snapshot-helper-${t.version}.apk`}},unavailableMessage:`Android touch gestures require the bundled Android automation helper artifact, but it was not found or could not be read`})}function ze(e){return{kind:e.topology===`single`?`swipe`:`transform`,durationMs:e.durationMs,pointers:e.pointers.map(Be)}}function Be(e){return{pointerId:e.pointerId,samples:e.samples.map(({offsetMs:e,point:t})=>({offsetMs:e,x:t.x,y:t.y}))}}async function B(e){let n=await e.adb([`shell`,`am`,`instrument`,`-w`,...e.extraArgs,e.runner],{allowFailure:!0,timeoutMs:e.timeoutMs}),r;try{r=Ve(`${n.stdout}\n${n.stderr}`)}catch(e){if(e instanceof t){if(e.code===L)throw new t(`COMMAND_FAILED`,e.message,e.details,e);if(e.code!==I)throw e}throw new t(`COMMAND_FAILED`,n.exitCode===0?`Android automation helper output could not be parsed`:`Android automation helper failed before returning parseable output`,f(n),e)}if(n.exitCode!==0)throw new t(`COMMAND_FAILED`,`Android automation helper failed`,f(n,{helper:r}));return e.readResult(r)}function Ve(e){let n=le(e).results.find(e=>e.agentDeviceProtocol===oe);if(!n)throw new t(I,`Android automation helper did not return a final result`);if(n.ok!==`true`)throw new t(L,n.message&&n.message!==`null`?n.message:n.errorType||`Android automation helper returned an error`,{errorType:n.errorType,helper:n});return n}function V(e){return{helperKind:e.kind,helperApiVersion:e.helperApiVersion,injectedEvents:b(e.injectedEvents),elapsedMs:b(e.elapsedMs)}}function H(e){let n=b(e.x),r=b(e.y),i=b(e.width),a=b(e.height);if(n===void 0||r===void 0||i===void 0||a===void 0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return P({x:n,y:r,width:i,height:a})}function He(e){if(e.topology===`two`||e.intent===`longPress`)return e;let[{pointerId:t,samples:n}]=e.pointers,r=[...new Set([...o(e.durationMs,`android`),...n.map(({offsetMs:e})=>e)])].sort((e,t)=>e-t),i=0,s=r.map(e=>{for(;i<n.length-2&&e>n[i+1].offsetMs;)i+=1;let t=n[i],r=n[i+1],o=r.offsetMs-t.offsetMs;return{offsetMs:e,point:e===r.offsetMs||o===0?r.point:a(t.point,r.point,(e-t.offsetMs)/o)}}),c=[s[0],s[1],s[2],...s.slice(3)];return{...e,pointers:[{pointerId:t,samples:c}]}}async function U(e,t){let n=He(t),r=ee(e);if(r){let e=n.intent===`longPress`?{...n,viewport:P(await r.gestureViewport())}:n;return{backend:`provider-native-touch`,...await r.touch(e)??{}}}return await Ie(e,n)}async function W(e){let t=ee(e);return t?P(await t.gestureViewport()):await Le(e)}var Ue=e({appSwitcherAndroid:()=>Ke,backAndroid:()=>q,fillAndroid:()=>Ye,focusAndroid:()=>Y,getAndroidScreenSize:()=>X,homeAndroid:()=>J,longPressAndroid:()=>qe,pressAndroid:()=>G,pressAndroidEnter:()=>We,pressAndroidTvRemote:()=>K,readAndroidTextAtPoint:()=>ge,scrollAndroid:()=>Qe,setAndroidOrientation:()=>Ge,typeAndroid:()=>Je});async function G(e,t,n){await g(e,[`shell`,`input`,`tap`,String(t),String(n)])}async function K(e,t,n){let r=i(t);await g(e,[`shell`,`input`,...n&&n>0?[`keyevent`,`--longpress`]:[`keyevent`],r])}async function q(e){await g(e,[`shell`,`input`,`keyevent`,`4`])}async function J(e){await g(e,[`shell`,`input`,`keyevent`,`3`])}async function We(e){await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}async function Ge(e,t){let n=$e(t);await g(e,[`shell`,`settings`,`put`,`system`,`accelerometer_rotation`,`0`]),await g(e,[`shell`,`settings`,`put`,`system`,`user_rotation`,n])}async function Ke(e){await g(e,[`shell`,`input`,`keyevent`,`187`])}async function qe(e,t,n,r=800){let i={x:t,y:n};return await U(e,{topology:`single`,intent:`longPress`,durationMs:r,pointers:[{pointerId:0,samples:[{offsetMs:0,point:i},{offsetMs:r,point:i}]}]})}async function Je(e,t,n=0){let r=d(e);if(r){await r({action:`type`,text:t,delayMs:n}),$(`type`,`provider-native`,t);return}if(S(e)){await Xe(e,t,n);return}if(rt(t),await et(e,`type`),n>0&&Array.from(t).length>1){await Z(e,{action:`type`,text:t,chunkSize:1,delayMs:n});return}await Z(e,{action:`type`,text:t,chunkSize:tt,delayMs:0})}async function Y(e,t,n){await G(e,t,n)}async function Ye(e,t,n,r,i=0){let a=await ve(e,t,n),o=d(e);if(o)return await o({action:`fill`,target:{x:t,y:n},text:r,delayMs:i}),$(`fill`,`provider-native`,r),D(r,a,await E(e,t,n,r));if(S(e))return D(r,a,await Ze(e,t,n,r,a));rt(r);let s=Array.from(r).length,c=[{clearPadding:12,minClear:8,maxClear:48,chunkSize:i>0?1:tt,inputDelayMs:i},{clearPadding:24,minClear:16,maxClear:96,chunkSize:i>0?1:4,inputDelayMs:i>0?i:15}],l=null;for(let i of c){await Y(e,t,n),await et(e,`fill`),await ct(e,lt(s+i.clearPadding,i.minClear,i.maxClear)),await Z(e,{action:`fill`,text:r,chunkSize:i.chunkSize,delayMs:i.inputDelayMs});let o=await E(e,t,n,r);if(l=o,o.ok)return;if(o.reason===`ime_capture`)return D(r,a,o);let c=O(r,a,o);if(c)return c}return D(r,a,l)}async function Xe(e,t,n){let r=p(e),i=(await C(m(e))).manifest.packageName,a=t.split(`
2
- `);for(let[t,o]of a.entries()){let s=n>0?Q(o,1):[o];for(let[e,o]of s.entries())o&&await x(r,i,o),n>0&&(e+1<s.length||t+1<a.length)&&await h(n);t+1<a.length&&await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(`type`,`test-ime`,t)}async function Ze(e,t,n,r,i){let a=p(e),o=(await C(m(e))).manifest.packageName,s=null;for(let c=0;c<2;c+=1){await Y(e,t,n),await de(a,o),r&&await x(a,o,r);let c=await E(e,t,n,r);if(s=c,c.ok||O(r,i,c))break}return $(`fill`,`test-ime`,r),s}async function Qe(e,t,n){let i=await W(e),a=s({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i.width,referenceHeight:i.height}),o={...a,referenceWidth:i.x+i.width,referenceHeight:i.y+i.height,x1:i.x+a.x1,y1:i.y+a.y1,x2:i.x+a.x2,y2:i.y+a.y2},c=Math.max(n?.durationMs??300,16),l=await U(e,r({intent:`pan`,origin:{x:o.x1,y:o.y1},delta:{x:o.x2-o.x1,y:o.y2-o.y1},durationMs:c},i,`android`));return{...o,...n?.durationMs===void 0?{}:{durationMs:c},...l}}function $e(e){let n=c[e];if(n===void 0)throw new t(`INVALID_ARGS`,`Unsupported Android rotation: ${e}`);return String(n)}async function et(e,n){let r;try{r=await _(e)}catch(e){l({level:`warn`,phase:`android_input_ownership_probe_failed`,data:{action:n,error:e instanceof Error?e.message:String(e)}});return}if(r.inputOwner===`ime`)throw new t(`COMMAND_FAILED`,`KEYBOARD_OVERLAY_BLOCKING: Android text input is blocked because the focused input belongs to the active keyboard/IME.`,{failureReason:`ime_capture`,action:n,inputOwner:r.inputOwner,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,nextAction:`Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.`})}async function X(e){let n=(await g(e,[`shell`,`wm`,`size`])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!n)throw new t(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(n[1]),height:Number(n[2])}}const tt=8;async function Z(e,t){let n=t.text.split(`
3
- `);for(let[r,i]of n.entries()){let a=Q(i,t.chunkSize);for(let[i,o]of a.entries())await nt(e,o),t.delayMs>0&&(i+1<a.length||r+1<n.length)&&await h(t.delayMs);r+1<n.length&&await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(t.action,`adb-shell`,t.text)}async function nt(e,t){if(t)try{await g(e,[`shell`,`input`,`text`,te(at(t))])}catch(e){throw ot(e)?st(t,e):e}}function rt(e){if(!it(e))throw st(e)}function it(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&t!==`
4
- `&&(e<32||e>126))return!1}return!0}function at(e){return e.replace(/ /g,`%s`)}function ot(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=e.details?.stderr,r=(typeof n==`string`?n:``).toLowerCase();return!!(r.includes(`exception occurred while executing 'text'`)||r.includes(`nullpointerexception`)&&r.includes(`inputshellcommand.sendtext`))}function st(e,n){return new t(`COMMAND_FAILED`,"Android text input requires provider-native text injection or the bundled test IME helper for non-ASCII/control characters; the adb-shell fallback supports ASCII text only. On emulators the test IME activates automatically; on real devices pass `open --test-ime` to enable it (see `agent-device doctor` for the current IME state).",{backend:`adb-shell`,textLength:Array.from(e).length,textPreview:e.slice(0,32)},n instanceof Error?n:void 0)}function Q(e,t){let n=Math.max(1,Math.floor(t)),r=[],i=Array.from(e);for(let e=0;e<i.length;e+=n)r.push(i.slice(e,e+n).join(``));return r.length>0?r:[``]}function $(e,t,n){l({phase:`android_text_injection`,data:{action:e,backend:t,textLength:Array.from(n).length}})}async function ct(e,t){let n=Math.max(0,t);await g(e,[`shell`,`input`,`keyevent`,`KEYCODE_MOVE_END`],{allowFailure:!0});for(let t=0;t<n;t+=24){let r=Math.min(24,n-t);await g(e,[`shell`,`input`,`keyevent`,...Array(r).fill(`KEYCODE_DEL`)],{allowFailure:!0})}}function lt(e,t,n){return Math.max(t,Math.min(n,e))}export{X as a,qe as c,Qe as d,Ge as f,W as h,Y as i,G as l,U as m,q as n,J as o,Je as p,Ye as r,Ue as s,Ke as t,K as u};
1
+ import{y as e}from"./sdk-contracts.js";import{l as t}from"./scroll-gesture.js";import{t as n}from"./timeouts.js";import"./retry.js";import{runHarmonyHdc as r}from"./hdc.js";import{invalidateHarmonyGestureViewport as i,readHarmonyGestureViewport as a}from"./snapshot2.js";async function o(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`click`,String(t),String(n)])}async function s(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`doubleClick`,String(t),String(n)])}async function c(e,t,n,i=800){await r(e,[`shell`,`uitest`,`uiInput`,`longClick`,String(t),String(n)])}async function l(e,t,i=0){await r(e,[`shell`,`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function u(e,t,i,a,o=0){await r(e,[`shell`,`uitest`,`uiInput`,`inputText`,String(t),String(i),a]),o>0&&await n(o)}async function d(e,n,i){let o=await a(e),s=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:o.width,referenceHeight:o.height});return await r(e,[`shell`,`uitest`,`uiInput`,`swipe`,String(s.x1),String(s.y1),String(s.x2),String(s.y2),String(i?.durationMs??300)]),s}async function f(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`shell`,`uitest`,`uiInput`,l,String(Math.round(a.point.x)),String(Math.round(a.point.y)),String(Math.round(o.point.x)),String(Math.round(o.point.y)),String(c)]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function p(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Back`]),i(e)}async function m(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Home`]),i(e)}async function h(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Recent`]),i(e)}async function g(e,t){if(t===`Back`){await p(e);return}await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,t])}async function _(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{h as appSwitcherHarmony,p as backHarmony,s as doubleClickHarmony,u as fillHarmony,m as homeHarmony,c as longPressHarmony,f as performHarmonyGesture,o as pressHarmony,g as pressHarmonyKeyboardKey,d as scrollHarmony,_ as setHarmonyOrientation,l as typeHarmony};
@@ -1 +1,2 @@
1
- import{_ as e}from"./sdk-contracts.js";import{z as t}from"./interaction.js";import{t as n}from"./timeouts.js";import{n as r}from"./hdc.js";import i from"node:path";import{randomUUID as a}from"node:crypto";import{promises as o}from"node:fs";import s from"node:os";async function c(e,t={}){let n=`/data/local/tmp/agent-device-layout-${a()}.json`,c=await o.mkdtemp(i.join(s.tmpdir(),`agent-device-harmony-layout-`)),l=i.join(c,`layout.json`);try{return await r(e,[`shell`,`uitest`,`dumpLayout`,`-p`,n],{timeoutMs:3e4}),await r(e,[`file`,`recv`,n,l],{timeoutMs:15e3}),d(u(await o.readFile(l,`utf8`)),t)}finally{await r(e,[`shell`,`rm`,`-f`,n],{allowFailure:!0}).catch(()=>{}),await o.rm(c,{recursive:!0,force:!0})}}async function l(t){let n=(await c(t)).nodes.find(e=>e.type===`Application`&&e.rect)?.rect;if(!n||n.width<=0||n.height<=0)throw new e(`COMMAND_FAILED`,`HarmonyOS snapshot did not expose an application viewport`);return n}function u(t){try{let e=JSON.parse(t);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`layout root is not an object`);return e}catch(t){throw new e(`COMMAND_FAILED`,`HarmonyOS uitest returned an invalid layout JSON document`,{cause:t instanceof Error?t.message:String(t)})}}function d(e,t){let n=[],r=0,i=0,a=!1,o=(e,s,c)=>{if(r+=1,i=Math.max(i,s),n.length>=5e3){a=!0;return}let l=f(e.attributes??{},n.length,s,c),u=!t.interactiveOnly||l.hittable===!0?n.push(l)-1:c;if(s<(t.depth??1/0))for(let t of e.children??[])o(t,s+1,u)};return o(e,0),{nodes:n,...a?{truncated:!0}:{},analysis:{rawNodeCount:r,maxDepth:i}}}function f(e,t,n,r){let i=p(e,`text`)??p(e,`originalText`),a=p(e,`description`),o=p(e,`id`)??p(e,`key`),s=m(p(e,`bounds`));return{index:t,type:p(e,`type`)===`root`?`Application`:p(e,`type`),...a?{label:a}:{},...i?{value:i}:{},...o?{identifier:o}:{},...s?{rect:s}:{},enabled:p(e,`enabled`)!==`false`,focused:p(e,`focused`)===`true`,visibleToUser:p(e,`visible`)!==`false`,hittable:p(e,`clickable`)===`true`,depth:n,...r===void 0?{}:{parentIndex:r}}}function p(e,t){let n=e[t];return typeof n==`string`?n:void 0}function m(e){if(!e)return;let t=/^\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]$/.exec(e);if(!t)return;let[,n,r,i,a]=t,o=Number(n),s=Number(r),c=Number(i)-o,l=Number(a)-s;return c>=0&&l>=0?{x:o,y:s,width:c,height:l}:void 0}async function h(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`click`,String(t),String(n)])}async function g(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`doubleClick`,String(t),String(n)])}async function _(e,t,n,i=800){await r(e,[`shell`,`uitest`,`uiInput`,`longClick`,String(t),String(n)])}async function v(e,t,i=0){await r(e,[`shell`,`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function y(e,t,i,a,o=0){await r(e,[`shell`,`uitest`,`uiInput`,`inputText`,String(t),String(i),a]),o>0&&await n(o)}async function b(e,n,i){let a=await l(e),o=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:a.width,referenceHeight:a.height});return await r(e,[`shell`,`uitest`,`uiInput`,`swipe`,String(o.x1),String(o.y1),String(o.x2),String(o.y2),String(i?.durationMs??300)]),o}async function x(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`shell`,`uitest`,`uiInput`,l,String(Math.round(a.point.x)),String(Math.round(a.point.y)),String(Math.round(o.point.x)),String(Math.round(o.point.y)),String(c)]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function S(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Back`])}async function C(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Home`])}async function w(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Recent`])}async function T(e,t){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,t])}async function E(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{w as appSwitcherHarmony,S as backHarmony,g as doubleClickHarmony,y as fillHarmony,C as homeHarmony,_ as longPressHarmony,c as n,x as performHarmonyGesture,h as pressHarmony,T as pressHarmonyKeyboardKey,b as scrollHarmony,E as setHarmonyOrientation,l as t,v as typeHarmony};
1
+ import{y as e}from"./sdk-contracts.js";import{c as t}from"./owner-identity.js";import{t as n}from"./timeouts.js";import"./retry.js";import"./process.js";import{t as r}from"./tool-provider2.js";function i(){let e=t();return e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let a=null;async function o(){let t=r();if(a?.provider===t)return a;let n=i();if(n===`wayland`){if(await t.whichCommand(`ydotool`))return a={tool:`ydotool`,display:n,provider:t},a;throw new e(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await t.whichCommand(`xdotool`))return a={tool:`xdotool`,display:n,provider:t},a;throw new e(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const s=1e4;async function c(...e){await r().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:s})}async function l(...e){await r().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:s})}function u(){return r().input}async function d(e,t){let{tool:n}=await o();if(n===`xdotool`){if(await f(e,t))return;await c(`mousemove`,`--sync`,String(e),String(t))}else await l(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function f(e,t){try{let n=await r().runCommand(`xdotool`,[`getmouselocation`,`--shell`],{allowFailure:!0,timeoutMs:s}),i=new Map(n.stdout.split(`
2
+ `).map(e=>e.trim().split(`=`)).filter(e=>e.length===2).map(([e,t])=>[e,Number(t)]));return i.get(`X`)===Math.round(e)&&i.get(`Y`)===Math.round(t)}catch{return!1}}async function p(e,t){let n=u();if(n){await n.key(e,t);return}let{tool:r}=await o();r===`xdotool`?await c(`key`,`--clearmodifiers`,e):await l(`key`,...t)}async function m(e,t,n,r){await d(e,t);let{tool:i}=await o();i===`xdotool`?await c(`click`,n):await l(`click`,r)}async function h(e,t,n,r,i){let a=u();if(a){await a.click(e,t,n);return}await m(e,t,r,i)}async function g(e,t){await h(e,t,`primary`,`1`,`0xC0`)}async function _(e,t){await h(e,t,`secondary`,`3`,`0xC1`)}async function v(e,t){await h(e,t,`middle`,`2`,`0xC2`)}async function y(e,t){let n=u();if(n){await n.doubleClick(e,t);return}let{tool:r}=await o();await d(e,t),r===`xdotool`?await c(`click`,`--repeat`,`2`,`1`):(await l(`click`,`0xC0`),await l(`click`,`0xC0`))}async function b(e,t,r=800){let i=u();if(i){await i.longPress(e,t,r);return}let{tool:a}=await o();await d(e,t),a===`xdotool`?(await c(`mousedown`,`1`),await n(r),await c(`mouseup`,`1`)):(await l(`click`,`--down`,`0xC0`),await n(r),await l(`click`,`--up`,`0xC0`))}async function x(e,t){await g(e,t)}async function S(e,t,r,i,a=300){let s=u();if(s){await s.drag(e,t,r,i,a);return}let{tool:f}=await o();await d(e,t),f===`xdotool`?(await c(`mousedown`,`1`),await c(`mousemove`,`--sync`,String(r),String(i)),await n(a),await c(`mouseup`,`1`)):(await l(`click`,`--down`,`0xC0`),await l(`mousemove`,`--absolute`,`-x`,String(r),`-y`,String(i)),await n(a),await l(`click`,`--up`,`0xC0`))}async function C(e,t){let n=u();if(n)return await n.scroll(e,t),T(t);let{tool:r}=await o(),i=5;if(t?.pixels==null?t?.amount!=null&&(i=Math.max(1,Math.round(5*(t.amount/.6)))):i=r===`xdotool`?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)),r===`xdotool`){let n=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await w(i,t?.durationMs,async e=>{await c(`click`,`--repeat`,String(e),n)})}else e===`up`||e===`down`?await w(i,t?.durationMs,async t=>{await l(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await w(i,t?.durationMs,async t=>{await l(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return T(t)}async function w(e,t,r){if(t===void 0||t<=0||e<=1){await r(e);return}let i=t/Math.max(1,e-1);for(let t=0;t<e;t+=1)await r(1),t<e-1&&await n(i)}function T(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function E(e,t=0){let n=u();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await o();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await c(...n)}else await l(`type`,`--`,e)}async function D(e,t,r,i=0){if(await g(e,t),await n(100),await p(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await n(50),r.length===0){await p(`BackSpace`,[`14:1`,`14:0`]);return}await E(r,i)}export{y as doubleClickLinux,D as fillLinux,x as focusLinux,b as longPressLinux,v as middleClickLinux,g as pressLinux,_ as rightClickLinux,C as scrollLinux,p as sendKey,S as swipeLinux,E as typeLinux};
@@ -0,0 +1 @@
1
+ import{y as e}from"./sdk-contracts.js";import{r as t}from"./archive.js";import{a as n,c as r,n as i,o as a,r as o,s}from"./install-source2.js";import{C as c,g as l,m as u}from"./host-file.js";import{t as d}from"./plist.js";import f from"node:path";async function p(e,t){let n=f.join(e,`Info.plist`),[r,i,a]=await Promise.all([d(n,`CFBundleIdentifier`,t),d(n,`CFBundleDisplayName`,t),d(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function m(e,t){return await r(async()=>await h(e,t))}async function h(t,n){if(t.kind===`url`&&!i(t.url))throw new e(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:t,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:t.kind!==`url`||i(t.url),signal:n?.signal}),a;try{a=await g(r.installablePath,n);let e=a,t=await p(e.installPath,n?.signal);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function g(e,t){return e.toLowerCase().endsWith(`.ipa`)?await _(e,t):{installPath:e,cleanup:async()=>{}}}async function _(r,i){let o=await u(`agent-device-ios-ipa-`),d=async()=>{await c(o)};try{let c=f.join(o,`extracted`),u=a()+1,p=n();await t({archivePath:r,outputRoot:c,type:`zip`,budget:p,depth:u,signal:i?.signal}),s(u);let m=f.join(c,`Payload`),h=(await l(m,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:f.join(m,e.name),bundleName:e.name.replace(/\.app$/i,``)})),g=h[0];if(g!==void 0&&h.length===1)return{installPath:g.installPath,cleanup:d};if(h.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await v(h,i?.signal);let _=i?.appIdentifierHint?.trim();if(_){let t=y(h,_);if(t)return{installPath:t.installPath,cleanup:d};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload and none matched "${_}". Available bundles: ${h.map(b).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${h.map(b).join(`, `)}`)}catch(e){throw await d(),e}}async function v(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await p(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function y(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function b(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{m as prepareIosInstallArtifact,p as readIosBundleInfo};
@@ -0,0 +1 @@
1
+ import{a as e,t}from"./rolldown-runtime.js";import{E as n,x as r,y as i}from"./sdk-contracts.js";import{t as a}from"./undici.js";import o from"node:net";import s from"node:dns/promises";var c=e(t(((e,t)=>{(function(e){let n=`(0?\\d+|0x[a-f0-9]+)`,r={fourOctet:RegExp(`^${n}\\.${n}\\.${n}\\.${n}$`,`i`),threeOctet:RegExp(`^${n}\\.${n}\\.${n}$`,`i`),twoOctet:RegExp(`^${n}\\.${n}$`,`i`),longValue:RegExp(`^${n}$`,`i`)},i=RegExp(`^0[0-7]+$`,`i`),a=RegExp(`^0x[a-f0-9]+$`,`i`),o=`%[0-9a-z]{1,}`,s=`(?:[0-9a-f]+::?)+`,c={zoneIndex:RegExp(o,`i`),native:RegExp(`^(::)?(${s})?([0-9a-f]+)?(::)?(${o})?$`,`i`),deprecatedTransitional:RegExp(`^(?:::)(${n}\\.${n}\\.${n}\\.${n}(${o})?)$`,`i`),transitional:RegExp(`^((?:${s})|(?:::)(?:${s})?)${n}\\.${n}\\.${n}\\.${n}(${o})?$`,`i`)};function l(e,t){if(e.indexOf(`::`)!==e.lastIndexOf(`::`))return null;let n=0,r=-1,i=(e.match(c.zoneIndex)||[])[0],a,o;for(i&&(i=i.substring(1),e=e.replace(/%.+$/,``));(r=e.indexOf(`:`,r+1))>=0;)n++;if(e.substr(0,2)===`::`&&n--,e.substr(-2,2)===`::`&&n--,n>=t)return null;for(o=t-n,a=`:`;o--;)a+=`0:`;return e=e.replace(`::`,a),e[0]===`:`&&(e=e.slice(1)),e[e.length-1]===`:`&&(e=e.slice(0,-1)),t=(function(){let t=e.split(`:`),n=[];for(let e=0;e<t.length;e++)n.push(t[e].length>4?NaN:parseInt(t[e],16));return n})(),{parts:t,zoneId:i}}function u(e,t,n,r){if(e.length!==t.length)throw Error(`ipaddr: cannot match CIDR for objects with different lengths`);let i=0,a;for(;r>0;){if(a=n-r,a<0&&(a=0),e[i]>>a!==t[i]>>a)return!1;r-=n,i+=1}return!0}function d(e){if(a.test(e))return parseInt(e,16);if(e[0]===`0`&&!isNaN(parseInt(e[1],10))){if(i.test(e))return parseInt(e,8);throw Error(`ipaddr: cannot parse ${e} as octal`)}return parseInt(e,10)}function f(e,t){for(;e.length<t;)e=`0${e}`;return e}let p={};p.IPv4=(function(){function e(e){if(e.length!==4)throw Error(`ipaddr: ipv4 octet count should be 4`);let t,n;for(t=0;t<e.length;t++)if(n=e[t],!(0<=n&&n<=255))throw Error(`ipaddr: ipv4 octet should fit in 8 bits`);this.octets=e}return e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,18,0,0]),15],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]],as112:[[new e([192,175,48,0]),24],[new e([192,31,196,0]),24]],amt:[[new e([192,52,193,0]),24]]},e.prototype.kind=function(){return`ipv4`},e.prototype.match=function(e,t){let n;if(t===void 0&&(n=e,e=n[0],t=n[1]),e.kind()!==`ipv4`)throw Error(`ipaddr: cannot match ipv4 address with non-ipv4 one`);return u(this.octets,e.octets,8,t)},e.prototype.prefixLengthFromSubnetMask=function(){let e=0,t=!1,n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},r,i,a;for(r=3;r>=0;--r)if(i=this.octets[r],i in n){if(a=n[i],t&&a!==0)return null;a!==8&&(t=!0),e+=a}else return null;return 32-e},e.prototype.range=function(){return p.subnetMatch(this,this.SpecialRanges)},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.toIPv4MappedAddress=function(){return p.IPv6.parse(`::ffff:${this.toString()}`)},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toString=function(){return this.octets.join(`.`)},e})(),p.IPv4.broadcastAddressFromCIDR=function(e){try{let t=this.parseCIDR(e),n=t[0].toByteArray(),r=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],a=0;for(;a<4;)i.push(parseInt(n[a],10)|parseInt(r[a],10)^255),a++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv4 CIDR format`,{cause:e})}},p.IPv4.isIPv4=function(e){return this.parser(e)!==null},p.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch{return!1}},p.IPv4.isValidCIDR=function(e){try{return this.parseCIDR(e),!0}catch{return!1}},p.IPv4.isValidFourPartDecimal=function(e){return!!(p.IPv4.isValid(e)&&e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},p.IPv4.isValidCIDRFourPartDecimal=function(e){let t=e.match(/^(.+)\/(\d+)$/);return!p.IPv4.isValidCIDR(e)||!t?!1:p.IPv4.isValidFourPartDecimal(t[1])},p.IPv4.networkAddressFromCIDR=function(e){let t,n,r,i,a;try{for(t=this.parseCIDR(e),r=t[0].toByteArray(),a=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(r[n],10)&parseInt(a[n],10)),n++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv4 CIDR format`,{cause:e})}},p.IPv4.parse=function(e){let t=this.parser(e);if(t===null)throw Error(`ipaddr: string is not formatted like an IPv4 Address`);return new this(t)},p.IPv4.parseCIDR=function(e){let t;if(t=e.match(/^(.+)\/(\d+)$/)){let e=parseInt(t[2]);if(e>=0&&e<=32){let n=[this.parse(t[1]),e];return Object.defineProperty(n,"toString",{value:function(){return this.join(`/`)}}),n}}throw Error(`ipaddr: string is not formatted like an IPv4 CIDR range`)},p.IPv4.parser=function(e){let t,n,i;if(t=e.match(r.fourOctet))return(function(){let e=t.slice(1,6),r=[];for(let t=0;t<e.length;t++)n=e[t],r.push(d(n));return r})();if(t=e.match(r.longValue)){if(i=d(t[1]),i>4294967295||i<0)throw Error(`ipaddr: address outside defined range`);return(function(){let e=[],t;for(t=0;t<=24;t+=8)e.push(i>>t&255);return e})().reverse()}return(t=e.match(r.twoOctet))?(function(){let e=t.slice(1,4),n=[];if(i=d(e[1]),i>16777215||i<0)throw Error(`ipaddr: address outside defined range`);return n.push(d(e[0])),n.push(i>>16&255),n.push(i>>8&255),n.push(i&255),n})():(t=e.match(r.threeOctet))?(function(){let e=t.slice(1,5),n=[];if(i=d(e[2]),i>65535||i<0)throw Error(`ipaddr: address outside defined range`);return n.push(d(e[0])),n.push(d(e[1])),n.push(i>>8&255),n.push(i&255),n})():null},p.IPv4.subnetMaskFromPrefixLength=function(e){if(e=parseInt(e),Number.isNaN(e)||e<0||e>32)throw Error(`ipaddr: invalid IPv4 prefix length`);let t=[0,0,0,0],n=0,r=Math.floor(e/8);for(;n<r;)t[n]=255,n++;return r<4&&(t[r]=2**(e%8)-1<<8-e%8),new this(t)},p.IPv6=(function(){function e(e,t){let n,r;if(e.length===16)for(this.parts=[],n=0;n<=14;n+=2)this.parts.push(e[n]<<8|e[n+1]);else if(e.length===8)this.parts=e;else throw Error(`ipaddr: ipv6 part count should be 8 or 16`);for(n=0;n<this.parts.length;n++)if(r=this.parts[n],!(0<=r&&r<=65535))throw Error(`ipaddr: ipv6 part should fit in 16 bits`);t&&(this.zoneId=t)}return e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],deprecatedSiteLocal:[new e([65216,0,0,0,0,0,0,0]),10],discard:[new e([256,0,0,0,0,0,0,0]),64],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[[new e([100,65435,0,0,0,0,0,0]),96],[new e([100,65435,1,0,0,0,0,0]),48]],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],benchmarking:[new e([8193,2,0,0,0,0,0,0]),48],amt:[new e([8193,3,0,0,0,0,0,0]),32],as112v6:[[new e([8193,4,274,0,0,0,0,0]),48],[new e([9760,79,32768,0,0,0,0,0]),48]],deprecatedOrchid:[new e([8193,16,0,0,0,0,0,0]),28],orchid2:[new e([8193,32,0,0,0,0,0,0]),28],droneRemoteIdProtocolEntityTags:[new e([8193,48,0,0,0,0,0,0]),28],segmentRouting:[new e([24320,0,0,0,0,0,0,0]),16],reserved:[[new e([8193,0,0,0,0,0,0,0]),23],[new e([8193,3512,0,0,0,0,0,0]),32],[new e([16383,0,0,0,0,0,0,0]),20]]},e.prototype.isIPv4MappedAddress=function(){return this.range()===`ipv4Mapped`},e.prototype.kind=function(){return`ipv6`},e.prototype.match=function(e,t){let n;if(t===void 0&&(n=e,e=n[0],t=n[1]),e.kind()!==`ipv6`)throw Error(`ipaddr: cannot match ipv6 address with non-ipv6 one`);return u(this.parts,e.parts,16,t)},e.prototype.prefixLengthFromSubnetMask=function(){let e=0,t=!1,n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},r,i;for(let a=7;a>=0;--a)if(r=this.parts[a],r in n){if(i=n[r],t&&i!==0)return null;i!==16&&(t=!0),e+=i}else return null;return 128-e},e.prototype.range=function(){return p.subnetMatch(this,this.SpecialRanges)},e.prototype.toByteArray=function(){let e,t=[],n=this.parts;for(let r=0;r<n.length;r++)e=n[r],t.push(e>>8),t.push(e&255);return t},e.prototype.toFixedLengthString=function(){let e=(function(){let e=[];for(let t=0;t<this.parts.length;t++)e.push(f(this.parts[t].toString(16),4));return e}).call(this).join(`:`),t=``;return this.zoneId&&(t=`%${this.zoneId}`),e+t},e.prototype.toIPv4Address=function(){if(!this.isIPv4MappedAddress())throw Error(`ipaddr: trying to convert a generic ipv6 address to ipv4`);let e=this.parts.slice(-2),t=e[0],n=e[1];return new p.IPv4([t>>8,t&255,n>>8,n&255])},e.prototype.toNormalizedString=function(){let e=(function(){let e=[];for(let t=0;t<this.parts.length;t++)e.push(this.parts[t].toString(16));return e}).call(this).join(`:`),t=``;return this.zoneId&&(t=`%${this.zoneId}`),e+t},e.prototype.toRFC5952String=function(){let e=/((^|:)(0(:|$)){2,})/g,t=``;this.zoneId&&(t=`%${this.zoneId}`);let n=this.toNormalizedString(),r=n.slice(0,n.length-t.length),i=0,a=-1,o=-1,s;for(;s=e.exec(r);){let e=(s[0].match(/0/g)||[]).length;e>o&&(o=e,i=s.index,a=s[0].length)}return a<0?r+t:`${r.substring(0,i)}::${r.substring(i+a)}${t}`},e.prototype.toString=function(){return this.toRFC5952String()},e})(),p.IPv6.broadcastAddressFromCIDR=function(e){try{let t=this.parseCIDR(e),n=t[0].toByteArray(),r=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],a=0;for(;a<16;)i.push(parseInt(n[a],10)|parseInt(r[a],10)^255),a++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv6 CIDR format`,{cause:e})}},p.IPv6.isIPv6=function(e){return this.parser(e)!==null},p.IPv6.isValid=function(e){if(typeof e==`string`&&e.indexOf(`:`)===-1)return!1;try{let t=this.parser(e);return new this(t.parts,t.zoneId),!0}catch{return!1}},p.IPv6.isValidCIDR=function(e){if(typeof e==`string`&&e.indexOf(`:`)===-1)return!1;try{return this.parseCIDR(e),!0}catch{return!1}},p.IPv6.networkAddressFromCIDR=function(e){let t,n,r,i,a;try{for(t=this.parseCIDR(e),r=t[0].toByteArray(),a=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<16;)i.push(parseInt(r[n],10)&parseInt(a[n],10)),n++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv6 CIDR format`,{cause:e})}},p.IPv6.parse=function(e){let t=this.parser(e);if(t===null)throw Error(`ipaddr: string is not formatted like an IPv6 Address`);return new this(t.parts,t.zoneId)},p.IPv6.parseCIDR=function(e){let t,n,r;if((n=e.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]),t>=0&&t<=128))return r=[this.parse(n[1]),t],Object.defineProperty(r,"toString",{value:function(){return this.join(`/`)}}),r;throw Error(`ipaddr: string is not formatted like an IPv6 CIDR range`)},p.IPv6.parser=function(e){let t,n,r,i,a,o;if(r=e.match(c.deprecatedTransitional))return this.parser(`::ffff:${r[1]}`);if(c.native.test(e))return l(e,8);if((r=e.match(c.transitional))&&(o=r[6]||``,t=r[1],r[1].endsWith(`::`)||(t=t.slice(0,-1)),t=l(t+o,6),t&&t.parts)){for(a=[parseInt(r[2]),parseInt(r[3]),parseInt(r[4]),parseInt(r[5])],n=0;n<a.length;n++)if(i=a[n],!(0<=i&&i<=255))return null;return t.parts.push(a[0]<<8|a[1]),t.parts.push(a[2]<<8|a[3]),{parts:t.parts,zoneId:t.zoneId}}return null},p.IPv6.subnetMaskFromPrefixLength=function(e){if(e=parseInt(e),Number.isNaN(e)||e<0||e>128)throw Error(`ipaddr: invalid IPv6 prefix length`);let t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],n=0,r=Math.floor(e/8);for(;n<r;)t[n]=255,n++;return r<16&&(t[r]=2**(e%8)-1<<8-e%8),new this(t)},p.fromByteArray=function(e){let t=e.length;if(t===4)return new p.IPv4(e);if(t===16)return new p.IPv6(e);throw Error(`ipaddr: the binary input is neither an IPv6 nor IPv4 address`)},p.isValid=function(e){return p.IPv6.isValid(e)||p.IPv4.isValid(e)},p.isValidCIDR=function(e){return p.IPv6.isValidCIDR(e)||p.IPv4.isValidCIDR(e)},p.parse=function(e){if(p.IPv6.isValid(e))return p.IPv6.parse(e);if(p.IPv4.isValid(e))return p.IPv4.parse(e);throw Error(`ipaddr: the address has neither IPv6 nor IPv4 format`)},p.parseCIDR=function(e){try{return p.IPv6.parseCIDR(e)}catch{try{return p.IPv4.parseCIDR(e)}catch(e){throw Error(`ipaddr: the address has neither IPv6 nor IPv4 CIDR format`,{cause:e})}}},p.process=function(e){let t=this.parse(e);return t.kind()===`ipv6`&&t.isIPv4MappedAddress()?t.toIPv4Address():t},p.subnetMatch=function(e,t,n){let r,i,a,o;for(i in n??=`unicast`,t)if(Object.prototype.hasOwnProperty.call(t,i)){for(a=t[i],a[0]&&!(a[0]instanceof Array)&&(a=[a]),r=0;r<a.length;r++)if(o=a[r],e.kind()===o[0].kind()&&e.match.apply(e,o))return i}return n},t!==void 0&&t.exports?t.exports=p:e.ipaddr=p})(e)}))(),1);async function l(e,t){if(e.protocol!==`http:`&&e.protocol!==`https:`)throw new i(`INVALID_ARGS`,`Unsupported source URL protocol: ${e.protocol}`);if(e.username||e.password)throw new i(`INVALID_ARGS`,`Source URL credentials are not allowed`);d(t);let r=h(e.hostname);p(r)&&_(e.hostname);let a=o.isIP(r);if(a)return{address:r,family:a};let s;try{s=await u(r,t)}catch(e){throw n(e)?e:new i(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`},e)}if(s.length===0)throw new i(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`});s.some(e=>m(e.address))&&_(r);let c=s[0];return{address:c.address,family:c.family}}async function u(e,t){let n=s.lookup(e,{all:!0,verbatim:!0});return t?await new Promise((e,r)=>{let i=()=>r(f(t.reason));t.addEventListener(`abort`,i,{once:!0}),n.then(e,r).finally(()=>t.removeEventListener(`abort`,i))}):await n}function d(e){if(e?.aborted)throw f(e.reason)}function f(e){return r(void 0,e)}function p(e){let t;try{t=h(e)}catch{return!0}return!t||t===`localhost`||t.endsWith(`.localhost`)?!0:o.isIP(t)!==0&&m(t)}function m(e){try{return c.default.process(g(e)).range()!==`unicast`}catch{return!0}}function h(e){let t=g(e).toLowerCase().replace(/\.$/,``);if(!t||t.includes(`%`))throw new i(`INVALID_ARGS`,`Source URL host is not allowed`,{hint:`Use a public artifact URL.`});return t}function g(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}function _(e){throw new i(`INVALID_ARGS`,`Source URL host is not allowed because it resolves to a non-public address: ${e}`,{hint:`Use a public artifact URL.`})}var v=a();async function y(e){let t=b(e.url),n=t?C(t,e.url):S(e.approvedAddress,e.family),r=t?w(e.url,e.approvedAddress,e.family):e.url;try{let i={dispatcher:n,headers:t?{...e.headers,host:e.url.host}:e.headers,maxRedirections:0,method:`GET`,signal:e.signal},a=await(0,v.request)(r,i);return{statusCode:a.statusCode,headers:a.headers,body:a.body,close:async()=>await D(n)}}catch(e){throw await D(n),e}}function b(e,t=process.env){if(x(e,t.no_proxy??t.NO_PROXY))return;let n=t.http_proxy??t.HTTP_PROXY;return e.protocol===`http:`?n||void 0:(t.https_proxy??t.HTTPS_PROXY)||n||void 0}function x(e,t){if(!t)return!1;let n=E(e.hostname).toLowerCase(),r=e.port||(e.protocol===`https:`?`443`:`80`);return t.split(/[\s,]+/).filter(Boolean).some(e=>{if(e===`*`)return!0;let t=T(e);if(t.port&&t.port!==r)return!1;let i=t.hostname.replace(/^\*?\./,``).toLowerCase();return n===i||n.endsWith(`.${i}`)})}function S(e,t){return new v.Agent({connect:{lookup:(n,r,i)=>i(null,e,t)}})}function C(e,t){let n=o.isIP(E(t.hostname))!==0;return new v.ProxyAgent({uri:e,proxyTunnel:!0,requestTls:t.protocol===`https:`&&!n?{servername:E(t.hostname)}:void 0})}function w(e,t,n){let r=new URL(e);return r.hostname=n===6?`[${E(t)}]`:t,r}function T(e){if(e.startsWith(`[`)){let t=e.indexOf(`]`);return t<0?{hostname:e}:{hostname:e.slice(1,t),port:e[t+1]===`:`?e.slice(t+2):void 0}}let t=e.lastIndexOf(`:`);return t>-1&&e.indexOf(`:`)===t?{hostname:e.slice(0,t),port:e.slice(t+1)}:{hostname:e}}function E(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}async function D(e){await e.close()}export{b as n,l as r,y as t};
@@ -1,12 +1,5 @@
1
- //#region src/platforms/install-source.d.ts
2
- type MaterializeInstallSource = {
3
- kind: 'url';
4
- url: string;
5
- headers?: Record<string, string>;
6
- } | {
7
- kind: 'path';
8
- path: string;
9
- };
1
+ import { p as LocalInstallSource } from "./sdk-contracts.js";
2
+ //#region packages/provision-kit/src/install-source.d.ts
10
3
  /**
11
4
  * @public Archive extensions accepted by install-source resolution.
12
5
  */
@@ -14,4 +7,4 @@ declare const ARCHIVE_EXTENSIONS: readonly [".zip", ".tar", ".tar.gz", ".tgz"];
14
7
  declare function validateDownloadSourceUrl(parsedUrl: URL): Promise<void>;
15
8
  declare function isTrustedInstallSourceUrl(sourceUrl: string | URL): boolean;
16
9
  //#endregion
17
- export { ARCHIVE_EXTENSIONS, type MaterializeInstallSource, isTrustedInstallSourceUrl, validateDownloadSourceUrl };
10
+ export { ARCHIVE_EXTENSIONS, type LocalInstallSource as MaterializeInstallSource, isTrustedInstallSourceUrl, validateDownloadSourceUrl };
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{t}from"./path-resolution.js";import{a as n,i as r,n as i,r as a,t as o}from"./byte-limit-stream.js";import s from"node:path";import{AsyncLocalStorage as c}from"node:async_hooks";import{createWriteStream as l,promises as u}from"node:fs";import d from"node:os";import{pipeline as f}from"node:stream/promises";import p from"node:net";import ee from"node:dns/promises";import m from"ipaddr.js";import{Agent as h,ProxyAgent as g,request as _}from"undici";async function v(t,n){let r=await u.stat(t).catch(()=>null);if(!r)throw new e(`INVALID_ARGS`,`App source not found: ${t}`);if(n.isInstallablePath(t,r))return{archivePath:n.archivePath,installablePath:t};if(r.isFile()&&S(t))return x(t,n,!1),await y(t,n);if(r.isDirectory()){let r=await b(t,n.isInstallablePath);if(r.length===1)return{archivePath:n.archivePath,installablePath:r[0]};if(r.length>1)throw new e(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${t}: ${r.join(`, `)}`,{matches:r});let i=await b(t,(e,t)=>!!(t.isFile()&&S(e)));if(i.length===1)return x(i[0],n,!0),await y(i[0],n);if(i.length>1)throw new e(`INVALID_ARGS`,`Found multiple nested archives under ${t}; expected one ${n.installableLabel} source`,{matches:i})}throw new e(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${t}`)}async function y(e,t){let n=await te(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await v(n.outputPath,{...t,archivePath:t.archivePath??e,archiveDepth:t.archiveDepth+1})}async function te(t,n,r){let o=i(t);if(!o)throw new e(`INVALID_ARGS`,`Unsupported archive: ${t}`);let c=await u.mkdtemp(s.join(d.tmpdir(),`agent-device-archive-`)),l=s.join(c,`extracted`);try{return await a({archivePath:t,outputRoot:l,type:o,budget:n,depth:r}),{outputPath:l,cleanup:async()=>await u.rm(c,{recursive:!0,force:!0})}}catch(e){throw await u.rm(c,{recursive:!0,force:!0}),e}}async function b(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let i=await u.readdir(e.path,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i){if(a.name===`__MACOSX`||a.name.startsWith(`._`))continue;let i=s.join(e.path,a.name);t(i,a)?n.push(i):a.isDirectory()&&e.depth<5&&r.push({path:i,depth:e.depth+1})}}return[...new Set(n)]}function x(t,n,r){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,r?`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`:`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`,{path:t})}function S(e){return i(e)!==void 0}const C=new c;async function w(e){return await C.run({budget:new r,depth:0},e)}function T(){return C.getStore()?.budget}function E(){return C.getStore()?.depth??0}function D(e){let t=C.getStore();t&&(t.depth=Math.max(t.depth,e))}async function O(t,n){if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Unsupported source URL protocol: ${t.protocol}`);if(t.username||t.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);k(n);let r=N(t.hostname);j(r)&&F(t.hostname);let i=p.isIP(r);if(i)return{address:r,family:i};let a;try{a=await ne(r,n)}catch(t){throw t instanceof e&&t.details?.reason===`request_canceled`?t:new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`},t)}if(a.length===0)throw new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`});a.some(e=>M(e.address))&&F(r);let o=a[0];return{address:o.address,family:o.family}}async function ne(e,t){let n=ee.lookup(e,{all:!0,verbatim:!0});return t?await new Promise((e,r)=>{let i=()=>r(A(t.reason));t.addEventListener(`abort`,i,{once:!0}),n.then(e,r).finally(()=>t.removeEventListener(`abort`,i))}):await n}function k(e){if(e?.aborted)throw A(e.reason)}function A(t){return new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t)}function j(e){let t;try{t=N(e)}catch{return!0}return!t||t===`localhost`||t.endsWith(`.localhost`)?!0:p.isIP(t)!==0&&M(t)}function M(e){try{return m.process(P(e)).range()!==`unicast`}catch{return!0}}function N(t){let n=P(t).toLowerCase().replace(/\.$/,``);if(!n||n.includes(`%`))throw new e(`INVALID_ARGS`,`Source URL host is not allowed`,{hint:`Use a public artifact URL.`});return n}function P(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}function F(t){throw new e(`INVALID_ARGS`,`Source URL host is not allowed because it resolves to a non-public address: ${t}`,{hint:`Use a public artifact URL.`})}async function I(e){let t=L(e.url),n=t?B(t,e.url):z(e.approvedAddress,e.family),r=t?V(e.url,e.approvedAddress,e.family):e.url;try{let i=await _(r,{dispatcher:n,headers:t?{...e.headers,host:e.url.host}:e.headers,maxRedirections:0,method:`GET`,signal:e.signal});return{statusCode:i.statusCode,headers:i.headers,body:i.body,close:async()=>await W(n)}}catch(e){throw await W(n),e}}function L(e,t=process.env){if(R(e,t.no_proxy??t.NO_PROXY))return;let n=t.http_proxy??t.HTTP_PROXY;return e.protocol===`http:`?n||void 0:(t.https_proxy??t.HTTPS_PROXY)||n||void 0}function R(e,t){if(!t)return!1;let n=U(e.hostname).toLowerCase(),r=e.port||(e.protocol===`https:`?`443`:`80`);return t.split(/[\s,]+/).filter(Boolean).some(e=>{if(e===`*`)return!0;let t=H(e);if(t.port&&t.port!==r)return!1;let i=t.hostname.replace(/^\*?\./,``).toLowerCase();return n===i||n.endsWith(`.${i}`)})}function z(e,t){return new h({connect:{lookup:(n,r,i)=>i(null,e,t)}})}function B(e,t){let n=p.isIP(U(t.hostname))!==0;return new g({uri:e,proxyTunnel:!0,requestTls:t.protocol===`https:`&&!n?{servername:U(t.hostname)}:void 0})}function V(e,t,n){let r=new URL(e);return r.hostname=n===6?`[${U(t)}]`:t,r}function H(e){if(e.startsWith(`[`)){let t=e.indexOf(`]`);return t<0?{hostname:e}:{hostname:e.slice(1,t),port:e[t+1]===`:`?e.slice(t+2):void 0}}let t=e.lastIndexOf(`:`);return t>-1&&e.indexOf(`:`)===t?{hostname:e.slice(0,t),port:e.slice(t+1)}:{hostname:e}}function U(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}async function W(e){await e.close()}const G=new Set([301,302,303,307,308]),K=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function q(e){let t=ce(e.url),n=ae(e.headers);for(let r=0;;r+=1){let i=await J(t,n,e.signal);try{let a=re(i,t,r);if(a){a.origin!==t.origin&&(n=oe(n)),t=a;continue}return Y(i),await X(e.tempDir,t,i)}finally{await i.close()}}}async function J(t,n,r){let i=await O(t,r);try{return await I({url:t,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`App source network request failed`,void 0,t)}}function re(t,n,r){if(!G.has(t.statusCode))return;t.body.resume?.();let i=Z(t.headers,`location`);if(!i||r>=5)throw new e(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:t.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new e(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function Y(t){if(!(t.statusCode>=200&&t.statusCode<300))throw new e(`COMMAND_FAILED`,`Failed to download app source: ${t.statusCode}`,{status:t.statusCode})}async function X(t,r,i){let a=Z(i.headers,`content-encoding`);if(a&&a.toLowerCase()!==`identity`)throw new e(`COMMAND_FAILED`,`App source response used unsupported content encoding`);ie(Z(i.headers,`content-length`));let c=s.join(t,se(i,r)),d=o({maxBytes:n,createLimitError:()=>new e(`COMMAND_FAILED`,`App source exceeds maximum size of ${n} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await f(i.body,d,l(c,{flags:`wx`})),c}catch(e){throw await u.rm(c,{force:!0}).catch(()=>{}),e}}function ie(t){if(t===null)return;if(!/^\d+$/.test(t))throw new e(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(t);if(!Number.isSafeInteger(n)||n>2147483648)throw new e(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function ae(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!K.has(n)&&!t.has(n)}))}function oe(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function se(e,t){let n=(Z(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||s.basename(t.pathname)||`downloaded-artifact.bin`;return s.basename(n)}function Z(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function ce(t){let n;try{n=new URL(t)}catch{throw new e(`INVALID_ARGS`,`Invalid source URL`)}if(n.username||n.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}const le=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function ue(e){let t=[];try{let n=await fe(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let i=await v(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)},budget:T()??new r,archiveDepth:0,onArchiveAccepted:D});return{archivePath:i.archivePath,installablePath:i.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function de(e){return t(e)}async function fe(e,t){if(e.kind===`path`)return{localPath:de(e.path),cleanup:async()=>{}};let n=await u.mkdtemp(s.join(d.tmpdir(),`agent-device-source-`));try{return{localPath:await pe(n,e.url,e.headers,t),cleanup:async()=>{await u.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await u.rm(n,{recursive:!0,force:!0}),e}}async function pe(t,n,r,i){let a=i?.signal;if(a?.aborted)throw new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`});let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await q({tempDir:t,url:n,headers:r,signal:c})}catch(e){throw me(e,a,s,o)}}function me(t,n,r,i){return n?.aborted?new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t):r.aborted?new e(`COMMAND_FAILED`,`App source download timed out after ${i}ms`,{timeoutMs:i},t):t}async function Q(e){await O(e)}function he(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return ge(n,r)||_e(n,r)}function ge(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`?/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t):!1}function _e(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{T as a,w as c,Q as i,he as n,E as o,ue as r,D as s,le as t};
1
+ import{x as e,y as t}from"./sdk-contracts.js";import{t as n}from"./path-resolution.js";import"./file.js";import{a as r,i,n as a,r as o}from"./archive.js";import{t as s}from"./byte-limit-stream.js";import{r as c,t as l}from"./install-source-network-transport.js";import u from"node:path";import{createWriteStream as d,promises as f}from"node:fs";import{AsyncLocalStorage as p}from"node:async_hooks";import m from"node:os";import{pipeline as h}from"node:stream/promises";async function g(e,n){let r=await f.stat(e).catch(()=>null);if(!r)throw new t(`INVALID_ARGS`,`App source not found: ${e}`);if(n.isInstallablePath(e,r))return{archivePath:n.archivePath,installablePath:e};if(r.isFile()&&x(e))return b(e,n,!1),await _(e,n);if(r.isDirectory()){let r=await y(e,n.isInstallablePath);if(r.length===1)return{archivePath:n.archivePath,installablePath:r[0]};if(r.length>1)throw new t(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${e}: ${r.join(`, `)}`,{matches:r});let i=await y(e,(e,t)=>!!(t.isFile()&&x(e)));if(i.length===1)return b(i[0],n,!0),await _(i[0],n);if(i.length>1)throw new t(`INVALID_ARGS`,`Found multiple nested archives under ${e}; expected one ${n.installableLabel} source`,{matches:i})}throw new t(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${e}`)}async function _(e,t){let n=await v(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await g(n.outputPath,{...t,archivePath:t.archivePath??e,archiveDepth:t.archiveDepth+1})}async function v(e,n,r){let i=a(e);if(!i)throw new t(`INVALID_ARGS`,`Unsupported archive: ${e}`);let s=await f.mkdtemp(u.join(m.tmpdir(),`agent-device-archive-`)),c=u.join(s,`extracted`);try{return await o({archivePath:e,outputRoot:c,type:i,budget:n,depth:r}),{outputPath:c,cleanup:async()=>await f.rm(s,{recursive:!0,force:!0})}}catch(e){throw await f.rm(s,{recursive:!0,force:!0}),e}}async function y(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let i=await f.readdir(e.path,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i){if(a.name===`__MACOSX`||a.name.startsWith(`._`))continue;let i=u.join(e.path,a.name);t(i,a)?n.push(i):a.isDirectory()&&e.depth<5&&r.push({path:i,depth:e.depth+1})}}return[...new Set(n)]}function b(e,n,r){if(n.allowArchiveExtraction)return;let i=r?`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`:`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`;throw new t(`INVALID_ARGS`,i,{path:e})}function x(e){return a(e)!==void 0}const S=new p;async function C(e){return await S.run({budget:new i,depth:0},e)}function w(){return S.getStore()?.budget}function T(){return S.getStore()?.depth??0}function E(e){let t=S.getStore();t&&(t.depth=Math.max(t.depth,e))}const D=new Set([301,302,303,307,308]),O=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function k(e){let t=z(e.url),n=F(e.headers);for(let r=0;;r+=1){let i=await A(t,n,e.signal);try{let a=j(i,t,r);if(a){a.origin!==t.origin&&(n=I(n)),t=a;continue}return M(i),await N(e.tempDir,t,i)}finally{await i.close()}}}async function A(e,n,r){let i=await c(e,r);try{return await l({url:e,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(e){throw e instanceof t?e:new t(`COMMAND_FAILED`,`The daemon failed to fetch the app source`,void 0,e)}}function j(e,n,r){if(!D.has(e.statusCode))return;e.body.resume?.();let i=R(e.headers,`location`);if(!i||r>=5)throw new t(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:e.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new t(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function M(e){if(!(e.statusCode>=200&&e.statusCode<300))throw new t(`COMMAND_FAILED`,`Failed to download app source: ${e.statusCode}`,{status:e.statusCode})}async function N(e,n,i){let a=R(i.headers,`content-encoding`);if(a&&a.toLowerCase()!==`identity`)throw new t(`COMMAND_FAILED`,`App source response used unsupported content encoding`);P(R(i.headers,`content-length`));let o=u.join(e,L(i,n)),c=s({maxBytes:r,createLimitError:()=>new t(`COMMAND_FAILED`,`App source exceeds maximum size of ${r} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await h(i.body,c,d(o,{flags:`wx`})),o}catch(e){throw await f.rm(o,{force:!0}).catch(()=>{}),e}}function P(e){if(e===null)return;if(!/^\d+$/.test(e))throw new t(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(e);if(!Number.isSafeInteger(n)||n>2147483648)throw new t(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function F(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!O.has(n)&&!t.has(n)}))}function I(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function L(e,t){let n=(R(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||u.basename(t.pathname)||`downloaded-artifact.bin`;return u.basename(n)}function R(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function z(e){let n;try{n=new URL(e)}catch{throw new t(`INVALID_ARGS`,`Invalid source URL`)}if(n.username||n.password)throw new t(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}const B=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function V(e){let t=[];try{let n=await U(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await g(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)},budget:w()??new i,archiveDepth:0,onArchiveAccepted:E});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await X(t)}}}catch(e){throw await X(t),e}}function H(e){return n(e)}async function U(e,t){if(e.kind===`path`)return{localPath:H(e.path),cleanup:async()=>{}};let n=await f.mkdtemp(u.join(m.tmpdir(),`agent-device-source-`));try{return{localPath:await W(n,e.url,e.headers,t),cleanup:async()=>{await f.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await f.rm(n,{recursive:!0,force:!0}),e}}async function W(t,n,r,i){let a=i?.signal;if(a?.aborted)throw e();let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await k({tempDir:t,url:n,headers:r,signal:c})}catch(e){throw G(e,a,s,o)}}function G(n,r,i,a){return r?.aborted?e(void 0,n):i.aborted?new t(`COMMAND_FAILED`,`App source download timed out after ${a}ms`,{timeoutMs:a},n):n}async function K(e){await c(e)}function q(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return J(n,r)||Y(n,r)}function J(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t)}function Y(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function X(e){for(let t of[...e].reverse())await t()}export{w as a,C as c,K as i,q as n,T as o,V as r,E as s,B as t};
@@ -0,0 +1 @@
1
+ import{y as e}from"./sdk-contracts.js";import{_r as t,fr as n,hr as r,mr as i,pr as a}from"./sdk-batch.js";function o(e){return e?.startsWith(`@`)?e.slice(1):e}const s=/^e\d+$/;function c(n){if(n[0]?.startsWith(`@`)){let e=_(n.slice(1));return{ref:n[0],...e===void 0?{}:{label:e}}}if(s.test(n[0]??``))throw new e(`INVALID_ARGS`,`Did you mean "@${n[0]}"? Snapshot refs need the @ prefix.`);let r=t(n);if(r){if(r.rest.length>0)throw new e(`INVALID_ARGS`,m(n,r));return{selector:r.selectorExpression}}return u(n)}function l(n){let r=n[0];if(r?.startsWith(`@`)){let e=n.slice(1),t=e.length===0?void 0:e.join(` `);return{kind:`ref`,target:{ref:r},text:t}}if(s.test(r??``))throw new e(`INVALID_ARGS`,`Did you mean "@${r}"? Snapshot refs need the @ prefix.`);let i=t(n,{preferTrailingValue:!0});if(i)return{kind:`selector`,target:{selector:i.selectorExpression},text:i.rest.length===0?void 0:i.rest.join(` `)};let a=n.slice(2);return{kind:`point`,target:u(n.slice(0,2)),text:a.length===0?void 0:a.join(` `)}}function u(t){let n=t[0]??``,r=a(n);if(r){let i=d(n)?r.value:[r.value,...t.slice(1)].join(` `).trim();throw new e(`INVALID_ARGS`,f({key:r.key,value:i}))}let i=Number(t[0]),o=Number(t[1]);if(Number.isFinite(i)&&Number.isFinite(o))return{x:i,y:o};throw new e(`INVALID_ARGS`,p(t))}function d(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function f(e){let{key:t,value:r}=e;return`Unknown selector key "${t}". Supported: ${n.join(`, `)}. ${i(t)?`Did you mean role=${t} label=${g(r)}?`:`Did you mean label=${g(r)}?`}`}function p(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>r(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${g(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function m(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${h(e,t)??`text="Sign in"`}.`}function h(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${g(a)}`;return[...e.slice(0,n-1),o].join(` `)}function g(e){return`"${e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}"`}function _(e){return e.join(` `).trim()||void 0}export{c as n,o as r,l as t};
@@ -0,0 +1 @@
1
+ import{b as e,y as t}from"./sdk-contracts.js";import{l as n,v as r}from"./sdk-device.js";import{on as i}from"./sdk-batch.js";import{i as a,s as o}from"./session-target-evidence.js";import{M as s,f as c,o as l,t as u}from"./parameterized-recorded-fill.js";import{t as d}from"./runtime.js";import{i as f}from"./mobile-snapshot-semantics.js";import{r as p}from"./request-cancel.js";import"./request.js";import{r as m}from"./provider-device-runtime.js";import{r as h}from"./request-runtime-binding.js";import{C as g,_,i as v,o as y,v as b,y as x}from"./session-snapshot.js";import{n as S}from"./platform-runtime-apple-resources.js";import{n as C}from"./internal/daemon.js";function w(e){let{req:t,logPath:n,traceLogPath:r}=e;return{verbose:t.flags?.verbose,logPath:n,traceLogPath:r,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function T(e,t){return!(!e||!n(e.device)||m(e.device)||t.skipPendingPostGestureStabilization&&_(e))}function E(e){let{session:t,selectorExpression:n}=e;return T(t,{skipPendingPostGestureStabilization:!0})?i(n):null}function D(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}async function O(e,t,n){let r=await S(e.device,t,e.appBundleId,n),i=r.found===!0,a=k(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}function k(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function A(t,n={}){let r=e(t);if(r.code===`ELEMENT_NOT_FOUND`)return n.delegateSemanticFailures===!0||n.allowElementNotFound===!0;if(r.code===`AMBIGUOUS_MATCH`)return n.delegateSemanticFailures===!0;if(r.code===`ELEMENT_OFFSCREEN`)return n.delegateSemanticFailures!==!1;if(r.code!==`COMMAND_FAILED`)return!1;let i=r.message.toLowerCase();return i.includes(`fetch failed`)||i.includes(`timed out`)||i.includes(`timeout`)||i.includes(`runner did not accept connection`)||i.includes(`invalid runner response`)}async function j(e){let{session:t,node:n,rootViewport:r,requestOptions:i}=e,a=D(n);if(!a)return null;let o;try{o=await O(t,a,i)}catch{return null}if(!o.found||!o.node?.rect)return null;let s={rect:o.node.rect,hittable:o.node.hittable===!0};return f(s,r)?s.rect:null}function M(e){let{operations:t,command:n,positionals:r,actionCommand:i=n,retryPositionals:o,flags:s,result:c,responseData:l,recordedTarget:u,recordedTargets:d,scheduleInteractionOutcomeRetry:f=!0,actionStartedAt:p,actionFinishedAt:m,androidFreshnessBaseline:h}=e,g=x(s),[_,v]=P({command:n,positionals:r,flags:g,result:c,responseData:l}),y=t.isSessionRecording()&&u?a(u):void 0,b=t.isSessionRecording()&&d?N(d):void 0;return t.recordAction({command:n,positionals:r,flags:g??{},result:_,...y?{targetEvidence:y}:{},...b?{targetEvidences:b}:{}}),t.markDeferredOutcome({command:n,action:i,positionals:o??r,flags:s,scheduleOutcomeRetry:f,androidFreshnessBaseline:h}),t.recordGestureVisualization(i,r,_,g??{},p,m),{ok:!0,data:v}}function N(e){let t=a(e.source),n=a(e.destination);return t&&n?{source:t,destination:n}:void 0}function P(e){if(e.command!==`fill`||typeof e.flags?.recordAs!=`string`)return[e.result,e.responseData];let t=l({ts:0,command:`fill`,positionals:e.positionals,flags:e.flags,result:e.result}),n=s(e.flags.recordAs);return[u(e.result,t,n),u(e.responseData,t,n)]}function F(e){let n=e.sessionStore.get(e.sessionName);if(!n)throw new t(`SESSION_NOT_FOUND`,h);return L({requestId:e.req.meta?.requestId,flags:e.req.flags,session:n,contextFromFlags:e.contextFromFlags,captureSnapshot:async(t,r)=>await e.captureSnapshotForSession(n,t,e.sessionStore,e.contextFromFlags,r),runtimeSessions:y({sessionName:e.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:e.req.internal?.findResolvedTarget!==void 0},setRecord:t=>{t.snapshot&&(v(n,t.snapshot),e.sessionStore.set(e.sessionName,n))}}),expireRefFrame:()=>g(n),confirmOffscreenTargetVisible:T(n,{skipPendingPostGestureStabilization:!1})?async(t,r)=>await j({session:n,node:t,rootViewport:r,requestOptions:w({req:e.req,logPath:e.logPath,traceLogPath:n.trace?.outPath})}):void 0,pairedGestureViewport:e.pairedGestureViewport,touchExecutor:e.touchExecutor,gestures:e.gestures})}function I(e){let{session:t,sessionStore:n,...r}=e;return M({...r,operations:{recordAction:n.recordAction.bind(n,t),markDeferredOutcome:e=>b({session:t,...e}),isSessionRecording:c.bind(null,t),recordGestureVisualization:C.bind(null,t)}})}function L(e){return d({backend:R(e),...o(`interaction commands`,{plural:!0}),sessions:e.runtimeSessions,signal:p(e.requestId)})}function R(e){let{flags:t,session:n}=e;return{platform:r(n.device),captureSnapshot:async(n,r)=>({snapshot:await e.captureSnapshot(t,{interactiveOnly:r?.interactiveOnly===!0,preferredBackend:r?.preferredBackend,includeRects:r?.includeRects===!0,signal:n.signal,boundCapture:e.touchExecutor?.captureSnapshot??e.gestures?.captureSnapshot})}),...z(e,()=>e.contextFromFlags(t,n.appBundleId,n.trace?.outPath)),...e.confirmOffscreenTargetVisible?{confirmOffscreenTargetVisible:async(t,n,r)=>await e.confirmOffscreenTargetVisible(n,r)}:{},...B(e.touchExecutor,e.expireRefFrame,t)}}function z(e,t){let n=e.gestures,r=e.pairedGestureViewport;return n?{resolveGestureViewport:async()=>r??await n.gestureViewport?.(t()),performGesture:async(r,i)=>(e.expireRefFrame(),V(await n.performPlan(i,t())))}:r?{resolveGestureViewport:async()=>r}:{}}function B(e,t,n){if(!e)return{};let{tapPoint:r,tapRef:i,fillPoint:a,fillRef:o,longPressPoint:s,hoverPoint:c,hoverRef:l}=e,u=async e=>(t(),V(await e()));return{tap:r?(e,t)=>u(()=>r(t,n)):void 0,tapTarget:i?(e,t)=>u(()=>i(t.ref)):void 0,fill:a?(e,t,n,r)=>u(()=>a(t,n,r)):void 0,fillTarget:o?(e,t,n,r)=>u(()=>o(t.ref,n,r)):void 0,longPress:s?(e,t,n)=>u(()=>s(t,n?.durationMs)):void 0,hover:c?(e,t)=>u(()=>c(t)):void 0,hoverTarget:l?(e,t)=>u(()=>l(t.ref)):void 0}}function V(e){return e&&typeof e==`object`?e:void 0}function H(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function U(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:H(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function W(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function G(e){try{return K(e),null}catch(e){if(e instanceof t)return H(e.code,e.message,e.details);throw e}}function K(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,{admission:r,scope:i,currentGeneration:a}=e.frame;if(r.admitted)return;let o=r.reason===`plain_ref_requires_complete_frame`&&i!==`all`&&i.has(n)&&a!==void 0?`@${n}~s${a}`:void 0;throw new t(`COMMAND_FAILED`,J(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:a,scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},...o?{suggestedRef:o}:{},hint:o?`Retry with the exact emitted ref ${o}.`:e.staleRefsWarning??q})}const q=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function J(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`}}export{F as a,T as c,U as i,E as l,G as n,I as o,W as r,A as s,K as t};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{Rn as t,lr as n}from"./sdk-batch-runner.js";import{t as r}from"./string-enum.js";const i=1e4,a=2e3,o=[`get`,`accept`,`dismiss`,`wait`],s=[`in-app`,`system`],c=[`primary`,`secondary`,`middle`];function l(e){return e?.clickButton??`primary`}function u(t){return t.button===`primary`?null:t.commandLabel===`click`?t.platform!==`macos`&&t.platform!==`linux`?new e(`UNSUPPORTED_OPERATION`,`click --button ${t.button} is supported only on macOS and Linux`):t.platform===`macos`&&t.button===`middle`?new e(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof t.count==`number`||typeof t.intervalMs==`number`||typeof t.holdMs==`number`||typeof t.jitterPx==`number`||t.doubleTap===!0?new e(`INVALID_ARGS`,`click --button ${t.button} does not support repeat or gesture modifier flags`):null:new e(`INVALID_ARGS`,`--button is supported only for click`)}function d(e){return e===`primary`?{}:{button:e}}const ee=[`up`,`down`,`left`,`right`,`top`,`bottom`],f=[`up`,`down`,`left`,`right`],p=[`left`,`right`,`left-edge`,`right-edge`],te=[`one-way`,`ping-pong`],ne=1e4,re=6e4,ie=r(f,{message:e=>`Unknown direction: ${e}`});function ae(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=v(e.amount),i=e.pixels===void 0?Math.round(n*r):fe(e.pixels),a=Math.max(1,Math.round(n*.05)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function oe(e){v(e.amount),e.pixels!==void 0&&fe(e.pixels)}function se(e,t){if(e===`left`||e===`right`){let n=m(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=g(h(t,n,50),t,8),a=g(h(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function ce(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function m(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=g(h(t,a?50:r,a?r:50),t,8),s=g(h(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function le(e){let t=de(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function h(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function g(e,t,n){return{x:y(e.x,n,t.referenceWidth),y:y(e.y,n,t.referenceHeight)}}function ue(e){return ie.parse(e)}function de(e){let t=e.filter(e=>n(e)&&_(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let r=e.map(e=>e.rect).filter(_);if(r.length===0)return;let i=Math.max(...r.map(e=>e.x+e.width)),a=Math.max(...r.map(e=>e.y+e.height));if(!(i<=0||a<=0))return{x:0,y:0,width:i,height:a}}function _(e){return!!e&&e.width>0&&e.height>0}function v(t){if(t===void 0)return .6;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function fe(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function y(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const b=1e4,x=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function S(n){let r=C(n),i=O(r,`kind`,x);if(i===`pan`)return{kind:i,origin:w(r,`origin`),delta:w(r,`delta`),pointerCount:t(r,`pointerCount`,{min:1,max:2}),durationMs:me(r)};if(i===`drag`)return pe(r);if(r.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(i===`fling`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:i,direction:O(r,`direction`,f),origin:w(r,`origin`),distance:t(r,`distance`,{min:0})}}if(i===`swipe`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:i,preset:O(r,`preset`,p)}}if(i===`pinch`)return{kind:i,scale:E(r,`scale`),origin:T(r,`origin`)};if(i===`rotate`){if(r.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:i,degrees:E(r,`degrees`),origin:T(r,`origin`)}}return{kind:i,origin:w(r,`origin`),delta:w(r,`delta`),scale:E(r,`scale`),degrees:E(r,`degrees`),durationMs:me(r)}}function pe(n){let r=t(n,`sourceHoldMs`,{min:1,max:1e4}),i=t(n,`moveMs`,{min:16,max:1e4}),a=t(n,`destinationHoldMs`,{min:0,max:1e4});if((r??800)+(i??500)+(a??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${b}`);return{kind:`drag`,source:D(n,`source`),destination:D(n,`destination`),sourceHoldMs:r,moveMs:i,destinationHoldMs:a}}function me(n){let r=t(n,`durationMs`);if(r!==void 0){if(r<16||r>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${b}.`);return r}}function C(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function w(e,t){let n=C(e[t]);return{x:E(n,`x`),y:E(n,`y`)}}function T(e,t){return e[t]===void 0?void 0:w(e,t)}function E(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function D(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function O(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const k={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:he}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function he(e,t){let[n,r,i,a,o]=e,s=A(n,i),c=A(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function A(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function j(e,t){let n=k[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!ge(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function ge(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function _e(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function ve(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function M(t,n){let r=j(t,n);if(r)throw new e(`INVALID_ARGS`,ve(r))}function ye(e,t,n){let r=be(e,t);return r?ve(r,n):void 0}function be(e,t){if(e===`swipe`)return j(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(k,n))return j(n,t.slice(1))}function N(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function P(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{M(`gesture pan`,r);let{origin:e,delta:i}=N(r);return S({kind:n,origin:e,delta:i,pointerCount:t,durationMs:F(r[4])})}case`fling`:return M(`gesture fling`,r),S({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:F(r[3])});case`swipe`:return M(`gesture swipe`,r),S({kind:n,preset:r[0]});case`pinch`:return M(`gesture pinch`,r),S({kind:n,scale:Number(r[0]),origin:I(r[1],r[2])});case`rotate`:return M(`gesture rotate`,r),S({kind:n,degrees:Number(r[0]),origin:I(r[1],r[2])});case`transform`:{M(`gesture transform`,r);let{origin:e,delta:t}=N(r);return S({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:F(r[6])})}case`drag`:return M(`gesture drag`,r),S({kind:n,source:r[0],destination:r[1],sourceHoldMs:F(r[2]),moveMs:F(r[3]),destinationHoldMs:F(r[4])});default:return S({kind:n})}}function xe(e){if(e[0]!==`drag`)return;let t=P(e);return t.kind===`drag`?t:void 0}function Se(e){switch(e.kind){case`pan`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return L([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return L([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?L([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function Ce(e,t={}){return M(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function we(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function Te(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:we(e).gesture}function Ee(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function F(e){return e===void 0?void 0:Number(e)}function I(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function L(e){return e.filter(e=>e!==void 0).map(String)}const R={pinchAxisDegrees:-90,samplingProfile:`default`},De={ios:R,macos:R,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:R,vega:R,linux:R,web:R};function Oe(e,t,n){let r=W(t),i=He(n);switch(e.intent){case`fling`:return Me(e,r);case`pan`:return Ne(e,r,i);case`pinch`:return B({intent:`pinch`,origin:e.origin??X(r),delta:{x:0,y:0},scale:Y(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=J(e.degrees,`gesture rotate degrees`);return B({intent:`rotate`,origin:e.origin??X(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:K(t)},r,i)}case`transform`:{let t=J(e.degrees,`gesture transform degrees`);return B({intent:`transform`,origin:e.origin,delta:e.delta,scale:Y(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:G(e.durationMs,K(t),`gesture transform durationMs`)},r,i)}}}function ke(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function Ae(t,n){let r=W(n),i=Le(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),a=G(t.moveMs,500,`gesture drag moveMs`),o=Re(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(i+a+o>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${b}`);return je(z(`pan`,t.from,t.to,a,r,`timed-pan`),i,o)}function je(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function Me(e,t){if(`preset`in e){let{from:n,to:r}=Ve(e.preset,t);return z(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return z(`fling`,e.from,e.to,100,t,`endpoint-hold`);let n=q(e.origin,`gesture fling origin`),r=ze(e.distance??180,`gesture fling distance`);return z(`fling`,n,Z(n,ce(e.direction,r)),100,t,`endpoint-hold`)}function Ne(t,n,r){let i=G(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=q(t.origin,`gesture pan origin`);return z(`pan`,e,Z(e,q(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return B({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function z(e,t,n,r,i,a){let o=q(t,`gesture ${e} start`),s=q(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return H(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function B(e,t,n){let r=q(e.origin,`gesture ${e.intent} origin`),i=Z(r,q(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Ie(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw U({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=V(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:Pe({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return H(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function Pe(e){let t=e.offsetMs/e.durationMs,n=Be(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=Ue(Fe(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function Fe(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Ie(e){return e===`pinch`?.4:.25}function V(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function H(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw U({...r,viewport:n,sample:o})}}function U(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function W(t){let n={x:J(t.x,`gesture viewport x`),y:J(t.y,`gesture viewport y`),width:J(t.width,`gesture viewport width`),height:J(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function G(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<16||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 16 and ${b}`);return i}function Le(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<1||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 1 and ${b}`);return i}function Re(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<0||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 0 and ${b}`);return i}function K(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function q(e,t){return{x:J(e.x,`${t} x`),y:J(e.y,`${t} y`)}}function J(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function Y(t,n){let r=J(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function ze(t,n){let r=J(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function X(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function Z(e,t){return{x:e.x+t.x,y:e.y+t.y}}function Be(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function Ve(e,t){let n=se(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function He(e){return e===void 0?R:De[e]}function Ue(e){return e*Math.PI/180}const We={occlusion:{kind:`runtime`,via:`src/core/selector-pipeline.ts#runNodePipelineStages`},parentOwnedTouchPoint:{kind:`runtime`,via:`src/core/interaction-touch-point.ts#resolveInteractionTouchPoint`},offscreen:{kind:`runtime`,via:`src/commands/interaction/runtime/resolution.ts#throwIfOffscreenInteractionTarget`},nonHittable:{kind:`runtime`,via:`src/core/selector-pipeline.ts#runNodePipelineStages`},responseConstruction:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-response.ts#buildInteractionResponseData`},responseIdentity:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-targets.ts#interactionResultExtra`},verifyEvidence:{kind:`runtime`,via:`src/commands/interaction/runtime/interactions.ts#pressCommand`,appliesTo:[`press`,`click`,`fill`]},settleObservation:{kind:`runtime`,via:`src/commands/interaction/runtime/settle.ts#settleAfterInteraction`}};({...We}),{...We};const Ge=`tapped via non-hittable coordinate fallback`,Ke=[`xctest-element`,`synthesized-first-responder`,`synthesized-first-responder-replacement`,`xctest-application-fallback`],qe=[`focused-element`,`keyboard-shown`],Je=1e4;function Ye(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function Xe(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function Ze(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const Qe={android:`longpress`,apple:`exact`,vega:`exact`},Q={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},$=Object.keys(Q),$e=`<${$.join(`|`)}>`;function et(t){let n=t?.toLowerCase();if(tt(n))return n;let r=n?ot.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${$.join(`, `)}.`)}function tt(e){return typeof e==`string`&&$.includes(e)}function nt(e){return Q[e].appleRemoteButton}function rt(e){return Q[e].androidKeyevent}function it(e){return Q[e].vegaKey}function at(e){return Qe[e]}const ot=new Map($.flatMap(e=>Q[e].aliases.map(t=>[t,e]))),st={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,targetAbsent:`wait_target_absent`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`};export{S as A,le as B,xe as C,Ee as D,Te as E,p as F,l as G,c as H,re as I,a as J,s as K,oe as L,ee as M,te as N,Ce as O,ne as P,m as R,ye as S,Se as T,d as U,ue as V,u as W,i as Y,Oe as _,rt as a,ke as b,at as c,Ze as d,Xe as f,Ae as g,Ke as h,et as i,f as j,x as k,Je as l,Ge as m,$ as n,nt as o,qe as p,o as q,$e as r,it as s,st as t,Ye as u,Be as v,P as w,_e as x,V as y,ae as z};
1
+ import{f as e,i as t,s as n}from"./session-snapshot.js";import{t as r}from"./snapshot-quality-verdict.js";import{t as i}from"./backend-snapshot-options.js";import{a,i as o,n as s,o as c,r as l}from"./interaction-ref-policy.js";async function u(e){let{session:t,flags:n,contextFromFlags:a,options:o}=e,s={...n??{},...i(o)},c=a(s,t.appBundleId,t.trace?.outPath),l=await e.capture({flags:s,options:o,context:c});return r(l.snapshotQuality)||e.publishSnapshot(l),l}const d=async(r,i,a,o,s)=>await u({session:r,flags:i,contextFromFlags:o,options:s,capture:async({flags:t,options:i,context:a})=>{let{snapshot:o}=await n({device:r.device,session:r,flags:t,outPath:t.out,logPath:a.logPath??``,includeRects:i.includeRects,androidFreshnessMode:i.androidFreshnessMode,signal:i.signal,...i.boundCapture?{captureData:async()=>await i.boundCapture(e({flags:t,session:r,snapshotScope:t.snapshotScope,includeRects:i.includeRects,signal:i.signal,context:a}))}:{}});return o},publishSnapshot:e=>{t(r,e),a.set(r.name,r)}});function f(e){return a({...e,captureSnapshotForSession:e.captureSnapshotForSession??d})}async function p(e){return(await import(`./find.js`)).handleFindCommands(e)}async function m(e){return await(await import(`./interaction2.js`)).handleInteractionCommands({...e,captureSnapshotForSession:e.captureSnapshotForSession??d})}export{d as captureSnapshotForSession,f as createInteractionRuntime,c as finalizeTouchInteraction,p as handleFindCommands,m as handleInteractionCommands,l as readSettleRequest,s as refMutationAdmissionResponse,o as settleFlagGuardResponse};
@@ -1 +1 @@
1
- import{C as e,_ as t,h as n,s as r,v as i}from"./sdk-contracts.js";import{Rn as a,b 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{$ as p,Et as ee,Vt as m}from"./prepare-kind.js";import{A as te,D as ne,E as re,G as h,I as ie,P as ae,T as g,U as oe,W as se,x as ce}from"./interaction.js";import{F as le,X as _}from"./screenshot-result.js";import{n as v}from"./command-catalog.js";import{n as ue,t as de}from"./verdict.js";import{i as fe}from"./runtime.js";import{A as y}from"./sdk-android-adb.js";import{t as pe}from"./timeouts.js";import{i as me}from"./cancel.js";import{o as he}from"./interactors.js";import{a as b,o as x,s as S,t as ge,u as C}from"./dispatch.js";import{Ct as w,Dt as T,It as _e,Kt as ve,Lt as ye,Nt as be,Ot as xe,Pt as Se,kt as E,wt as Ce}from"./internal/daemon.js";import{C as D,S as we,_ as Te,c as Ee,d as De,f as Oe,g as ke,h as Ae,l as je,n as Me,p as Ne,r as Pe,v as Fe,x as O,y as Ie}from"./selector-runtime.js";import{t as k}from"./interaction-runtime.js";import{t as A}from"./interaction-snapshot.js";import{n as j,r as Le,t as M}from"./interaction-common.js";function Re(e){let n=e.flags?.recordAs;if(n!==void 0){if(le(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(!_(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 N(e){try{return P(e),null}catch(e){if(e instanceof t)return b(e.code,e.message,e.details);throw e}}function P(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,r=be({session:e.session,refBody:n,mintedGeneration:e.mintedGeneration});if(r.admitted)return;let i=ye(e.session);throw new t(`COMMAND_FAILED`,Be(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:_e(e.session),scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??ze})}const ze=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function Be(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 F(e,t){if(!ve(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){y({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function I(e,t){return!d(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:b(`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 Ve=new Set(s());function He(e){return We({fields:Ue(e.command),input:e.input??{},data:e.data,controlledFields:Ve})}function Ue(e){let t=o(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function We(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 Ge=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function Ke(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Ge.has(e)))}function L(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=Je(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return qe({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...m(o)})}function qe(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function Je(e,t,n){let r=R(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Ye(t,n),a=Xe(e);if(a)return Qe(a,e??{},i);if(i)return Ze(e,i)}function R(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Ye(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Xe(e){let t=R(e,`ref`);return t===void 0?R(e,`selector`):`@${t}`}function Ze(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:`Tapped${t}`}function Qe(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}const $e={source:`direct-ios`,kind:`not-observed`};function z(e,t){if(!et(e))return t;let{resolution:n,...r}=t;return r}function et(e){return e.maestroCoordinateFallbackDispatched===!0}function B(e){return V({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 V(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...z(t,{resolution:t.kind===`runner-payload`?$e: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,...z(t,ke(i)),...rt(i.settle,e.settleRefsGeneration),...r??{}},o=L({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...nt(i)}}),s=L({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=it(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...tt(i)}}function tt(e){let t=H(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 nt(e){let t=H(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function H(e){return`recordingTarget`in e?e.recordingTarget:void 0}function rt(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function it(e,t){return t?e?`${e} ${t}`:t:e}async function at(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Le({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):j(n.snapshot?.nodes??[]);return V({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:T(n,r.settle)})}function U(e){let t=f(e.session.device.platform)?Ke(e.data):e.data;return e.command?He({command:e.command,input:e.flags,data:t}):t}function ot(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function W(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 G(e){return[String(e.x),String(e.y)]}function st(e,n){if(n.code!==`AMBIGUOUS_MATCH`)return n;let r=ee(n.details);return r.length===0||e.snapshotGeneration===void 0?n:(xe(e,r),new t(n.code,n.message,{...n.details,refsGeneration:e.snapshotGeneration},n.cause))}async function K(e){if(!ct(e))return;let t=ut(e.session.snapshot);if(!t)return;let n=await dt(e,t.snapshot.snapshotQuality,t.presentation);if(!(!n||!ft(t.snapshot,n,e.command)))return pt(t.snapshot,n,e.command)}function ct(e){return lt(e.command)&&i(e.error).code===`XCTEST_RECORDED_FAILURE`&&Oe(e.session,{skipPendingPostGestureStabilization:!1})}function lt(e){return e===`click`||e===`press`}function ut(e){if(!q(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){y({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=mt(e.presentationKey);if(n){if(n.raw){y({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function dt(e,t,n){try{let r=ue(t);return await e.captureSnapshotForSession(e.session,yt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:me(e.requestId)})}catch(t){y({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function ft(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(y({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey?!0:(y({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function pt(e,t,n){if(!q(t))return;let r=p(e.nodes),i=p(t.nodes);if(r.digest!==i.digest)return y({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 q(e){return!!(e&&e.nodes.length>0&&!de(e.snapshotQuality))}function mt(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return ht(t)}function ht(e){let t=gt(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!_t(t.depth)||!vt(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function gt(e){return typeof e==`object`&&e?e:void 0}function _t(e){return e==null||typeof e==`number`}function vt(e){return e==null||typeof e==`string`}function yt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function bt(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function xt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await w({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=N({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 w({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function J(e,t){let n=e.sessionStore.get(e.sessionName);if(!n)return x();let r=k(e),a=Date.now();try{let i,o=await xt(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 M({session:n,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:Tt(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=st(n,i(r));if(je(o))throw o;return o.code===`AMBIGUOUS_MATCH`?Y(o):await St({error:o,handlerParams:e,session:n,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||Y(o)}}async function St(e){if(!e.target)return;let t=fe(e.error);if(!t&&_(e.session))return;let n=await K({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=Ct({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:j(e.session.snapshot?.nodes??[]),extra:e.extra});return M({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 Ct(e){return e.resolvedTarget?V({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):B({targetKind:e.target.kind,point:wt(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...bt(e.target),...e.extra??{}}})}function wt(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function Y(t){return{ok:!1,error:e(t)}}function Tt(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?G(t.point):void 0}async function Et(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=I(i,`fill`);if(e)return e;let t=S(`fill`,i.device);if(t)return t}if(!i)return x();Re({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=D(`fill`,t.flags);if(a)return a;let o=Te(t.positionals??[]);if(!o.ok)return o.response;let s=await Dt(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return await J(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:O(t.flags),expectedResolvedTarget:l,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>Ot({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function Dt(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?E({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:N({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await F(e,t),{staleRefsWarning:i})}function Ot(e){let{session:t,result:n}=e,r=W(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:j(t.snapshot?.nodes??[]);return V({source:{kind:`runtime`,result:n,publicData:U({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:T(t,n.settle)})}async function kt(e,t,n){return await At({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function At(t){let{params:n,session:r,selector:i,command:a,positionals:o,extra:s,fallbackPhase:c}=t,l=Date.now();Se(r);try{let e=await ge(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=Mt(e),u=U({session:r,command:ot(n.req.command,a),flags:n.req.flags,data:e}),d=W(i.allowNonHittableCoordinateFallback===!0,e),{result:f,responseData:p}=V({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:u,point:c,maestroCoordinateFallbackDispatched:d.used},referenceFrame:Nt(e),extra:{...s,...d.extra}});return M({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:G(c),flags:n.req.flags,result:f,responseData:p,actionStartedAt:l,actionFinishedAt:t})}catch(t){return await jt({error:t,handlerParams:n,session:r,extra:s,positionals:o,actionStartedAt:l})||(De(t,{delegateSemanticFailures:i.allowNonHittableCoordinateFallback!==!0})?(y({level:`debug`,phase:c,data:{selector:i.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)})}}async function jt(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await K({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}=B({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return M({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 Mt(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 Nt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Pt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return n!==`click`||r.kind!==`selector`||_(t)||Lt(i)||c(n)&&i?.verify===!0||l(n)&&i?.settle===!0?null:Ft(t,r.selector,i)}function Ft(e,t,n){let r=Ne({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const It=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function Lt(e){return It.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}async function Rt(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=zt(a,t,o,n.flags);if(s)return{response:s};let c=n.positionals??[],l=t===`longpress`?Fe(c):Ie(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=h(n.flags);return{admitted:{session:a,commandLabel:o,clickButton:f,resultButtonTag:oe(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===`longpress`?`longpress`:`press`;return I(e,n)||S(i,e.device)||D(t,r)||Bt(e,t,n,r)}function Bt(e,t,n,r){let i=h(r);if(t===`longpress`||i===`primary`)return;let a=se({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 b(a.code,a.message,a.details)}function Vt(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return E({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===`longpress`?`longpress`:`press`,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:N({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i});return s?{response:s}:{androidFreshnessBaseline:await F(e,t)}}async function X(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:Pt({session:r.session,commandLabel:r.commandLabel,target:r.target,flags:e.req.flags});if(i){let t=await kt(e,r.session,i);if(t)return t}return await J(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`}: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 Ee(a,Ae(o,e))},buildPayloads:async n=>{let i=Kt(n);return await at({params:e,session:a,result:n,staleRefsWarning:c,publicData:U({session:a,command:t===`longpress`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:l})}}}async function Gt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c=O(o);if(n===`longpress`)return await t.interactions.longPress(r,{session:i,requestId:a,durationMs:e.durationMs,settle:c,expectedResolvedTarget:s});let l={session:i,requestId:a,button:e.clickButton,count:o?.count,intervalMs:o?.intervalMs,holdMs:o?.holdMs,jitterPx:o?.jitterPx,doubleTap:o?.doubleTap,verify:o?.verify,settle:c,expectedResolvedTarget:s,preresolvedTarget:e.preresolvedTarget};return n===`click`?await t.interactions.click(r,l):await t.interactions.press(r,l)}function Kt(e){return`durationMs`in e?e.durationMs:void 0}async function qt(e){switch(e.req.command){case`press`:return await X(e,`press`);case`click`:return await X(e,`click`);case`longpress`:return await X(e,`longpress`);case`fill`:return await Et(e);default:return null}}function Z(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 $(e,`gesture`,async t=>Yt(e,t))}async function Yt(e,t){let n=te(e.req.input),r=en(n,t);return r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile),C(r,t.device),Zt(n,r,await Xt(Q(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:nn(e,i),flags:un(e,r),responseData:Z(n,{executionProfile:$t(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 $(e,`swipe`,async t=>{let n=rn(e.req.input);C(ne(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await cn(Q(e),e,n,r,i,a);return{positionals:sn(n),flags:e.req.flags,responseData:Z(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 Q(e){return k({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function $(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return x();let a=Date.now();try{let e=he(i.device),o=e?{status:`clear`}:await w({session:i,command:n,phase:`before-command`}),s=await r(i);e||await w({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}`),M({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 $t(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 en(e,t){let n=re(e);return n.intent===`drag`?{...n,source:tn(n.source,t),destination:tn(n.destination,t)}:n}function tn(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 P({session:i,ref:a.base,mintedGeneration:a.generation}),a.base}function nn(e,t){return e.kind!==`drag`||!t?g(e):g({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function rn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);ce(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:on(n.from,`swipe from`),to:on(n.to,`swipe to`),count:a(n,`count`,{min:1,max:200}),pauseMs:a(n,`pauseMs`,{min:0,max:ae}),pattern:r};return an(i),i}function an(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 ${ie}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function on(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 sn(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function cn(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=ne(ln(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 pe(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function ln(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function un(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function dn(e){let t=await qt({...e,captureSnapshotForSession:A,refSnapshotFlagGuardResponse:we});if(t)return t;switch(e.req.command){case v.gesture:return await Jt({...e,captureSnapshotForSession:A});case v.swipe:return await Qt({...e,captureSnapshotForSession:A});case v.type:return await fn({...e,captureSnapshotForSession:A});case`get`:return await Me(e);case`is`:return await Pe(e);default:return null}}async function fn(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?S(v.type,r.device)||await pn(r)||await mn(e,r):x()}async function pn(e){return e.device.platform===`android`&&e.screenRecording&&(await Ce({session:e})).status===`failed`?b(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function mn(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=k(t),c=Date.now();try{let e=await w({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 w({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...m(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),M({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{dn as handleInteractionCommands};
1
+ import{A as e,O as t,_ as n,b as r,c as i,y 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{i as p,o 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{_,v as ae}from"./runtime.js";import{n as v}from"./catalog.js";import{n as oe}from"./success-text.js";import{i as se,n as ce,r as le}from"./click-button.js";import{r as ue,t as de}from"./interaction-positionals.js";import{r as y}from"./diagnostics.js";import{t as fe}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import"./gesture-plan.js";import{r as pe}from"./request-cancel.js";import"./request.js";import{r as me}from"./provider-device-runtime.js";import{a as b,i as x}from"./request-runtime-binding.js";import{C as S,d as he,n as ge,r as C,t as w,u as _e,w as T,x as ve}from"./session-snapshot.js";import{i as E,r as ye}from"./platform-runtime-apple-resources.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{d as Oe,f as ke,i as Ae,r as je,v as N}from"./selector-runtime.js";import{n as Me}from"./type-text-runtime.js";function Ne(e){let t=e.flags?.recordAs;if(t!==void 0){if(ie(t),e.flags?.noRecord)throw new a(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!e.isSessionRecording&&!e.replayPlanStep)throw new a(`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(!ve(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){y({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: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 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&&!me(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){y({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:x(`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:x(`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:x(`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 de(e)}catch{return null}}function Xe(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ue(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=`preActionNodes`in e?e.preActionNodes: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:w(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:n,snapshotGeneration:r,publishPartialRefs:i}=t;if(n.code!==`AMBIGUOUS_MATCH`)return n;let o=e(n.details);return o.length===0||r===void 0?n:(i(o),new a(n.code,n.message,{...n.details,refsGeneration:r},n.cause))}async function ut(e,t,n){let r=await Oe(e,n);if(r){if(r.permissionDialog)return`press ${t} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new a(`COMMAND_FAILED`,`press ${t} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}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)&&r(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){y({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=bt(e.presentationKey);if(n){if(n.raw){y({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:pe(e.requestId)})}catch(t){y({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:(y({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?(y({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey||(y({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 y({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:T({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 b();let i=Ce({...e,touchExecutor:t.touchExecutor}),a=Date.now();try{let r,o=await Dt(n,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(i);return r=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]:[],...r?[r]:[]];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(i){let o=lt({error:r(i),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:_e(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 b();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?C({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:T({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:w(t,n.settle)})}async function Lt(e,n,r,i){let a=e,o={selector:r.raw},s=Date.now();S(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})?(y({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:b()};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=se(n.flags);return{admitted:{session:a,commandLabel:o,clickButton:f,resultButtonTag:ce(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=se(r);if(!Gt.has(t)||i===`primary`)return;let a=le({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 x(a.code,a.message,a.details)}function Yt(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return C({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:T({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 b();let a=Date.now();try{let t=me(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(e,t){if(!e.startsWith(`@`))return e;let r=n(e);if(!r)throw new a(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:i});return De({ref:r.base,mintedGeneration:r.generation,frame:T({session:t,ref:r.base,mintedGeneration:r.generation})}),r.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(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`swipe requires structured object input`);re(e);let t=e,n=t.pattern;if(n!==void 0&&n!==`one-way`&&n!==`ping-pong`)throw new a(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let r={from:_n(t.from,`swipe from`),to:_n(t.to,`swipe to`),count:o(t,`count`,{min:1,max:200}),pauseMs:o(t,`pauseMs`,{min:0,max:p}),pattern:n};return gn(r),r}function gn(e){let t=e.count??1,n=e.pauseMs??0,r=t*100+Math.max(0,t-1)*n;if(!(r<=6e4))throw new a(`INVALID_ARGS`,`Swipe series must fit within ${ee}ms.`,{count:t,pauseMs:n,gestureDurationMs:100,scheduledDurationMs:r,hint:`Reduce --count or --pause-ms.`})}function _n(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`${t} must be a point`);let n=e;if(typeof n.x!=`number`||!Number.isFinite(n.x))throw new a(`INVALID_ARGS`,`${t} x must be finite`);if(typeof n.y!=`number`||!Number.isFinite(n.y))throw new a(`INVALID_ARGS`,`${t} y must be finite`);return{x:n.x,y:n.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 fe(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 b();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:x(`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});S(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{kt 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 h}from"./method-scope.js";import{a as g}from"./helper.js";import{a as _,n as v}from"./runner-client.js";import{a as y,c as b,i as x,l as S,n as C,o as w,r as T,s as E}from"./apps.js";import{n as D,t as O}from"./runner-sequence.js";function k(e,t,n,r={includeDuration:!0}){let i=j(e.referenceWidth),a=j(e.referenceHeight);if(i===void 0||a===void 0)return M(e,{amount:n?.amount});let o=d({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return M(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function A(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 j(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function M(e,t){let{x1:n,y1:r,x2:i,y2:a}=P(e),o=j(e.referenceWidth),s=j(e.referenceHeight),c=N(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 N(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 P(e){let t=j(e.x),n=j(e.y),r=j(e.x2),i=j(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 F(e,t,n,r,i,a){return k(await e(t,{command:`desktopScroll`,direction:i,...A(a,{includeDuration:!0}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function I(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function ee(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 v(e,W(e,t,r,i),n),tapElementSelector:async r=>await v(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 v(e,O([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return D(a),a},longPress:async(r,i,a)=>await v(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await v(e,W(e,t,r,i),n),type:async(r,i)=>R(await v(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
2
- `?void 0:`append`,appBundleId:t.appBundleId},n)),fillElementSelector:async(r,i,a)=>await v(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 v(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(v,e,t,n,r,i),performGesture:async r=>await H(e,t,n,r),gestureViewport:async()=>B(await v(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 v(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 v(e,{command:`swipe`,direction:U(t,r),appBundleId:n.appBundleId},a)}return await v(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)?M(await e(t,I(c,n.appBundleId,u?.durationMs),o),{amount:u?.amount,durationMs:u?.durationMs}):(a(u??{}),r(t)?await F(e,t,n,o,c,u):k(await e(t,{command:`scroll`,direction:c,...A(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)=>w(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:o}),openDevice:()=>E(t),close:e=>y(t,e,o),screenshot:(e,n)=>Q(t,e,n,o),snapshot:async n=>{let r=te(await m(`snapshot_capture`,async()=>await v(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},J(o,n?.signal)),{backend:`xctest`})),i=r.nodes??[];if(i.length===0&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:i,truncated:r.truncated??!1,backend:`xctest`,...r.quality?{quality:r.quality}:{},...!r.quality&&r.message?{warnings:[r.message]}:{}}},back:async e=>{if(i(t)){await v(t,I(`menu`,n.appBundleId),o);return}await v(t,{command:ee(e),appBundleId:n.appBundleId},o)},home:async()=>{if(i(t)){await v(t,I(`home`,n.appBundleId),o);return}await v(t,{command:`home`,appBundleId:n.appBundleId},o)},setOrientation:async r=>{let i=Y(await v(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 v(t,{command:`appSwitcher`,appBundleId:n.appBundleId},o)},tvRemote:async(e,r)=>{await v(t,I(u(e),n.appBundleId,r),o)},readClipboard:()=>T(t),writeClipboard:e=>x(t,e),setSetting:(e,n,r,i)=>C(t,e,n,r,i),...a};return r?X(t,n,s,r):s}function J(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Y(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 X(e,t,n,r){return h({...n,open:async()=>Z(`open`),openDevice:async()=>Z(`openDevice`),close:async()=>Z(`close`),screenshot:async()=>Z(`screenshot`),readClipboard:async()=>Z(`readClipboard`),writeClipboard:async()=>Z(`writeClipboard`),setSetting:async()=>Z(`setSetting`)},n=>_(r,{deviceId:e.id,requestId:t.requestId},n))}function Z(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 Q(e,t,n={},r){if($(e,n.surface)){await g(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await b(e,t,n.appBundleId,n.fullscreen,r);return}await S(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function $(e,t){return r(e)&&t!==void 0&&t!==`app`}function te(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{y 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{l as a,s 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 ee}from"./location-coordinates.js";import{a as te,n as ne,t as re}from"./scroll-command.js";import"./device.js";import{t as ie}from"./device-rotation.js";import{c as ae,r as f}from"./diagnostics.js";import{_ as oe}from"./owner-identity.js";import{i as p}from"./exec.js";import{t as m}from"./timeouts.js";import{a as se}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{i as ce,n as h}from"./retry.js";import"./process.js";import{a as g}from"./gesture-plan.js";import{n as le}from"./scoped-provider.js";import{n as ue,r as de}from"./ios-snapshot-planning.js";import{r as fe}from"./device-isolation.js";import{i as pe,r as me}from"./snapshot-quality-verdict.js";import{r as he}from"./ios-snapshot-acquisition.js";import{i as ge,n as _e}from"./screenshot-density.js";import{n as ve}from"./interactor-types.js";import{a as _,o as ye,t as be}from"./runner-presentation.js";import{C as xe,g as Se,r as Ce}from"./host-file.js";import{a as we,c as Te,d as Ee,l as De,u as Oe}from"./config2.js";import{o as ke}from"./tool-provider.js";import{n as Ae,r as v,t as y}from"./physical-device-control.js";import{n as b}from"./simctl.js";import{n as x,r as je}from"./apps-simctl.js";import{n as S,r as C,s as Me}from"./runner.js";import{t as Ne}from"./runner-cache-metadata.js";import{m as w,p as Pe}from"./runner-client.js";import{n as Fe,r as Ie,t as Le}from"./app-launch.js";import{r as T,t as E}from"./simulator.js";import{a as Re,d as ze,f as Be,g as Ve,h as D,m as He,p as Ue}from"./app-resolution.js";import{a as We,i as Ge,o as Ke}from"./helper.js";import{n as qe}from"./multitouch-support.js";import{t as Je}from"./runner-selector-query.js";import{t as Ye}from"./surface-snapshot.js";import O from"node:path";async function Xe(e){return r(e)?await ze():(T(e,`clipboard`),await E(e),p(await x(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replaceAll(`\r
2
+ `,`
3
+ `).replace(/\n$/,``))}async function Ze(e,t){if(r(e)){await Ue(t);return}T(e,`clipboard`),await E(e),p(await x(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t}),`Failed to write iOS simulator clipboard`)}const Qe=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],$e={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`},et={1:`searching`,2:`failed`,3:`active`},tt={0:`notSupported`,1:`searching`,2:`failed`,3:`active`};function k(e,t,n){return b(e,t,n)}const A=new Set;async function nt(e){let t=null,n=!1;if(it(e))n=!0;else try{t=await at(e),n=!0}catch(t){I(e,`snapshot_failed`,t)}try{(!n||t)&&await P(e),await F(e,Qe)}catch(t){I(e,`prepare_failed`,t)}return async()=>{await rt(e,n?t:null)}}async function rt(e,t){if(await P(e),!t){M(e);return}await F(e,st(t)),j(e)}function j(e){A.delete(N(e))}function M(e){A.add(N(e))}function it(e){return A.has(N(e))}function N(e){return`${e.platform}:${e.kind}:${e.id}`}async function at(e){return ot(p(await k(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function P(e){await k(e,[`status_bar`,e.id,`clear`])}async function F(e,t){t.length!==0&&await k(e,[`status_bar`,e.id,`override`,...t])}function ot(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=$e[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=et[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=tt[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 st(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||ct(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function ct(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function I(e,t,n){f({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...v(n)}})}let L=null,R;async function lt(t,n,i,a,o){if(r(t)){let t=n.toLowerCase();if(t===`appearance`){await Be(i);return}if(t===`permission`){let t=ee(i);if(t===`deny`)throw new e(`INVALID_ARGS`,l(`permission`));let n=dt(o?.permissionTarget);return await We(t,n)}throw new e(`INVALID_ARGS`,l(n))}T(t,`settings`),await E(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 ut(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 x(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=D(i)?`active`:`failed`;await x(t,[`status_bar`,t.id,`override`,`--wifiMode`,e]),j(t);return}case`airplane`:D(i)?(await x(t,[`status_bar`,t.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),j(t)):(await x(t,[`status_bar`,t.id,`clear`]),M(t));return;case`location`:{if(i.toLowerCase()===`set`){let{latitude:e,longitude:n}=d(o);return await x(t,[`location`,t.id,`set`,`${e},${n}`]),{latitude:e,longitude:n}}let n=D(i);if(!a)throw new e(`INVALID_ARGS`,`location setting requires an active app in session`);let r=n?`grant`:`revoke`;await x(t,[`privacy`,t.id,r,`location`,a]);return}case`faceid`:case`touchid`:{let e=s,n=mt[e];await xt(t,bt(i,e),{settingName:e,label:n.label,modalityAliases:n.modalityAliases});return}case`appearance`:{let e=await ft(t,i);await x(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 gt(t,ht(ee(i)),yt(o?.permissionTarget,o?.permissionMode),a);return;default:throw new e(`INVALID_ARGS`,`Unsupported setting: ${n}`)}}async function ut(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 Re(t,r);await E(t),await Le(t,i);let a=p(await x(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 Se(a);return await Promise.all(o.map(e=>xe(O.join(a,e)))),{bundleId:i,containerPath:a}}function dt(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 ft(t,n){let r=He(n);if(r!==`toggle`)return r;let i=p(await x(t,[`ui`,t.id,`appearance`],{allowFailure:!0}),`Failed to read current iOS appearance`),a=pt(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 pt(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 mt={faceid:{label:`Face ID`,modalityAliases:[`face`]},touchid:{label:`Touch ID`,modalityAliases:[`finger`,`touch`]}};function ht(e){return e===`deny`?`revoke`:e}async function gt(t,n,r,i){let a=await _t(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 x(t,o);return}catch(n){throw s&&z(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 x(t,o);return}catch(e){if(!z(e))throw e}try{await x(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 z(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 _t(t){let n=fe(t.simulatorSetPath),r=`${oe(`PATH`)??``}::${n??``}`;if(L&&R===r)return L;let i=await x(t,[`privacy`,`help`],{allowFailure:!0}),a=vt(`${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 L=a,R=r,a}function vt(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 yt(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 bt(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 xt(t,n,r){let i=St(t.id,n,r.modalityAliases),a=[];for(let e of i){let n=je(t,e),r=await ke(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=Ve(a);throw a.length>0&&a.every(e=>Ct(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 St(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 Ct(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 B(e,t,n){return b(e,t,n)}const wt={ensureBooted:E,prepareStatusBarForScreenshot:nt,captureWithRetry:Dt,normalizeDensity:It,captureWithRunner:U,shouldFallbackToRunner:Pt},V=new Map,H=new Map;async function Tt(e,t,n={}){if(r(e)){await U(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Et(e,t,n);return}await y(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:w})}async function Et(t,n,r={}){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...wt,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(t);let a=async()=>{};if(r.normalizeStatusBar===!0)try{a=await i.prepareStatusBarForScreenshot(t)}catch(e){Mt(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&&Ft(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;jt(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=>Mt(t,`restore_failed`,e))}}async function Dt(e,t){let n=h.fromTimeoutMs(Ee);await ce(async({deadline:n})=>{await B(e,[`io`,e.id,`screenshot`,t],{timeoutMs:Math.max(1e3,n?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Te,maxDelayMs:De,jitter:.2,shouldRetry:e=>Pt(e)},{deadline:n,phase:`ios_simulator_screenshot`})}async function U(t,n,i,a,o){if(t.kind===`device`&&!r(t)){await y(t).captureScreenshot(t,n,{appBundleId:i,fullscreen:a,runnerOptions:o,preferRunner:!0,runRunnerCommand:w});return}let s=(await w(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 Ce(s,n);return}if(t.kind===`simulator`){await Ot(t,s,n);return}throw new e(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function Ot(t,n,r){let i=h.fromTimeoutMs(we),a=`Unable to locate runner container for simulator screenshot`,o=H.get(t.id);if(o){let e=await kt(o,n,r);if(e.copied)return;a=e.error,H.delete(t.id)}for(let e of Ne){let o=await B(t,[`get_app_container`,t.id,e,`data`],{allowFailure:!0,timeoutMs:At(i,we,`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 kt(s,n,r);if(c.copied){H.set(t.id,s);return}a=c.error}throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function kt(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of Nt(e,t))try{return await Ce(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function At(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 jt(e,t,n){let r=v(n);f({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function Mt(e,t,n){f({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...v(n)}})}function Nt(e,t){let n=O.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=O.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(O.join(n,s)),O.isAbsolute(r)&&o(O.normalize(r)),c.startsWith(`tmp/`))o(O.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(O.join(n,t))}}let l=O.basename(r);return l&&o(O.join(n,`tmp`,l)),i}function Pt(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ae(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 Ft(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ae(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 It(e,t,n){let r=await Lt(e),i=_e(await ge(t),r,n);i&&await pe(t,i.width,i.height)}async function Lt(t){let n=V.get(t.id);if(n!==void 0)return n;let r=await B(t,[`getenv`,t.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:Oe}),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 V.set(t.id,i),i}function Rt(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:re},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function zt(e,t,n,r={includeDuration:!0}){let i=W(e.referenceWidth),o=W(e.referenceHeight);if(i===void 0||o===void 0)return G(e,{amount:n?.amount});let s=a({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:o});return G(e,{amount:n?.amount,pixels:s.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function Bt(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}=Ht(e),o=W(e.referenceWidth),s=W(e.referenceHeight),c=Vt(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 Vt(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 Ht(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 Ut(e,t,n,r,i,a){return zt(await e(t,{command:`desktopScroll`,direction:i,...Bt(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 Wt(e){return e===`system`?`backSystem`:`backInApp`}function Gt(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 w(e,J(e,t,r,i),n),pressPoint:async(r,i)=>await Kt(e,t,n,r,i),tapElementSelector:async r=>await w(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...tn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await w(e,S([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return C(a),a},longPress:async(r,i,a)=>await w(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await w(e,J(e,t,r,i),n),type:async(r,i)=>Xt(await w(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 w(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 nn(w,e,t,n,r,i),performGesture:async r=>await $t(e,t,n,r),gestureViewport:async()=>Qt(await w(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function Kt(e,t,n,i,a){return r(e)&&a.surface&&a.surface!==`app`?await qt(t,i,a):a.button===`primary`?a.count===1?await Yt(e,t,n,i,a):await Pe(e,i,a,t.appBundleId,async t=>await w(e,t,n)):await Jt(e,t,n,i,a.button)}async function qt(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 Jt(e,t,n,r,i){return await w(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function Yt(e,t,n,r,i){if(i.doubleTap){let i=await w(e,S([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return C(i),i}return i.holdMs>0?await w(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await w(e,J(e,t,r.x,r.y),n)}function Xt(e){let t=e.textEntryRoute;return Zt(t)?{textEntryRoute:t}:{}}function Zt(e){return typeof e==`string`&&ve.includes(e)}function Qt(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 $t(e,n,i,a){if(a.topology===`two`&&qe(e,a.intent),a.topology===`single`&&r(e)){let{start:t,end:r}=g(a);return await w(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}=g(a);return await w(e,{command:`swipe`,direction:en(t,r),appBundleId:n.appBundleId},i)}return await w(e,{command:`gesture`,gesturePlan:a,appBundleId:n.appBundleId},i)}function en(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,...tn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function tn(e){return n(e)&&!t(e)}async function nn(e,n,i,a,s,c){if(te(c?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ne}`}),t(n))return G(await e(n,K(s,i.appBundleId,c?.durationMs),a),{amount:c?.amount,durationMs:c?.durationMs});if(o(c??{}),r(n))return await Ut(e,n,i,a,s,c);let l=Rt(c);return zt(await e(n,{command:`scroll`,direction:s,...Bt(l),appBundleId:i.appBundleId},a),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 Ge(t,e)}return async(r,i)=>await w(e,{command:`alert`,action:r,appBundleId:n?.appBundleId,timeoutMs:i},t)}async function rn(e,t,n){return await Y(e,t,n)(`get`,s)}async function an(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:sn(o,a);return s=!1,await i(`get`,e)}catch(e){if(!X(e))throw e}await m(300)}throw new e(`COMMAND_FAILED`,`alert wait timed out`)}async function on(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:sn(l,c);return d=!1,await a(r,e)}catch(e){if(u=e,!X(e))break}await m(300)}throw cn(u)}function sn(e,t){return Math.max(1,t-(Date.now()-e))}function cn(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 ln(e){return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:me(e.snapshotQuality),qualityPayload:dn(e.qualityPayload),runnerFatal:e.runnerFatal===!0,message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function un(e,t,n){let r=n.nodes??[];if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return r;let i=de({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),a=fn(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:ue(i),viewport:a,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{return be(o,i).nodes}catch(e){Z(e)}}function dn(e){if(e!==void 0)return(!mn(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new _(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`)),e.scope!==void 0&&e.scope!==null&&Z(new _(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`})),{nodes:e.nodes,truncated:e.truncated,scope:null}}function fn(e,t){return he(pn(t),{fallbackToLargestRoot:!0})??he(pn(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function pn(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function mn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(t){throw t instanceof _?new e(`COMMAND_FAILED`,t.message,ye(t),t):t}function hn(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}=Gt(n,r),s={open:(e,t)=>Fe(n,e,{appBundleId:t?.appBundleId,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,terminateRunningApp:t?.terminateRunningApp,url:t?.url,runnerOptions:o}),openDevice:()=>Ie(n),close:e=>Le(n,e,o),screenshot:(e,t)=>wn(n,e,t,o),snapshot:async e=>await gn(n,e,o),readTextAtPoint:async(e,t)=>En(n,t?.surface)?await Dn(e,t):await On(n,e,t,o),findText:async(e,t)=>({found:(await w(n,{command:`findText`,text:e,appBundleId:t?.appBundleId},t?.signal?{...o,signal:t.signal}:o))?.found===!0}),findSelector:async(e,t)=>({found:(await Je(n,e,t?.appBundleId,t?.signal?{...o,signal:t.signal}:o)).found===!0}),back:async e=>{if(t(n)){await w(n,K(`menu`,r.appBundleId),o);return}await w(n,{command:Wt(e),appBundleId:r.appBundleId},o)},home:async()=>{if(t(n)){await w(n,K(`home`,r.appBundleId),o);return}await w(n,{command:`home`,appBundleId:r.appBundleId},o)},setOrientation:async t=>{let i=Sn(await w(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 w(n,{command:`appSwitcher`,appBundleId:r.appBundleId},o)},tvRemote:async(e,t)=>{await w(n,K(se(e),r.appBundleId,t),o)},keyboardDismiss:async()=>{let e=await w(n,{command:`keyboardDismiss`,appBundleId:r.appBundleId},o);return{kind:`mechanism`,wasVisible:Q(e,`wasVisible`),dismissed:Q(e,`dismissed`),visible:Q(e,`visible`),mechanism:xn(e,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let e=await w(n,{command:`keyboardReturn`,appBundleId:r.appBundleId},o);return{kind:`visibility-echo`,visible:Q(e,`visible`),wasVisible:Q(e,`wasVisible`)}},readClipboard:()=>Xe(n),writeClipboard:e=>Ze(n,e),setSetting:(e,t,r,i)=>lt(n,e,t,r,i),readAlert:e=>rn(n,o,e),awaitAlert:e=>an(n,o,e),acceptAlert:e=>on(n,o,`accept`,e),dismissAlert:e=>on(n,o,`dismiss`,e),...a};return i?Cn(n,r,s,i):s}async function gn(e,t,n){return r(e)&&t?.surface&&t.surface!==`app`?await Ye(t,t.signal):await _n(e,t,n)}async function _n(t,n,r){let i=ln(await ae(`snapshot_capture`,async()=>await w(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},bn(r,n?.signal)),{backend:`xctest`})),a=i.nodes??[],o=yn(n,i.quality);if(a.length===0&&t.kind===`simulator`&&!o)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:vn(t,n,i),truncated:i.truncated??!1,backend:`xctest`,producer:`apple-runner`,...i.quality?{quality:i.quality}:{},...!i.quality&&i.message?{warnings:[i.message]}:{}}}function vn(e,t,n){return r(e)?n.nodes??[]:un(e.id,t,n)}function yn(e,t){return i(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function bn(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 xn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Sn(t){let n=t.orientation;if(typeof n==`string`&&ie.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function Cn(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 le(i,n=>Me(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 wn(e,t,n={},r){if(Tn(e,n.surface)){await Ke(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await U(e,t,n.appBundleId,n.fullscreen,r);return}await Tt(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function Tn(e,t){return r(e)&&t!==void 0&&t!==`app`}function En(e,t){return r(e)&&t!==void 0&&t!==`app`}async function Dn(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 On(e,t,n,r){let i=await w(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{hn as createAppleInteractor};