agent-device 0.21.20 → 0.21.21

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 (357) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.apk → agent-device-android-ime-helper-0.21.21.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.21.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.manifest.json → agent-device-android-ime-helper-0.21.21.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.20.manifest.json → agent-device-android-snapshot-helper-0.21.21.manifest.json} +6 -6
  7. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AppWindowScreenshot.swift +73 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/BackgroundInteraction.swift +557 -0
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/GhostCursor.swift +141 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +107 -3
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +136 -22
  12. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/BackgroundInteractionTests.swift +88 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +121 -4
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +10 -2
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +36 -9
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +28 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +27 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
  29. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
  30. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
  31. package/dist/src/adapter.js +1 -1
  32. package/dist/src/adb-executor.js +2 -2
  33. package/dist/src/adb-failure.js +1 -1
  34. package/dist/src/adb-transport.js +1 -1
  35. package/dist/src/agent-browser-lifecycle.js +1 -1
  36. package/dist/src/agent-browser-process-record.js +1 -1
  37. package/dist/src/agent-browser-provider.js +1 -1
  38. package/dist/src/agent-browser-tool.js +1 -1
  39. package/dist/src/agent-device-client.js +2 -2
  40. package/dist/src/ai-sdk.js +1 -1
  41. package/dist/src/alert-runtime.js +1 -1
  42. package/dist/src/alert.js +1 -1
  43. package/dist/src/android-adb.d.ts +12 -0
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/app-backend.js +1 -0
  46. package/dist/src/app-catalog.js +1 -1
  47. package/dist/src/app-deployment-resolution.js +1 -1
  48. package/dist/src/app-inventory.js +1 -1
  49. package/dist/src/app-launch.js +1 -1
  50. package/dist/src/app-lifecycle.js +2 -2
  51. package/dist/src/app-lifecycle2.js +1 -1
  52. package/dist/src/app-log-files.js +1 -1
  53. package/dist/src/app-log-reconnect.js +1 -1
  54. package/dist/src/app-log-runtime2.js +3 -3
  55. package/dist/src/app-log-session-resource.js +1 -0
  56. package/dist/src/app-resolution.js +2 -2
  57. package/dist/src/apple-runner-platform.js +1 -1
  58. package/dist/src/application-lifecycle-interaction.js +1 -1
  59. package/dist/src/archive.js +2 -2
  60. package/dist/src/artifact-download.js +1 -1
  61. package/dist/src/auth-session.js +1 -1
  62. package/dist/src/auth.js +1 -1
  63. package/dist/src/back-mode.js +1 -1
  64. package/dist/src/backend-snapshot-options.js +1 -1
  65. package/dist/src/boot-diagnostics.js +1 -1
  66. package/dist/src/cache.js +1 -1
  67. package/dist/src/capabilities.js +1 -1
  68. package/dist/src/capture.js +1 -1
  69. package/dist/src/cli-config.js +1 -1
  70. package/dist/src/cli-help.js +13 -5
  71. package/dist/src/cli.js +4 -4
  72. package/dist/src/click-button.js +1 -1
  73. package/dist/src/client-metro-companion.js +1 -1
  74. package/dist/src/client-metro.js +1 -1
  75. package/dist/src/client-options.js +3 -0
  76. package/dist/src/client-types.d.ts +88 -5
  77. package/dist/src/clipboard-shell-response.js +1 -1
  78. package/dist/src/cloud-artifacts.d.ts +7 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-schema.js +1 -1
  82. package/dist/src/command-tools.js +2 -2
  83. package/dist/src/connection-runtime.js +1 -1
  84. package/dist/src/connection.js +5 -5
  85. package/dist/src/contracts.d.ts +1 -1
  86. package/dist/src/contracts.js +1 -1
  87. package/dist/src/daemon-artifacts.js +1 -0
  88. package/dist/src/daemon-client-lease-beat.js +1 -1
  89. package/dist/src/daemon-client-lifecycle.js +1 -1
  90. package/dist/src/daemon-client-liveness-probe.js +1 -0
  91. package/dist/src/daemon-client-transport.js +1 -1
  92. package/dist/src/daemon-http.js +1 -0
  93. package/dist/src/daemon-policy-file.js +1 -1
  94. package/dist/src/daemon-registration-owner.js +1 -0
  95. package/dist/src/daemon-registration.js +1 -1
  96. package/dist/src/daemon-resolution.js +1 -1
  97. package/dist/src/daemon-shutdown-report.js +1 -1
  98. package/dist/src/daemon.js +2 -2
  99. package/dist/src/debug-symbols-facade.js +1 -1
  100. package/dist/src/device-claim-inspection.js +1 -1
  101. package/dist/src/device-claim-rule.js +1 -1
  102. package/dist/src/device-inventory-context.js +1 -1
  103. package/dist/src/device-readiness-runtime.js +1 -1
  104. package/dist/src/device-release.js +1 -1
  105. package/dist/src/device-rotation.js +1 -1
  106. package/dist/src/device-selection-resolver.js +1 -1
  107. package/dist/src/device-session.js +1 -1
  108. package/dist/src/device-shell.js +1 -1
  109. package/dist/src/device.js +1 -1
  110. package/dist/src/device2.js +1 -3
  111. package/dist/src/device3.js +3 -0
  112. package/dist/src/devicectl.js +1 -1
  113. package/dist/src/diagnostics.js +3 -3
  114. package/dist/src/dispatch-resolve.js +4 -1
  115. package/dist/src/display-inventory.js +1 -1
  116. package/dist/src/doctor-facade.js +1 -1
  117. package/dist/src/doctor2.js +1 -1
  118. package/dist/src/durable-capture-resource.js +1 -0
  119. package/dist/src/engine-eval-script.js +1 -1
  120. package/dist/src/error.js +1 -1
  121. package/dist/src/exec.js +1 -1
  122. package/dist/src/file.js +1 -1
  123. package/dist/src/find.js +1 -1
  124. package/dist/src/generic-settle.js +1 -1
  125. package/dist/src/generic.js +1 -1
  126. package/dist/src/gesture-admission.js +1 -1
  127. package/dist/src/gesture-plan.js +1 -1
  128. package/dist/src/gesture-runtime.js +1 -1
  129. package/dist/src/harmonyos.js +1 -1
  130. package/dist/src/hdc.js +1 -1
  131. package/dist/src/helper.js +2 -2
  132. package/dist/src/host-file.js +1 -1
  133. package/dist/src/host.js +1 -1
  134. package/dist/src/human-control-contract.js +1 -1
  135. package/dist/src/human-control.js +1 -1
  136. package/dist/src/index.d.ts +1 -1
  137. package/dist/src/index.js +1 -1
  138. package/dist/src/input-actions.js +1 -1
  139. package/dist/src/input-actions2.js +2 -2
  140. package/dist/src/install-artifact-facade.js +1 -1
  141. package/dist/src/install-source-network-transport.js +1 -1
  142. package/dist/src/install-source.d.ts +5 -0
  143. package/dist/src/install-source2.js +1 -1
  144. package/dist/src/instance-client.js +1 -0
  145. package/dist/src/interaction-positionals.js +1 -1
  146. package/dist/src/interaction-ref-policy.js +1 -1
  147. package/dist/src/interaction.js +1 -1
  148. package/dist/src/interaction2.js +1 -1
  149. package/dist/src/interactor-operation-binding.js +1 -1
  150. package/dist/src/interactor.js +5 -5
  151. package/dist/src/interactor2.js +1 -1
  152. package/dist/src/interactors.js +1 -1
  153. package/dist/src/internal/bin.js +1 -1
  154. package/dist/src/internal/daemon.js +1 -2
  155. package/dist/src/internal/png-worker.js +1 -1
  156. package/dist/src/internal/run-script-http-child.js +1 -1
  157. package/dist/src/inventory.js +4 -4
  158. package/dist/src/inventory2.js +1 -1
  159. package/dist/src/inventory3.js +1 -1
  160. package/dist/src/inventory5.js +1 -1
  161. package/dist/src/ios-client.js +4 -30
  162. package/dist/src/ios-settings.js +1 -0
  163. package/dist/src/ios-snapshot-engine.js +1 -1
  164. package/dist/src/ios-snapshot-runtime.js +1 -1
  165. package/dist/src/launch-confirmation.js +1 -1
  166. package/dist/src/lease-context.js +1 -1
  167. package/dist/src/lease-registry-scope.js +1 -0
  168. package/dist/src/lease-scope.js +1 -1
  169. package/dist/src/lease.js +1 -1
  170. package/dist/src/legacy-xctest-device-set.js +1 -1
  171. package/dist/src/limrun-download-file.js +1 -1
  172. package/dist/src/limrun-runtime-dependencies.js +1 -1
  173. package/dist/src/limrun.d.ts +28 -2
  174. package/dist/src/limrun.js +1 -1
  175. package/dist/src/linux.js +1 -1
  176. package/dist/src/load.js +1 -0
  177. package/dist/src/location-coordinates.js +1 -1
  178. package/dist/src/macos-facade.js +1 -1
  179. package/dist/src/managed-device-scope.js +1 -1
  180. package/dist/src/mechanics.js +16 -16
  181. package/dist/src/observation.js +1 -1
  182. package/dist/src/observe-until.js +1 -1
  183. package/dist/src/overlay.js +2 -2
  184. package/dist/src/owner-identity.js +3 -3
  185. package/dist/src/path-resolution.js +1 -1
  186. package/dist/src/perf-facade.js +1 -1
  187. package/dist/src/perf-runtime-operation-builder.js +1 -1
  188. package/dist/src/perf-runtime-plan.js +1 -1
  189. package/dist/src/perf-target.js +1 -1
  190. package/dist/src/perf.js +1 -1
  191. package/dist/src/physical-device-control.js +1 -1
  192. package/dist/src/platform-request-scope.js +1 -1
  193. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  194. package/dist/src/platform-runtime-app-log-process.js +1 -1
  195. package/dist/src/platform-runtime-host.js +1 -1
  196. package/dist/src/platform-runtime-managed-owner.js +1 -1
  197. package/dist/src/platform-runtime-open-target.js +1 -1
  198. package/dist/src/platform-runtime-operation-host.js +2 -2
  199. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  200. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  201. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  202. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  203. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  204. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
  205. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  206. package/dist/src/platform-runtime-unavailable.js +1 -1
  207. package/dist/src/platform-runtime.js +1 -1
  208. package/dist/src/platform-runtime2.js +1 -1
  209. package/dist/src/plugins.d.ts +9 -0
  210. package/dist/src/plugins.js +1 -0
  211. package/dist/src/plugins2.js +2 -0
  212. package/dist/src/png-crop-bytes.js +1 -1
  213. package/dist/src/png-size.js +1 -1
  214. package/dist/src/png-worker-client.js +1 -1
  215. package/dist/src/png.js +1 -1
  216. package/dist/src/prepare-kind.js +1 -1
  217. package/dist/src/process.js +1 -1
  218. package/dist/src/project-runtime.js +1 -1
  219. package/dist/src/provider-credential-fingerprint.js +1 -0
  220. package/dist/src/provider-device-admission.js +1 -1
  221. package/dist/src/provider-device-runtimes.js +1 -0
  222. package/dist/src/provider-limrun-credentials.js +1 -0
  223. package/dist/src/provider-profile-fields.js +1 -0
  224. package/dist/src/provider-session-ownership.js +2 -2
  225. package/dist/src/provider-webdriver.js +2 -1
  226. package/dist/src/providers.js +1 -1
  227. package/dist/src/proxy.js +1 -1
  228. package/dist/src/quality-warnings.js +1 -1
  229. package/dist/src/react-native.js +1 -1
  230. package/dist/src/record-runtime.js +1 -1
  231. package/dist/src/record-trace.js +1 -1
  232. package/dist/src/recording.js +1 -1
  233. package/dist/src/rect-center.js +1 -1
  234. package/dist/src/register-builtins.js +1 -1
  235. package/dist/src/registry.js +39 -39
  236. package/dist/src/remote-config2.js +1 -1
  237. package/dist/src/replay-divergence.js +1 -1
  238. package/dist/src/replay.js +2 -2
  239. package/dist/src/reporting.js +5 -5
  240. package/dist/src/request-admission.js +1 -1
  241. package/dist/src/request-cancel.js +1 -1
  242. package/dist/src/request-cancellation.js +1 -1
  243. package/dist/src/request-runtime-binding.js +1 -1
  244. package/dist/src/result-serialization.js +1 -1
  245. package/dist/src/retry.js +1 -1
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-metadata.js +3 -3
  248. package/dist/src/runner-client.js +1 -1
  249. package/dist/src/runner-dev-tools-security.js +1 -1
  250. package/dist/src/runner-device-readiness.js +1 -1
  251. package/dist/src/runner-disposal.js +1 -1
  252. package/dist/src/runner-error-classification.js +2 -2
  253. package/dist/src/runner-exchange.js +1 -1
  254. package/dist/src/runner-operations-facade.js +1 -1
  255. package/dist/src/runner-session-types.js +1 -1
  256. package/dist/src/runner-start-budget.js +1 -1
  257. package/dist/src/runner.js +1 -1
  258. package/dist/src/runtime-admission.js +1 -1
  259. package/dist/src/runtime-transport-hints.js +1 -1
  260. package/dist/src/runtime.js +1 -1
  261. package/dist/src/runtime10.js +2 -2
  262. package/dist/src/runtime2.js +3 -3
  263. package/dist/src/runtime3.js +1 -1
  264. package/dist/src/runtime4.js +5 -5
  265. package/dist/src/runtime5.js +1 -1
  266. package/dist/src/runtime6.js +1 -1
  267. package/dist/src/runtime7.js +1 -1
  268. package/dist/src/runtime8.js +1 -1
  269. package/dist/src/runtime9.js +1 -1
  270. package/dist/src/screen-recording-admission-ledger.js +1 -1
  271. package/dist/src/screen-recording-completion.js +1 -1
  272. package/dist/src/screen-recording-options.js +1 -1
  273. package/dist/src/screen-recording-resource-recovery.js +1 -1
  274. package/dist/src/screen-recording-transport.js +1 -1
  275. package/dist/src/screenshot-density.js +1 -1
  276. package/dist/src/screenshot-image.js +1 -1
  277. package/dist/src/screenshot-result.js +1 -1
  278. package/dist/src/screenshot-runtime.js +1 -1
  279. package/dist/src/screenshot.js +1 -1
  280. package/dist/src/screenshot3.js +1 -1
  281. package/dist/src/script.js +1 -1
  282. package/dist/src/scroll-command.js +1 -1
  283. package/dist/src/scroll-gesture.js +1 -1
  284. package/dist/src/sdk-batch-runner.js +2 -2
  285. package/dist/src/sdk-batch.js +2 -2
  286. package/dist/src/sdk-contracts.d.ts +45 -2
  287. package/dist/src/sdk-contracts.js +2 -2
  288. package/dist/src/sdk-device.js +1 -1
  289. package/dist/src/sdk-io.js +1 -1
  290. package/dist/src/sdk-remote-config.js +1 -1
  291. package/dist/src/sdk-selectors.d.ts +33 -4
  292. package/dist/src/selection.js +0 -0
  293. package/dist/src/selector-runtime.js +1 -1
  294. package/dist/src/selectors.d.ts +2 -2
  295. package/dist/src/selectors.js +1 -1
  296. package/dist/src/server.js +1 -1
  297. package/dist/src/session-allocation.js +1 -1
  298. package/dist/src/session-artifact-paths.js +1 -1
  299. package/dist/src/session-repair-tombstone.js +1 -1
  300. package/dist/src/session-routing.js +1 -1
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session-snapshot.js +1 -1
  303. package/dist/src/session-stream.js +27 -0
  304. package/dist/src/session.js +1 -1
  305. package/dist/src/session2.js +5 -5
  306. package/dist/src/settings.js +1 -1
  307. package/dist/src/settings2.js +1 -1
  308. package/dist/src/simctl-settings-facade.js +1 -0
  309. package/dist/src/simctl-settings.js +1 -0
  310. package/dist/src/simctl.js +1 -1
  311. package/dist/src/simulator.js +1 -1
  312. package/dist/src/snapshot-diagnostics.js +1 -1
  313. package/dist/src/snapshot-runtime-binding.js +1 -1
  314. package/dist/src/snapshot-runtime.js +1 -1
  315. package/dist/src/snapshot-state.js +1 -1
  316. package/dist/src/snapshot2.js +1 -1
  317. package/dist/src/snapshot3.js +1 -1
  318. package/dist/src/snapshot4.js +1 -1
  319. package/dist/src/src.js +1 -1
  320. package/dist/src/src7.js +1 -1
  321. package/dist/src/src8.js +2 -2
  322. package/dist/src/store.js +1 -0
  323. package/dist/src/string-enum.js +1 -1
  324. package/dist/src/surface-snapshot.js +1 -1
  325. package/dist/src/takeover.js +1 -1
  326. package/dist/src/target-evidence.js +1 -1
  327. package/dist/src/telemetry.js +1 -1
  328. package/dist/src/text-entry-focus.js +1 -1
  329. package/dist/src/tool-provider.js +1 -1
  330. package/dist/src/tool-provider2.js +1 -1
  331. package/dist/src/toolchain-probe.js +2 -2
  332. package/dist/src/touch-runtime.js +1 -1
  333. package/dist/src/touch-runtime2.js +1 -1
  334. package/dist/src/transport.js +2 -2
  335. package/dist/src/tv-remote.js +1 -1
  336. package/dist/src/type-text-runtime.js +1 -1
  337. package/dist/src/update-check.js +1 -1
  338. package/dist/src/vars.js +1 -1
  339. package/dist/src/verified-file.js +1 -1
  340. package/dist/src/version.js +1 -1
  341. package/dist/src/video.js +1 -1
  342. package/dist/src/viewport.js +1 -1
  343. package/dist/src/web.js +1 -1
  344. package/dist/src/web2.js +1 -1
  345. package/dist/src/webdriver-source.js +1 -1
  346. package/package.json +5 -1
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.20.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk.sha256 +0 -1
  351. package/dist/src/api.js +0 -3
  352. package/dist/src/daemon-process.js +0 -1
  353. package/dist/src/multitouch-support.js +0 -1
  354. package/dist/src/parameterized-recorded-fill.js +0 -1
  355. package/dist/src/runner-startup-transport.js +0 -1
  356. package/dist/src/runner-xctestrun.js +0 -1
  357. package/dist/src/session-store.js +0 -4
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";function t(e){return Object.freeze({family:e.platform,...e.appleOs===void 0?{}:{appleOs:e.appleOs},kind:e.kind,...e.target===void 0?{}:{target:e.target},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend}})}function n(e){return Object.freeze({id:e.id,...t(e)})}function r(e){return JSON.stringify([e.id,...o(e)])}function i(e,t){return r(e)===r(t)}function a(e,t){return JSON.stringify(o(e))===JSON.stringify(o(t))}function o(e){return[e.family,e.appleOs??null,e.kind,e.target??null,e.iosPhysicalDeviceBackend??null]}const s=[`ios`,`ipados`,`tvos`,`watchos`,`visionos`,`macos`],c=[`apple`,`android`,`harmonyos`,`vega`,`linux`,`web`],l=[`ios`,`macos`,`android`,`harmonyos`,`vega`,`linux`,`web`],u=[...c,`ios`,`macos`],ee=[`simulator`,`emulator`,`device`],d=[`mobile`,`tv`,`desktop`];function f(e){return[e.deviceName,e.udid,e.serial].some(e=>typeof e==`string`&&e.trim().length>0)}function p(e){return e===`apple`||e===`ios`||e===`macos`}function m(e){return e.appleOs===`macos`||e.platform===`macos`}function h(e){return p(e.platform)&&!m(e)}function g(e){if(e.kind!==`simulator`)return!1;let t=S(e);return t===`ios`||t===`ipados`}function _(e){return e.platform===`android`||e.platform===`harmonyos`||p(e.platform)&&!m(e)}function v(e){return p(e.platform)?m(e)?`macos`:`ios`:e.platform}function y(e){return e===`macos`?{platform:`apple`,appleOs:`macos`}:e===`ios`?{platform:`apple`}:{platform:e}}function b(e){return p(e.platform)&&e.target===`tv`}function x(e){return h(e)&&!b(e)&&e.appleOs!==`visionos`}function S(e){return e.appleOs?e.appleOs:e.platform===`macos`?`macos`:b(e)?`tvos`:`ios`}function te(e){let t=S(e);return t===`ios`||t===`ipados`}function ne(e){return c.includes(e)}function C(e){return l.includes(e)}function w(e){return s.includes(e)}function T(e,t){return t?t===`apple`?p(e.platform):t===`ios`?p(e.platform)&&!m(e):t===`macos`?p(e.platform)&&m(e):e.platform===t:!0}function E(e,t){return!e||!t||e===t?!1:e===`apple`?!p(t):t!==`apple`||!p(e)}function D(e,t){return t?O(t):e===`macos`||e===`desktop`?`macOS`:e===`tv`?`tvOS`:`iOS`}function O(e){switch(e){case`tvos`:return`tvOS`;case`macos`:return`macOS`;case`visionos`:return`visionOS`;default:return`iOS`}}function k(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&n!==`macos`&&r!==`desktop`)return t}function A(e){return e.map((e,t)=>({device:e,index:t})).sort((e,t)=>ie(e,t)).map(({device:e})=>e)}function j(e){return!e||e===`apple`||e===`ios`}async function M(e,t,n={}){let r=e.filter(e=>G(e,t));return N(r,t)||L(r,t.deviceName)||($(r)&&(r=A(r)),z(r,t,n))}function N(e,t){if(P(t),t.udid)return F(e,t.udid);if(t.serial)return I(e,t)}function P(t){let n=t.platform;if(n){if(t.udid&&q(n))throw new e(`INVALID_ARGS`,`--udid selects Apple devices, but this request selected --platform ${n}.`,{hint:`Use --serial ${t.udid} for ${n} devices.`});if(t.serial&&p(n))throw new e(`INVALID_ARGS`,`--serial selects Android and HarmonyOS devices, but this request selected --platform ${n}.`,{hint:`Use --udid ${t.serial} for Apple devices.`})}}function F(t,n){let r=t.find(e=>e.id===n&&p(e.platform));if(!r)throw new e(`DEVICE_NOT_FOUND`,`No Apple device with UDID ${n}`);return r}function I(t,n){let r=t.find(e=>e.id===n.serial&&q(e.platform));if(!r)throw new e(`DEVICE_NOT_FOUND`,J(n));return r}function L(t,n){if(!n)return;let r=X(n),i=t.find(e=>X(e.name)===r);if(!i){let r=re(t,n);throw new e(`DEVICE_NOT_FOUND`,`No device named ${n}`,r===void 0?void 0:{hint:r})}return i}function re(e,t){let n=e.find(e=>e.id===t);if(!n)return;let r=R(n.platform);if(r)return`${t} is the id of ${JSON.stringify(n.name)}, not its name. Did you mean --${r} ${t}?`}function R(e){if(p(e))return`udid`;if(q(e))return`serial`}function z(e,t,n){let r=e[0];if(r!==void 0&&e.length===1)return r;e.length===0&&Y(t,n);let i=H(e);i.length>1&&B(i);let a=i[0];return a||Y(t,n),a}function B(t){let n=t.slice(0,10);throw new e(`AMBIGUOUS_MATCH`,`${t.length} devices match this request equally; select one explicitly.`,{devices:n.map(e=>({id:e.id,name:e.name})),matches:t.length,hint:V(n)})}function V(e){let t=e[0];return`Select the intended device explicitly, for example ${t?`--${R(t.platform)??`udid`} ${t.id}`:`--udid <id>`} or --device ${JSON.stringify(t?.name??`<name>`)}. Run agent-device devices to list them.`}function H(e){let t=$(e)?W(e):U(e),n=t.filter(e=>e.booted);return n.length>0?n:t}function U(e){let t=e.filter(e=>e.kind!==`device`);return t.length>0?t:e}function W(e){let t=Math.min(...e.map(e=>Z(e)));return e.filter(e=>Z(e)===t)}function G(e,t,n={}){return T(e,t.platform)&&(!t.target||(e.target??`mobile`)===t.target)&&(!n.includeExplicitSelectors||K(e,t))}function K(e,t){return!(t.udid&&!(e.id===t.udid&&p(e.platform))||t.serial&&!(e.id===t.serial&&q(e.platform))||t.deviceName&&X(e.name)!==X(t.deviceName))}function q(e){return e===`android`||e===`harmonyos`||e===`vega`}function J(e){return e.platform===`android`?`No Android device with serial ${e.serial}`:e.platform===`vega`?`No Vega VVD with serial ${e.serial}`:e.platform===`harmonyos`?`No HarmonyOS device with serial ${e.serial}`:`No Android, HarmonyOS device, or Vega VVD with serial ${e.serial}`}function Y(t,n){let r=n.simulatorSetPath;throw r&&j(t.platform)?new e(`DEVICE_NOT_FOUND`,`No devices found in the scoped simulator set`,{simulatorSetPath:r,hint:`The simulator set at "${r}" appears to be empty. Create a compatible simulator first with xcrun simctl --set "${r}" create, or remove the scoped simulator set.`,selector:t}):new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:t})}function X(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function ie(e,t){return Z(e.device)-Z(t.device)||Number(t.device.booted===!0)-Number(e.device.booted===!0)||e.device.name.localeCompare(t.device.name)||e.index-t.index}function Z(e){return e.kind===`simulator`?Q(e,0,1,2,3):e.kind===`device`&&p(e.platform)&&!m(e)?Q(e,10,11,12,13):14}function Q(e,t,n,r,i){return{mobile:ae(e.name)?n:t,tv:r,desktop:i}[e.target??`mobile`]}function $(e){return e.length>0&&e.every(e=>p(e.platform))}function ae(e){return/\bipad\b/i.test(e)}export{n as A,v as C,S as D,M as E,t as M,i as N,x as O,a as P,E as S,k as T,C as _,l as a,G as b,te as c,p as d,g as f,ne as g,_ as h,u as i,r as j,A as k,f as l,m,d as n,y as o,h as p,c as r,R as s,ee as t,w as u,q as v,D as w,T as x,b as y};
1
+ import{P as e}from"./sdk-contracts.js";function t(e){return Object.freeze({family:e.platform,...e.appleOs===void 0?{}:{appleOs:e.appleOs},kind:e.kind,...e.target===void 0?{}:{target:e.target},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend}})}function n(e){return Object.freeze({id:e.id,...t(e)})}function r(e){return JSON.stringify([e.id,...o(e)])}function i(e,t){return r(e)===r(t)}function a(e,t){return JSON.stringify(o(e))===JSON.stringify(o(t))}function o(e){return[e.family,e.appleOs??null,e.kind,e.target??null,e.iosPhysicalDeviceBackend??null]}const s=[`ios`,`ipados`,`tvos`,`watchos`,`visionos`,`macos`],c=[`apple`,`android`,`harmonyos`,`vega`,`linux`,`web`],l=[`ios`,`macos`,`android`,`harmonyos`,`vega`,`linux`,`web`],u=[...c,`ios`,`macos`],ee=[`simulator`,`emulator`,`device`],te=[`mobile`,`tv`,`desktop`];function d(e){return[e.deviceName,e.udid,e.serial].some(e=>typeof e==`string`&&e.trim().length>0)}function f(e){return e===`apple`||e===`ios`||e===`macos`}function p(e){return e.appleOs===`macos`||e.platform===`macos`}function m(e){return f(e.platform)&&!p(e)}function h(e){if(e.kind!==`simulator`)return!1;let t=x(e);return t===`ios`||t===`ipados`}function g(e){return e.platform===`android`||e.platform===`harmonyos`||f(e.platform)&&!p(e)}function _(e){return f(e.platform)?p(e)?`macos`:`ios`:e.platform}function v(e){return e===`macos`?{platform:`apple`,appleOs:`macos`}:e===`ios`?{platform:`apple`}:{platform:e}}function y(e){return f(e.platform)&&e.target===`tv`}function b(e){return m(e)&&!y(e)&&e.appleOs!==`visionos`}function x(e){return e.appleOs?e.appleOs:e.platform===`macos`?`macos`:y(e)?`tvos`:`ios`}function ne(e){let t=x(e);return t===`ios`||t===`ipados`}function re(e){return c.includes(e)}function ie(e){return l.includes(e)}function S(e){return s.includes(e)}function C(e,t){return t?t===`apple`?f(e.platform):t===`ios`?f(e.platform)&&!p(e):t===`macos`?f(e.platform)&&p(e):e.platform===t:!0}function w(e,t){return!e||!t||e===t?!1:e===`apple`?!f(t):t!==`apple`||!f(e)}function T(e,t){return t?E(t):e===`macos`||e===`desktop`?`macOS`:e===`tv`?`tvOS`:`iOS`}function E(e){switch(e){case`tvos`:return`tvOS`;case`macos`:return`macOS`;case`visionos`:return`visionOS`;default:return`iOS`}}function D(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&n!==`macos`&&r!==`desktop`)return t}function O(e){return e.map((e,t)=>({device:e,index:t})).sort((e,t)=>ae(e,t)).map(({device:e})=>e)}function k(e){return!e||e===`apple`||e===`ios`}async function A(e,t,n={}){let r=e.filter(e=>W(e,t));return j(r,t)||F(r,t.deviceName)||($(r)&&(r=O(r)),R(r,t,n))}function j(e,t){if(M(t),t.udid)return N(e,t.udid);if(t.serial)return P(e,t)}function M(t){let n=t.platform;if(n){if(t.udid&&K(n))throw new e(`INVALID_ARGS`,`--udid selects Apple devices, but this request selected --platform ${n}.`,{hint:`Use --serial ${t.udid} for ${n} devices.`});if(t.serial&&f(n))throw new e(`INVALID_ARGS`,`--serial selects Android and HarmonyOS devices, but this request selected --platform ${n}.`,{hint:`Use --udid ${t.serial} for Apple devices.`})}}function N(t,n){let r=t.find(e=>e.id===n&&f(e.platform));if(!r)throw new e(`DEVICE_NOT_FOUND`,`No Apple device with UDID ${n}`);return r}function P(t,n){let r=t.find(e=>e.id===n.serial&&K(e.platform));if(!r)throw new e(`DEVICE_NOT_FOUND`,q(n));return r}function F(t,n){if(!n)return;let r=t.find(e=>Y(e,n));if(!r){let r=I(t,n);throw new e(`DEVICE_NOT_FOUND`,`No device named ${n}`,r===void 0?void 0:{hint:r})}return r}function I(e,t){let n=e.find(e=>e.id===t);if(!n)return;let r=L(n.platform);if(r)return`${t} is the id of ${JSON.stringify(n.name)}, not its name. Did you mean --${r} ${t}?`}function L(e){if(f(e))return`udid`;if(K(e))return`serial`}function R(e,t,n){let r=e[0];if(r!==void 0&&e.length===1)return r;e.length===0&&J(t,n);let i=V(e);i.length>1&&z(i);let a=i[0];return a||J(t,n),a}function z(t){let n=t.slice(0,10);throw new e(`AMBIGUOUS_MATCH`,`${t.length} devices match this request equally; select one explicitly.`,{devices:n.map(e=>({id:e.id,name:e.name})),matches:t.length,hint:B(n)})}function B(e){let t=e[0];return`Select the intended device explicitly, for example ${t?`--${L(t.platform)??`udid`} ${t.id}`:`--udid <id>`} or --device ${JSON.stringify(t?.name??`<name>`)}. Run agent-device devices to list them.`}function V(e){let t=$(e)?U(e):H(e),n=t.filter(e=>e.booted);return n.length>0?n:t}function H(e){let t=e.filter(e=>e.kind!==`device`);return t.length>0?t:e}function U(e){let t=Math.min(...e.map(e=>Z(e)));return e.filter(e=>Z(e)===t)}function W(e,t,n={}){return C(e,t.platform)&&(!t.target||(e.target??`mobile`)===t.target)&&(!n.includeExplicitSelectors||G(e,t))}function G(e,t){return!(t.udid&&!(e.id===t.udid&&f(e.platform))||t.serial&&!(e.id===t.serial&&K(e.platform))||t.deviceName&&!Y(e,t.deviceName))}function K(e){return e===`android`||e===`harmonyos`||e===`vega`}function q(e){return e.platform===`android`?`No Android device with serial ${e.serial}`:e.platform===`vega`?`No Vega VVD with serial ${e.serial}`:e.platform===`harmonyos`?`No HarmonyOS device with serial ${e.serial}`:`No Android, HarmonyOS device, or Vega VVD with serial ${e.serial}`}function J(t,n){let r=n.simulatorSetPath;throw r&&k(t.platform)?new e(`DEVICE_NOT_FOUND`,`No devices found in the scoped simulator set`,{simulatorSetPath:r,hint:`The simulator set at "${r}" appears to be empty. Create a compatible simulator first with xcrun simctl --set "${r}" create, or remove the scoped simulator set.`,selector:t}):new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:t})}function Y(e,t){return X(e.name)===X(t)}function X(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function ae(e,t){return Z(e.device)-Z(t.device)||Number(t.device.booted===!0)-Number(e.device.booted===!0)||e.device.name.localeCompare(t.device.name)||e.index-t.index}function Z(e){return e.kind===`simulator`?Q(e,0,1,2,3):e.kind===`device`&&f(e.platform)&&!p(e)?Q(e,10,11,12,13):14}function Q(e,t,n,r,i){return{mobile:oe(e.name)?n:t,tv:r,desktop:i}[e.target??`mobile`]}function $(e){return e.length>0&&e.every(e=>f(e.platform))}function oe(e){return/\bipad\b/i.test(e)}export{O as A,w as C,A as D,D as E,a as F,r as M,t as N,x as O,i as P,C as S,T,ie as _,l as a,Y as b,ne as c,f as d,h as f,re as g,g as h,u as i,n as j,b as k,d as l,p as m,te as n,v as o,m as p,c as r,L as s,ee as t,S as u,K as v,_ as w,W as x,y};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import n from"node:path";import{promises as r}from"node:fs";import i from"node:os";var a=e({createLocalArtifactAdapter:()=>o});function o(e={}){let a=e.cwd??process.cwd(),o=e.tempDir??i.tmpdir(),c=e.rootDir?s(e.rootDir,a):void 0;return{resolveInput:async e=>{if(e.kind===`uploadedArtifact`)throw new t(`UNSUPPORTED_OPERATION`,`Uploaded artifact inputs require a custom artifact adapter`);return{path:s(e.path,a,c)}},reserveOutput:async(e,t)=>{let i,l=t.visibility??`client-visible`,u=e?.kind===`path`?s(e.path,a,c):n.join(i=await r.mkdtemp(n.join(o,`agent-device-${t.field}-`)),`${t.field}${t.ext}`);return await r.mkdir(n.dirname(u),{recursive:!0}),{path:u,visibility:l,...i?{cleanup:async()=>{await r.rm(i,{recursive:!0,force:!0})}}:{},publish:async()=>e?.kind===`downloadableArtifact`?{kind:`localPath`,field:t.field,artifactType:t.artifactType,path:u,fileName:e.fileName??n.basename(e.clientPath??u)}:void 0}},createTempFile:async e=>{let t=await r.mkdtemp(n.join(o,`${e.prefix}-`));return{path:n.join(t,`file${e.ext}`),visibility:`internal`,cleanup:async()=>{await r.rm(t,{recursive:!0,force:!0})}}}}}function s(e,r,i){let a=n.isAbsolute(e)?e:n.resolve(r,e);if(i&&!c(a,i))throw new t(`INVALID_ARGS`,`Local path is outside the artifact adapter root`,{path:a,rootDir:i});return a}function c(e,t){let r=n.relative(t,e);return r===``||!r.startsWith(`..`)&&!n.isAbsolute(r)}export{a as n,o as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{promises as n}from"node:fs";import r from"node:os";import i from"node:path";var a=e({createLocalArtifactAdapter:()=>o});function o(e={}){let a=e.cwd??process.cwd(),o=e.tempDir??r.tmpdir(),c=e.rootDir?s(e.rootDir,a):void 0;return{resolveInput:async e=>{if(e.kind===`uploadedArtifact`)throw new t(`UNSUPPORTED_OPERATION`,`Uploaded artifact inputs require a custom artifact adapter`);return{path:s(e.path,a,c)}},reserveOutput:async(e,t)=>{let r,l=t.visibility??`client-visible`,u=e?.kind===`path`?s(e.path,a,c):i.join(r=await n.mkdtemp(i.join(o,`agent-device-${t.field}-`)),`${t.field}${t.ext}`);return await n.mkdir(i.dirname(u),{recursive:!0}),{path:u,visibility:l,...r?{cleanup:async()=>{await n.rm(r,{recursive:!0,force:!0})}}:{},publish:async()=>e?.kind===`downloadableArtifact`?{kind:`localPath`,field:t.field,artifactType:t.artifactType,path:u,fileName:e.fileName??i.basename(e.clientPath??u)}:void 0}},createTempFile:async e=>{let t=await n.mkdtemp(i.join(o,`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:`internal`,cleanup:async()=>{await n.rm(t,{recursive:!0,force:!0})}}}}}function s(e,n,r){let a=i.isAbsolute(e)?e:i.resolve(n,e);if(r&&!c(a,r))throw new t(`INVALID_ARGS`,`Local path is outside the artifact adapter root`,{path:a,rootDir:r});return a}function c(e,t){let n=i.relative(t,e);return n===``||!n.startsWith(`..`)&&!i.isAbsolute(n)}export{a as n,o as t};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{i as t}from"./sdk-device.js";const n=[`portrait`,`landscape`],r=new Set([`1`,`true`,`yes`,`on`]),i=new Set([`0`,`false`,`no`,`off`]);function a(e){return`AGENT_DEVICE_${e.replaceAll(/([A-Z])/g,`_$1`).replaceAll(/[^A-Za-z0-9_]/g,`_`).toUpperCase()}`}function o(t,n,r,i){if(t.multiple)return(Array.isArray(n)?n:[n]).map(e=>o({...t,multiple:!1},e,r,i));if(t.type===`boolean`)return s(n,r,i);if(t.type===`booleanOrString`){if(typeof n==`boolean`)return n;if(typeof n==`string`&&c(n)!==void 0)return c(n);if(typeof n==`string`&&n.trim().length>0)return n;throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean or non-empty string.`)}if(t.type===`string`){if(typeof n==`string`&&n.trim().length>0)return n;throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected non-empty string.`)}if(t.type===`enum`){if(t.setValue!==void 0)return l(t,n,r,i);if(typeof n!=`string`||!t.enumValues?.includes(n))throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected one of: ${t.enumValues?.join(`, `)}.`);return n}let a=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isFinite(a)||t.type===`int`&&!Number.isInteger(a))throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected ${t.type===`int`?`integer`:`number`}.`);if(typeof t.min==`number`&&a<t.min)throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be >= ${t.min}.`);if(typeof t.max==`number`&&a>t.max)throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be <= ${t.max}.`);return a}function s(t,n,r){if(typeof t==`boolean`)return t;if(typeof t==`string`){let e=c(t);if(e!==void 0)return e}throw new e(`INVALID_ARGS`,`Invalid value for "${r}" in ${n}. Expected boolean.`)}function c(e){let t=e.trim().toLowerCase();if(r.has(t))return!0;if(i.has(t))return!1}function l(t,n,r,i){let a=t.setValue;if(n===a)return a;if(typeof n==`string`){let e=n.trim();if(e===``||e===`true`||e===`1`)return a;if(e===`false`||e===`0`)return}if(n===!0)return a;if(n!==!1)throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean-like value for enum flag.`)}const u=[{key:`stateDir`,type:`string`,path:!0},{key:`daemonBaseUrl`,type:`string`},{key:`daemonAuthToken`,type:`string`},{key:`daemonTransport`,type:`enum`,enumValues:[`auto`,`socket`,`http`]},{key:`daemonServerMode`,type:`enum`,enumValues:[`socket`,`http`,`dual`]},{key:`tenant`,type:`string`},{key:`sessionIsolation`,type:`enum`,enumValues:[`none`,`tenant`]},{key:`runId`,type:`string`},{key:`leaseId`,type:`string`},{key:`leaseBackend`,type:`enum`,enumValues:[`ios-simulator`,`ios-instance`,`android-instance`,`harmonyos-instance`]},{key:`platform`,type:`enum`,enumValues:t},{key:`target`,type:`enum`,enumValues:[`mobile`,`tv`,`desktop`]},{key:`device`,type:`string`},{key:`udid`,type:`string`},{key:`serial`,type:`string`},{key:`iosSimulatorDeviceSet`,type:`string`,path:!0,env:!1},{key:`androidDeviceAllowlist`,type:`string`},{key:`session`,type:`string`},{key:`providerApp`,type:`string`},{key:`providerOsVersion`,type:`string`},{key:`providerProject`,type:`string`},{key:`providerBuild`,type:`string`},{key:`providerSessionName`,type:`string`},{key:`providerDeviceOrientation`,type:`enum`,enumValues:n},{key:`providerGeoLocation`,type:`string`},{key:`providerTimezone`,type:`string`},{key:`providerAppiumVersion`,type:`string`},{key:`providerLanguage`,type:`string`},{key:`providerLocale`,type:`string`},{key:`providerNetworkProfile`,type:`string`},{key:`providerCustomNetwork`,type:`string`},{key:`providerNoResignApp`,type:`boolean`},{key:`awsProjectArn`,type:`string`},{key:`awsDeviceArn`,type:`string`},{key:`awsAppArn`,type:`string`},{key:`awsRegion`,type:`string`},{key:`awsInteractionMode`,type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`]},{key:`metroProjectRoot`,type:`string`,path:!0},{key:`metroKind`,type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`]},{key:`metroPublicBaseUrl`,type:`string`},{key:`metroProxyBaseUrl`,type:`string`},{key:`metroBearerToken`,type:`string`},{key:`metroPreparePort`,type:`int`,min:1,max:65535},{key:`metroListenHost`,type:`string`},{key:`metroStatusHost`,type:`string`},{key:`metroStartupTimeoutMs`,type:`int`,min:1},{key:`metroProbeTimeoutMs`,type:`int`,min:1},{key:`metroRuntimeFile`,type:`string`,path:!0},{key:`metroNoReuseExisting`,type:`boolean`},{key:`metroNoInstallDeps`,type:`boolean`},{key:`launchUrl`,type:`string`}],d=[{key:`leaseProvider`,type:`string`,env:!1},{key:`deviceKey`,type:`string`,env:!1},{key:`clientId`,type:`string`,env:!1}],f=[...u,...d],p=new Map(f.map(e=>[e.key,e]));function m(e){return p.get(e)}function h(e){return m(e)?.env===!1?[]:[a(e)]}export{a,n as c,m as i,f as n,c as o,h as r,o as s,u as t};
1
+ import{P as e,t}from"./sdk-contracts.js";import{i as n}from"./sdk-device.js";const r=[`portrait`,`landscape`],i={providerApp:`--provider-app`,providerOsVersion:`--provider-os-version`,providerProject:`--provider-project`,providerBuild:`--provider-build`,providerSessionName:`--provider-session-name`,providerDeviceOrientation:`--provider-device-orientation`,providerGeoLocation:`--provider-geo-location`,providerTimezone:`--provider-timezone`,providerAppiumVersion:`--provider-appium-version`,providerLanguage:`--provider-language`,providerLocale:`--provider-locale`,providerNetworkProfile:`--provider-network-profile`,providerCustomNetwork:`--provider-custom-network`,providerNoResignApp:`--provider-no-resign-app`,awsProjectArn:`--aws-project-arn`,awsDeviceArn:`--aws-device-arn`,awsAppArn:`--aws-app-arn`,awsRegion:`--aws-region`,awsInteractionMode:`--aws-interaction-mode`},a={providerOsVersion:[`--os-version`],providerDeviceOrientation:[`--device-orientation`],providerGeoLocation:[`--geo-location`],providerTimezone:[`--timezone`],providerAppiumVersion:[`--appium-version`],providerLanguage:[`--language`],providerLocale:[`--locale`],providerNetworkProfile:[`--network-profile`],providerCustomNetwork:[`--custom-network`]},o=new Set([`1`,`true`,`yes`,`on`]),s=new Set([`0`,`false`,`no`,`off`]);function c(e){return`AGENT_DEVICE_${e.replaceAll(/([A-Z])/g,`_$1`).replaceAll(/[^A-Za-z0-9_]/g,`_`).toUpperCase()}`}function l(t,n,r,i){if(t.multiple)return(Array.isArray(n)?n:[n]).map(e=>l({...t,multiple:!1},e,r,i));if(t.type===`boolean`)return u(n,r,i);if(t.type===`booleanOrString`){if(typeof n==`boolean`)return n;if(typeof n==`string`&&d(n)!==void 0)return d(n);if(typeof n==`string`&&n.trim().length>0)return n;throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean or non-empty string.`)}if(t.type===`string`){if(typeof n==`string`&&n.trim().length>0)return n;throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected non-empty string.`)}if(t.type===`enum`){if(t.setValue!==void 0)return f(t,n,r,i);if(typeof n!=`string`||!t.enumValues?.includes(n))throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected one of: ${t.enumValues?.join(`, `)}.`);return n}let a=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isFinite(a)||t.type===`int`&&!Number.isInteger(a))throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected ${t.type===`int`?`integer`:`number`}.`);if(typeof t.min==`number`&&a<t.min)throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be >= ${t.min}.`);if(typeof t.max==`number`&&a>t.max)throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be <= ${t.max}.`);return a}function u(t,n,r){if(typeof t==`boolean`)return t;if(typeof t==`string`){let e=d(t);if(e!==void 0)return e}throw new e(`INVALID_ARGS`,`Invalid value for "${r}" in ${n}. Expected boolean.`)}function d(e){let t=e.trim().toLowerCase();if(o.has(t))return!0;if(s.has(t))return!1}function f(t,n,r,i){let a=t.setValue;if(n===a)return a;if(typeof n==`string`){let e=n.trim();if(e===``||e===`true`||e===`1`)return a;if(e===`false`||e===`0`)return}if(n===!0)return a;if(n!==!1)throw new e(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean-like value for enum flag.`)}const p=[{key:`stateDir`,type:`string`,path:!0},{key:`daemonBaseUrl`,type:`string`},{key:`daemonAuthToken`,type:`string`},{key:`daemonTransport`,type:`enum`,enumValues:[`auto`,`socket`,`http`]},{key:`daemonServerMode`,type:`enum`,enumValues:[`socket`,`http`,`dual`]},{key:`tenant`,type:`string`},{key:`sessionIsolation`,type:`enum`,enumValues:[`none`,`tenant`]},{key:`runId`,type:`string`},{key:`leaseId`,type:`string`},{key:`leaseBackend`,type:`enum`,enumValues:t},{key:`platform`,type:`enum`,enumValues:n},{key:`target`,type:`enum`,enumValues:[`mobile`,`tv`,`desktop`]},{key:`device`,type:`string`},{key:`udid`,type:`string`},{key:`serial`,type:`string`},{key:`iosSimulatorDeviceSet`,type:`string`,path:!0,env:!1},{key:`androidDeviceAllowlist`,type:`string`},{key:`session`,type:`string`},{key:`providerApp`,type:`string`},{key:`providerOsVersion`,type:`string`},{key:`providerProject`,type:`string`},{key:`providerBuild`,type:`string`},{key:`providerSessionName`,type:`string`},{key:`providerDeviceOrientation`,type:`enum`,enumValues:r},{key:`providerGeoLocation`,type:`string`},{key:`providerTimezone`,type:`string`},{key:`providerAppiumVersion`,type:`string`},{key:`providerLanguage`,type:`string`},{key:`providerLocale`,type:`string`},{key:`providerNetworkProfile`,type:`string`},{key:`providerCustomNetwork`,type:`string`},{key:`providerNoResignApp`,type:`boolean`},{key:`awsProjectArn`,type:`string`},{key:`awsDeviceArn`,type:`string`},{key:`awsAppArn`,type:`string`},{key:`awsRegion`,type:`string`},{key:`awsInteractionMode`,type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`]},{key:`metroProjectRoot`,type:`string`,path:!0},{key:`metroKind`,type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`]},{key:`metroPublicBaseUrl`,type:`string`},{key:`metroProxyBaseUrl`,type:`string`},{key:`metroBearerToken`,type:`string`},{key:`metroPreparePort`,type:`int`,min:1,max:65535},{key:`metroListenHost`,type:`string`},{key:`metroStatusHost`,type:`string`},{key:`metroStartupTimeoutMs`,type:`int`,min:1},{key:`metroProbeTimeoutMs`,type:`int`,min:1},{key:`metroRuntimeFile`,type:`string`,path:!0},{key:`metroNoReuseExisting`,type:`boolean`},{key:`metroNoInstallDeps`,type:`boolean`},{key:`launchUrl`,type:`string`}],m=[{key:`leaseProvider`,type:`string`,env:!1},{key:`deviceKey`,type:`string`,env:!1},{key:`clientId`,type:`string`,env:!1}],h=[...p,...m],g=new Map(h.map(e=>[e.key,e]));function _(e){return g.get(e)}function v(e){return _(e)?.env===!1?[]:[c(e)]}export{c as a,r as c,_ as i,i as l,h as n,d as o,v as r,l as s,p as t,a as u};
@@ -3,8 +3,9 @@ import { A as Rect, C as Platform, P as SnapshotNode, R as SnapshotState, T as P
3
3
  /**
4
4
  * The evidence a `fill` carries when it changed a field but could not confirm the text it sent.
5
5
  * Both the fill response and `Interactor.fill`'s return need these shapes, so they sit below both
6
- * of those modules rather than in either. This is the cross-language shape, not Android's probing:
7
- * `packages/platform-android/src/fill-verification.ts` builds Android's copy of it.
6
+ * of those modules rather than in either. This is the cross-language shape, not a platform's probing:
7
+ * `packages/platform-android/src/fill-verification.ts` builds Android's copy of it, and the Apple
8
+ * runner's `RunnerTests+TextEntryConfirmation.swift` builds the iOS one.
8
9
  */
9
10
  /** The field a fill aimed at, as the platform that performed it names it. */
10
11
  type FillVerificationTarget = {
@@ -15,7 +16,8 @@ type FillVerificationTarget = {
15
16
  };
16
17
  /**
17
18
  * Target-bound evidence that a fill moved a field's content from `before` to `after` without raw
18
- * equality with `requested` being reachable, because app-owned formatting prevents it. Bound to the
19
+ * equality with `requested` being reachable, because app-owned formatting prevents it or the field's
20
+ * accessibility value does not echo the typed text. Bound to the
19
21
  * {@link FillVerificationTarget} it was collected against so another field, or the same field after
20
22
  * it re-laid out, cannot borrow this evidence.
21
23
  */
@@ -376,6 +378,33 @@ type AstSelectorResolution = {
376
378
  disambiguation?: SelectorDisambiguationDisclosure;
377
379
  };
378
380
  declare function resolveSelectorChain(nodes: SnapshotState['nodes'], chain: SelectorChain, options: SelectorResolutionOptions): AstSelectorResolution | null;
381
+ /** The parser-side twin of the façade's `SelectorChainMatchList`. */
382
+ type AstSelectorChainMatchList = {
383
+ selector: Selector;
384
+ selectorIndex: number;
385
+ matchedNodes: SnapshotNode[];
386
+ };
387
+ /**
388
+ * Every node the winning chain alternative matches, in snapshot order, plus
389
+ * that alternative and its index; `null` when no alternative matches.
390
+ *
391
+ * "Winning" is the SAME alternative `findSelectorChainMatch` picks — the first
392
+ * with at least one match — decoupled from uniqueness and disambiguation:
393
+ * several matches are reported, never refused or narrowed to one. That is NOT
394
+ * always what `resolveSelectorChain` names: under its default
395
+ * `requireUnique: true` it skips an ambiguous alternative and resolves from a
396
+ * later one, so the indices agree when it passes `requireUnique: false`, when
397
+ * the first matching alternative is unique, or when `disambiguateAmbiguous:
398
+ * true` resolves that alternative in place (see `firstMatch` vs `matchedNodes`
399
+ * above). Published through `agent-device/selectors` (#3180) so a consumer
400
+ * applies its OWN strictness to the same matched-node domain the daemon
401
+ * resolves against, instead of reimplementing term matching.
402
+ *
403
+ * ADR 0012 migration step 4 kept this mirroring `analyzeSelectorMatches`'s
404
+ * alternate-selection exactly, so a replay-time verifier computes `matchCount`
405
+ * and the recorded-identity set over the SAME domain resolution itself used.
406
+ */
407
+ declare function listSelectorChainMatches(nodes: SnapshotState['nodes'], chain: SelectorChain, options: SelectorMatchOptions): AstSelectorChainMatchList | null;
379
408
  /**
380
409
  * A first-match lookup used by existence checks. No façade twin: the root
381
410
  * façade resolves through the policy interface only, so this shape reaches
@@ -404,4 +433,4 @@ declare function formatSelectorFailure(chain: SelectorChain | string, diagnostic
404
433
  unique?: boolean;
405
434
  }): string;
406
435
  //#endregion
407
- export { SettleObservation as _, resolveSelectorChain as a, isSelectorToken as c, ClickCommandResponseData as d, FillCommandResponseData as f, PressCommandResponseData as g, LongPressCommandResponseData as h, findSelectorChainMatch as i, parseSelectorChain as l, HoverCommandResponseData as m, isNodeEditable as n, SelectorDiagnostics as o, FindCommandResponseData as p, isNodeVisible as r, SelectorChain as s, formatSelectorFailure as t, tryParseSelectorChain as u, ClickButton as v };
436
+ export { PressCommandResponseData as _, listSelectorChainMatches as a, SelectorChain as c, tryParseSelectorChain as d, ClickCommandResponseData as f, LongPressCommandResponseData as g, HoverCommandResponseData as h, findSelectorChainMatch as i, isSelectorToken as l, FindCommandResponseData as m, isNodeEditable as n, resolveSelectorChain as o, FillCommandResponseData as p, isNodeVisible as r, SelectorDiagnostics as s, formatSelectorFailure as t, parseSelectorChain as u, SettleObservation as v, ClickButton as y };
Binary file
@@ -1 +1 @@
1
- import{N as e,P as t,S as n,d as r,j as i,k as a,m as o,o as s,v as c}from"./sdk-contracts.js";import{C as l,p as u}from"./sdk-device.js";import{Fn as d,Nn as f,Rt as p,dr as m,fr as ee,pr as h}from"./sdk-batch.js";import{s as te}from"./session-store.js";import{c as g,i as ne,s as re,u as _}from"./target-evidence.js";import{d as v}from"./parameterized-recorded-fill.js";import{_ as ie,g as ae,l as oe,r as se,s as ce}from"./overlay.js";import{r as le}from"./diagnostics.js";import"./diagnostics2.js";import{i as ue}from"./rect-center.js";import{a as y}from"./android-system-chrome.js";import{r as de}from"./request-cancel.js";import"./request.js";import{n as fe}from"./provider-device-admission.js";import{A as pe,E as b,d as x,f as me,g as he,h as ge,i as S,k as _e,n as C,o as w,r as T,s as E,u as D}from"./session-snapshot.js";import{n as O}from"./dispatch-resolve.js";import{s as k}from"./quality-warnings.js";import{t as A}from"./backend-snapshot-options.js";import{t as j}from"./snapshot-runtime-binding.js";function M(e){let t=i(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:s(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:o})}}function N(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function P(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:y(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:y(e.node)}}function F(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=xe(e),i=r?.kind===`ref`?z(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:be(s)}}function I(e){let{target:t}=e;return{...t.kind===`ref`?{ref:z(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:y(e.node)}}function L(e){let{node:t,preActionNodes:n,...r}=e;return r}function ve(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function ye(e){let{selectorChain:t,...n}=e;return n}function R(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=v(o)&&i?ne(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:te(n),...s?{targetEvidence:s,targetEvidenceMode:a??`action`}:{}})}function be(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function xe(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function z(e){return e.startsWith(`@`)?e.slice(1):e}async function B(e){let t=await j({...e,plan:p({hasActiveApp:e.session?.appBundleId!==void 0,intent:Se(e.command)}),readiness:!e.session});return t.ok?{ok:!0,operations:{capture:t.capture,...t.readTextAtPoint?{readText:t.readTextAtPoint}:{},...t.findText?{findText:t.findText}:{}}}:t}function Se(e){switch(e){case`is`:return`capture-only`;case`find`:case`get`:return`element-text`;case`wait`:return`wait-observation`}}const Ce=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function V(e,t){let n=Ce.filter(([e])=>t?.[e]!==void 0).map(([,e])=>e);return n.length===0?null:s(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}async function H(t,n){if(t.device.platform!==`android`||!t.appBundleId||t.lease?.leaseProvider||fe(t.device))return null;if(!n)throw new e(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);let r=await n.readAppState(t.device),i=r.package?.trim();if(!i||i===t.appBundleId)return null;let a=await n.isPermissionPackage(i);return!Ee(i)&&!a?null:{expectedPackage:t.appBundleId,foregroundPackage:i,activity:r.activity,hint:Te(a),...a?{permissionDialog:!0}:{}}}function we(e){return e.permissionDialog?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Te(e){return e?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Ee(e){return e===`com.android.settings`||e===`com.android.systemui`||e.includes(`launcher`)}async function De(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=ae(n),l=e.readTextAtPoint;if(!l)return c;let d=ue(n.rect);if(!d||u(t)&&c&&!ie(n.type??``))return c;let f=s(r,i,a),p=await l({point:d,options:{appBundleId:i,surface:o},execution:me(f)});return p.status===`read`?p.text:(le({level:`warn`,phase:`interaction_read_fallback`,data:{reason:Oe(p.reason),nodeRef:n.ref,surface:o,platform:t.platform}}),c)}function Oe(e){switch(e){case`no-text-at-point`:return`no_text_at_point`;default:return e}}function U(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ie(c,e.req.flags?.out),d=Me({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=Ne({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await ke({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Re({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function ke(e){let{params:t,request:r}=e,i=await W(t,r,r.snapshotScope);return r.recovery?.legacyIosSparse&&oe(i)?n(i,await Ae({runtimeParams:t,request:r,policy:r.recovery.legacyIosSparse})):r.recovery?.sparseVerdictQueryScope?.shouldScope&&k(i.snapshotQuality)?n(i,await je({runtimeParams:t,request:r,policy:r.recovery.sparseVerdictQueryScope,snapshot:i})):i}async function Ae(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await W(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await W(t,n,r.query,!1)}}async function je(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await W(t,n,r.query,!1)}catch{return i}}async function W(e,t,n,r=t.flags?.snapshotInteractiveOnly){let i={...t.flags,snapshotInteractiveOnly:r},a=e.capture,o=await E({device:e.device,session:e.session,flags:i,outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal,captureData:async()=>await a(x({flags:i,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:n,includeRects:t.includeRects,signal:t.signal}))});return re(e.captureProof,o.snapshot)}function Me(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!b(a)&&!G(a,o))return r}function Ne(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(!(!i||_e(i))&&Pe(t,r)&&Fe(i,n)&&i.presentationKey===K(r))return i}function Pe(e,t){return t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||b(e)||G(e,t)?!1:e.snapshot?.postGestureOutcome?.kind!==`unsettled`}function Fe(e,t){return t-e.createdAt<750}function G(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&he(e)}function K(e){return c(a(Le(e)))}function Ie(e,t){return JSON.stringify({presentationKey:K(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Le(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Re(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||k(i.snapshotQuality)||(S(t,i),n.set(r,t))}function q(e){return D({backend:Be(e),..._(`selector commands`,{plural:!0}),sessions:w({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(S(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??de(e.req.meta?.requestId)})}async function ze(e,t){e.consumedSnapshot??={},e.captureProof??={};let n=e.sessionStore.get(e.sessionName);return!n&&t?{ok:!1,response:r()}:{ok:!0,session:n,device:n?.device??await O(e.req.flags??{})}}async function J(e,t){let n=await ze(e,t.requireSession);if(!n.ok)return n;let r=await B({command:t.command,device:n.device,session:n.session,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?{ok:!0,runtime:q({...e,session:n.session,device:n.device,bound:r.operations})}:{ok:!1,response:r.response}}function Be(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=e.contextFromFlags??((e,t,n)=>ge(i??``,e,t,n)),c=e.bound?.readText,u=e.bound?.findText,d=x({flags:t.flags,logPath:i??``,meta:t.meta,session:n,snapshotScope:void 0}).execution,f=e.bound,p=f===void 0?void 0:U({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,captureProof:e.captureProof,logPath:i,capture:f.capture});return{platform:l(r),captureSnapshot:p&&(async(e,n)=>{let i={...t.flags,...A(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||Ve(t)||a&&r.platform===`web`;return await p.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})}),readText:async(e,i)=>({text:await De({readTextAtPoint:c,device:r,node:i,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:s})}),...u?{findText:async(e,t)=>{let{found:r}=await u({text:t,options:{appBundleId:n?.appBundleId,surface:n?.surface},execution:d,...e.signal?{signal:e.signal}:{}});return n&&pe(n),{found:r}}}:{}}}function Ve(e){if(e.command!==`is`)return!1;let t=h(e.positionals??[]);return t.ok&&t.predicate===`absent`}async function Y(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[],r=f(n,t.flags);if(!r.ok)return s(r.code,r.message);let i=r.parsed,a=i.action;if(!d(a))return null;let o=await J(e,{requireSession:!1,command:`find`});if(!o.ok)return o.response;let c=await Q(async()=>{let n=await o.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:i.locator,query:i.query,action:a,timeoutMs:i.timeoutMs});R(e.sessionStore,e.sessionName,t,N(n,a));let r=P(n),s=typeof r.ref==`string`?[r.ref]:Array.isArray(r.matches)?r.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(s.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(C(t,s),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...r,refsGeneration:t.snapshotGeneration}}return r});return g({response:c,consumedTree:X(e),captureProof:e.captureProof})}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function He(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ee(t.positionals?.[0]);if(!n.ok)return s(n.code,n.message);let r=n.format,i=We(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=V(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard,o=await J(e,{requireSession:!0,command:`get`});if(!o.ok)return o.response;let c=o.runtime,l=i.target.kind===`ref`?T({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0,u=await Q(async()=>{let n=await c.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});R(e.sessionStore,e.sessionName,t,F(n,r),{node:n.node,preActionNodes:n.preActionNodes});let o=I(n);return l?{...o,warning:l}:o});return g({response:u,consumedTree:X(e),captureProof:e.captureProof})}async function Ue(e){let{req:t}=e;if(t.command!==`is`)return null;let n=h(t.positionals??[]);if(!n.ok)return s(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,selectorExpression:i,expectedText:a}=n;if(r===`absent`){let e=ce({depth:t.flags?.snapshotDepth,scope:t.flags?.snapshotScope});if(e){let t=se(e);return s(t.code,t.message,t.details)}}let o=t.internal?.replayTargetGuard,c=await J(e,{requireSession:!0,command:`is`});if(!c.ok)return c.response;let l=await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:i,expectedText:a,expectedResolvedTarget:o}),s=Z(n),l=L(n);return R(e.sessionStore,e.sessionName,t,l,s),ye(l)});return g({response:await $(e,l,`is ${r}`),consumedTree:X(e),captureProof:e.captureProof})}function Z(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function We(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=M(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=m(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:s(n.code,n.message)}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let n=t(e);return s(n.code,n.message,n.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{if(!e.androidObservation)return t;i=await H(r,e.androidObservation)}catch{return t}return i?s(t.error.code,`${n} failed because ${we(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{$ as a,q as c,V as d,B as f,M as g,ve as h,Ue as i,U as l,L as m,Y as n,Z as o,R as p,He as r,Q as s,X as t,H as u};
1
+ import{A as e,C as t,F as n,M as r,P as i,f as a,h as o,s,y as c}from"./sdk-contracts.js";import{r as l}from"./diagnostics.js";import"./diagnostics2.js";import{p as u,w as d}from"./sdk-device.js";import{Fn as f,Nn as p,Rt as m,dr as ee,fr as h,pr as g}from"./sdk-batch.js";import{d as te,n as _}from"./dispatch-resolve.js";import{c as v,i as y,s as b,u as ne}from"./target-evidence.js";import{n as re,p as ie}from"./provider-device-admission.js";import{_ as ae,g as oe,l as se,r as ce,s as le}from"./overlay.js";import{i as ue}from"./rect-center.js";import{a as x}from"./android-system-chrome.js";import{r as de}from"./request-cancel.js";import"./request.js";import{M as fe,O as S,_ as pe,f as me,i as he,j as ge,l as _e,m as C,o as w,p as T,r as E,s as D,v as O}from"./session-snapshot.js";import{s as k}from"./quality-warnings.js";import{t as A}from"./backend-snapshot-options.js";import{t as j}from"./snapshot-runtime-binding.js";function M(e){let t=r(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:s(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:o})}}function N(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function P(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:x(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:x(e.node)}}function F(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=xe(e),i=r?.kind===`ref`?z(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:be(s)}}function I(e){let{target:t}=e;return{...t.kind===`ref`?{ref:z(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:x(e.node)}}function L(e){let{node:t,preActionNodes:n,...r}=e;return r}function ve(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function ye(e){let{selectorChain:t,...n}=e;return n}function R(e,t,n,r,i,a){if(!t)return;let o=e.resolveCurrent(t);if(!o)return;let s=ie(o)&&i?y(i,{mode:a}):void 0;e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:te(n),...s?{targetEvidence:s,targetEvidenceMode:a??`action`}:{}})}function be(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function xe(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function z(e){return e.startsWith(`@`)?e.slice(1):e}async function B(e){let t=await j({...e,plan:m({hasActiveApp:e.session?.appBundleId!==void 0,intent:Se(e.command)}),readiness:!e.session});return t.ok?{ok:!0,operations:{capture:t.capture,...t.readTextAtPoint?{readText:t.readTextAtPoint}:{},...t.findText?{findText:t.findText}:{}}}:t}function Se(e){switch(e){case`is`:return`capture-only`;case`find`:case`get`:return`element-text`;case`wait`:return`wait-observation`}}const Ce=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function V(e,t){let n=Ce.filter(([e])=>t?.[e]!==void 0).map(([,e])=>e);return n.length===0?null:s(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}async function H(e,t){if(e.device.platform!==`android`||!e.appBundleId||e.lease?.leaseProvider||re(e.device))return null;if(!t)throw new i(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);let n=await t.readAppState(e.device),r=n.package?.trim();if(!r||r===e.appBundleId)return null;let a=await t.isPermissionPackage(r);return!Ee(r)&&!a?null:{expectedPackage:e.appBundleId,foregroundPackage:r,activity:n.activity,hint:Te(a),...a?{permissionDialog:!0}:{}}}function we(e){return e.permissionDialog?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Te(e){return e?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Ee(e){return e===`com.android.settings`||e===`com.android.systemui`||e.includes(`launcher`)}async function De(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=oe(n),d=e.readTextAtPoint;if(!d)return c;let f=ue(n.rect);if(!f||u(t)&&c&&!ae(n.type??``))return c;let p=s(r,i,a),m=await d({point:f,options:{appBundleId:i,surface:o},execution:C(p)});return m.status===`read`?m.text:(l({level:`warn`,phase:`interaction_read_fallback`,data:{reason:Oe(m.reason),nodeRef:n.ref,surface:o,platform:t.platform}}),c)}function Oe(e){switch(e){case`no-text-at-point`:return`no_text_at_point`;default:return e}}function U(e){let{sessionStore:t,ref:n}=e,r=0,i,a,o=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async s=>{let c=n?t.requireCurrent(n):void 0,l=Date.now(),u=Ie(s,e.req.flags?.out),d=Me({timestamp:l,lastSnapshotAt:r,lastSnapshotResult:i,lastSnapshotCacheKey:a,session:c,request:s,cacheKey:u});if(d)return o(d);let f=Ne({session:c,timestamp:l,request:s});if(f)return r=f.createdAt,i={snapshot:f},a=u,o(i);let p=await ke({params:e,request:s});s.signal?.throwIfAborted();let m={snapshot:p};return Re({ref:n,sessionStore:t,snapshot:p}),r=l,i=m,a=u,o(m)}}}async function ke(e){let{params:n,request:r}=e,i=await W(n,r,r.snapshotScope);return r.recovery?.legacyIosSparse&&se(i)?t(i,await Ae({runtimeParams:n,request:r,policy:r.recovery.legacyIosSparse})):r.recovery?.sparseVerdictQueryScope?.shouldScope&&k(i.snapshotQuality)?t(i,await je({runtimeParams:n,request:r,policy:r.recovery.sparseVerdictQueryScope,snapshot:i})):i}async function Ae(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await W(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await W(t,n,r.query,!1)}}async function je(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await W(t,n,r.query,!1)}catch{return i}}async function W(e,t,n,r=t.flags?.snapshotInteractiveOnly){let i=e.ref?e.sessionStore.requireCurrent(e.ref):void 0,a={...t.flags,snapshotInteractiveOnly:r},o=e.capture,s=await _e({device:e.device,session:i,flags:a,outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal,captureData:async()=>await o(T({flags:a,logPath:e.logPath??``,meta:e.req.meta,session:i,snapshotScope:n,includeRects:t.includeRects,signal:t.signal}))});return b(e.captureProof,s.snapshot)}function Me(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!S(a)&&!G(a,o))return r}function Ne(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(!(!i||ge(i))&&Pe(t,r)&&Fe(i,n)&&i.presentationKey===K(r))return i}function Pe(e,t){return t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||S(e)||G(e,t)?!1:e.snapshot?.postGestureOutcome?.kind!==`unsettled`}function Fe(e,t){return t-e.createdAt<750}function G(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&O(e)}function K(t){return c(e(Le(t)))}function Ie(e,t){return JSON.stringify({presentationKey:K(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Le(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Re(e){let{ref:t,sessionStore:n,snapshot:r}=e;!t||k(r.snapshotQuality)||w(n.requireCurrent(t),r)}function q(e){return me({backend:Be(e),...ne(`selector commands`,{plural:!0}),sessions:D({sessionName:e.sessionName,sessionStore:e.sessionStore,ref:e.ref,recordOptions:{includeSnapshot:!0},setRecord:(e,t)=>{!t||!e.snapshot||w(t,e.snapshot)}}),signal:e.signal??de(e.req.meta?.requestId)})}async function ze(e,t){e.consumedSnapshot??={},e.captureProof??={};let n=e.sessionStore.lookup(e.sessionName),r=n?.session;return!r&&t?{ok:!1,response:a()}:{ok:!0,ref:n,session:r,device:r?.device??await _(e.req.flags??{})}}async function J(e,t){let n=await ze(e,t.requireSession);if(!n.ok)return n;let r=await B({command:t.command,device:n.device,session:n.session,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?{ok:!0,ref:n.ref,runtime:q({...e,ref:n.ref,session:n.session,device:n.device,bound:r.operations})}:{ok:!1,response:r.response}}function Be(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=e.contextFromFlags??((e,t,n)=>pe(i??``,e,t,n)),c=e.bound?.readText,l=e.bound?.findText,u=T({flags:t.flags,logPath:i??``,meta:t.meta,session:n,snapshotScope:void 0}).execution,f=e.bound,p=f===void 0?void 0:U({ref:e.ref,device:r,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,captureProof:e.captureProof,logPath:i,capture:f.capture});return{platform:d(r),captureSnapshot:p&&(async(e,n)=>{let i={...t.flags,...A(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||Ve(t)||a&&r.platform===`web`;return await p.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})}),readText:async(e,i)=>({text:await De({readTextAtPoint:c,device:r,node:i,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:s})}),...l?{findText:async(e,t)=>{let{found:r}=await l({text:t,options:{appBundleId:n?.appBundleId,surface:n?.surface},execution:u,...e.signal?{signal:e.signal}:{}});return n&&fe(n),{found:r}}}:{}}}function Ve(e){if(e.command!==`is`)return!1;let t=g(e.positionals??[]);return t.ok&&t.predicate===`absent`}async function Y(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[],r=p(n,t.flags);if(!r.ok)return s(r.code,r.message);let i=r.parsed,a=i.action;if(!f(a))return null;let o=await J(e,{requireSession:!1,command:`find`});if(!o.ok)return o.response;let c=await Q(async()=>{let n=await o.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:i.locator,query:i.query,action:a,timeoutMs:i.timeoutMs});R(e.sessionStore,o.ref,t,N(n,a));let r=P(n),s=typeof r.ref==`string`?[r.ref]:Array.isArray(r.matches)?r.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(s.length>0){let t=o.ref;if(t){let n=e.sessionStore.requireCurrent(t);if(E(n,s),n.snapshotGeneration!==void 0)return{...r,refsGeneration:n.snapshotGeneration}}}return r});return v({response:c,consumedTree:X(e),captureProof:e.captureProof})}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function He(e){let{req:t}=e;if(t.command!==`get`)return null;let n=h(t.positionals?.[0]);if(!n.ok)return s(n.code,n.message);let r=n.format,i=We(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=V(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard,o=await J(e,{requireSession:!0,command:`get`});if(!o.ok)return o.response;let c=o.runtime,l=i.target.kind===`ref`?he({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0,u=await Q(async()=>{let n=await c.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});R(e.sessionStore,o.ref,t,F(n,r),{node:n.node,preActionNodes:n.preActionNodes});let s=I(n);return l?{...s,warning:l}:s});return v({response:u,consumedTree:X(e),captureProof:e.captureProof})}async function Ue(e){let{req:t}=e;if(t.command!==`is`)return null;let n=g(t.positionals??[]);if(!n.ok)return s(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,selectorExpression:i,expectedText:a}=n;if(r===`absent`){let e=le({depth:t.flags?.snapshotDepth,scope:t.flags?.snapshotScope});if(e){let t=ce(e);return s(t.code,t.message,t.details)}}let o=t.internal?.replayTargetGuard,c=await J(e,{requireSession:!0,command:`is`});if(!c.ok)return c.response;let l=await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:i,expectedText:a,expectedResolvedTarget:o}),s=Z(n),l=L(n);return R(e.sessionStore,c.ref,t,l,s),ye(l)});return v({response:await $(e,l,`is ${r}`),consumedTree:X(e),captureProof:e.captureProof})}function Z(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function We(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=M(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=ee(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:s(n.code,n.message)}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=n(e);return s(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{if(!e.androidObservation)return t;i=await H(r,e.androidObservation)}catch{return t}return i?s(t.error.code,`${n} failed because ${we(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{$ as a,q as c,V as d,B as f,M as g,ve as h,Ue as i,U as l,L as m,Y as n,Z as o,R as p,He as r,Q as s,X as t,H as u};
@@ -1,2 +1,2 @@
1
- import { a as resolveSelectorChain, c as isSelectorToken, i as findSelectorChainMatch, l as parseSelectorChain, n as isNodeEditable, o as SelectorDiagnostics, r as isNodeVisible, s as SelectorChain, t as formatSelectorFailure, u as tryParseSelectorChain } from "./sdk-selectors.js";
2
- export { type SelectorChain, type SelectorDiagnostics, findSelectorChainMatch, formatSelectorFailure, isNodeEditable, isNodeVisible, isSelectorToken, parseSelectorChain, resolveSelectorChain, tryParseSelectorChain };
1
+ import { a as listSelectorChainMatches, c as SelectorChain, d as tryParseSelectorChain, i as findSelectorChainMatch, l as isSelectorToken, n as isNodeEditable, o as resolveSelectorChain, r as isNodeVisible, s as SelectorDiagnostics, t as formatSelectorFailure, u as parseSelectorChain } from "./sdk-selectors.js";
2
+ export { type SelectorChain, type SelectorDiagnostics, findSelectorChainMatch, formatSelectorFailure, isNodeEditable, isNodeVisible, isSelectorToken, listSelectorChainMatches, parseSelectorChain, resolveSelectorChain, tryParseSelectorChain };
@@ -1 +1 @@
1
- import{Dn as e,Er as t,Sr as n,Tr as r,wn as i,wr as a,xr as o}from"./sdk-batch.js";import{t as s}from"./sdk-selectors.js";export{i as findSelectorChainMatch,s as formatSelectorFailure,r as isNodeEditable,t as isNodeVisible,o as isSelectorToken,n as parseSelectorChain,e as resolveSelectorChain,a as tryParseSelectorChain};
1
+ import{Dn as e,En as t,Er as n,Sr as r,Tr as i,wn as a,wr as o,xr as s}from"./sdk-batch.js";import{t as c}from"./sdk-selectors.js";export{a as findSelectorChainMatch,c as formatSelectorFailure,i as isNodeEditable,n as isNodeVisible,s as isSelectorToken,t as listSelectorChainMatches,r as parseSelectorChain,e as resolveSelectorChain,o as tryParseSelectorChain};
@@ -1,4 +1,4 @@
1
- import{N as e,l as t}from"./sdk-contracts.js";import{v as n}from"./sdk-batch.js";import{i as r}from"./catalog.js";import{a as i}from"./version.js";import{a,i as ee,r as o,t as te}from"./command-tools.js";import{i as s,r as c,t as l}from"./cli-help.js";const u=`agent-device drives iOS, Android, tvOS, Android TV, macOS, Linux, and web apps. Tools mirror CLI commands of the same name; CLI flags are camelCase properties (--settle -> settle: true).
1
+ import{P as e,u as t}from"./sdk-contracts.js";import{v as n}from"./sdk-batch.js";import{i as r}from"./catalog.js";import{a as i}from"./version.js";import{a,i as ee,r as o,t as te}from"./command-tools.js";import{i as s,r as c,t as l}from"./cli-help.js";const u=`agent-device drives iOS, Android, tvOS, Android TV, macOS, Linux, and web apps. Tools mirror CLI commands of the same name; CLI flags are camelCase properties (--settle -> settle: true).
2
2
 
3
3
  Start: known app -> call open {app, foreground: true} at once; do not probe with devices, apps, appstate, snapshot, or screenshot first. open returns the initial interactive snapshot with @refs. Unknown app id: devices, then apps, then open the discovered id; never invent ids. Existing session: continue from its state, do not reopen.
4
4
 
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{a as t}from"./request-cancellation.js";import{c as n,r,t as i}from"./device-session.js";import{assertLimrunUploadedAppAccess as a,resolveInstalledAppIdForAsset as o,resolveLimrunAppAsset as s}from"./app-catalog.js";async function c(e,t,n){let r=n?.initialApp,i=typeof r==`string`?r.trim():``;if(i)return a(n?.publicNetworkOnly),await s(e,t,i,n?.signal)}async function l(t,n){let r=await i(t).listApps(`user-installed`),a=o(n.name,r);if(a)return a;throw new e(`COMMAND_FAILED`,`Limrun installed ${n.name}, but its application identifier could not be resolved unambiguously.`,{asset:n.name,installedApps:r.map(e=>e.id)})}async function u(n){let i=await n.limrun.iosInstances.create({wait:!0,metadata:n.metadata,spec:{...n.region?{region:n.region}:{},...n.app?{initialAssets:[{kind:`App`,source:`AssetID`,assetId:n.app.id,launchMode:`RelaunchIfRunning`}]}:{}}});try{if(!i.status.apiUrl)throw new e(`COMMAND_FAILED`,`Limrun iOS instance did not expose apiUrl`);return await r({lease:n.lease,instanceId:i.metadata.id,device:t(`ios`,n.lease,i.metadata.id),apiUrl:i.status.apiUrl,token:i.status.token},n.dependencies)}catch(e){throw await n.limrun.iosInstances.delete(i.metadata.id).catch(()=>{}),e}}async function d(r){let i=await r.limrun.androidInstances.create({wait:!0,metadata:r.metadata,spec:{...r.region?{region:r.region}:{},...r.app?{initialAssets:[{kind:`App`,source:`AssetIDs`,assetIds:[r.app.id]}]}:{}}});try{if(!i.status.apiUrl||!i.status.adbWebSocketUrl)throw new e(`COMMAND_FAILED`,`Limrun Android instance did not expose API and ADB websocket endpoints`);return await n({lease:r.lease,instanceId:i.metadata.id,device:t(`android`,r.lease,i.metadata.id),apiUrl:i.status.apiUrl,token:i.status.token,adbUrl:i.status.adbWebSocketUrl},r.dependencies)}catch(e){throw await r.limrun.androidInstances.delete(i.metadata.id).catch(()=>{}),e}}export{d as allocateLimrunAndroidSession,u as allocateLimrunIosSession,l as resolvePreinstalledAppId,c as resolveRequestedLimrunAppAsset};
1
+ import{P as e}from"./sdk-contracts.js";import{i as t,t as n}from"./device2.js";import{c as r,r as i,t as a}from"./device-session.js";import{n as o}from"./provider-profile-fields.js";import{assertLimrunUploadedAppAccess as s,resolveInstalledAppIdForAsset as c,resolveLimrunAppAsset as l}from"./app-catalog.js";function u(e){o(e?.flags,n)}async function d(e,t,n){let r=n?.initialApp,i=typeof r==`string`?r.trim():``;if(i)return s(n?.publicNetworkOnly),await l(e,t,i,n?.signal)}async function f(t,n){let r=await a(t).listApps(`user-installed`),i=c(n.name,r);if(i)return i;throw new e(`COMMAND_FAILED`,`Limrun installed ${n.name}, but its application identifier could not be resolved unambiguously.`,{asset:n.name,installedApps:r.map(e=>e.id)})}async function p(n){let r=await n.limrun.iosInstances.create({wait:!0,metadata:n.metadata,spec:{...n.region?{region:n.region}:{},...n.app?{initialAssets:[{kind:`App`,source:`AssetID`,assetId:n.app.id,launchMode:`RelaunchIfRunning`}]}:{}}});try{if(!r.status.apiUrl)throw new e(`COMMAND_FAILED`,`Limrun iOS instance did not expose apiUrl`);return await i({lease:n.lease,instanceId:r.metadata.id,ownership:`created`,device:t(`ios`,n.lease,r.metadata.id),apiUrl:r.status.apiUrl,token:r.status.token},n.dependencies)}catch(e){throw await n.limrun.iosInstances.delete(r.metadata.id).catch(()=>{}),e}}async function m(n){let i=await n.limrun.androidInstances.create({wait:!0,metadata:n.metadata,spec:{...n.region?{region:n.region}:{},...n.app?{initialAssets:[{kind:`App`,source:`AssetIDs`,assetIds:[n.app.id]}]}:{}}});try{if(!i.status.apiUrl||!i.status.adbWebSocketUrl)throw new e(`COMMAND_FAILED`,`Limrun Android instance did not expose API and ADB websocket endpoints`);return await r({lease:n.lease,instanceId:i.metadata.id,ownership:`created`,device:t(`android`,n.lease,i.metadata.id),apiUrl:i.status.apiUrl,token:i.status.token,adbUrl:i.status.adbWebSocketUrl},n.dependencies)}catch(e){throw await n.limrun.androidInstances.delete(i.metadata.id).catch(()=>{}),e}}export{m as allocateLimrunAndroidSession,p as allocateLimrunIosSession,u as rejectRefusedLimrunProfileFields,f as resolvePreinstalledAppId,d as resolveRequestedLimrunAppAsset};
@@ -1 +1 @@
1
- import{r as e}from"./session-paths.js";import t from"node:path";function n(e){return t.join(e,`runner.log`)}function r(n,r){let i=e(r&&r.length>0?r:`unknown`);return t.join(n,`requests`,`${i}.ndjson`)}function i(e){return{path:r(e.sessionDir,e.requestId),ref:{session:e.session,requestId:e.requestId&&e.requestId.length>0?e.requestId:`unknown`}}}function a(n,i){return r(t.join(n,`remote-diagnostics`,e(i.session)),i.requestId)}export{n as i,i as n,r,a as t};
1
+ import{P as e}from"./sdk-contracts.js";import{n as t,r as n}from"./session-paths.js";import r from"node:path";function i(e){return r.join(e,`runner.log`)}function a(e,t){let i=n(t&&t.length>0?t:`unknown`);return r.join(e,`requests`,`${i}.ndjson`)}function o(e){return{path:a(e.sessionDir,e.requestId),ref:{session:e.session,requestId:e.requestId&&e.requestId.length>0?e.requestId:`unknown`}}}function s(e,t){return a(r.join(e,`remote-diagnostics`,n(t.session)),t.requestId)}function c(i,a){if(!t(a))throw new e(`INVALID_ARGS`,`Invalid session name ${JSON.stringify(a)}: a session name cannot be empty, ".", or "..".`);return r.join(i,n(a))}function l(e,t){return r.join(c(e,t),`app.log`)}function u(e,t){return r.join(c(e,t),`app-log.pid`)}export{o as a,c as i,l as n,a as o,u as r,i as s,s as t};
@@ -1 +1 @@
1
- import e from"node:path";import t from"node:fs";function n(t){return e.join(t,`repair-tombstone.json`)}function r(e){let n;try{n=t.readFileSync(e,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!(typeof r?.expiresAt!=`number`||r.expiresAt<=Date.now()))return r}function i(i){let a;try{a=t.readdirSync(i,{withFileTypes:!0})}catch{return}for(let t of a){if(!t.isDirectory())continue;let a=r(n(e.join(i,t.name)));if(a?.commitFailure)return{sessionName:t.name,tombstone:{...a,commitFailure:a.commitFailure}}}}export{r as n,n as r,i as t};
1
+ import{P as e}from"./sdk-contracts.js";import t from"node:fs";import n from"node:path";function r(e){return n.join(e,`repair-tombstone.json`)}function i(e,t){try{let n=o(e);return n?.owner===t&&n.expiresAt>Date.now()?n:void 0}catch{return}}function a(e,n){try{o(e)?.owner===n&&t.rmSync(e,{force:!0})}catch{}}function o(e){let n;try{n=t.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return;throw e}return s(n,e)}function s(t,n){try{let e=JSON.parse(t);if(!c(e))throw Error(`Invalid repair tombstone fields`);return e}catch(t){throw new e(`COMMAND_FAILED`,`Repair evidence could not be inspected.`,{reason:`repair_evidence_invalid`,path:n},t instanceof Error?t:void 0)}}function c(e){let t=e;return Number.isFinite(t?.reapedAt)&&Number.isFinite(t?.expiresAt)&&typeof t?.owner==`string`&&(t.sourcePath===void 0||typeof t.sourcePath==`string`)&&l(t.commitFailure)}function l(e){let t=e;return e===void 0||typeof t?.code==`string`&&typeof t?.message==`string`}function u(e){let i;try{i=t.readdirSync(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return;throw e}for(let t of i){if(!t.isDirectory())continue;let i=o(r(n.join(e,t.name)));if(i?.commitFailure&&i.expiresAt>Date.now())return{sessionName:t.name,tombstone:{...i,commitFailure:i.commitFailure}}}}export{r as i,u as n,i as r,a as t};
@@ -1 +1 @@
1
- import{N as e,o as t}from"./sdk-contracts.js";import{C as n,i as r,p as i,v as a,x as o}from"./sdk-device.js";import"./session-store.js";import{s}from"./device-shell.js";import{t as c}from"./device-isolation.js";import l from"node:path";import u from"node:fs";import d from"node:crypto";function f(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function p(e,t,n={}){return e.session.screenRecording?g(e.address,t):v(e,t,n)}function m(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:p(e,`device-in-use`,r)})}function h(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:_(e.address,r)})}function g(e,t){let n=s(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function _(e,t){let n=s(e);return`${y(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${b(t)}Run agent-device session list to inspect active sessions.`}function v(e,t,n){let r=e.address,i=s(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+x(e,n):`${y(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${b(n)}`.trimEnd()}function y(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function b(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function x(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function S(t,n){let{address:r,session:i}=t,a=C(i,n);if(a.length!==0)throw new e(`INVALID_ARGS`,`Session "${r}" is already bound to ${f(i)}, but this request selected ${a.map(w).join(`, `)}.`,{session:r,conflicts:a.map(w),hint:p(t,`selector-conflict`,{offersPlatformSession:a.some(e=>e.key===`platform`)})})}function C(e,t){if(!t)return[];let n=[],r=e.device,s=t.platform;if(s&&!o(r,s)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(r.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!i(r)||t.udid!==r.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!a(r.platform)||t.serial!==r.id)&&n.push({key:`serial`,value:t.serial}),t.device&&t.device.trim().toLowerCase()!==r.name.trim().toLowerCase()&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),a=r.simulatorSetPath?.trim();(!i(r)||r.kind!==`simulator`||e!==a)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=c(t.androidDeviceAllowlist);(r.platform!==`android`||!e.has(r.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function w(e){return`${T(e.key)}=${e.value}`}function T(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const E=`default`,D=new Set(r);function O(e,t,n={}){let r=e.session||E;if(P(e))return r;let i=j(e);return i.kind===`cwd`?I(e,t,i.id,n):r}function k(e){return e.session||E}function A(e){let t=j(e);return t.kind===`cwd`?t:void 0}function j(t){if(t.meta?.sessionIsolation===`tenant`||t.flags?.sessionIsolation===`tenant`){let n=t.meta?.tenantId;if(!n)throw new e(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:n}}if(P(t)||(t.session||E)!==E)return{kind:`named-local`};let n=J(t.meta?.cwd);return n?{kind:`cwd`,id:q(n)}:{kind:`global-default`}}function M(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function N(e,t){let n=A(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function P(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function F(e,t){return`cwd:${e}:${t}`}function I(e,t,n,r){let i=H(t,n),a=U(e);return a?L(e,t,n,a,i,r):V(n,i,r)}function L(e,t,n,r,i,a){let o=F(n,r);if(t.get(o))return o;let s=B(e.flags,r),c=i.map(e=>({ref:e,conflicts:C(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(G(a,l.map(e=>e.ref)),o):R(c)?.address??o}function R(e){return e.find(e=>!z(e.conflicts))?.ref}function z(e){return e.some(e=>e.key===`platform`)}function B(e,t){return{...e,platform:t}}function V(e,t,n){let[r]=t;return r&&t.length===1?r.address:(G(n,t),F(e,E))}function H(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function U(e){return W(e.flags?.platform)??W(e.meta?.lockPlatform)}function W(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return D.has(t)?t:void 0}function G(e,t){if(t.length>1&&e.attachesToSession===!0)throw K(t)}function K(t){let r=t.map(e=>e.address),i=t.map(e=>n(e.session.device)),a=i.map(e=>`--platform ${e}`).join(` or `);return new e(`AMBIGUOUS_MATCH`,`This workspace has ${t.length} implicit sessions (${r.join(`, `)}); select one explicitly.`,{sessions:r,platforms:i,hint:`Run agent-device session list to inspect them. Add ${a} to run in that platform's session, or pass --session <address> copied from that list.`})}function q(e){return d.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function J(e){if(!e||e.trim().length===0)return;let t=Y(e);return X(t)??t}function Y(e){let t=l.resolve(e);try{return u.realpathSync.native(t)}catch{return t}}function X(e){let t=e;for(;;){if(u.existsSync(l.join(t,`.git`)))return t;let e=l.dirname(t);if(e===t)return;t=e}}export{j as a,w as c,h as d,p as f,k as i,C as l,N as n,M as o,f as p,O as r,S as s,P as t,m as u};
1
+ import{P as e,s as t}from"./sdk-contracts.js";import{S as n,b as r,i,p as a,v as o,w as s}from"./sdk-device.js";import"./dispatch-resolve.js";import{s as c}from"./device-shell.js";import{t as l}from"./device-isolation.js";import u from"node:crypto";import d from"node:fs";import f from"node:path";function p(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function m(e,t,n={}){return e.session.screenRecording?_(e.address,t):y(e,t,n)}function h(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:m(e,`device-in-use`,r)})}function g(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:v(e.address,r)})}function _(e,t){let n=c(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function v(e,t){let n=c(e);return`${b(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${x(t)}Run agent-device session list to inspect active sessions.`}function y(e,t,n){let r=e.address,i=c(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+S(e,n):`${b(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${x(n)}`.trimEnd()}function b(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function x(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function S(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function C(t,n){let{address:r,session:i}=t,a=w(i,n);if(a.length!==0)throw new e(`INVALID_ARGS`,`Session "${r}" is already bound to ${p(i)}, but this request selected ${a.map(T).join(`, `)}.`,{session:r,conflicts:a.map(T),hint:m(t,`selector-conflict`,{offersPlatformSession:a.some(e=>e.key===`platform`)})})}function w(e,t){if(!t)return[];let i=[],s=e.device,c=t.platform;if(c&&!n(s,c)&&i.push({key:`platform`,value:t.platform}),t.target&&t.target!==(s.target??`mobile`)&&i.push({key:`target`,value:t.target}),t.udid&&(!a(s)||t.udid!==s.id)&&i.push({key:`udid`,value:t.udid}),t.serial&&(!o(s.platform)||t.serial!==s.id)&&i.push({key:`serial`,value:t.serial}),t.device&&!r(s,t.device)&&i.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),n=s.simulatorSetPath?.trim();(!a(s)||s.kind!==`simulator`||e!==n)&&i.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=l(t.androidDeviceAllowlist);(s.platform!==`android`||!e.has(s.id))&&i.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return i}function T(e){return`${E(e.key)}=${e.value}`}function E(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const D=`default`,O=new Set(i);function k(e,t,n={}){let r=e.session||D;if(F(e))return r;let i=M(e);return i.kind===`cwd`?L(e,t,i.id,n):r}function A(e){return e.session||D}function j(e){let t=M(e);return t.kind===`cwd`?t:void 0}function M(t){if(t.meta?.sessionIsolation===`tenant`||t.flags?.sessionIsolation===`tenant`){let n=t.meta?.tenantId;if(!n)throw new e(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:n}}if(F(t)||(t.session||D)!==D)return{kind:`named-local`};let n=Y(t.meta?.cwd);return n?{kind:`cwd`,id:J(n)}:{kind:`global-default`}}function N(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function P(e,t){let n=j(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function F(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function I(e,t){return`cwd:${e}:${t}`}function L(e,t,n,r){let i=U(t,n),a=W(e);return a?R(e,t,n,a,i,r):H(n,i,r)}function R(e,t,n,r,i,a){let o=I(n,r);if(t.get(o))return o;let s=V(e.flags,r),c=i.map(e=>({ref:e,conflicts:w(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(K(a,l.map(e=>e.ref)),o):z(c)?.address??o}function z(e){return e.find(e=>!B(e.conflicts))?.ref}function B(e){return e.some(e=>e.key===`platform`)}function V(e,t){return{...e,platform:t}}function H(e,t,n){let[r]=t;return r&&t.length===1?r.address:(K(n,t),I(e,D))}function U(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function W(e){return G(e.flags?.platform)??G(e.meta?.lockPlatform)}function G(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return O.has(t)?t:void 0}function K(e,t){if(t.length>1&&e.attachesToSession===!0)throw q(t)}function q(t){let n=t.map(e=>e.address),r=t.map(e=>s(e.session.device)),i=r.map(e=>`--platform ${e}`).join(` or `);return new e(`AMBIGUOUS_MATCH`,`This workspace has ${t.length} implicit sessions (${n.join(`, `)}); select one explicitly.`,{sessions:n,platforms:r,hint:`Run agent-device session list to inspect them. Add ${i} to run in that platform's session, or pass --session <address> copied from that list.`})}function J(e){return u.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function Y(e){if(!e||e.trim().length===0)return;let t=X(e);return Z(t)??t}function X(e){let t=f.resolve(e);try{return d.realpathSync.native(t)}catch{return t}}function Z(e){let t=e;for(;;){if(d.existsSync(f.join(t,`.git`)))return t;let e=f.dirname(t);if(e===t)return;t=e}}export{M as a,T as c,g as d,m as f,A as i,w as l,P as n,N as o,p,k as r,C as s,F as t,h as u};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{i as t}from"./runtime-admission.js";function n(e,n){return n.available?void 0:t(e,n)}function r(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`)}const i=new WeakMap;let a;(class e{static{a=(t,n)=>{let r=new e;return i.set(r,{device:Object.freeze({...t}),plan:n}),Object.freeze(r),r}}#e;constructor(){this.#e=void 0}get admitted(){return this.#e,!0}});function o(t){let n=i.get(t);if(n===void 0)throw new e(`COMMAND_FAILED`,`Runtime plan admission is not one minted by admitRuntimePlan; refusing to bind.`);return n}async function s(e){let t=await r(e.inspectFacts)(e.device);for(let n of e.plan.use.required){let e=t.operations[n];if(!e.available)return{admitted:!1,operation:n,fact:e}}return a(e.device,e.plan)}function c(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`)}export{o as a,n as i,c as n,r,s as t};
1
+ import{P as e}from"./sdk-contracts.js";import{i as t}from"./runtime-admission.js";function n(e,n){return n.available?void 0:t(e,n)}function r(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`)}const i=new WeakMap;let a;(class e{static{a=(t,n)=>{let r=new e;return i.set(r,{device:Object.freeze({...t}),plan:n}),Object.freeze(r),r}}#e;constructor(){this.#e=void 0}get admitted(){return this.#e,!0}});function o(t){let n=i.get(t);if(n===void 0)throw new e(`COMMAND_FAILED`,`Runtime plan admission is not one minted by admitRuntimePlan; refusing to bind.`);return n}async function s(e){let t=await r(e.inspectFacts)(e.device);for(let n of e.plan.use.required){let e=t.operations[n];if(!e.available)return{admitted:!1,operation:n,fact:e}}return a(e.device,e.plan)}function c(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`)}export{o as a,n as i,c as n,r,s as t};
@@ -1 +1 @@
1
- import{E as e,N as t,O as n,b as r,h as i,o as a}from"./sdk-contracts.js";import{u as o}from"./capture.js";import{r as s}from"./snapshot-capture-annotations.js";import{r as c}from"./snapshot-diagnostics.js";import{f as l}from"./android-input-ownership.js";import{C as u,d,h as f}from"./sdk-device.js";import{Cn as ee,jr as te}from"./sdk-batch.js";import{A as ne,C as re,a as ie,g as ae,j as oe,o as se,t as ce}from"./runtime.js";import{h as le,o as p}from"./overlay.js";import{i as ue}from"./click-button.js";import{a as de,r as fe}from"./diagnostics.js";import{t as pe}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import{t as me}from"./snapshot-state.js";import{i as he}from"./lease-context.js";import{randomInt as ge}from"node:crypto";let m={resolve:async()=>{throw new t(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function _e(e){m=e}function ve(){return m}var h=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const ye=new h({state:`active`,scope:`all`,tree:void 0,generation:void 0});function be(e){return new h({state:`active`,...e})}function xe(e){return h.expire(e)}const g=new WeakMap,_=new WeakSet;function v(e){return e.refFrame??ye}function y(e){return v(e).generation??e.snapshotGeneration}function Se(e){return v(e).tree}function Ce(e){Te(e),b(e),e.refFrame=xe(v(e)),e.snapshotScopeSource=void 0}function b(e){e.snapshot&&_.add(e.snapshot)}function we(e){return _.has(e)}function Te(e){let t=x(e)+1;return g.set(e,t),t}function x(e){return g.get(e)??0}function Ee(e){S(e,`all`)}function De(e,t){S(e,t)}function S(e,t){e.refFrame=be({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function C(e){return v(e).state}function w(e){return v(e).scope}function Oe(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:T({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:w(e.session),currentGeneration:y(e.session)}}function T(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(C(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==y(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=w(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const ke=[250,400,600];function E(e){return e===`press`||e===`click`||e===`back`||e===`open`}function D(e){return e.map(e=>[e.depth??0,e.type??``,e.label??``,e.value??``,e.identifier??``,e.enabled===!1?`disabled`:`enabled`,e.hittable===!0?`hittable`:`not-hittable`].join(`|`))}function Ae(e,t){return e<12?!1:t<=Math.floor(e*.2)}function je(e,t,n){return n.interactiveOnly&&e.snapshot.nodes.length===0&&e.rawNodeCount!==void 0&&e.rawNodeCount>=12?`empty-interactive`:n.mode===`ref-refresh`?null:Ae(t.baselineCount,e.snapshot.nodes.length)?Me(e.snapshot)?null:`sharp-drop`:t.routeComparable&&E(t.action)&&Ne(t.baselineSignatures,e.snapshot.nodes)?`stuck-route`:null}function Me(e){return e.nodes.some(e=>e.hittable===!0||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())}function Ne(e,t){if(!e||e.length===0)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=D(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),c=Math.max(3,Math.floor(n*.15));return a>=Math.floor(n*.9)&&o<=c&&s<=c}async function Pe(e){let t=e.window.markedAt+e.retry.retryBudgetMs,n=await e.capture(),r=e.classify(n),i=0;for(let a of e.retry.delaysMs){if(!r)break;let o=t-Date.now();if(o<=0)break;await pe(Math.min(a,o)),n=await e.capture(),i+=1,r=e.classify(n)}r||e.onTrustworthyCapture?.();let a=i>0||r?{action:e.window.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0;return{...n,annotations:{...n.annotations,...s({freshness:a})}}}function Fe(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=Ie(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?D(r?.nodes??[]):void 0,routeComparable:i}}function Ie(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function O(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function k(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function A(e,t){return Pe({capture:e.capture,classify:n=>je({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:1500,delaysMs:ke},onTrustworthyCapture:()=>k(e.session)})}function j(e){let t=new Map,n=[],r=oe(e);for(let i of e){let e=Re(i,t,r);e&&n.push(e)}return n}function M(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function N(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function P(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!N(r,i))return!1}return!0}function F(e,t){let n=I(e),r=I(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!N(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function I(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function L(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!N(e,t))return!1}return!0}function R(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,N(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function Le(e,t,n){let r=z(B(e,n)),i=z(B(t,n));for(let[e,t]of r){let n=i.get(e);if(!n||!N(t,n))return!0;i.delete(e)}return i.size>0}function z(e){let t=new Map,n=new Map;for(let r of e){let e=t.get(r.content)??0;t.set(r.content,e+1),n.set(`${r.content}|#${e}`,r)}return n}function B(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function Re(e,t,n){if(!e.rect||!Ue(e.rect)||We(e))return;let r=He(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=Be(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},content:ze(e,a),x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!Ve(e,n)}}function ze(e,t){return t??`${e.type??``}|${e.role??``}`}function Be(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function Ve(e,t){return te(e)||e.ref!==void 0&&t.has(e.ref)}function He(e){let t=[e.identifier,e.label,e.value,e.type,e.role,...le(e),e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Ue(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function We(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Ge(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,androidFreshnessBaseline:o}=e;E(r)&&Fe(t,r,o??t.snapshot),Ke(t,r,i,a)}function Ke(e,t,n=[],r){if(!H(e.device)||!et(t,n,r))return;let i=U(e.device)?j(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:M(e.snapshot)}:{}}}function qe(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function V(e){return!!e?.postGestureStabilization}async function Je(e){if(f(e.device)&&e.session&&V(e.session))return await Ye({...e,session:e.session});let t=O(e.session);if(t&&e.device.platform===`android`){let n=await A(e,t);return{snapshot:n.snapshot,...n.annotations}}}async function Ye(e){return Qe(await Ze({session:e.session,capture:async()=>await Xe(e),readSnapshot:e=>e.snapshot}))}async function Xe(e){let t=O(e.session);return t&&e.device.platform===`android`?await A(e,t):await e.capture()}async function Ze(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!H(t.device)||!i)return{value:e.initial??await n()};try{return await ne({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:U(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:j(t.nodes),backend:M(t)}},signaturesStable:P,classifyBaselineEvidence:F,surfacesIdentical:L,summarizeDivergence:R}})}finally{qe(t)}}function Qe(e){let{snapshot:t,annotations:n}=e.value;return e.postGestureOutcome&&(t.postGestureOutcome=e.postGestureOutcome),{snapshot:t,...n}}function $e(e){if(!e?.postGestureStabilization)return e;let{postGestureStabilization:t,...n}=e;return n}function et(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function H(e){return f(e)}function U(e){return d(e.platform)}const tt=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function nt(e){return Object.fromEntries(tt.map(t=>[t,e?.[t]]))}function W(e,t,n,r,i,a){return{requestId:i??de().requestId,appBundleId:n,runnerLeaseContext:he({meta:a}),logPath:e,traceLogPath:r,...nt(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...o(t),clickButton:ue(t)}}let G;async function K(){if(G)return G;let{createAppleSessionObservation:e}=await import(`./session-observation.js`),{listLocalDeviceInventory:t,shouldPropagateDeviceInventoryProbeError:n}=await import(`./device-inventory-context.js`).then(e=>e.t);return G??=e({listLocalDevices:t,shouldPropagateProbeError:n}),G}const rt=Object.freeze({async observeRunnerSession(e){return(await K()).observeRunnerSession(e)},async resolveSoleForegroundApp(e){return(await K()).resolveSoleForegroundApp(e)}});async function it(e,t,n,r){let{queryAppleRunnerSelector:i}=await import(`./runner-operations-facade.js`);return await i(e,t,n,r)}function at(e){let{flags:t,logPath:r,meta:a,session:o,snapshotScope:s}=e,{appBundleId:c,trace:l,surface:u}=o??{},d=e.context??W(r??``,t,c,l?.outPath,a?.requestId,a);return{options:{appBundleId:c,...n(t,i),scope:s,includeRects:e.includeRects,surface:u},execution:q(d),...e.signal===void 0?{}:{signal:e.signal}}}function q(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function ot(e){let t=re(e);return{...t,capture:ce(t),selectors:se(t),interactions:ie(t)}}async function J(e){let t=await(await ve().resolve(e.device,e.runnerContext)).snapshot(e.options);if(!(`stage`in t))return t;let{presentIosSnapshotAcquisition:n}=await import(`./ios-snapshot-runtime.js`);return await n(t,e.options)}async function st(e){let t=await Je({session:e.session,device:e.device,interactiveOnly:e.flags?.snapshotInteractiveOnly===!0,androidFreshnessMode:e.androidFreshnessMode,capture:()=>X(e)});if(t)return t;let n=await X(e);return k(e.session),{snapshot:n.snapshot,...n.annotations}}async function Y(e){if(e.captureData)return await e.captureData();let{device:t,session:r,logPath:a}=e,o=W(a,Z(e),r?.appBundleId,r?.trace?.outPath);return await J({device:t,runnerContext:{requestId:o.requestId,signal:e.signal,appBundleId:o.appBundleId,verbose:o.verbose,logPath:o.logPath,traceLogPath:o.traceLogPath,iosXctestrunFile:o.iosXctestrunFile,iosXctestDerivedDataPath:o.iosXctestDerivedDataPath,iosXctestEnvDir:o.iosXctestEnvDir,runnerLeaseContext:o.runnerLeaseContext},options:{appBundleId:o.appBundleId,signal:e.signal,...n(o,i),includeRects:e.includeRects,surface:r?.surface}})}async function X(e){let t=Date.now(),n=await Y(e);c(e.session,{durationMs:Date.now()-t,backend:n.backend,platform:u(e.device)});let r=s(n),i=l(n,me(n,Z(e)));return r.androidSnapshot?.systemSurfaceOnly===!0&&(i.systemSurfaceOnly=!0),{data:n,snapshot:i,annotations:r}}function Z(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function ct(t,n){if(!t||!t.trim().startsWith(`@`))return{ok:!0,scope:t};if(!n?.snapshot)return a(`INVALID_ARGS`,`Ref scope requires an existing snapshot in session.`);let i=e(t.trim());if(!i)return a(`INVALID_ARGS`,`Invalid ref scope: ${t}`);let o=[n.snapshot,...n.snapshotScopeSource?[n.snapshotScopeSource]:[]],s=!1,c;for(let e of o){let t=r(e.nodes,i);if(t&&(s=!0,c=ae(t,e.nodes),c))break}return s?c?{ok:!0,scope:c}:a(`COMMAND_FAILED`,`Ref ${t} has no label to scope by`,{reason:p.refUnlabeled,ref:i}):a(`COMMAND_FAILED`,`Ref ${t} not found`,{reason:p.refNotFound,ref:i},{hint:ee})}function lt(e,t,n={}){if(!e)return;let r=Se(e);return{name:t,appBundleId:e.appBundleId,appName:e.appName,...n.includeSnapshot===!0?{snapshot:e.snapshot,...r&&n.omitRefFrameSnapshot!==!0?{refFrameSnapshot:r}:{}}:{},metadata:{surface:e.surface,...n.metadata??{}}}}function ut(e){return{get:t=>t===e.sessionName?lt(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{if(t.name!==e.sessionName){fe({level:`warn`,phase:`runtime_session_write_skipped`,data:{expected:e.sessionName,received:t.name}});return}e.setRecord(t)}}}function dt(e,t){e.snapshot!==t&&(e.snapshotGeneration=Q(e.snapshotGeneration)),e.snapshot=t,e.snapshotScopeSource=void 0,t.comparisonSafe===!0&&(e.lastComparisonSafeSnapshot=t)}function ft(e,t){e.snapshotScopeSource=t.scopeSource,e.snapshotGeneration=t.keptCurrentSnapshot?t.previousGeneration:Q(t.previousGeneration)}function Q(e){return e===void 0?ge(1e5,1e6):e+1}function pt(e){let t=e.startsWith(`@`)?e.slice(1):e,n=t.indexOf(`~`);return n===-1?t:t.slice(0,n)}function $(e,t){let n=new Set;for(let e of t){let t=pt(e);t.length>0&&n.add(t)}n.size!==0&&De(e,n)}function mt(e,t){if(t?.diff)return $(e,ht(t)),e.snapshotGeneration}function ht(e){let t=[];for(let n of e.diff?.lines??[])n.ref&&t.push(n.ref);for(let n of e.refs??[])t.push(n.ref);for(let n of e.tail??[])t.push(n.ref);return t}function gt(e){return`Ref @${e.ref.startsWith(`@`)?e.ref.slice(1):e.ref} was minted from snapshot s${e.mintedGeneration} but the session's ref frame is now s${e.currentFrameEpoch} — re-run snapshot -i.`}function _t(e){let{session:t,ref:n,mintedGeneration:r}=e;if(t&&C(t)===`expired`)return`The UI may have changed since these refs were issued, so they no longer represent current device state. Take a new snapshot before relying on or interacting with them.`;if(r!==void 0){let e=t?y(t)??0:0;if(r!==e)return gt({ref:n,mintedGeneration:r,currentFrameEpoch:e})}}export{b as A,L as C,Ee as D,O as E,_e as F,x as M,v as N,Ce as O,C as P,Le as S,R as T,Ge as _,ft as a,j as b,Y as c,at as d,q as f,V as g,W as h,dt as i,Oe as j,we as k,ct as l,it as m,$ as n,ut as o,rt as p,_t as r,st as s,mt as t,ot as u,$e as v,M as w,F as x,P as y};
1
+ import{D as e,P as t,g as n,k as r,s as i,x as a}from"./sdk-contracts.js";import{u as o}from"./capture.js";import{r as s}from"./snapshot-capture-annotations.js";import{r as c}from"./snapshot-diagnostics.js";import{f as l}from"./android-input-ownership.js";import{a as u,r as d}from"./diagnostics.js";import"./diagnostics2.js";import{d as ee,h as f,w as te}from"./sdk-device.js";import{Cn as ne,jr as re}from"./sdk-batch.js";import{A as ie,C as ae,a as oe,g as se,j as ce,o as le,t as ue}from"./runtime.js";import{h as de,o as p}from"./overlay.js";import{i as fe}from"./click-button.js";import{t as pe}from"./timeouts.js";import"./retry.js";import{t as me}from"./snapshot-state.js";import{i as he}from"./lease-context.js";import{randomInt as ge}from"node:crypto";let m={resolve:async()=>{throw new t(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function _e(e){m=e}function ve(){return m}var h=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const ye=new h({state:`active`,scope:`all`,tree:void 0,generation:void 0});function be(e){return new h({state:`active`,...e})}function xe(e){return h.expire(e)}const g=new WeakMap,_=new WeakSet;function v(e){return e.refFrame??ye}function y(e){return v(e).generation??e.snapshotGeneration}function Se(e){return v(e).tree}function Ce(e){Te(e),b(e),e.refFrame=xe(v(e)),e.snapshotScopeSource=void 0}function b(e){e.snapshot&&_.add(e.snapshot)}function we(e){return _.has(e)}function Te(e){let t=x(e)+1;return g.set(e,t),t}function x(e){return g.get(e)??0}function Ee(e){S(e,`all`)}function De(e,t){S(e,t)}function S(e,t){e.refFrame=be({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function C(e){return v(e).state}function w(e){return v(e).scope}function Oe(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:ke({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:w(e.session),currentGeneration:y(e.session)}}function ke(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(C(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==y(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=w(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const Ae=[250,400,600];function T(e){return e===`press`||e===`click`||e===`back`||e===`open`}function E(e){return e.map(e=>[e.depth??0,e.type??``,e.label??``,e.value??``,e.identifier??``,e.enabled===!1?`disabled`:`enabled`,e.hittable===!0?`hittable`:`not-hittable`].join(`|`))}function je(e,t){return e<12?!1:t<=Math.floor(e*.2)}function Me(e,t,n){return n.interactiveOnly&&e.snapshot.nodes.length===0&&e.rawNodeCount!==void 0&&e.rawNodeCount>=12?`empty-interactive`:n.mode===`ref-refresh`?null:je(t.baselineCount,e.snapshot.nodes.length)?Ne(e.snapshot)?null:`sharp-drop`:t.routeComparable&&T(t.action)&&Pe(t.baselineSignatures,e.snapshot.nodes)?`stuck-route`:null}function Ne(e){return e.nodes.some(e=>e.hittable===!0||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())}function Pe(e,t){if(!e||e.length===0)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=E(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),c=Math.max(3,Math.floor(n*.15));return a>=Math.floor(n*.9)&&o<=c&&s<=c}async function Fe(e){let t=e.window.markedAt+e.retry.retryBudgetMs,n=await e.capture(),r=e.classify(n),i=0;for(let a of e.retry.delaysMs){if(!r)break;let o=t-Date.now();if(o<=0)break;await pe(Math.min(a,o)),n=await e.capture(),i+=1,r=e.classify(n)}r||e.onTrustworthyCapture?.();let a=i>0||r?{action:e.window.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0;return{...n,annotations:{...n.annotations,...s({freshness:a})}}}function Ie(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=Le(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?E(r?.nodes??[]):void 0,routeComparable:i}}function Le(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function D(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function O(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function k(e,t){return Fe({capture:e.capture,classify:n=>Me({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:1500,delaysMs:Ae},onTrustworthyCapture:()=>O(e.session)})}function A(e){let t=new Map,n=[],r=ce(e);for(let i of e){let e=Re(i,t,r);e&&n.push(e)}return n}function j(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function M(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function N(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!M(r,i))return!1}return!0}function P(e,t){let n=F(e),r=F(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!M(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function F(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function I(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!M(e,t))return!1}return!0}function L(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,M(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function R(e,t,n){let r=z(B(e,n)),i=z(B(t,n));for(let[e,t]of r){let n=i.get(e);if(!n||!M(t,n))return!0;i.delete(e)}return i.size>0}function z(e){let t=new Map,n=new Map;for(let r of e){let e=t.get(r.content)??0;t.set(r.content,e+1),n.set(`${r.content}|#${e}`,r)}return n}function B(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function Re(e,t,n){if(!e.rect||!Ue(e.rect)||We(e))return;let r=He(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=Be(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},content:ze(e,a),x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!Ve(e,n)}}function ze(e,t){return t??`${e.type??``}|${e.role??``}`}function Be(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function Ve(e,t){return re(e)||e.ref!==void 0&&t.has(e.ref)}function He(e){let t=[e.identifier,e.label,e.value,e.type,e.role,...de(e),e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Ue(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function We(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Ge(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,androidFreshnessBaseline:o}=e;T(r)&&Ie(t,r,o??t.snapshot),Ke(t,r,i,a)}function Ke(e,t,n=[],r){if(!H(e.device)||!et(t,n,r))return;let i=U(e.device)?A(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:j(e.snapshot)}:{}}}function qe(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function V(e){return!!e?.postGestureStabilization}async function Je(e){if(f(e.device)&&e.session&&V(e.session))return await Ye({...e,session:e.session});let t=D(e.session);if(t&&e.device.platform===`android`){let n=await k(e,t);return{snapshot:n.snapshot,...n.annotations}}}async function Ye(e){return Qe(await Ze({session:e.session,capture:async()=>await Xe(e),readSnapshot:e=>e.snapshot}))}async function Xe(e){let t=D(e.session);return t&&e.device.platform===`android`?await k(e,t):await e.capture()}async function Ze(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!H(t.device)||!i)return{value:e.initial??await n()};try{return await ie({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:U(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:A(t.nodes),backend:j(t)}},signaturesStable:N,classifyBaselineEvidence:P,surfacesIdentical:I,summarizeDivergence:L}})}finally{qe(t)}}function Qe(e){let{snapshot:t,annotations:n}=e.value;return e.postGestureOutcome&&(t.postGestureOutcome=e.postGestureOutcome),{snapshot:t,...n}}function $e(e){if(!e?.postGestureStabilization)return e;let{postGestureStabilization:t,...n}=e;return n}function et(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function H(e){return f(e)}function U(e){return ee(e.platform)}const tt=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function nt(e){return Object.fromEntries(tt.map(t=>[t,e?.[t]]))}function W(e,t,n,r,i,a){return{requestId:i??u().requestId,appBundleId:n,runnerLeaseContext:he({meta:a}),logPath:e,traceLogPath:r,...nt(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...o(t),clickButton:fe(t)}}let G;async function K(){if(G)return G;let{createAppleSessionObservation:e}=await import(`./session-observation.js`),{listLocalDeviceInventory:t,shouldPropagateDeviceInventoryProbeError:n}=await import(`./device-inventory-context.js`).then(e=>e.t);return G??=e({listLocalDevices:t,shouldPropagateProbeError:n}),G}const rt=Object.freeze({async observeRunnerSession(e){return(await K()).observeRunnerSession(e)},async resolveSoleForegroundApp(e){return(await K()).resolveSoleForegroundApp(e)}});async function it(e,t,n,r){let{queryAppleRunnerSelector:i}=await import(`./runner-operations-facade.js`);return await i(e,t,n,r)}function at(e){let{flags:t,logPath:i,meta:a,session:o,snapshotScope:s}=e,{appBundleId:c,trace:l,surface:u}=o??{},d=e.context??W(i??``,t,c,l?.outPath,a?.requestId,a);return{options:{appBundleId:c,...r(t,n),scope:s,includeRects:e.includeRects,surface:u},execution:q(d),...e.signal===void 0?{}:{signal:e.signal}}}function q(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function ot(e){let t=ae(e);return{...t,capture:ue(t),selectors:le(t),interactions:oe(t)}}async function st(e){let t=await(await ve().resolve(e.device,e.runnerContext)).snapshot(e.options);if(!(`stage`in t))return t;let{presentIosSnapshotAcquisition:n}=await import(`./ios-snapshot-runtime.js`);return await n(t,e.options)}async function ct(e){let t=await Je({session:e.session,device:e.device,interactiveOnly:e.flags?.snapshotInteractiveOnly===!0,androidFreshnessMode:e.androidFreshnessMode,capture:()=>Y(e)});if(t)return t;let n=await Y(e);return O(e.session),{snapshot:n.snapshot,...n.annotations}}async function J(e){if(e.captureData)return await e.captureData();let{device:t,session:i,logPath:a}=e,o=W(a,X(e),i?.appBundleId,i?.trace?.outPath);return await st({device:t,runnerContext:{requestId:o.requestId,signal:e.signal,appBundleId:o.appBundleId,verbose:o.verbose,logPath:o.logPath,traceLogPath:o.traceLogPath,iosXctestrunFile:o.iosXctestrunFile,iosXctestDerivedDataPath:o.iosXctestDerivedDataPath,iosXctestEnvDir:o.iosXctestEnvDir,runnerLeaseContext:o.runnerLeaseContext},options:{appBundleId:o.appBundleId,signal:e.signal,...r(o,n),includeRects:e.includeRects,surface:i?.surface}})}async function Y(e){let t=Date.now(),n=await J(e);c(e.session,{durationMs:Date.now()-t,backend:n.backend,platform:te(e.device)});let r=s(n),i=l(n,me(n,X(e)));return r.androidSnapshot?.systemSurfaceOnly===!0&&(i.systemSurfaceOnly=!0),{data:n,snapshot:i,annotations:r}}function X(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function lt(t,n){if(!t||!t.trim().startsWith(`@`))return{ok:!0,scope:t};if(!n?.snapshot)return i(`INVALID_ARGS`,`Ref scope requires an existing snapshot in session.`);let r=e(t.trim());if(!r)return i(`INVALID_ARGS`,`Invalid ref scope: ${t}`);let o=[n.snapshot,...n.snapshotScopeSource?[n.snapshotScopeSource]:[]],s=!1,c;for(let e of o){let t=a(e.nodes,r);if(t&&(s=!0,c=se(t,e.nodes),c))break}return s?c?{ok:!0,scope:c}:i(`COMMAND_FAILED`,`Ref ${t} has no label to scope by`,{reason:p.refUnlabeled,ref:r}):i(`COMMAND_FAILED`,`Ref ${t} not found`,{reason:p.refNotFound,ref:r},{hint:ne})}function Z(e,t,n={}){if(!e)return;let r=Se(e);return{name:t,appBundleId:e.appBundleId,appName:e.appName,...n.includeSnapshot===!0?{snapshot:e.snapshot,...r&&n.omitRefFrameSnapshot!==!0?{refFrameSnapshot:r}:{}}:{},metadata:{surface:e.surface,...n.metadata??{}}}}function ut(e,t){return{get:n=>n===e?Z(t,e):void 0,set:()=>{}}}function dt(e){let t=e.ref;return{getRef:()=>t?e.sessionStore.refresh(t):void 0,get:n=>n===e.sessionName?Z(t?e.sessionStore.resolveCurrent(t):void 0,e.sessionName,e.recordOptions):void 0,set:n=>{if(n.name!==e.sessionName){d({level:`warn`,phase:`runtime_session_write_skipped`,data:{expected:e.sessionName,received:n.name}});return}let r=t?e.sessionStore.requireCurrent(t):void 0,i=e.setRecord(n,r,t);i&&(t=i)}}}function ft(e,t){e.snapshot!==t&&(e.snapshotGeneration=Q(e.snapshotGeneration)),e.snapshot=t,e.snapshotScopeSource=void 0,t.comparisonSafe===!0&&(e.lastComparisonSafeSnapshot=t)}function pt(e){e.snapshot=void 0}function mt(e,t){e.snapshot=t.snapshot,t.snapshot.comparisonSafe===!0&&(e.lastComparisonSafeSnapshot=t.snapshot),e.snapshotScopeSource=t.scopeSource,e.snapshotGeneration=t.keptCurrentSnapshot?t.previousGeneration:Q(t.previousGeneration)}function Q(e){return e===void 0?ge(1e5,1e6):e+1}function ht(e){let t=e.startsWith(`@`)?e.slice(1):e,n=t.indexOf(`~`);return n===-1?t:t.slice(0,n)}function $(e,t){let n=new Set;for(let e of t){let t=ht(e);t.length>0&&n.add(t)}n.size!==0&&De(e,n)}function gt(e,t,n){if(!e||!n?.diff)return;let r=t.resolveCurrent(e);if(r)return $(r,_t(n)),r.snapshotGeneration}function _t(e){let t=[];for(let n of e.diff?.lines??[])n.ref&&t.push(n.ref);for(let n of e.refs??[])t.push(n.ref);for(let n of e.tail??[])t.push(n.ref);return t}function vt(e){return`Ref @${e.ref.startsWith(`@`)?e.ref.slice(1):e.ref} was minted from snapshot s${e.mintedGeneration} but the session's ref frame is now s${e.currentFrameEpoch} — re-run snapshot -i.`}function yt(e){let{session:t,ref:n,mintedGeneration:r}=e;if(t&&C(t)===`expired`)return`The UI may have changed since these refs were issued, so they no longer represent current device state. Take a new snapshot before relying on or interacting with them.`;if(r!==void 0){let e=t?y(t)??0:0;if(r!==e)return vt({ref:n,mintedGeneration:r,currentFrameEpoch:e})}}export{Ce as A,P as C,L as D,j as E,v as F,C as I,_e as L,b as M,Oe as N,D as O,x as P,A as S,I as T,W as _,mt as a,$e as b,ut as c,lt as d,ot as f,it as g,rt as h,yt as i,we as j,Ee as k,ct as l,q as m,gt as n,ft as o,at as p,$ as r,dt as s,pt as t,J as u,V as v,R as w,N as x,Ge as y};