agent-device 0.21.20 → 0.21.22

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.22.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.22.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.22.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.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.22.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{k as e}from"./owner-identity.js";import"./file.js";import t from"node:path";import n from"node:fs";function r(t,r){let i={providerReleases:{released:r.providerReleases.released.map(s),pending:r.providerReleases.pending.map(s)},claims:{released:[...r.claims.released],orphaned:[...r.claims.orphaned],superseded:[...r.claims.superseded],unattributable:[...r.claims.unattributable]}},a=o(t);try{e({destination:a,contents:`${JSON.stringify(i)}\n`,mode:384}),n.chmodSync(a,384)}catch{}}function i(e){try{let t=JSON.parse(n.readFileSync(o(e),`utf8`));return c(t)?{...t,claims:l(t)}:null}catch{return null}}function a(e){try{n.rmSync(o(e),{force:!0})}catch{}}function o(e){return t.join(e,`daemon-shutdown.json`)}function s(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function c(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(f)&&n.pending.every(f)}function l(e){let t=e.claims;if(!t||typeof t!=`object`)return{released:[],orphaned:[],superseded:[],unattributable:[]};let n=t;return{released:u(n.released),orphaned:u(n.orphaned),superseded:u(n.superseded),unattributable:u(n.unattributable)}}function u(e){return Array.isArray(e)?e.filter(d):[]}function d(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.deviceKey==`string`&&typeof t.session==`string`&&typeof t.platform==`string`&&typeof t.deviceId==`string`}function f(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}export{i as n,r,a as t};
1
+ import e from"node:fs";import t from"node:path";function n(e){return{providerReleases:{released:e.providerReleases.released.map(a),pending:e.providerReleases.pending.map(a)},claims:{released:[...e.claims.released],orphaned:[...e.claims.orphaned],superseded:[...e.claims.superseded],unattributable:[...e.claims.unattributable]}}}function r(t){try{let n=JSON.parse(e.readFileSync(i(t),`utf8`));return o(n)?{...n,claims:s(n)}:null}catch{return null}}function i(e){return t.join(e,`daemon-shutdown.json`)}function a(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function o(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(u)&&n.pending.every(u)}function s(e){let t=e.claims;if(!t||typeof t!=`object`)return{released:[],orphaned:[],superseded:[],unattributable:[]};let n=t;return{released:c(n.released),orphaned:c(n.orphaned),superseded:c(n.superseded),unattributable:c(n.unattributable)}}function c(e){return Array.isArray(e)?e.filter(l):[]}function l(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.deviceKey==`string`&&typeof t.session==`string`&&typeof t.platform==`string`&&typeof t.deviceId==`string`}function u(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}export{r as n,i as r,n as t};
@@ -1,2 +1,2 @@
1
- import{N as e}from"./sdk-contracts.js";import{p as t}from"./owner-identity.js";import{t as n}from"./timeouts.js";import"./process.js";import"./retry.js";import{t as r}from"./daemon-resolution.js";import{i,r as a,t as o}from"./daemon-process.js";import{n as s}from"./daemon-registration.js";import{n as c}from"./daemon-shutdown-report.js";import{t as l}from"./shared.js";import u from"node:fs";async function d(n){let r=s(n.paths.infoPath);if(!r)return h();if(!r.startTime){if(!t(r.pid))return h();throw new e(`COMMAND_FAILED`,`Refusing to stop a daemon without a verified process start-time identity.`,{pid:r.pid})}if(!o(r.pid,r.startTime)){if(!t(r.pid))return h();throw new e(`COMMAND_FAILED`,`Refusing to stop a daemon whose PID or start-time identity could not be verified.`,{pid:r.pid,processStartTime:r.startTime})}let a={pid:r.pid,startTime:r.startTime};if(!f(r.pid,`SIGTERM`))return h();let{exited:c}=await i(a,{timeoutMs:n.graceTimeoutMs??1e4});if(c)return await m(n.paths,1e3),{stopped:!0,mode:`graceful`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]};o(r.pid,r.startTime)&&f(r.pid,`SIGKILL`);let{exited:l}=await i(a,{timeoutMs:n.killTimeoutMs??2e3});if(!l)throw new e(`COMMAND_FAILED`,`Daemon did not exit after SIGKILL.`,{pid:r.pid});return{stopped:!0,mode:`forced`,cleanupConfidence:`unknown`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`unknown`,released:[],pending:null},warnings:[`The daemon was force-killed before provider lease state could be finalized. Provider allocations may remain active.`]}}function f(n,r){if(a(n,r))return!0;if(!t(n))return!1;throw new e(`COMMAND_FAILED`,`Daemon could not be signaled with ${r}.`,{pid:n,signal:r})}function p(e){let t=s(e);return t?.startTime?{pid:t.pid,processStartTime:t.startTime}:null}async function m(e,t){let r=Date.now();for(;Date.now()-r<t;){if(!u.existsSync(e.infoPath)&&!u.existsSync(e.lockPath))return;await n(25)}}function h(){return{stopped:!1,mode:`not-running`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]}}function g(){return Object.freeze({cleanup:async e=>{let{cleanupRunnerLeasesForOwner:t}=await import(`./runner-operations-facade.js`);await t(e)}})}const _=g(),v=async({positionals:t,flags:n})=>{if(t[0]!==`stop`||t.length!==1)throw new e(`INVALID_ARGS`,`daemon accepts only: stop`);let i=r(n.stateDir),a=p(i.infoPath),o=await d({paths:i}),s=y(o,o.mode===`graceful`?c(i.baseDir):null),u=n.clean===!0&&a!==null&&s.stopped;u&&await _.cleanup({pid:a.pid,startTime:a.processStartTime});let f={...s,clean:u};return await l(n,f,()=>C(f)),!0};function y(e,t){return e.mode!==`graceful`||t?t?{...e,providerReleases:{status:`completed`,...t.providerReleases},claimsReleased:t.claims.released,claimsOrphaned:t.claims.orphaned,claimsSuperseded:t.claims.superseded,claimsUnattributable:t.claims.unattributable,warnings:[...e.warnings,...b(t.claims.superseded),...x(t.claims.orphaned),...S(t.claims.unattributable)]}:e:{...e,cleanupConfidence:`unknown`,providerReleases:{status:`unknown`,released:[],pending:null},warnings:[...e.warnings,`The graceful shutdown report is unavailable, so provider cleanup state is unknown. Provider allocations may remain active.`]}}function b(e){return e.length===0?[]:[`Another owner had already claimed ${e.map(e=>e.deviceId).join(`, `)} before this daemon released it, so those devices are now owned elsewhere.`]}function x(e){return e.length===0?[]:[`Ownership of ${e.map(e=>e.deviceId).join(`, `)} was not released cleanly; the claim now blocks other owners until it is settled. Inspect with: agent-device device status --stale, then release with: agent-device device release --stale.`]}function S(e){return e.length===0?[]:[`A claim for ${e.map(e=>e.deviceId).join(`, `)} remains whose owner could not be read, so this daemon cannot say whether those devices are free. No device release route settles it: --stale proves staleness from the recorded owner and refuses records that name none, and open refuses to overwrite them. Inspect with: agent-device device status.`]}function C(e){return[e.stopped?`Daemon stopped (${e.mode}).`:`No running daemon found.`,e.clean?`Retained runner cleanup completed.`:null,...e.warnings].filter(e=>!!e).join(`
2
- `)}export{v as daemonCommand};
1
+ import{P as e}from"./sdk-contracts.js";import{t}from"./daemon-resolution.js";import{r as n}from"./daemon-registration.js";import{n as r}from"./daemon-shutdown-report.js";import{t as i}from"./shared.js";async function a(e){let t=n(e.paths.infoPath);if(!t)return c();let{stopAndRetireDaemon:r}=await import(`./daemon-registration-owner.js`).then(e=>e.r),i=await r({paths:e.paths,observed:t,mode:`graceful`,termTimeoutMs:e.graceTimeoutMs??1e4,killTimeoutMs:e.killTimeoutMs??2e3});if(i.status===`retained`&&i.termination?.status===`not-running`)return c();if(i.status!==`retired`)throw o(t,i);return i.termination.mode===`already-exited`?c():i.termination.mode===`graceful`?{stopped:!0,mode:`graceful`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]}:{stopped:!0,mode:`forced`,cleanupConfidence:`unknown`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`unknown`,released:[],pending:null},warnings:[`The daemon was force-killed before provider lease state could be finalized. Provider allocations may remain active.`]}}function o(t,n){let r=n.status===`retained`?n.termination:void 0,i=r?.status===`retained`?r:void 0,{hint:a,diagnosticId:o,logPath:s}=(n.status===`retained`?n.error:void 0)??{};return new e(`COMMAND_FAILED`,`Daemon retirement could not be confirmed.`,{pid:t.pid,processStartTime:t.startTime,reason:i?`daemon_exit_unconfirmed`:`daemon_retirement_unconfirmed`,terminationReason:i?.reason,signal:i?.signal,retirement:n,hint:a,diagnosticId:o,logPath:s})}function s(e){let t=n(e);return t?.startTime?{pid:t.pid,processStartTime:t.startTime}:null}function c(){return{stopped:!1,mode:`not-running`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]}}function l(){return Object.freeze({cleanup:async e=>{let{cleanupRunnerLeasesForOwner:t}=await import(`./runner-operations-facade.js`);await t(e)}})}const u=l(),d=async({positionals:n,flags:o})=>{if(n[0]!==`stop`||n.length!==1)throw new e(`INVALID_ARGS`,`daemon accepts only: stop`);let c=t(o.stateDir),l=s(c.infoPath),d=await a({paths:c}),p=f(d,d.mode===`graceful`?r(c.baseDir):null),m=o.clean===!0&&l!==null&&p.stopped;m&&await u.cleanup({pid:l.pid,startTime:l.processStartTime});let h={...p,clean:m};return await i(o,h,()=>g(h)),!0};function f(e,t){return e.mode!==`graceful`||t?t?{...e,providerReleases:{status:`completed`,...t.providerReleases},claimsReleased:t.claims.released,claimsOrphaned:t.claims.orphaned,claimsSuperseded:t.claims.superseded,claimsUnattributable:t.claims.unattributable,warnings:[...e.warnings,...p(t.claims.superseded),...m(t.claims.orphaned),...h(t.claims.unattributable)]}:e:{...e,cleanupConfidence:`unknown`,providerReleases:{status:`unknown`,released:[],pending:null},warnings:[...e.warnings,`The graceful shutdown report is unavailable, so provider cleanup state is unknown. Provider allocations may remain active.`]}}function p(e){return e.length===0?[]:[`Another owner had already claimed ${e.map(e=>e.deviceId).join(`, `)} before this daemon released it, so those devices are now owned elsewhere.`]}function m(e){return e.length===0?[]:[`Ownership of ${e.map(e=>e.deviceId).join(`, `)} was not released cleanly; the claim now blocks other owners until it is settled. Inspect with: agent-device device status --stale, then release with: agent-device device release --stale.`]}function h(e){return e.length===0?[]:[`A claim for ${e.map(e=>e.deviceId).join(`, `)} remains whose owner could not be read, so this daemon cannot say whether those devices are free. No device release route settles it: --stale proves staleness from the recorded owner and refuses records that name none, and open refuses to overwrite them. Inspect with: agent-device device status.`]}function g(e){return[e.stopped?`Daemon stopped (${e.mode}).`:`No running daemon found.`,e.clean?`Retained runner cleanup completed.`:null,...e.warnings].filter(e=>!!e).join(`
2
+ `)}export{d as daemonCommand};
@@ -1,4 +1,4 @@
1
- import{N as e}from"./sdk-contracts.js";import{_ as t}from"./sdk-batch-runner.js";import{s as n}from"./owner-identity.js";import{l as r,o as i}from"./exec.js";import"./command.js";import"./process.js";import{D as a,g as o,o as s,u as c,y as l}from"./host-file.js";import u from"node:path";const d=/^[0-9a-fA-F-]{32,36}$/;function f(e){if(!(!e||!d.test(e)))return e.replaceAll(`-`,``).toUpperCase()}function p(e,t){return`${e.uuid}:${m(t)}`}function m(e){return`0x${e.toString(16)}`}function h(e){return typeof e==`string`&&e.length>0?e:void 0}function g(...e){for(let t of e){let e=h(t);if(e)return e}}function _(e){let t=e.filter(e=>!!e);return t.length>0?t.join(` `):void 0}function v(e){try{let n=JSON.parse(e);return t(n)?n:null}catch{return null}}function y(e){if(typeof e==`number`&&Number.isSafeInteger(e))return e;if(typeof e==`string`){let t=e.startsWith(`0x`)?Number.parseInt(e,16):Number(e);return Number.isSafeInteger(t)?t:void 0}}function b(e,t,n){if(!Object.hasOwn(e,t))return;let r=y(e[t]);if(r!==void 0)return r;S(n,t)}function x(e,t,n){if(!Object.hasOwn(e,t))return;let r=ee(e[t]);if(r!==void 0)return r;S(n,t)}function ee(e){if(typeof e==`bigint`)return e;if(typeof e==`number`&&Number.isSafeInteger(e)||typeof e==`string`&&/^(?:0x[0-9a-fA-F]+|\d+)$/.test(e))return BigInt(e)}function S(t,n){throw new e(`INVALID_ARGS`,`Invalid ${t} numeric field: ${n}`,{hint:`Crash artifact numeric fields must be integer numbers or integer numeric strings.`})}function C(e){return e.length===1?e[0]:void 0}function w(e){return[...new Set(e)]}function te(e){let t=e.match(/^(.*) \+ (\d+)$/);return t?{symbol:t[1],location:Number(t[2])}:{symbol:e}}const ne=/^(?:arm64e?|arm64_32|x86_64|armv7[sk]?|i386)$/;function re(e){return ie(e)??O(e)}function ie(e){let t=ae(e);if(!t)return null;let n=(Array.isArray(t.payload.usedImages)?t.payload.usedImages:[]).flatMap((e,t)=>D(e,t));if(n.length===0)return null;let r=oe(Array.isArray(t.payload.threads)?t.payload.threads:[],n);return{format:`ips`,images:n,addresses:r.map(({frame:e,...t})=>t),document:t,frameMatches:r,write:e=>T(t,r,e)}}function ae(e){let t=v(e);if(t)return{payload:t};let n=e.indexOf(`
1
+ import{P as e}from"./sdk-contracts.js";import{v as t}from"./sdk-batch-runner.js";import{c as n}from"./owner-identity.js";import{l as r,o as i}from"./exec.js";import"./command.js";import"./process.js";import{D as a,g as o,o as s,u as c,y as l}from"./host-file.js";import u from"node:path";const d=/^[0-9a-fA-F-]{32,36}$/;function f(e){if(!(!e||!d.test(e)))return e.replaceAll(`-`,``).toUpperCase()}function p(e,t){return`${e.uuid}:${m(t)}`}function m(e){return`0x${e.toString(16)}`}function h(e){return typeof e==`string`&&e.length>0?e:void 0}function g(...e){for(let t of e){let e=h(t);if(e)return e}}function _(e){let t=e.filter(e=>!!e);return t.length>0?t.join(` `):void 0}function v(e){try{let n=JSON.parse(e);return t(n)?n:null}catch{return null}}function y(e){if(typeof e==`number`&&Number.isSafeInteger(e))return e;if(typeof e==`string`){let t=e.startsWith(`0x`)?Number.parseInt(e,16):Number(e);return Number.isSafeInteger(t)?t:void 0}}function b(e,t,n){if(!Object.hasOwn(e,t))return;let r=y(e[t]);if(r!==void 0)return r;S(n,t)}function x(e,t,n){if(!Object.hasOwn(e,t))return;let r=ee(e[t]);if(r!==void 0)return r;S(n,t)}function ee(e){if(typeof e==`bigint`)return e;if(typeof e==`number`&&Number.isSafeInteger(e)||typeof e==`string`&&/^(?:0x[0-9a-fA-F]+|\d+)$/.test(e))return BigInt(e)}function S(t,n){throw new e(`INVALID_ARGS`,`Invalid ${t} numeric field: ${n}`,{hint:`Crash artifact numeric fields must be integer numbers or integer numeric strings.`})}function C(e){return e.length===1?e[0]:void 0}function w(e){return[...new Set(e)]}function te(e){let t=e.match(/^(.*) \+ (\d+)$/);return t?{symbol:t[1],location:Number(t[2])}:{symbol:e}}const ne=/^(?:arm64e?|arm64_32|x86_64|armv7[sk]?|i386)$/;function re(e){return ie(e)??O(e)}function ie(e){let t=ae(e);if(!t)return null;let n=(Array.isArray(t.payload.usedImages)?t.payload.usedImages:[]).flatMap((e,t)=>D(e,t));if(n.length===0)return null;let r=oe(Array.isArray(t.payload.threads)?t.payload.threads:[],n);return{format:`ips`,images:n,addresses:r.map(({frame:e,...t})=>t),document:t,frameMatches:r,write:e=>T(t,r,e)}}function ae(e){let t=v(e);if(t)return{payload:t};let n=e.indexOf(`
2
2
  `);if(n===-1)return null;let r=e.slice(0,n),i=v(e.slice(n+1));return i?{header:r,payload:i}:null}function oe(e,t){let n=new Map(t.map(e=>[e.index,e]));return e.flatMap((e,t)=>se(e).flatMap((e,r)=>ce(e,n,t,r)))}function se(e){return!t(e)||!Array.isArray(e.frames)?[]:e.frames.filter(t)}function ce(e,t,n,r){let i=b(e,`imageIndex`,`IPS frame`),a=x(e,`imageOffset`,`IPS frame`);if(i===void 0||a===void 0)return[];let o=t.get(i);return o?[{frame:e,frameIndex:r,threadIndex:n,image:o,address:o.base+a}]:[]}function T(e,t,n){for(let e of t){let t=n.get(p(e.image,e.address))?.text;t&&E(e.frame,t)}e.payload.agentDeviceSymbolication={tool:`agent-device debug symbols`,symbolicatedFrames:[...n.values()].filter(e=>e.text).length};let r=`${JSON.stringify(e.payload,null,2)}\n`;return e.header?`${e.header}\n${r}`:r}function E(e,t){let n=te(t);e.symbol=n.symbol,n.location!==void 0&&(e.symbolLocation=n.location)}function D(e,n){if(!t(e))return[];let r=f(h(e.uuid)),i=x(e,`base`,`IPS usedImages`);if(!r||i===void 0)return[];let a=h(e.path);return[{index:n,name:h(e.name)??(a?u.basename(a):`image-${n}`),uuid:r,arch:h(e.arch),base:i,path:a}]}function O(e){let t=e.split(`
3
3
  `),n=k(t);if(n.length===0)return null;let r=M(t,n);return{format:`text`,images:n,addresses:r,lines:t,frameMatches:r,write(e){let n=new Map(r.map(e=>[e.lineIndex,e]));return t.map((t,r)=>{let i=n.get(r);if(!i)return t;let a=e.get(p(i.image,i.address))?.text;return!a||t.includes(a)?t:`${t} // ${a}`}).join(`
4
4
  `)}}}function k(e){let t=[],n=e.findIndex(e=>/^Binary Images:/i.test(e.trim()));if(n===-1)return t;for(let r of e.slice(n+1)){let e=A(r);e&&t.push(e)}return t}function A(e){let t=e.match(/^\s*(0x[0-9a-fA-F]+)\s*-\s*(0x[0-9a-fA-F]+)\s+\+?(.+?)\s+<([0-9a-fA-F-]{32,36})>\s+(.+)$/);if(!t)return null;let n=f(t[4]);if(!n)return null;let r=j(t[3].trim(),t[5].trim());return{name:r.name,arch:r.arch,uuid:n,base:BigInt(t[1]),end:BigInt(t[2]),path:t[5].trim()}}function j(e,t){let n=e.split(/\s+/),r=n.at(-1);if(r&&ne.test(r))return{name:n.slice(0,-1).join(` `).trim(),arch:r};let i=u.basename(t);return{name:e.startsWith(i)?i:e}}function M(e,t){let n=[],r;for(let[i,a]of e.entries()){let e=a.match(/^Thread\s+(\d+)\s+Crashed:/);e?r=Number(e[1]):(a.trim().length===0||/^Thread\s+\d+/.test(a))&&(r=void 0);let o=N(a,t),s=a.match(/^\s*(\d+)/);o&&s&&n.push({...o,frameIndex:Number(s[1]),lineIndex:i,threadIndex:r})}return n}function N(e,t){let n=e.match(/^\s*\d+\s+(.+?)\s+(0x[0-9a-fA-F]+)\b/);if(!n)return null;let r=n[1].trim(),i=BigInt(n[2]),a=P(t,r,i);return a?{image:a,address:i}:null}function P(e,t,n){let r=e.filter(e=>e.name===t);return r.find(e=>F(e,n))??C(r)}function F(e,t){return e.end!==void 0&&e.base<=t&&t<=e.end}const I=1e4;async function L(e){return e.dsym&&e.searchPath?[K(e.cwd,e.dsym),...await R(K(e.cwd,e.searchPath))]:e.dsym?[K(e.cwd,e.dsym)]:e.searchPath?await R(K(e.cwd,e.searchPath)):[]}async function R(t){let n=[],r=0;async function i(a){if(n.length>=200)return;if(r+=1,r>I)throw new e(`COMMAND_FAILED`,`debug symbols search-path scan exceeded bounds.`,{searchPath:t,maxEntries:I,hint:`Pass --dsym <App.dSYM> directly or narrow --search-path to the build products directory.`});if(!(await z(a,t)).isDirectory()){a===t&&B(t);return}if(a.endsWith(`.dSYM`)){n.push(a);return}let s=await o(a,{withFileTypes:!0});for(let e of s)e.isDirectory()&&await i(u.join(a,e.name))}return await i(t),n}async function z(t,n){try{return await c(t)}catch{throw new e(`INVALID_ARGS`,`debug symbols search path does not exist: ${n}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}}function B(t){throw new e(`INVALID_ARGS`,`debug symbols search path is not a directory: ${t}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}async function V(t,n){let r=(await Promise.all(w(t).map(e=>H(e,n)))).flat();if(r.length===0)throw new e(`COMMAND_FAILED`,`No UUIDs found in dSYM bundle.`,{hint:`Verify the path points to a built .dSYM bundle with DWARF contents.`});return r}async function H(e,t){return await U(e),W(e,i(await r(t,[`--uuid`,e],{timeoutMs:15e3,allowFailure:!0}),`Failed to inspect dSYM UUIDs: ${e}`,{hint:`Verify the dSYM bundle is valid and readable.`}).stdout)}async function U(t){if(!((await c(t).catch(()=>null))?.isDirectory()&&t.endsWith(`.dSYM`)))throw new e(`INVALID_ARGS`,`Not a .dSYM bundle: ${t}`,{hint:`Pass the .dSYM bundle path, not the DWARF executable inside it.`})}function W(e,t){return t.split(`
@@ -1 +1 @@
1
- import{_ as e,o as t,x as n}from"./sdk-device.js";import{Zt as r}from"./sdk-batch.js";import{b as i,n as a}from"./owner-identity.js";import"./process.js";import{t as o}from"./daemon-registration.js";import{r as s}from"./durable-resource.js";import"./src7.js";import c from"node:path";import l from"node:fs";import u from"node:crypto";import d from"node:os";function f(e){return p(`family`in e?e.family:e.platform,e.appleOs,e.id)}function p(e,t,n){return`local:${e}:${t??`none`}:${n}`}function m(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?c.resolve(e):c.join(d.homedir(),`.agent-device`,`device-claims`)}function h(e){let t=u.createHash(`sha256`).update(e).digest(`hex`);return c.join(m(),`${t}.json`)}function g(e){return{deviceKey:e.deviceKey,ownerToken:e.ownerToken,ownerPid:e.ownerPid,ownerStartTime:e.ownerStartTime}}function _(e){return e.schemaVersion===3}function v(e){return r(e.allocator.instanceId)}function y(e){return D(e)?e.schemaVersion===3?S(e):e.schemaVersion===2?O(e):e.schemaVersion===1?k(e):null:null}function b(e){return D(e)&&e.schemaVersion===3}const x=[`ownerPid`,`ownerStartTime`,`ownerToken`,`session`,`workspace`,`abandonedAtMs`];function S(e){if(e.kind!==`allocator`||C(e))return null;let t=w(e);return t&&{schemaVersion:3,kind:`allocator`,...t}}function C(e){return x.some(t=>e[t]!==void 0)}function w(e){if(!D(e.device)||!P(e.device.name))return null;let t=e.device.name,n=s(e.device),r=F(e.deviceKey),i=F(e.stateDir),a=T(e.allocator),o=N(e);return!n||!r||!i||!a||!o||r!==f(n)?null:{deviceKey:r,device:{...n,name:t},stateDir:i,allocator:a,createdAtMs:o.createdAtMs,updatedAtMs:o.updatedAtMs}}function T(e){if(!D(e))return null;let t=E(e.instanceId),n=E(e.identityIncarnationId);return t&&n?{instanceId:t,identityIncarnationId:n}:null}function E(e){return P(e)&&e===e.trim()?e:null}function D(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function O(e){if(!D(e.device)||!P(e.device.name))return null;let t=s(e.device);return t?A(e,t,e.device.name):null}function k(n){if(!D(n.device))return null;let r=n.device,i=r.name;if(!P(i)||!e(r.platform))return null;let a=t(r.platform),o=s({id:r.id,family:a.platform,kind:r.kind,target:r.target,...r.appleOs===void 0?a.platform===`apple`?{appleOs:r.platform===`macos`?`macos`:`ios`}:{}:{appleOs:r.appleOs},...r.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:r.iosPhysicalDeviceBackend}});return o?A(n,o,i):null}function A(e,t,n){let r=j(e),i=M(e),a=N(e);return!r||!i||!a||r.deviceKey!==f(t)?null:{schemaVersion:2,...r,device:{...t,name:n},...i,...a}}function j(e){let t=F(e.deviceKey),n=F(e.session),r=F(e.workspace),i=F(e.stateDir);return!t||!n||!r||!i?null:{deviceKey:t,session:n,workspace:r,stateDir:i}}function M(e){let{ownerPid:t,ownerStartTime:n}=e,r=F(e.ownerToken);return!I(t)||!r||n!==null&&!P(n)?null:{ownerPid:t,ownerStartTime:n,ownerToken:r}}function N(e){let{createdAtMs:t,updatedAtMs:n,abandonedAtMs:r}=e;return!L(t)||!L(n)||r!==void 0&&!L(r)?null:{createdAtMs:t,updatedAtMs:n,...L(r)?{abandonedAtMs:r}:{}}}function P(e){return typeof e==`string`&&e.length>0}function F(e){return P(e)?e:null}function I(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function L(e){return typeof e==`number`&&Number.isFinite(e)}function R(e){let t=m(),n=z(t);if(`claims`in n)return n.claims;let r=n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>K(c.join(t,e.name))).filter(e=>e!==null).filter(t=>B(t.claim??t.allocatorClaim,e)),a=i(r.flatMap(e=>e.claim?[e.claim.ownerPid]:[]));return r.map(e=>e.claim?J(e,a.get(e.claim.ownerPid)??null):e)}function z(e){try{return{entries:l.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:c.basename(e),classification:`unknown`,error:String(t)}]}}}function B(e,t){return!e||[V(e,t.udid??t.serial),H(e,t.device),U(e,t.platform)].every(Boolean)}function V(e,t){return!t||e.device.id===t}function H(e,t){return!t||e.device.name===t||e.device.id===t}function U(e,t){return n({platform:e.device.family,appleOs:e.device.appleOs},t)}function W(e){let t=K(e);return t?.claim?J(t,i([t.claim.ownerPid]).get(t.claim.ownerPid)??null):t}function G(e){let t=K(e);return t?.allocatorClaim||t?.classification===`allocator-inconsistent`?t:null}function K(e){let t=c.basename(e);try{return q(t,l.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function q(e,t){try{let n=JSON.parse(t),r=y(n);return r?_(r)?{fileName:e,deviceKey:r.deviceKey,allocatorClaim:r,classification:`allocator-held`}:{fileName:e,deviceKey:r.deviceKey,claim:r,classification:`unknown`}:{fileName:e,classification:b(n)?`allocator-inconsistent`:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function J(e,t){let n=e.claim;if(!n)return e;let r={pid:n.ownerPid,startTime:n.ownerStartTime},i=a({owner:r,stateDir:n.stateDir},t),s=i===`live`&&o({...r,stateDir:n.stateDir});return{...e,classification:s?`owner-daemon-superseded`:i}}function Y(e){switch(e){case`owner-process-dead`:case`owner-process-reused`:case`owner-state-dir-gone`:case`owner-daemon-superseded`:return!0;case`live`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}function X(e){switch(e){case`owner-process-dead`:case`owner-daemon-superseded`:return!0;case`live`:case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}export{G as a,f as c,R as i,h as l,Y as n,v as o,W as r,g as s,X as t,m as u};
1
+ import{S as e,_ as t,o as n}from"./sdk-device.js";import{Zt as r}from"./sdk-batch.js";import{n as i,x as a}from"./owner-identity.js";import"./process.js";import{t as o}from"./daemon-registration.js";import{r as s}from"./durable-resource.js";import"./src7.js";import c from"node:crypto";import l from"node:fs";import u from"node:os";import d from"node:path";function f(e){return p(`family`in e?e.family:e.platform,e.appleOs,e.id)}function p(e,t,n){return`local:${e}:${t??`none`}:${n}`}function m(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?d.resolve(e):d.join(u.homedir(),`.agent-device`,`device-claims`)}function h(e){let t=c.createHash(`sha256`).update(e).digest(`hex`);return d.join(m(),`${t}.json`)}function g(e){return{deviceKey:e.deviceKey,ownerToken:e.ownerToken,ownerPid:e.ownerPid,ownerStartTime:e.ownerStartTime}}function _(e){return e.schemaVersion===3}function v(e){return r(e.allocator.instanceId)}function y(e){return D(e)?e.schemaVersion===3?S(e):e.schemaVersion===2?O(e):e.schemaVersion===1?k(e):null:null}function b(e){return D(e)&&e.schemaVersion===3}const x=[`ownerPid`,`ownerStartTime`,`ownerToken`,`session`,`workspace`,`abandonedAtMs`];function S(e){if(e.kind!==`allocator`||C(e))return null;let t=w(e);return t&&{schemaVersion:3,kind:`allocator`,...t}}function C(e){return x.some(t=>e[t]!==void 0)}function w(e){if(!D(e.device)||!P(e.device.name))return null;let t=e.device.name,n=s(e.device),r=F(e.deviceKey),i=F(e.stateDir),a=T(e.allocator),o=N(e);return!n||!r||!i||!a||!o||r!==f(n)?null:{deviceKey:r,device:{...n,name:t},stateDir:i,allocator:a,createdAtMs:o.createdAtMs,updatedAtMs:o.updatedAtMs}}function T(e){if(!D(e))return null;let t=E(e.instanceId),n=E(e.identityIncarnationId);return t&&n?{instanceId:t,identityIncarnationId:n}:null}function E(e){return P(e)&&e===e.trim()?e:null}function D(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function O(e){if(!D(e.device)||!P(e.device.name))return null;let t=s(e.device);return t?A(e,t,e.device.name):null}function k(e){if(!D(e.device))return null;let r=e.device,i=r.name;if(!P(i)||!t(r.platform))return null;let a=n(r.platform),o=s({id:r.id,family:a.platform,kind:r.kind,target:r.target,...r.appleOs===void 0?a.platform===`apple`?{appleOs:r.platform===`macos`?`macos`:`ios`}:{}:{appleOs:r.appleOs},...r.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:r.iosPhysicalDeviceBackend}});return o?A(e,o,i):null}function A(e,t,n){let r=j(e),i=M(e),a=N(e);return!r||!i||!a||r.deviceKey!==f(t)?null:{schemaVersion:2,...r,device:{...t,name:n},...i,...a}}function j(e){let t=F(e.deviceKey),n=F(e.session),r=F(e.workspace),i=F(e.stateDir);return!t||!n||!r||!i?null:{deviceKey:t,session:n,workspace:r,stateDir:i}}function M(e){let{ownerPid:t,ownerStartTime:n}=e,r=F(e.ownerToken);return!I(t)||!r||n!==null&&!P(n)?null:{ownerPid:t,ownerStartTime:n,ownerToken:r}}function N(e){let{createdAtMs:t,updatedAtMs:n,abandonedAtMs:r}=e;return!L(t)||!L(n)||r!==void 0&&!L(r)?null:{createdAtMs:t,updatedAtMs:n,...L(r)?{abandonedAtMs:r}:{}}}function P(e){return typeof e==`string`&&e.length>0}function F(e){return P(e)?e:null}function I(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function L(e){return typeof e==`number`&&Number.isFinite(e)}function R(e){let t=m(),n=z(t);if(`claims`in n)return n.claims;let r=n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>K(d.join(t,e.name))).filter(e=>e!==null).filter(t=>B(t.claim??t.allocatorClaim,e)),i=a(r.flatMap(e=>e.claim?[e.claim.ownerPid]:[]));return r.map(e=>e.claim?J(e,i.get(e.claim.ownerPid)??null):e)}function z(e){try{return{entries:l.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:d.basename(e),classification:`unknown`,error:String(t)}]}}}function B(e,t){return!e||[V(e,t.udid??t.serial),H(e,t.device),U(e,t.platform)].every(Boolean)}function V(e,t){return!t||e.device.id===t}function H(e,t){return!t||e.device.name===t||e.device.id===t}function U(t,n){return e({platform:t.device.family,appleOs:t.device.appleOs},n)}function W(e){let t=K(e);return t?.claim?J(t,a([t.claim.ownerPid]).get(t.claim.ownerPid)??null):t}function G(e){let t=K(e);return t?.allocatorClaim||t?.classification===`allocator-inconsistent`?t:null}function K(e){let t=d.basename(e);try{return q(t,l.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function q(e,t){try{let n=JSON.parse(t),r=y(n);return r?_(r)?{fileName:e,deviceKey:r.deviceKey,allocatorClaim:r,classification:`allocator-held`}:{fileName:e,deviceKey:r.deviceKey,claim:r,classification:`unknown`}:{fileName:e,classification:b(n)?`allocator-inconsistent`:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function J(e,t){let n=e.claim;if(!n)return e;let r={pid:n.ownerPid,startTime:n.ownerStartTime},a=i({owner:r,stateDir:n.stateDir},t),s=a===`live`&&o({...r,stateDir:n.stateDir});return{...e,classification:s?`owner-daemon-superseded`:a}}function Y(e){switch(e){case`owner-process-dead`:case`owner-process-reused`:case`owner-state-dir-gone`:case`owner-daemon-superseded`:return!0;case`live`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}function X(e){switch(e){case`owner-process-dead`:case`owner-daemon-superseded`:return!0;case`live`:case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}export{G as a,f as c,R as i,h as l,Y as n,v as o,W as r,g as s,X as t,m as u};
@@ -1 +1 @@
1
- import{F as e,N as t,P as n,c as r,o as i}from"./sdk-contracts.js";import"./capture.js";import{i as a,p as o}from"./sdk-batch-runner.js";import{p as s}from"./android-input-ownership.js";import{C as c,d as l,l as u,p as d}from"./sdk-device.js";import{f,n as p,u as m}from"./lease-scope.js";import{Ar as h,Dr as ee,Lr as te,Yr as g,Yt as ne,en as _,or as re,tn as ie}from"./sdk-batch.js";import{a as ae}from"./script.js";import"./session-store.js";import{i as oe}from"./back-mode.js";import{r as v}from"./diagnostics.js";import{t as se}from"./timeouts.js";import"./diagnostics2.js";import{s as ce}from"./device-shell.js";import{n as le}from"./retry.js";import{n as y}from"./runtime-transport-hints.js";import{_ as ue,a as de,c as fe,d as b,f as pe,g as me,h as he,i as ge,l as _e,m as ve,n as x,o as ye,p as S,r as be,s as C,u as xe,v as Se,y as Ce}from"./human-control-contract.js";import{c as we}from"./request-cancel.js";import{t as Te}from"./request.js";import{n as Ee,t as De,u as Oe}from"./provider-session-ownership.js";import{r as ke}from"./application-lifecycle-runtime.js";import{a as Ae,c as w,l as je,n as Me,o as Ne,r as Pe,t as Fe}from"./device-claim-inspection.js";import{b as Ie,c as Le,g as Re,i as ze,p as Be,x as T}from"./perf-runtime-plan.js";import{n as Ve,r as He,t as Ue}from"./lease-context.js";import{d as We,g as Ge,u as Ke}from"./screenshot-runtime.js";import{n as qe}from"./screen-recording-admission-ledger.js";import{a as Je,c as Ye,d as E,l as Xe,n as Ze,o as Qe,r as $e,u as D}from"./src8.js";import{n as et,t as tt}from"./compatibility-policy.js";import{o as nt}from"./screen-recording-resource-recovery.js";import O from"node:path";import"node:fs";import rt,{createHash as it}from"node:crypto";import at from"node:os";import k from"node:fs/promises";function ot(e,t){return A(e,t)?t:`${e}:${t}`}function A(e,t){return t.startsWith(`${e}:`)}function st(e,t){return!e.partitioned||A(e.tenant,t)}var ct=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},lt=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},ut=class{holdsByDevice=new Map;mutations=new ct;inFlightWork=new lt;leases=new Map;runBindings=new Map;deviceBindings=new Map;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=_e(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new De({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=ve(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=fe(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let n=S(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(i,t);if(i.deviceKey)throw xe(i);return C(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=ue(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);ye(n,e),C(n,e);let r=e.ttlMs===void 0?pe(n):this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(n,r)}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=ue(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return ye(n,e),C(n,e),{...n}}assertLeaseAdmission(e){let t=he(e);this.cleanupExpiredLeases(),C(this.getActiveLease(t.leaseId),t)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?b(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>x(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,n,r,i){i?.throwIfAborted();let a=ge(n),o=de(r);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=b(s),l=this.findHumanControlHold(a);if(l&&(this.assertHoldAuthority(e,l),b(l.hold.scope)!==c))throw new t(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:a,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(a,d),await this.activateHumanControlHold(c,d,o.ttlMs,i)}async activateHumanControlHold(e,n,r,i){let a=this.holdsByDevice.get(e),{id:o}=n.hold;try{if(await this.mutations.wait(e,i),i?.throwIfAborted(),a.get(o)!==n)throw new t(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return n.hold={...n.hold,state:`active`,updatedAt:s,...r===void 0?{}:{expiresAt:s+r}},this.refreshHeldLease(e,s),x(n.hold)}catch(t){throw a.get(o)===n&&this.deleteHumanControlHold(e,o),t}}removeHumanControlHold(e,t){let n=ge(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=b(r.hold.scope);return this.deleteHumanControlHold(i,n),x(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=b(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw be(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=b(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let n=this.getActiveLease(e);if(!n.deviceKey)throw new t(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...n,deviceKey:n.deviceKey}}resolveHumanControlScope(e,n){if(e.kind===`host`){if(!n.scope)throw new t(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return n.scope}if(n.scope)throw new t(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let r=this.requireHumanControlLease(e.leaseId);return{backend:r.backend,leaseProvider:r.leaseProvider,deviceKey:r.deviceKey}}assertHoldAuthority(e,n){if(e.kind===`host`)return;let r=this.requireHumanControlLease(e.leaseId);if(n.ownerLeaseId!==r.leaseId||b(r)!==b(n.hold.scope))throw new t(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=b(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,pe(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=me(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let n=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(n<this.maxActiveSimulatorLeases))throw new t(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:n,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let n=this.leases.get(e);if(n)return n;throw new t(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(S(e),e.leaseId);let t=b(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.runBindings.delete(S(e));let n=b(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=b({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw xe(r)}};function dt(e){let n=Ce(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,i=Se(r);if(r&&!i)throw new t(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(n!==`tenant`)return e;if(!i)throw new t(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let a=e.session||`default`;return A(i,a)?{...e,meta:{...e.meta,tenantId:i,sessionIsolation:n}}:{...e,session:ot(i,a),meta:{...e.meta,tenantId:i,sessionIsolation:n}}}function ft(e,n,r,i={}){if(We(e.command))return;let a=Ve(e);ht(e,a);let o=r?.lease;if(r===void 0&&!a.leaseId&&pt(e,i.providerAppCatalog))return;if(e.command===`human_control`&&!o&&!a.leaseId)throw new t(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!a.leaseId||!a.tenantId&&!a.runId))return;gt(a,o);let s=He(e,r);n.assertLeaseAdmission(m(s));let c=n.heartbeatLease(m(s));return Ke(e)&&n.assertHumanControlAdmission(c),c}function pt(e,t){let n=Ge(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function mt(e){We(e.command)||ht(e,Ve(e))}function ht(e,n){if(e.command!==`open`)return;let r=p(n);if(r.length!==0)throw new t(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:r})}function gt(e,t){t&&(j(`leaseId`,e.leaseId,t.leaseId),j(`tenantId`,e.tenantId,t.tenantId),j(`runId`,e.runId,t.runId),j(`leaseProvider`,e.leaseProvider,t.leaseProvider),j(`clientId`,e.clientId,t.clientId),j(`deviceKey`,e.deviceKey,t.deviceKey))}function j(e,n,r){if(!(!n||!r||n===r))throw new t(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function _t(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),v({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return v({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}function vt(e){mt(e)}async function yt(e){let t=e.sessionStore.get(e.sessionName),n=t?.lease;return!t||!n||!e.leaseRegistry.consumeExpiredLease(n.leaseId)?!1:(v({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:n.leaseId,session:t.name,deviceKey:n.deviceKey}}),await e.teardownSession(t,t.name).catch(e=>{v({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:n.leaseId,session:t.name,error:e instanceof Error?e.message:String(e)}})}),await Ie(t.deviceClaim).catch(e=>{v({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:t.name,deviceKey:t.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.delete(t.name),!0)}function bt(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.get(t),a=ft(e.req,r,i,{providerAppCatalog:e.providerAppCatalog});if(!a)return e.req;let o={...e.req,internal:{...e.req.internal,admittedLease:a}};return i?.lease&&n.set(t,{...i,lease:{...i.lease,leaseBackend:a.backend,expiresAt:a.expiresAt}}),o}function xt(e){return Ue(e.req,e.req.internal?.admittedLease)??e.existingLease}async function St(e){let t=e.session.lease;if(!t)return;let n=f({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n),i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=Ee(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return v({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const Ct=[`platform`,`target`],wt=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function Tt(e){return u({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function Et(e){return Tt(e)||kt(e,Ct)}function Dt(e){return Et(e)||kt(e,wt)}function Ot(e){return typeof e==`string`&&e.trim().length>0}function kt(e,t){return e?t.some(t=>Ot(e[t])):!1}function At(e){return{appleSimulatorAppTarget:jt(e)}}function jt(e){return e&&!a(e)?e:void 0}function Mt(){return qe({displayName:`audio probe`})}function Nt(){return qe({displayName:`perf capture`})}function Pt(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return it(`sha256`).update(re(t),`utf8`).digest(`hex`)}function Ft(e,t,n){return new Wt(Lt(It(t.resolve(e))),n).parse()}function It(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function Lt(e){let n=[],r=0;for(;r<e.length;){let i=e.slice(r),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){r+=a;continue}let o=Rt(i);if(!o)throw new t(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);n.push(o.value),r+=o.length}return n}function Rt(e){return zt(e)??Bt(e)??Vt(e)??Ht(e)??Ut(e)}function zt(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function Bt(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function Vt(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function Ht(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Ut(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Wt=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let e=this.parseOr();if(this.peek())throw new t(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new t(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new t(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.consumePlatformToken();let e=this.consumeComparisonOperator(),t=this.consumeStringLiteral(),n=this.platform===t.toLowerCase();return e.value===`==`?n:!n}consumePlatformToken(){if(this.peek()?.type!==`platform`)throw new t(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}consumeComparisonOperator(){let e=this.peek();if(e?.type!==`operator`||e.value!==`==`&&e.value!==`!=`)throw new t(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,e}consumeStringLiteral(){let e=this.peek();if(e?.type!==`string`)throw new t(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`);return this.index+=1,e.value}consumeOperator(e){let t=this.peek();return t?.type!==`operator`||t.value!==e?!1:(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type!==`paren`||t.value!==e?!1:(this.index+=1,!0)}peek(){return this.tokens[this.index]}};function Gt(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function Kt(e,t){return{...P(e,t),source:e.source}}function M(e,n,r){if(e===void 0)return;let i=r??Je[n]??{},a=Qe(i),o;if(typeof e==`number`)o=e;else{let r=e.trim();if(r===``)throw new t(`INVALID_ARGS`,`Maestro ${n} must be ${a}.`);o=Number(r)}if(!Number.isFinite(o)||Math.abs(o)>2**53-1||i.integer&&!Number.isSafeInteger(o)||i.nonNegative&&o<0||i.positive&&o<=0)throw new t(`INVALID_ARGS`,`Maestro ${n} must be ${a}.`);return o}function qt(e,t,n,r){return M(e===void 0?t:n.resolve(String(e)),r)}function N(t){if(t?.aborted)throw e()}async function Jt(e,n){if(e.include.kind===`commands`)return{kind:`program`,source:e.source,config:{},commands:e.include.commands};if(!n.loadProgram)throw new t(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return N(n.signal),n.signal?await n.loadProgram(e.include.path,e.source.path,n.signal):await n.loadProgram(e.include.path,e.source.path)}function Yt(e,t){if(e.include.kind===`file`)return O.resolve(t?O.dirname(t):process.cwd(),e.include.path)}function Xt(e){return e===void 0?void 0:O.resolve(e)}function Zt(e,n){let r=Yt(e,e.source.path);if(r&&n.has(r))throw new t(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);return r}function Qt(e,n,r,i){let a=e.include.kind===`file`?Xt(n.source.path):void 0,o=new Set([r,a].filter(e=>e!==void 0)),s=[...o].find(e=>i.has(e));if(s)throw new t(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function $t(e,t,n){return e.platform&&e.platform!==n.platform?!1:e.true===void 0?!0:typeof e.true==`boolean`?e.true:Ft(e.true,t,n.platform)}function en(e){return[...e.visible?[{kind:`visible`,selector:e.visible}]:[],...e.notVisible?[{kind:`notVisible`,selector:e.notVisible}]:[]]}function P(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>P(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,P(n,t)])):e}async function tn(e,t){N(t.signal);let n=Xt(e.source.path),r={options:t,context:Ye(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await nn(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function nn(e,t,n,r,i){N(i.options.signal);let a=pn(t,e.config.env),o=e.config.appId??n,s=i.context.enter(e.config.env);try{let t=[...e.config.onFlowStart??[],...e.commands,...e.config.onFlowComplete??[]],n=[];for(let s of t)n.push(...await an(s,a,o,e.source.path??r,i));return n}finally{s()}}async function rn(e,t,n,r,i){let a=[];for(let o of e)a.push(...await an(o,t,n,r,i));return a}async function an(e,t,n,r,i){N(i.options.signal);let a=mn(e,r);switch(a.kind){case`runFlow`:{let e=sn(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await on(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[F(a,t,n,o)]}case`repeat`:return[F(a,t,n,await rn(a.commands,t,n,r,i))];case`retry`:return[F(a,t,n,await rn(a.commands,t,n,r,i))];default:return[dn(a,t,n)]}}async function on(e,t,n,r,i){let a=ln(e,i.context),o=Zt(a,i.activeIncludePaths),s=await Jt(a,i.options);N(i.options.signal);let c=Qt(a,s,o,i.activeIncludePaths),l=pn(t,e.env),u=i.context.enter(e.env);try{return await nn(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function sn(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:cn(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function cn(e,t){if(e===!1)return`omit`;if(typeof e==`string`)return un(t.context.resolveDeferred(e))?`opaque`:Ft(e,t.context,t.options.platform)?void 0:`omit`}function ln(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function un(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function dn(e,t,n){return E({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function F(e,t,n,r){return E({kind:`opaque`,command:fn(e),source:e.source,scopes:t,body:r,appId:n})}function fn(e){switch(e.kind){case`runFlow`:return E({kind:e.kind,source:e.source,when:e.when,label:e.label,...e.include.kind===`file`?{includePath:e.include.path}:{}});case`repeat`:return{kind:e.kind,source:e.source,times:e.times};case`retry`:return E({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function pn(e,t){return t===void 0?e:[...e,t]}function mn(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function hn(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await tn(e,t),a=gn(t.runtimeHints),o=E({kind:`maestroReplayPlan`,platform:t.platform,target:t.target,runtimeHints:a,initialStaticEnv:structuredClone({...t.defaults??{},...e.config.env??{},...t.env??{}}),steps:structuredClone(n),total:n.length,compatibility:{staticallyExecutedControls:r,staticallySkippedControls:i}}),s=Pt(o);return _n({...o,digest:s})}function gn(e){if(!e)return;let t=Object.entries(e).filter(e=>e[1]!==void 0);return t.length===0?void 0:Object.fromEntries(t)}function _n(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))_n(t);return Object.freeze(e)}function vn(e,t={}){let{from:n,planDigest:r}=t;if(n===void 0&&r===void 0)return{allowed:!0,startIndex:0};if(n===void 0||r===void 0)return{allowed:!1,reason:`replay --from requires --plan-digest (and --plan-digest requires --from).`};if(!Number.isInteger(n)||n<1||n>e.total)return{allowed:!1,reason:`replay --from ${n} is out of range for a ${e.total}-step plan.`};if(r!==e.digest)return{allowed:!1,reason:`replay --plan-digest does not match the current plan digest.`};if(n===1)return{allowed:!0,startIndex:0};for(let t=0;t<n-1;t+=1){let n=e.steps[t];if(n.kind===`opaque`)return{allowed:!1,reason:`step ${t+1} is opaque runtime control flow (${n.command.kind}) and cannot be skipped safely.`};if(n.command.kind===`runScript`||n.command.kind===`evalScript`)return{allowed:!1,reason:`step ${t+1} (${n.command.kind}) can produce outputEnv values and cannot be skipped safely.`}}let i=e.steps[n-1];return i.kind===`opaque`?{allowed:!1,reason:`step ${n} is opaque runtime control flow (${i.command.kind}) and cannot be resumed into.`}:{allowed:!0,startIndex:n-1}}function yn(e,n={}){let r=vn(e,n);if(!r.allowed)throw new t(`INVALID_ARGS`,r.reason);return r.startIndex}function bn(e,n){if(!Number.isInteger(n)||n<0||n>e.total)throw new t(`INVALID_ARGS`,`Maestro replay startIndex ${n} is out of range for a ${e.total}-step plan.`);return n}const xn=`maestro-test-failure`;function I(e,n={}){return new t(`COMMAND_FAILED`,e,{...n,reason:xn})}function Sn(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason===xn}const Cn=new Set([``,`false`,`0`,`null`,`undefined`]);function wn(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0&&!Number.isNaN(e):!Cn.has(e)}async function Tn(e,t){N(t.options.signal);try{return await Rn(e,t.context,async()=>await En(e,t))}catch(t){throw z(t,e)}}async function En(e,t){if(e.kind===`command`)return await Dn(e.command,e.appId,t);await Nn(e,t)}async function Dn(e,t,n){if(e.kind===`evalScript`)return await An(e,n);let r=Kt(e,n.context);try{return await jn(r,t,n)}catch(e){if(N(n.options.signal),kn(r)&&Sn(e)){n.warnings.push(On(r,e)),n.skipped+=1;return}throw zn(e,r)}}function On(e,n){let r=`${e.source.path?`${e.source.path}:`:``}line ${e.source.line}`,i=n instanceof t?n.message:String(n);return`Optional Maestro ${e.kind} skipped at ${r}: ${i}`}function kn(e){return`optional`in e&&e.optional===!0}async function An(e,n){let{evaluateMaestroEvalScript:r}=await import(`./engine-eval-script.js`);if(n.options.trustedScripts===!1)throw new t(`UNAUTHORIZED`,`Maestro evalScript is not permitted for flows received over the remote daemon surface: node:vm is not a security sandbox, so an untrusted expression can escape to the host.`);let i=await r(e.script,n.context.values);n.context.replaceOutput(i),n.executed+=1}async function jn(e,t,n){switch(e.kind){case`assertVisible`:await R({kind:`visible`,selector:e.target},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await R({kind:`notVisible`,selector:e.target},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`assertTrue`:if(!wn(e.condition))throw I(`Maestro assertTrue condition was falsy: ${JSON.stringify(e.condition)}`);n.executed+=1;return;case`extendedWaitUntil`:await R(Ln(e),M(e.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await Mn(e,t,n)}}async function Mn(e,t,n){let r=E({command:e,env:n.context.values,appId:t===void 0?void 0:n.context.resolve(t),generation:n.context.generation,invalidateObservation:n.context.invalidateObservation,cachedObservation:n.context.observation,signal:n.options.signal}),i=await n.port.execute(r);return N(n.options.signal),i.observation&&n.context.recordObservation(i.observation),i.outputEnv&&n.context.merge(i.outputEnv),i.artifactPaths?.forEach(e=>n.artifacts.add(e)),n.executed+=1,i}async function Nn(e,t){let n=Kt(e.command,t.context);switch(n.kind){case`runFlow`:if(n.when&&!await Fn(n.when,t)){t.skipped+=1;return}t.executed+=1,await L(e.body,t);return;case`repeat`:{let r=qt(n.times,0,t.context,`repeat.times`);t.executed+=1;for(let n=0;n<r;n+=1)N(t.options.signal),await L(e.body,t);return}case`retry`:{let r=Math.min(qt(n.maxRetries,1,t.context,`retry.maxRetries`),et.control.retryMaxRetries);t.executed+=1,await Pn(e.body,r,t);return}}}async function L(e,t){for(let n of e)await Tn(n,t)}async function Pn(e,n,r){let i;for(let t=0;t<=n;t+=1){N(r.options.signal);try{await L(e,r);return}catch(t){if(N(r.options.signal),!Sn(Vn(t)))throw t;i=z(t,e[0])}}throw i||new t(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function Fn(e,t){if(!$t(e,t.context,t.options))return!1;for(let n of en(e))if(N(t.options.signal),!(await In(n,t.timing.runFlowConditionTimeoutMs,t)).matched)return!1;return!0}async function R(e,t,n){if(!(await In(e,t,n)).matched)throw I(`Maestro ${e.kind} condition did not match.`)}async function In(e,t,n){let r={condition:e,timeoutMs:t,generation:n.context.generation,env:n.context.values,...n.context.observation?{cachedObservation:n.context.observation}:{},...n.options.signal?{signal:n.options.signal}:{}},i=await n.port.observe(r);return N(n.options.signal),n.context.recordObservation(i),i}function Ln(e){if(e.visible)return{kind:`visible`,selector:e.visible};if(e.notVisible)return{kind:`notVisible`,selector:e.notVisible};throw new t(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function Rn(e,t,n){let r=e.scopes.map(e=>t.enter({...e}));try{return await n()}finally{for(let e=r.length-1;e>=0;--e)r[e]()}}function z(e,t){if(Bn(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:Hn(e,t?.command),source:n,...t?{command:t.command}:{}}}function zn(e,t){return{kind:`maestroPlanStepFailure`,error:Hn(e,t),source:t.source,command:t}}function Bn(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function Vn(e){return Bn(e)?e.error:e}function Hn(e,n){if(!(e instanceof t)||!n||/\bline \d+\b/.test(e.message))return e;let r=n.source.path?`${n.source.path}:`:``;return new t(e.code,`${e.message} (${r}line ${n.source.line})`,e.details)}async function Un(e,n,r={}){N(r.signal);let i=r.startIndex??0;if(!Number.isInteger(i)||i<0||i>e.total)throw new t(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${e.total}-step plan.`);let a={plan:e,port:n,options:r,context:Ye(r.defaults,r.env?{...r.env}:{}),timing:tt,artifacts:new Set,warnings:[],executed:e.compatibility.staticallyExecutedControls,skipped:e.compatibility.staticallySkippedControls};for(let t=i;t<e.steps.length;t+=1)try{await Wn(e.steps[t],t,a)}catch(e){throw Vn(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function Wn(e,t,n){N(n.options.signal);let r=n.options.now??Date.now,i=r(),a=n.port.readMetrics?.(),o=n.context.generation,s={command:e.command,source:e.source,generation:o,stepIndex:t+1,stepTotal:n.plan.total};B(()=>n.options.observer?.commandStarted?.(s));try{let t=await Tn(e,n);N(n.options.signal),B(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...Gn(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=z(t,e);throw B(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...Gn(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],warnings:[...n.warnings]})),o}}function Gn(e,t){return!e||!t?{}:{runtimeMetrics:{hierarchyCaptures:t.hierarchyCaptures-e.hierarchyCaptures,screenshotCaptures:t.screenshotCaptures-e.screenshotCaptures,tapRetries:t.tapRetries-e.tapRetries,settleLatches:t.settleLatches-e.settleLatches,settleTimeouts:t.settleTimeouts-e.settleTimeouts}}}function B(e){try{e?.()}catch{}}async function Kn(e,t,n={}){let r=qn(e,n);return await Un(e,t,{...n,startIndex:r})}function qn(e,t){return t.from!==void 0||t.planDigest!==void 0?yn(e,{from:t.from,planDigest:t.planDigest}):bn(e,t.startIndex??0)}function Jn(e){return Gt(e)?{command:e.kind,...e.kind===`runFlow`?H(e.label??e.includePath):{}}:{command:e.kind,...Yn(e)}}function Yn(e){return`label`in e&&e.label?H(e.label):Xn(e)?H(rr(e.target)):Zn(e)?Qn(e):e.kind===`inputText`?H(`<text>`):$n(e)}function Xn(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function Zn(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function Qn(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return H(V(e.target));case`extendedWaitUntil`:return H(V(e.visible??e.notVisible));case`scrollUntilVisible`:return H(V(e.element))}}function $n(e){return er(e)?tr(e):e.kind===`swipe`?nr(e):e.kind===`runFlow`?H(e.label??(e.include.kind===`file`?e.include.path:``)):e.kind===`assertTrue`?H(String(e.condition)):{}}function er(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function tr(e){switch(e.kind){case`openLink`:return H(e.link);case`takeScreenshot`:return H(e.path);case`runScript`:return H(e.file);case`pressKey`:return H(e.key)}}function nr(e){return H(e.gesture.kind===`coordinates`?`${ir(e.gesture.start)} to ${ir(e.gesture.end)}`:e.gesture.direction)}function rr(e){return e.space===`target`?V(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function V(e){return e?.id??e?.text}function ir(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function H(e){return e?{value:e}:{}}const ar=new Set(String.raw`^$\.*+?()[]{}|`);function or(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function sr(e){try{new RegExp(e)}catch{return e}let t=``;for(let n=0;n<e.length;n+=1){let r=e[n];if(r!==`\\`){if(ar.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!ar.has(i))return;t+=i,n+=1}return t}function cr(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(g(e.rect))return t.isVisibleInEffectiveViewport(e);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=t.findAncestor(e,e=>h(e,n)?e:null);return r?g(r.rect)?t.isVisibleInEffectiveViewport(r):n!==`android`&&r.hittable===!0:!1}function lr(e,t,n){return!!n.findAncestor(e,e=>e.index===t.index?e:null)}function ur(e,t){let n=[t.id===void 0?void 0:fr(e.identifier,t.id),t.text===void 0?void 0:pr(e,t.text)].filter(e=>e!==void 0);return!(n.length===0&&t.enabled===void 0&&t.selected===void 0||n.some(e=>!e)||t.enabled!==void 0&&e.enabled!==!1!==t.enabled||t.selected!==void 0&&e.selected===!0!==t.selected)}function dr(e){return e.matches.filter(t=>cr(t,e.visibility,e.platform))}function fr(e,t){let n=e??``;return D(n)===D(t)||or(n,t)}function pr(e,t){return[e.label,Xe(e),e.identifier].filter(e=>!!e).some(e=>fr(e,t))}function mr(e){return e.index!==void 0||e.childOf!==void 0||e.below!==void 0||e.above!==void 0||e.leftOf!==void 0||e.rightOf!==void 0||e.containsChild!==void 0||e.containsDescendants!==void 0}function hr(e){return e.text!==void 0||e.id!==void 0||e.enabled!==void 0||e.selected!==void 0}function gr(e,t,n){let r=[],i=0;for(let a of e)for(let e of n){let n=vr(a.rect,e.rect);n===void 0||!_r(t,a.rect,e.rect)||r.push({node:a,distance:n,order:i++})}return r.sort((e,t)=>e.distance-t.distance||e.order-t.order),r.map(({node:e})=>e)}function _r(e,t,n){switch(e){case`below`:return t.y>n.y;case`above`:return t.y<n.y;case`leftOf`:return t.x<n.x;case`rightOf`:return t.x>n.x}}function vr(e,t){if(!(!yr(e)||!yr(t)))return Math.fround(Math.hypot(U(e.x,e.width)-U(t.x,t.width),U(e.y,e.height)-U(t.y,t.height)))}function yr(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite))}function U(e,t){return e+Math.trunc(t/2)}function br(e,n={},r={}){let i=ee(e.nodes,n);n.onVisibilityContextCreated?.();let a=new WeakMap,o=new WeakSet,s=new WeakMap,c=new Map,l=t=>t.parentIndex===void 0?void 0:i.nodeByIndex.get(t.parentIndex)??e.nodes[t.parentIndex],u=e=>{let t=s.get(e);if(t)return t;let n=new Set,r=new Set,i=l(e);for(;i&&!r.has(i.index);)r.add(i.index),n.add(i.index),i=l(i);return s.set(e,n),n},d=(t,r)=>{let i=c.get(t);i||(i=new WeakMap,c.set(t,i));let a=i.get(r);if(a)return a;n.onPositionComputed?.(t,r);let o=gr(e.nodes,t,m(r).indexed),s={ordered:o,candidateIndexes:new Set(o.map(e=>e.index))};return i.set(r,s),s},f=(e,t)=>d(e,t).ordered,p=(e,t)=>d(e,t).candidateIndexes,m=i=>{let s=a.get(i);if(s)return s;if(o.has(i))throw new t(`INVALID_ARGS`,`Maestro selector relations cannot contain cycles.`);o.add(i),n.onSelectorComputed?.(i);try{let t=xr(e,i,l,u,m,p),n={matches:t,indexed:Tr(t,i.index,r.orderUnindexed)};return a.set(i,n),n}finally{o.delete(i)}};return{visibility:i,resolve:m,resolvePosition:f}}function xr(e,t,n,r,i,a){let{index:o,childOf:s,below:c,above:l,leftOf:u,rightOf:d,containsChild:f,containsDescendants:p,...m}=t,h=hr(m)?e.nodes.filter(e=>ur(e,m)):[...e.nodes];if(s){let e=new Set(i(s).indexed.map(e=>e.index));h=h.filter(t=>Cr(r(t),e))}if(f){let e=new Set(i(f).indexed.map(n).filter(e=>e!==void 0).map(e=>e.index));h=h.filter(t=>e.has(t.index))}if(p){let e=p.map(e=>Sr(i(e).indexed,r));h=h.filter(t=>e.every(e=>e.has(t.index)))}for(let[e,n]of wr(t)){let t=a(e,n);h=h.filter(e=>t.has(e.index))}return h}function Sr(e,t){let n=new Set;for(let r of e)for(let e of t(r))n.add(e);return n}function Cr(e,t){for(let n of e)if(t.has(n))return!0;return!1}function wr(e){return[[`below`,e.below],[`above`,e.above],[`leftOf`,e.leftOf],[`rightOf`,e.rightOf]].filter(e=>e[1]!==void 0)}function Tr(e,t,n){if(t===void 0)return n?n(e):[...e];let r=Dr(e)[Or(t)];return r?[r]:[]}function Er(e,t){return t===void 0?e[0]:Dr(e)[Or(t)]}function Dr(e){return[...e].sort((e,t)=>{let n=W(e.rect?.y),r=W(t.rect?.y);return n===r?W(e.rect?.x)-W(t.rect?.x):n-r})}function W(e){return e!==void 0&&Number.isFinite(e)?e:2**53-1}function Or(e){let n=typeof e==`number`?e:Number(e.trim());if(!Number.isSafeInteger(n)||n<0)throw new t(`INVALID_ARGS`,`Maestro selector.index must be a non-negative integer.`);return n}const kr={android:{kind:`exact`,provider:`android-helper`},ios:{kind:`divergence`,provider:`apple-xctest`,reason:`maestro-clickable-not-exposed-by-provider`}};function Ar(e,t){let n=kr[t];if(n.kind===`divergence`)return n;let r=s(e);return r?r.kind!==`exact`||r.provider!==n.provider?{kind:`divergence`,provider:n.provider,reason:`unregistered-provider-evidence`}:r:{kind:`divergence`,provider:n.provider,reason:`exact-evidence-not-retained`}}function G(e,t){return t.kind===`exact`?e.map((e,n)=>({node:e,order:n,rank:jr(t.clickableByNodeIndex.get(e.index))})).sort((e,t)=>t.rank-e.rank||e.order-t.order).map(({node:e})=>e):[...e]}function jr(e){return e===!0?2:+(e===!1)}function Mr(e,t,n,r={}){let i=Ar(e,n),a=Pr(e,i,r),o=Nr(t,a),s=dr({visibility:a.visibility,matches:o.matches,platform:n});return{...o,visible:s,clickability:i,ranked:Fr(s,t,n,a.visibility,i)}}function Nr(e,t){return{matches:t.resolve(e).matches,parentMatched:e.childOf===void 0||t.resolve(e.childOf).indexed.length>0}}function Pr(e,t,n={}){return br(e,n,t?{orderUnindexed:e=>G(e,t)}:{})}function Fr(e,t,n,r,i){let a=n!==`ios`||!zr(t)?e:e.filter(n=>{if(Hr(n))return!0;let i=e.filter(e=>e!==n&&Br(n,e,t));return!i.some(e=>Hr(e)&&lr(n,e,r))&&!i.some(e=>lr(e,n,r))});return t.index===void 0&&i?G(a,i):a}function Ir(e,t){let n=t===void 0?e.find(K):Lr(e,t);return!n||!K(n)?null:{node:n,rect:n.rect}}function Lr(e,t){return Er(e,t)}function Rr(e){return K(e)?e.rect:void 0}function K(e){return g(e.rect)}function zr(e){return e.id!==void 0||e.text!==void 0}function Br(e,t,n){if(n.id!==void 0&&q(e.identifier)!==q(t.identifier))return!1;if(n.text!==void 0){let n=Vr(e),r=new Set(Vr(t));if(!n.some(e=>r.has(e)))return!1}return!0}function Vr(e){return[e.label,e.value,e.identifier].map(q).filter(e=>e!==void 0)}function q(e){if(e)return D(e)||void 0}function Hr(e){let t=te(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}const Ur=Symbol(`maestroFlowProgram`),Wr=Symbol(`maestroFailureCommand`),Gr=Symbol(`maestroFailurePlan`);function Kr(e,t){let n=$e(e,{sourcePath:t});return{sourcePath:t,name:n.config.name,appTarget:Xr(n),[Ur]:n}}async function qr(e,t,n){let r;try{let i=Ze(O.dirname(e.sourcePath),n.readSource),a=await hn(e[Ur],{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,runtimeHints:n.runtimeHints,loadProgram:i,signal:n.signal}),o=yn(a,{from:n.from,planDigest:n.planDigest}),s=await Kn(a,t,{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,loadProgram:i,signal:n.signal,startIndex:o,trustedScripts:n.trustedScripts,observer:Yr(a,n.observer,e=>{r=e})});return{ok:!0,replayed:a.total-o,planDigest:a.digest,startIndex:o,artifactPaths:s.artifactPaths,...s.warnings?{warnings:s.warnings}:{}}}catch(e){return{ok:!1,error:r?.error??e,...r?{failure:r}:{}}}}function Jr(e,t){let n=Qr(e[Wr]),r=e[Gr].platform;return!n||r!==`android`&&r!==`ios`?[]:Mr(t,n.selector,r).ranked.map(e=>({node:e,basis:$r(n.selector,e)}))}function Yr(e,t,n){return{commandStarted:e=>t?.actionStarted?.(J(e)),commandCompleted:e=>t?.actionCompleted?.({...J(e),durationMs:e.durationMs,runtimeMetrics:e.runtimeMetrics,data:e.data}),commandFailed:r=>{let i=vn(e,{from:r.stepIndex,planDigest:e.digest}),a={...J(r),durationMs:r.durationMs,error:r.error,artifactPaths:r.artifactPaths,warnings:[...r.warnings],isControl:Gt(r.command),redactions:r.command.kind===`inputText`&&r.command.text.length>0?[{name:`inputText.text`,value:r.command.text}]:[],resume:i.allowed?{allowed:!0,from:r.stepIndex,planDigest:e.digest}:{allowed:!1,from:r.stepIndex,planDigest:e.digest,reason:i.reason},[Wr]:r.command,[Gr]:e};n(a),t?.actionFailed?.(a)}}}function J(e){let t=Jn(e.command);return{action:t.command,...t.value?{value:t.value}:{},source:e.source,generation:e.generation,stepIndex:e.stepIndex,stepTotal:e.stepTotal}}function Xr(e){return[e.config.appId,...[...e.config.onFlowStart??[],...e.commands].filter(e=>e.kind===`launchApp`).map(e=>e.kind===`launchApp`?e.appId:void 0)].find(Zr)}function Zr(e){return!!(e?.trim()&&!e.includes(`$`)&&!a(e))}function Qr(e){switch(e.kind){case`tapOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`doubleTapOn`:case`longPressOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`assertVisible`:case`assertNotVisible`:return{selector:e.target};case`extendedWaitUntil`:return e.visible?{selector:e.visible}:e.notVisible?{selector:e.notVisible}:void 0;case`scrollUntilVisible`:return{selector:e.element};case`swipe`:return e.gesture.kind===`target`?{selector:e.gesture.from}:void 0;default:return}}function $r(e,t){return e.id!==void 0||e.text!==void 0&&ur({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text===void 0?`other`:`label`}const ei=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;function ti(e,n){let r=e.files[n];if(r===void 0)throw new t(`INVALID_ARGS`,`replay script source is missing ${n}; it was not part of the script sources sent with this request.`,{path:n,entry:e.entry});return r}function ni(e){let t=ae(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return ai(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function ri(e,t){return t===`ios`?oi(e)??{}:{}}function ii(e,t){let n=ni(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function ai(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!a(e))}function oi(e){let t=jt(e);return t?{appleSimulatorAppTarget:t}:void 0}function si(e){let n=e.flags??{};if(n.waitMs===void 0)return;let[r]=oe(`waitMs`);if(!r)throw new t(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return o(n,`waitMs`,{min:r.min,max:r.max})}function ci(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function li(e){return{...ci(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function ui(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return fi({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function di(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function fi(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=le.fromTimeoutMs(a),s=()=>di(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;Te({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await se(Math.min(250,o.remainingMs())),we(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};pi(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function pi(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}const mi={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},Y=new Map;async function hi(e){let t=await k.mkdtemp(O.join(at.tmpdir(),`agent-device-materialized-`));try{let n=await yi(e.installablePath,O.join(t,`installable`)),r=e.archivePath?await yi(e.archivePath,O.join(t,`archive`)):void 0,i=rt.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{vi(i)},a);return Y.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await k.rm(t,{recursive:!0,force:!0}),e}}async function gi(e,t){await X(e,Oe(Y,e,t,mi))}async function _i(e){let t=Array.from(Y.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await X(e,t)}))}async function vi(e){let t=Y.get(e);if(t)try{await X(e,t)}catch{}}async function X(e,t){clearTimeout(t.timer),Y.delete(e),await k.rm(t.rootPath,{recursive:!0,force:!0})}async function yi(e,t){let n=await k.stat(e);await k.mkdir(t,{recursive:!0});let r=O.join(t,O.basename(e));return n.isDirectory()?(await k.cp(e,r,{recursive:!0}),r):(await k.copyFile(e,r),r)}function bi(e){return e.device.platform===`web`}function xi(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function Si(e){let{session:t,sessionName:n,sessionStore:r}=e;t.appLog&&await Be({session:t,sessionName:n,sessionStore:r,resourcePath:Re.resolvePath(r.resolveSessionDir(n))})}async function Ci(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.perfCapture&&await ze({...e,session:t,intent:`disposal`})}async function wi(e,t){await t.stopSnapshotHelper(e.device)}async function Ti(e){let{session:t,sessionName:n,sessionStore:r,platformCleanup:i}=e;await i.closeManagedBrowser({device:t.device,sessionName:n,stateDir:r.resolveDaemonStateDir(),openSessionNames:()=>xi(r)})}async function Ei(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function Di(e){if(e.failures.length===0)return;let n=e.failures.map(({step:e})=>e),r=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return v({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:n,errors:r}}),new t(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${r.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:n,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function Oi(e){let{session:n,sessionName:r,sessionStore:i}=e;if(!e.platformCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let a=e.platformCleanup,o=[{step:`recording`,run:()=>ki({session:n,sessionName:r,sessionStore:i})},...e.appLog===`run`?[{step:`app_log`,run:()=>Si({session:n,sessionName:r,sessionStore:i})}]:[],{step:`audio_probe`,run:()=>Ai({session:n,sessionName:r,sessionStore:i})},{step:`perf_capture`,run:()=>Ci({session:n,sessionName:r,sessionStore:i})},{step:`platform_snapshot_helper`,run:()=>wi(n,a)},{step:`web_browser`,run:()=>Ti({session:n,sessionName:r,sessionStore:i,platformCleanup:a})}];o.push({step:`materialized_paths`,run:()=>_i(r)});let s=Di({sessionName:r,phase:`session_teardown_cleanup_failed`,failures:await Ei(o)});if(s)throw s}async function ki(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.screenRecording&&await nt({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}async function Ai(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.audioProbe&&await Le({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}function ji(e){return d(e)&&e.kind===`simulator`}function Mi(e){return e.platform===`android`&&e.kind===`emulator`}const Ni=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Z(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Q(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function $(e){return ke(Q(e))}function Pi(e,n){if(e!==void 0){if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`Invalid open runtime ${n}: expected string.`);return y(e)}}function Fi(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Ii(e){if(e!==void 0){if(typeof e!=`number`)throw new t(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Fi(e)}}function Li(e,n,i){if(e===void 0)return i;if(!r(e))throw new t(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(i&&e!==i)throw new t(`INVALID_ARGS`,`open runtime targets ${e}, but session "${n}" is bound to ${i}.`);return e}function Ri(e){if(r(e))return e}function zi(e,t){return{platform:t,metroHost:y(e?.metroHost),metroPort:Fi(e?.metroPort),bundleUrl:y(e?.bundleUrl),launchUrl:y(e?.launchUrl)}}function Bi(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Vi(e){if(Mi(e))return`10.0.2.2`;if(ji(e))return`127.0.0.1`}function Hi(e,t){if(!e||y(e.metroHost)||y(e.bundleUrl)||e.metroPort===void 0)return e;let n=Vi(t);return n?{...e,metroHost:n}:e}function Ui(e){let{runtime:n,sessionName:r,platform:i}=e;if(n===void 0)return;if(!n||typeof n!=`object`||Array.isArray(n))throw new t(`INVALID_ARGS`,`open runtime must be an object.`);let a=n,o=Object.keys(a).find(e=>!Ni.includes(e));if(o)throw new t(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Ni.join(`, `)}.`);return{platform:Li(a.platform,r,i),metroHost:Pi(a.metroHost,`metroHost`),metroPort:Ii(a.metroPort),bundleUrl:Pi(a.bundleUrl,`bundleUrl`),launchUrl:Pi(a.launchUrl,`launchUrl`)}}function Wi(e,t,n){if(n){if(Z(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function Gi(e,n,r,i){let a=e.getRuntimeHints(n);if(!a)return;let o=r?c(r):void 0,s=Ri(o)??i;if(a.platform&&r&&!s)throw new t(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${n}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new t(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${n}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Ki(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Ri(c(i)):e.platform,o=n.getRuntimeHints(r),s=Ui({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Gi(n,r,i,a);return{runtime:i?Hi(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let l=s&&Z(s)>0?s:void 0;return{runtime:i?Hi(l,i):l,previousRuntime:o,replacedStoredRuntime:!0}}function qi(e){return Ki(e).runtime}function Ji(e){try{return{ok:!0,data:Ki(e)}}catch(e){let t=n(e);return i(t.code,t.message,t.details)}}async function Yi(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Xi(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Q(t)})}function Xi(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&$(e.previousRuntime)&&!$(e.runtime)}function Zi(e){let{device:t,owner:n,stateDir:r,intent:i}=e,a=i.kind===`exact-owner`&&ie(i.owner,n)?ne(i.fence):null;if(!a)return{status:`binding-invalid`};let o=w(T(t)),s=Pe(je(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!$i(c.stateDir,r)||!ie(Ne(c),n)?{status:`conflict`,conflict:s}:c.allocator.identityIncarnationId===a.identityIncarnationId?{status:`covered`}:{status:`incarnation-stale`,heldIncarnationId:c.allocator.identityIncarnationId}}function Qi(e){let t=w(T(e));return Ae(je(t))}function $i(e,t){return O.resolve(e)===O.resolve(t)}function ea(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=c(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=l(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${ce(i)}`,`${a} ${ce(e.id)}`,...n===`release`||Me(t.classification)?[`--stale`]:[]].join(` `)}function ta(e,n){if(n.classification===`allocator-held`)return ra(e,n);let r=n.claim,i=ea(e,n,Fe(n.classification)?`release`:`status`),a=c(r?{platform:r.device.family,appleOs:r.device.appleOs}:e);return new t(`DEVICE_IN_USE`,r?`${a} device ${e.id} is owned by session "${r.session}" in workspace "${r.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:ua(n.classification),classification:n.classification,deviceKey:n.deviceKey,...r?{owner:{session:r.session,workspace:r.workspace,stateDir:r.stateDir}}:{},recovery:{command:i},hint:Fe(n.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${i}`:`Inspect the owner with: ${i}`,retriable:!1})}function na(e,t){return la(ta(e,t))}function ra(e,n){let r=n.allocatorClaim,i=c({platform:r.device.family,appleOs:r.device.appleOs}),a=ea(e,n);return new t(`DEVICE_IN_USE`,`${i} device ${e.id} is held by managed-device allocator "${r.allocator.instanceId}" for installation "${r.stateDir}".`,{reason:`DEVICE_CLAIM_ALLOCATOR_HELD`,classification:n.classification,deviceKey:n.deviceKey,owner:{kind:`allocator`,stateDir:r.stateDir,allocator:r.allocator},recovery:{command:a},hint:`This device belongs to a managed pool and is released only after its allocator proves the identity removed; inspect with: ${a}`,retriable:!1})}function ia(e,n){return new t(`COMMAND_FAILED`,`${c(e)} device ${e.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:_(n),deviceKey:w(T(e)),retriable:!1,hint:`A managed identity becomes executable only after its allocator activates it and this installation holds its allocator-held claim.`})}function aa(e,n,r){return new t(`COMMAND_FAILED`,`${c(e)} device ${e.id} is held for identity incarnation "${r}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:_(n),deviceKey:w(T(e)),heldIncarnationId:r,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function oa(e,n){return new t(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:_(n),deviceKey:w(T(e)),retriable:!1})}function sa(e,t,n){switch(n.status){case`binding-invalid`:return{admitted:!1,error:oa(e,t)};case`missing`:return{admitted:!1,error:ia(e,t)};case`covered`:return{admitted:!0};case`incarnation-stale`:return{admitted:!1,error:aa(e,t,n.heldIncarnationId)};case`conflict`:return{admitted:!1,error:ta(e,n.conflict)}}}function ca(e,t,n){let r=sa(e,t,n);return r.admitted?void 0:la(r.error)}function la(e){let{hint:t,retriable:n,...r}=e.details??{};return i(e.code,e.message,r,{hint:t,retriable:n})}function ua(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:case`allocator-inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function da(e){switch(e.kind){case`local-family`:return`ordinary`;case`managed-local`:return`allocator-held`;case`provider-runtime`:return`none`}}export{mr as $,hi as A,Jr as B,Ci as C,xi as D,bi as E,ri as F,Mr as G,Kr as H,ii as I,Lr as J,Fr as K,ni as L,li as M,si as N,gi as O,oi as P,br as Q,ei as R,Si as S,Oi as T,Pr as U,qr as V,Nr as W,G as X,Rr as Y,Ar as Z,Ri as _,xt as _t,ta as a,Nt as at,ki as b,st as bt,zi as c,Et as ct,Yi as d,Ot as dt,dr as et,Bi as f,bt as ft,Xi as g,St as gt,Wi as h,_t as ht,sa as i,M as it,ui as j,_i as k,Z as l,Tt as lt,Q as m,yt as mt,ca as n,sr as nt,Qi as o,Mt as ot,qi as p,vt as pt,Ir as q,na as r,I as rt,Zi as s,At as st,da as t,cr as tt,$ as u,Dt as ut,Ji as v,dt as vt,wi as w,Di as x,Ai as y,ut as yt,ti as z};
1
+ import{F as e,I as t,P as n,l as r,s as i}from"./sdk-contracts.js";import"./capture.js";import{i as a,m as o}from"./sdk-batch-runner.js";import{p as s}from"./android-input-ownership.js";import{r as c}from"./diagnostics.js";import"./diagnostics2.js";import{d as l,l as u,m as d,p as f,w as p}from"./sdk-device.js";import{f as m,n as h,u as ee}from"./lease-scope.js";import{Ar as te,Dr as ne,Lr as re,Yr as g,Yt as ie,en as _,o as ae,or as oe,tn as se}from"./sdk-batch.js";import{a as ce}from"./script.js";import"./dispatch-resolve.js";import{i as le}from"./back-mode.js";import{a as ue}from"./session.js";import{b as de,m as fe}from"./owner-identity.js";import{l as pe}from"./exec.js";import{t as me}from"./timeouts.js";import"./command.js";import{t as he}from"./daemon-artifacts.js";import"./process.js";import{n as ge}from"./retry.js";import{n as v}from"./runtime-transport-hints.js";import{s as _e}from"./device-shell.js";import{_ as y,a as ve,c as ye,d as be,h as xe,i as Se,n as b,o as Ce,p as we,r as Te,s as x,t as Ee,u as S,v as De,y as Oe}from"./lease-registry-scope.js";import{c as ke}from"./request-cancel.js";import{t as Ae}from"./request.js";import{n as je,t as Me,u as Ne}from"./provider-session-ownership.js";import{a as Pe,i as Fe,n as C,r as Ie}from"./human-control-contract.js";import{_ as Le,d as Re,f as ze,u as Be}from"./screenshot-runtime.js";import{r as Ve}from"./daemon-policy-file.js";import{r as He}from"./application-lifecycle-runtime.js";import{a as Ue,c as w,l as We,n as Ge,o as Ke,r as qe,t as Je}from"./device-claim-inspection.js";import{c as Ye,f as Xe,i as Ze,p as T}from"./perf-runtime-plan.js";import{n as Qe,r as E,t as $e}from"./lease-context.js";import{n as et}from"./screen-recording-admission-ledger.js";import{a as tt,c as nt,d as D,l as rt,n as it,o as at,r as ot,u as O}from"./src8.js";import{n as st,t as ct}from"./compatibility-policy.js";import{i as lt,o as ut,s as dt}from"./durable-capture-resource.js";import{o as ft}from"./screen-recording-resource-recovery.js";import pt,{createHash as mt}from"node:crypto";import"node:fs";import k from"node:os";import A from"node:path";import j from"node:fs/promises";function ht(e,t){return gt(e,t)?t:`${e}:${t}`}function gt(e,t){return t.startsWith(`${e}:`)}function _t(e,t){return!e.partitioned||gt(e.tenant,t)}const vt=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/,yt=/^[1-9][0-9]{0,9}$/;function M(e){let t=e?.trim()??``,r=t.lastIndexOf(`@`),i=r<0?t:t.slice(0,r),a=r<0?void 0:t.slice(r+1);if(!vt.test(i)||a!==void 0&&!yt.test(a))throw new n(`INVALID_ARGS`,`A macos-app lease device key must be <bundleId> or <bundleId>@<pid>.`,{deviceKey:t});return a===void 0?{bundleId:i}:{bundleId:i,pid:Number(a)}}const bt=new Set([`open`,`batch`,`lease_heartbeat`,`lease_release`]),xt=[`out`,`saveScript`,`sessionSaveScript`,`baseline`,`launchConsole`,`launchArgs`,`launchUrl`,`bundleUrl`,`artifactsDir`,`stepsFile`,`searchPath`,`retainPaths`,`installSource`,`metroProjectRoot`,`metroRuntimeFile`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`],St=[`device`,`udid`,`serial`,`target`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function N(e,t,r={}){return new n(`UNAUTHORIZED`,t,{...r,reason:`MACOS_APP_LEASE_DENIED`,rule:e,retriable:!1,hint:`This lease is limited to one macOS app; retrying will not help. Use an allowed command on the leased app.`})}function Ct(e,t,n){if(e.backend!==`macos-app`)return;let r=M(e.deviceKey);if(Tt(r,t.command,t.positionals??[],wt(t.runtime,{...t.input,...t.flags})),(t.command===`open`||t.command===`batch`)&&t.flags?.platform!==`macos`)throw N(`device`,`A macos-app lease needs platform macos on ${t.command}.`);if(t.command===`batch`)for(let e of t.flags?.batchSteps??[]){let t=Array.isArray(e.positionals)?e.positionals.map(String):[];Tt(r,ae(e.command),t,wt(e.runtime,{...e.input,...e.flags}))}if(n)Mt(r,n);else if(!bt.has(t.command))throw N(`session`,`A macos-app lease runs ${t.command} only in a session of ${r.bundleId}; open it first.`,{command:t.command,bundleId:r.bundleId})}function wt(e,t){return{...t,...e?.launchUrl?{launchUrl:e.launchUrl}:{},...e?.bundleUrl?{bundleUrl:e.bundleUrl}:{}}}function Tt(e,t,n,r){if(!Be(t))throw N(`command`,`A macos-app lease does not allow ${t}.`,{command:t});if(kt(r),Ot(r),t===`screenshot`?Et(n,r):Dt(r),t===`open`&&At(e,n),t===`close`&&n.length>0&&n[0]!==e.bundleId)throw N(`app`,`A macos-app lease only closes ${e.bundleId}.`,{bundleId:e.bundleId})}function Et(e,t){if(t.screenshotFullscreen===!0)throw N(`capture`,`A macos-app lease captures only the app window.`);let{out:n,...r}=t;Dt(r);for(let t of[e[0],n])if(!(t===void 0||typeof t==`string`&&he(t,`screenshot`,`.png`)))throw N(`host-path`,`A macos-app lease does not write files on the host.`)}function Dt(e){let t=xt.find(t=>e[t]!==void 0&&e[t]!==!1);if(t)throw N(`host-path`,`A macos-app lease does not accept ${t}, which names a host path or launch.`,{field:t})}function Ot(e){let t=St.find(t=>e[t]!==void 0&&e[t]!==``);if(t)throw N(`device`,`A macos-app lease does not accept the ${t} device selector.`,{field:t})}function kt(e){if(e.surface!==void 0&&e.surface!==`app`)throw N(`surface`,`A macos-app lease is limited to the app surface, not ${String(e.surface)}.`,{surface:e.surface});if(e.platform!==void 0&&e.platform!==`macos`)throw N(`app`,`A macos-app lease only drives a macOS app.`,{platform:e.platform})}function At(e,t){if(t.length!==1||t[0]!==e.bundleId)throw N(`app`,`A macos-app lease only opens ${e.bundleId}.`,{bundleId:e.bundleId});jt()}function jt(){if(ue(de)!==`native`)throw N(`backend`,`A macos-app lease needs the native macOS app backend (AGENT_DEVICE_MACOS_APP_BACKEND=native).`)}function Mt(e,t){if(!d(t.device)||(t.surface??`app`)!==`app`||t.appBundleId!==e.bundleId)throw N(`app`,`This session is not the leased app ${e.bundleId}.`,{bundleId:e.bundleId})}const Nt=/bundleID="([^"]+)"/,Pt=async e=>{if(!fe(e))return;let t=await pe(`/usr/bin/lsappinfo`,[`info`,`-only`,`bundleid`,String(e)],{allowFailure:!0,timeoutMs:5e3});return Nt.exec(t.stdout)?.[1]};async function Ft(e,t=Pt){if(e.backend!==`macos-app`)return;let n=M(e.deviceKey);if(n.pid!==void 0&&await t(n.pid)!==n.bundleId)throw N(`process`,`The leased app process ${n.bundleId}@${n.pid} is no longer running.`,{bundleId:n.bundleId,pid:n.pid})}const It=[`sessionStateDir`,`runnerLogPath`,`requestLogPath`,`eventLogPath`,`device`,`id`,`kind`,`serial`,`device_udid`,`ios_simulator_device_set`],Lt=/(?<![\p{L}\p{N}_./])\/(?:Users|home|private|var|tmp|Volumes|Library|Applications|opt|System|usr|etc|Network|cores)(?:\/[\p{L}\p{N}_.@%+~-]+)*\/?/gu;function Rt(){return{hostName:k.hostname(),homeDirectory:k.homedir()}}function zt(e,t,n=Rt()){return t.ok?{ok:!0,data:Bt(e,t.data,n)}:{ok:!1,error:Vt(t.error,n)}}function Bt(e,t,n){if(!t)return t;let{fallbackScreenshotPath:r,...i}=t;if(e!==`open`)return i;for(let e of It)delete i[e];let{snapshot:a,initialSnapshotError:o,warnings:s,...c}=i;return{...c,...a===void 0?{}:{snapshot:Bt(`snapshot`,a,n)},...o===void 0?{}:{initialSnapshotError:Vt(o,n)},...s===void 0?{}:{warnings:P(s,n)}}}function Vt(e,t){let{logPath:n,diagnosticsRecord:r,...i}=e;return P(i,t)}function P(e,t){return typeof e==`string`?Ht(e,t):Array.isArray(e)?e.map(e=>P(e,t)):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,P(n,t)]))}function Ht(e,t){let n=e;if(t.homeDirectory.length>1){let e=t.homeDirectory.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);n=n.replaceAll(RegExp(`${e}[\\w.@%+~/-]*`,`g`),`<host-path>`)}for(let e of new Set([t.hostName,t.hostName.split(`.`)[0]]))e.length>=4&&(n=n.replaceAll(e,`<host>`));return n.replace(Lt,`<host-path>`)}function Ut(e,t){if(!(t===void 0||!e.hasHeldMacOsAppLease(t)))throw N(`diagnostics`,`A macos-app lease does not serve request diagnostics.`)}function Wt(e,t){if(Gt(e,t.command,t.flags??{}),t.command===`batch`)for(let n of t.flags?.batchSteps??[])Gt(e,ae(n.command),{...n.input,...n.flags})}function Gt(e,t,n){if(Zt(e,t),t===`close`&&n.shutdown===!0&&Jt(e,`device-shutdown`),e.deviceIds)for(let t of[n.udid,n.serial]){let n=typeof t==`string`?t.trim():``;if(!(!n||e.deviceIds.has(n)))throw F(e,`device`,`Device ${n} is outside this daemon's policy.`,{deviceId:n})}}function Kt(e,t){return!e.deviceIds||e.deviceIds.has(t.id)}function qt(e,t){if(!Kt(e,t))throw F(e,`device`,`Device ${t.id} is outside this daemon's policy.`,{deviceId:t.id})}function Jt(e,t){if(e.deniedCapabilities.has(t))throw F(e,`capability`,`This daemon's policy denies ${t}.`,{capability:t})}function Yt(e,t){let n=e.requiredLeaseBackend;if(!(!n||t?.backend===n))throw F(e,`lease`,`This daemon's policy requires a ${n} lease.`,{leaseBackend:n})}function Xt(e,t){if(!t.deviceIds)return e;let n=e=>e.filter(e=>Kt(t,e)),r=Object.freeze({discover:async(t,r)=>n(await e.localOnly.discover(t,r))}),i=async(t,i)=>{let a=await e.providerFirst.discoverWithSource(t,i),o=n(a.devices);return o.length>0||a.source===`local`?{...a,devices:o}:{devices:await r.discover(t,i),source:`local`}},a=Object.freeze({discover:async(e,t)=>(await i(e,t)).devices,discoverWithSource:i});return Object.freeze({...e,localOnly:r,providerFirst:a})}function Zt(e,t){let n=e.commands;if(!n)return;let r=Ve(t);if(r===void 0)return;let i=n.names.has(r);if(!(n.mode===`allow`?i:!i))throw F(e,`command`,`This daemon's policy denies the ${r} command.`,{command:r})}function F(e,t,r,i){return new n(`UNAUTHORIZED`,r,{...i,reason:`DAEMON_POLICY_DENIED`,rule:t,policyDigest:e.digest,retriable:!1,hint:`The daemon operator's policy denies this request; retrying will not help. Use an allowed command and device, or ask the operator to change the policy.`})}var Qt=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},$t=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},en=class{holdsByDevice=new Map;mutations=new Qt;inFlightWork=new $t;leases=new Map;runBindings=new Map;deviceBindings=new Map;hostTtlMsByLeaseId=new Map;macOsAppTenantIds=new Set;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=Se(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new Me({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=be(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Te(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}putHostLease(e,t){let r=y(e),i=be(t);this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(i.ttlMs),o=this.leases.get(r);if(o){if(!Ce(o,i))throw new n(`INVALID_ARGS`,`Lease id already names a lease with another scope.`,{reason:`LEASE_SCOPE_MISMATCH`});return this.hostTtlMsByLeaseId.set(r,a),this.refreshLease(o,a)}if(this.assertHumanControlAdmission(i),this.assertDeviceAvailable(i),i.backend===`macos-app`&&this.macOsAppTenantIds.add(i.tenantId),this.runBindings.has(S(i)))throw new n(`DEVICE_IN_USE`,`This tenant run already holds a lease for the device.`,{reason:`DEVICE_LEASE_BUSY`});this.enforceCapacity(i.backend);let s={...Te(i,a,this.now()),leaseId:r};return this.leases.set(s.leaseId,s),this.hostTtlMsByLeaseId.set(r,a),this.bindLease(s),{...s}}refreshExistingRunBinding(e,t){let n=S(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(e.retainOnClose?{...i,retainOnClose:!0}:i,t);if(i.deviceKey)throw ve(i);return b(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=y(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);Ee(n,e),b(n,e);let r=e.ttlMs===void 0?ye(n):this.resolveLeaseTtlMs(e.ttlMs),i=this.hostTtlMsByLeaseId.get(t);return this.refreshLease(n,i===void 0?r:Math.min(r,i))}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=y(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return Ee(n,e),b(n,e),{...n}}assertLeaseAdmission(e){let t=we(e);this.cleanupExpiredLeases(),b(this.getActiveLease(t.leaseId),t)}hasHeldMacOsAppLease(e){return this.macOsAppTenantIds.has(e)}findActiveLeaseBackend(e){let t=xe(e);if(t)return this.cleanupExpiredLeases(),this.leases.get(t)?.backend}hasRetainedLeases(){let e=this.now();return this.listActiveLeases().some(t=>t.retainOnClose===!0&&t.expiresAt>e)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?x(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>C(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,r,i){i?.throwIfAborted();let a=Fe(t),o=Pe(r);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=x(s),l=this.findHumanControlHold(a);if(l&&(this.assertHoldAuthority(e,l),x(l.hold.scope)!==c))throw new n(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:a,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(a,d),await this.activateHumanControlHold(c,d,o.ttlMs,i)}async activateHumanControlHold(e,t,r,i){let a=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,i),i?.throwIfAborted(),a.get(o)!==t)throw new n(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...r===void 0?{}:{expiresAt:s+r}},this.refreshHeldLease(e,s),C(t.hold)}catch(n){throw a.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=Fe(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=x(r.hold.scope);return this.deleteHumanControlHold(i,n),C(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=x(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Ie(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=x(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new n(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new n(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new n(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let r=this.requireHumanControlLease(e.leaseId);return{backend:r.backend,leaseProvider:r.leaseProvider,deviceKey:r.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let r=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==r.leaseId||x(r)!==x(t.hold.scope))throw new n(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=x(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,ye(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=xe(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new n(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new n(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(S(e),e.leaseId);let t=x(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.hostTtlMsByLeaseId.delete(e.leaseId),this.runBindings.delete(S(e));let n=x(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=x({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw ve(r)}};function tn(e){let t=Oe(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,i=De(r);if(r&&!i)throw new n(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!i)throw new n(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let a=e.session||`default`;return gt(i,a)?{...e,meta:{...e.meta,tenantId:i,sessionIsolation:t}}:{...e,session:ht(i,a),meta:{...e.meta,tenantId:i,sessionIsolation:t}}}function nn(e,t,r,i={}){if(an(e,t,r,i.daemonPolicy))return;let a=Qe(e);ln(e,a);let o=r?.lease;if(i.daemonPolicy?.requiredLeaseBackend){let n=E(e,r).leaseId?rn(e,t,r):void 0;return Yt(i.daemonPolicy,n),n}if(!(r===void 0&&!a.leaseId&&sn(e,i.providerAppCatalog))){if(e.command===`human_control`&&!o&&!a.leaseId)throw new n(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(!(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!a.leaseId||!a.tenantId&&!a.runId)))return rn(e,t,r)}}function rn(e,t,n){un(Qe(e),n?.lease);let r=E(e,n);t.assertLeaseAdmission(ee(r));let i=t.heartbeatLease(ee(r));return Ct(i,e,n),Re(e)&&t.assertHumanControlAdmission(i),i}function an(e,t,n,r){return ze(e.command)?Be(e.command)?!0:!on(e,t,n,r):!1}function on(e,t,n,r){if(r?.requiredLeaseBackend)return!0;let i=E(e,n);return i.leaseBackend===`macos-app`||i.leaseId!==void 0&&t.findActiveLeaseBackend(i.leaseId)===`macos-app`}function sn(e,t){let n=Le(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function cn(e){ze(e.command)||ln(e,Qe(e))}function ln(e,t){if(e.command!==`open`)return;let r=h(t);if(r.length!==0)throw new n(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:r})}function un(e,t){t&&(I(`leaseId`,e.leaseId,t.leaseId),I(`tenantId`,e.tenantId,t.tenantId),I(`runId`,e.runId,t.runId),I(`leaseProvider`,e.leaseProvider,t.leaseProvider),I(`clientId`,e.clientId,t.clientId),I(`deviceKey`,e.deviceKey,t.deviceKey))}function I(e,t,r){if(!(!t||!r||t===r))throw new n(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function dn(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),c({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return c({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}function fn(e){cn(e)}async function pn(e){let t=e.sessionStore.lookup(e.sessionName),n=t?.session,r=n?.lease;return!t||!n||!r||!e.leaseRegistry.consumeExpiredLease(r.leaseId)?!1:(c({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,deviceKey:r.deviceKey}}),await e.teardownSession(t).catch(e=>{c({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,error:e instanceof Error?e.message:String(e)}})}),await Xe(n.deviceClaim).catch(e=>{c({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:n.name,deviceKey:n.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.retire(t),!0)}function mn(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.lookup(t),a=i?.session,o=nn(e.req,r,a,{providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy});if(!o)return e.req;let s={...e.req,internal:{...e.req.internal,admittedLease:o}};return i&&a?.lease&&n.update(i,e=>({lease:{...e.lease,leaseBackend:o.backend,expiresAt:o.expiresAt}})),s}function hn(e){return $e(e.req,e.req.internal?.admittedLease)??e.existingLease}async function gn(e){let t=e.session.lease;if(!t)return;let n=m({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n);if(r?.retainOnClose){c({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:!1,retained:!0}});return}let i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=je(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return c({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const _n=[`platform`,`target`],vn=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function yn(e){return u({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function bn(e){return yn(e)||Cn(e,_n)}function xn(e){return bn(e)||Cn(e,vn)}function Sn(e){return typeof e==`string`&&e.trim().length>0}function Cn(e,t){return e?t.some(t=>Sn(e[t])):!1}function wn(e){return{appleSimulatorAppTarget:Tn(e)}}function Tn(e){return e&&!a(e)?e:void 0}function En(){return et({displayName:`audio probe`})}function Dn(){return et({displayName:`perf capture`})}function On(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return mt(`sha256`).update(oe(t),`utf8`).digest(`hex`)}function kn(e,t){try{return new Rn(jn(An(e)),t).parse()}catch(e){if(e instanceof n&&e.code===`INVALID_ARGS`)return;throw e}}function An(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function jn(e){let t=[],r=0;for(;r<e.length;){let i=e.slice(r),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){r+=a;continue}let o=Mn(i);if(!o)throw new n(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);t.push(o.value),r+=o.length}return t}function Mn(e){return Nn(e)??Pn(e)??Fn(e)??In(e)??Ln(e)}function Nn(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function Pn(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function Fn(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function In(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Ln(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Rn=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let e=this.parseOr();if(this.peek())throw new n(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new n(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new n(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.consumePlatformToken();let e=this.consumeComparisonOperator(),t=this.consumeStringLiteral(),n=this.platform===t.toLowerCase();return e.value===`==`?n:!n}consumePlatformToken(){if(this.peek()?.type!==`platform`)throw new n(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}consumeComparisonOperator(){let e=this.peek();if(e?.type!==`operator`||e.value!==`==`&&e.value!==`!=`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,e}consumeStringLiteral(){let e=this.peek();if(e?.type!==`string`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`);return this.index+=1,e.value}consumeOperator(e){let t=this.peek();return t?.type!==`operator`||t.value!==e?!1:(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type!==`paren`||t.value!==e?!1:(this.index+=1,!0)}peek(){return this.tokens[this.index]}};const zn=new Set([``,`false`,`0`,`null`,`undefined`]);function L(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0&&!Number.isNaN(e):!zn.has(e)}function Bn(e){return typeof e==`boolean`||typeof e==`number`||typeof e==`string`?L(e):typeof e==`bigint`?e!==0n:e!=null}function Vn(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function Hn(e,t){return{...B(e,t),source:e.source}}function R(e,t,r){if(e===void 0)return;let i=r??tt[t]??{},a=at(i),o;if(typeof e==`number`)o=e;else{let r=e.trim();if(r===``)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);o=Number(r)}if(!Number.isFinite(o)||Math.abs(o)>2**53-1||i.integer&&!Number.isSafeInteger(o)||i.nonNegative&&o<0||i.positive&&o<=0)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);return o}function Un(e,t,n,r){return R(e===void 0?t:n.resolve(String(e)),r)}function z(e){if(e?.aborted)throw t()}async function Wn(e,t){if(e.include.kind===`commands`)return{kind:`program`,source:e.source,config:{},commands:e.include.commands};if(!t.loadProgram)throw new n(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return z(t.signal),t.signal?await t.loadProgram(e.include.path,e.source.path,t.signal):await t.loadProgram(e.include.path,e.source.path)}function Gn(e,t){if(e.include.kind===`file`)return A.resolve(t?A.dirname(t):process.cwd(),e.include.path)}function Kn(e){return e===void 0?void 0:A.resolve(e)}function qn(e,t){let r=Gn(e,e.source.path);if(r&&t.has(r))throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);return r}function Jn(e,t,r,i){let a=e.include.kind===`file`?Kn(t.source.path):void 0,o=new Set([r,a].filter(e=>e!==void 0)),s=[...o].find(e=>i.has(e));if(s)throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function Yn(e,t){if(e.trustedScripts===!1)throw new n(`UNAUTHORIZED`,`Maestro ${t} is not permitted for flows received over the remote daemon surface: node:vm is not a security sandbox, so an untrusted expression can escape to the host.`)}async function Xn(e,t,n,r){if(e===void 0)return!0;if(typeof e==`boolean`)return e;let i=Zn(e,n);if(i!==void 0){let e=kn(i,r.platform);if(e!==void 0)return e;if(!i.includes("${"))return L(i)}Yn(r,t);let{evaluateMaestroConditionScript:a}=await import(`./engine-eval-script.js`),o=await a(e,n.values,r.platform,t);return n.replaceOutput(o.outputEnv),Bn(o.value)}function Zn(e,t){try{return t.resolve(e)}catch(e){if(e instanceof n&&e.code===`INVALID_ARGS`)return;throw e}}function Qn(e,t){return[...e.visible?[{kind:`visible`,selector:B(e.visible,t)}]:[],...e.notVisible?[{kind:`notVisible`,selector:B(e.notVisible,t)}]:[]]}function B(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>B(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,B(n,t)])):e}async function $n(e,t){z(t.signal);let n=Kn(e.source.path),r={options:t,context:nt(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await er(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function er(e,t,n,r,i){z(i.options.signal);let a=ur(t,e.config.env),o=e.config.appId??n,s=i.context.enter(e.config.env);try{let t=[...e.config.onFlowStart??[],...e.commands,...e.config.onFlowComplete??[]],n=[];for(let s of t)n.push(...await nr(s,a,o,e.source.path??r,i));return n}finally{s()}}async function tr(e,t,n,r,i){let a=[];for(let o of e)a.push(...await nr(o,t,n,r,i));return a}async function nr(e,t,n,r,i){z(i.options.signal);let a=dr(e,r);switch(a.kind){case`runFlow`:{let e=ir(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await rr(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[V(a,t,n,o)]}case`repeat`:return[V(a,t,n,await tr(a.commands,t,n,r,i))];case`retry`:return[V(a,t,n,await tr(a.commands,t,n,r,i))];default:return[cr(a,t,n)]}}async function rr(e,t,n,r,i){let a=or(e,i.context),o=qn(a,i.activeIncludePaths),s=await Wn(a,i.options);z(i.options.signal);let c=Jn(a,s,o,i.activeIncludePaths),l=ur(t,e.env),u=i.context.enter(e.env);try{return await er(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function ir(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:ar(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function ar(e,t){if(e===!1)return`omit`;if(typeof e!=`string`)return;let n=t.context.resolveDeferred(e);if(sr(n))return`opaque`;let r=kn(n,t.options.platform);return r===void 0?`opaque`:r?void 0:`omit`}function or(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function sr(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function cr(e,t,n){return D({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function V(e,t,n,r){return D({kind:`opaque`,command:lr(e),source:e.source,scopes:t,body:r,appId:n})}function lr(e){switch(e.kind){case`runFlow`:return D({kind:e.kind,source:e.source,when:e.when,label:e.label,...e.include.kind===`file`?{includePath:e.include.path}:{}});case`repeat`:return D({kind:e.kind,source:e.source,times:e.times,while:e.while});case`retry`:return D({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function ur(e,t){return t===void 0?e:[...e,t]}function dr(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function fr(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await $n(e,t),a=pr(t.runtimeHints),o=D({kind:`maestroReplayPlan`,platform:t.platform,target:t.target,runtimeHints:a,initialStaticEnv:structuredClone({...t.defaults??{},...e.config.env??{},...t.env??{}}),steps:structuredClone(n),total:n.length,compatibility:{staticallyExecutedControls:r,staticallySkippedControls:i}}),s=On(o);return mr({...o,digest:s})}function pr(e){if(!e)return;let t=Object.entries(e).filter(e=>e[1]!==void 0);return t.length===0?void 0:Object.fromEntries(t)}function mr(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))mr(t);return Object.freeze(e)}function hr(e,t={}){let{from:n,planDigest:r}=t;if(n===void 0&&r===void 0)return{allowed:!0,startIndex:0};if(n===void 0||r===void 0)return{allowed:!1,reason:`replay --from requires --plan-digest (and --plan-digest requires --from).`};if(!Number.isInteger(n)||n<1||n>e.total)return{allowed:!1,reason:`replay --from ${n} is out of range for a ${e.total}-step plan.`};if(r!==e.digest)return{allowed:!1,reason:`replay --plan-digest does not match the current plan digest.`};if(n===1)return{allowed:!0,startIndex:0};for(let t=0;t<n-1;t+=1){let n=e.steps[t];if(n.kind===`opaque`)return{allowed:!1,reason:`step ${t+1} is opaque runtime control flow (${n.command.kind}) and cannot be skipped safely.`};if(n.command.kind===`runScript`||n.command.kind===`evalScript`)return{allowed:!1,reason:`step ${t+1} (${n.command.kind}) can produce outputEnv values and cannot be skipped safely.`}}let i=e.steps[n-1];return i.kind===`opaque`?{allowed:!1,reason:`step ${n} is opaque runtime control flow (${i.command.kind}) and cannot be resumed into.`}:{allowed:!0,startIndex:n-1}}function gr(e,t={}){let r=hr(e,t);if(!r.allowed)throw new n(`INVALID_ARGS`,r.reason);return r.startIndex}function _r(e,t){if(!Number.isInteger(t)||t<0||t>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${t} is out of range for a ${e.total}-step plan.`);return t}const vr=`maestro-test-failure`;function H(e,t={}){return new n(`COMMAND_FAILED`,e,{...t,reason:vr})}function yr(e){return e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===vr}async function br(e,t){z(t.options.signal);try{return await Pr(e,t.context,async()=>await xr(e,t))}catch(t){throw G(t,e)}}async function xr(e,t){if(e.kind===`command`)return await Sr(e.command,e.appId,t);await Or(e,t)}async function Sr(e,t,n){if(e.kind===`evalScript`)return await Tr(e,n);let r=Hn(e,n.context);try{return await Er(r,t,n)}catch(e){if(z(n.options.signal),wr(r)&&yr(e)){n.warnings.push(Cr(r,e)),n.skipped+=1;return}throw Fr(e,r)}}function Cr(e,t){let r=`${e.source.path?`${e.source.path}:`:``}line ${e.source.line}`,i=t instanceof n?t.message:String(t);return`Optional Maestro ${e.kind} skipped at ${r}: ${i}`}function wr(e){return`optional`in e&&e.optional===!0}async function Tr(e,t){let{evaluateMaestroEvalScript:n}=await import(`./engine-eval-script.js`);Yn(t.options,`evalScript`);let r=await n(e.script,t.context.values);t.context.replaceOutput(r),t.executed+=1}async function Er(e,t,n){switch(e.kind){case`assertVisible`:await W({kind:`visible`,selector:e.target},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await W({kind:`notVisible`,selector:e.target},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`assertTrue`:if(!L(e.condition))throw H(`Maestro assertTrue condition was falsy: ${JSON.stringify(e.condition)}`);n.executed+=1;return;case`extendedWaitUntil`:await W(Nr(e),R(e.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await Dr(e,t,n)}}async function Dr(e,t,n){let r=D({command:e,env:n.context.values,appId:t===void 0?void 0:n.context.resolve(t),generation:n.context.generation,invalidateObservation:n.context.invalidateObservation,cachedObservation:n.context.observation,signal:n.options.signal}),i=await n.port.execute(r);return z(n.options.signal),i.observation&&n.context.recordObservation(i.observation),i.outputEnv&&n.context.merge(i.outputEnv),i.artifactPaths?.forEach(e=>n.artifacts.add(e)),n.executed+=1,i}async function Or(e,t){let n=e.command;switch(n.kind){case`runFlow`:if(n.when&&!await jr(n.when,`runFlow.when`,t)){t.skipped+=1;return}t.executed+=1,await U(e.body,t);return;case`repeat`:t.executed+=1,await kr(e.body,n.times,n.while,t);return;case`retry`:{let r=Math.min(Un(n.maxRetries,1,t.context,`retry.maxRetries`),st.control.retryMaxRetries);t.executed+=1,await Ar(e.body,r,t);return}}}async function U(e,t){for(let n of e)await br(n,t)}async function kr(e,t,n,r){let i=t===void 0&&n?1/0:Un(t,0,r.context,`repeat.times`);for(let t=0;t<i;t+=1){if(await new Promise(e=>setImmediate(e)),z(r.options.signal),n&&!await jr(n,`repeat.while`,r))return;await U(e,r)}}async function Ar(e,t,r){let i;for(let n=0;n<=t;n+=1){z(r.options.signal);try{await U(e,r);return}catch(t){if(z(r.options.signal),!yr(Lr(t)))throw t;i=G(t,e[0])}}throw i||new n(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function jr(e,t,n){if(e.platform&&e.platform!==n.options.platform||!await Xn(e.true,`${t}.true`,n.context,n.options))return!1;for(let t of Qn(e,n.context))if(z(n.options.signal),!(await Mr(t,n.timing.runFlowConditionTimeoutMs,n)).matched)return!1;return!0}async function W(e,t,n){if(!(await Mr(e,t,n)).matched)throw H(`Maestro ${e.kind} condition did not match.`)}async function Mr(e,t,n){let r={condition:e,timeoutMs:t,generation:n.context.generation,env:n.context.values,...n.context.observation?{cachedObservation:n.context.observation}:{},...n.options.signal?{signal:n.options.signal}:{}},i=await n.port.observe(r);return z(n.options.signal),n.context.recordObservation(i),i}function Nr(e){if(e.visible)return{kind:`visible`,selector:e.visible};if(e.notVisible)return{kind:`notVisible`,selector:e.notVisible};throw new n(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function Pr(e,t,n){let r=e.scopes.map(e=>t.enter({...e}));try{return await n()}finally{for(let e=r.length-1;e>=0;--e)r[e]()}}function G(e,t){if(Ir(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:Rr(e,t?.command),source:n,...t?{command:t.command}:{}}}function Fr(e,t){return{kind:`maestroPlanStepFailure`,error:Rr(e,t),source:t.source,command:t}}function Ir(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function Lr(e){return Ir(e)?e.error:e}function Rr(e,t){if(!(e instanceof n)||!t||/\bline \d+\b/.test(e.message))return e;let r=t.source.path?`${t.source.path}:`:``;return new n(e.code,`${e.message} (${r}line ${t.source.line})`,e.details)}async function zr(e,t,r={}){z(r.signal);let i=r.startIndex??0;if(!Number.isInteger(i)||i<0||i>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${e.total}-step plan.`);let a={plan:e,port:t,options:r,context:nt(r.defaults,r.env?{...r.env}:{}),timing:ct,artifacts:new Set,warnings:[],executed:e.compatibility.staticallyExecutedControls,skipped:e.compatibility.staticallySkippedControls};for(let t=i;t<e.steps.length;t+=1)try{await Br(e.steps[t],t,a)}catch(e){throw Lr(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function Br(e,t,n){z(n.options.signal);let r=n.options.now??Date.now,i=r(),a=n.port.readMetrics?.(),o=n.context.generation,s={command:e.command,source:e.source,generation:o,stepIndex:t+1,stepTotal:n.plan.total};K(()=>n.options.observer?.commandStarted?.(s));try{let t=await br(e,n);z(n.options.signal),K(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...Vr(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=G(t,e);throw K(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...Vr(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],warnings:[...n.warnings]})),o}}function Vr(e,t){return!e||!t?{}:{runtimeMetrics:{hierarchyCaptures:t.hierarchyCaptures-e.hierarchyCaptures,screenshotCaptures:t.screenshotCaptures-e.screenshotCaptures,tapRetries:t.tapRetries-e.tapRetries,settleLatches:t.settleLatches-e.settleLatches,settleTimeouts:t.settleTimeouts-e.settleTimeouts}}}function K(e){try{e?.()}catch{}}async function Hr(e,t,n={}){let r=Ur(e,n);return await zr(e,t,{...n,startIndex:r})}function Ur(e,t){return t.from!==void 0||t.planDigest!==void 0?gr(e,{from:t.from,planDigest:t.planDigest}):_r(e,t.startIndex??0)}function Wr(e){return Vn(e)?{command:e.kind,...e.kind===`runFlow`?J(e.label??e.includePath):{}}:{command:e.kind,...Gr(e)}}function Gr(e){return`label`in e&&e.label?J(e.label):Kr(e)?J($r(e.target)):qr(e)?Jr(e):e.kind===`inputText`?J(`<text>`):Yr(e)}function Kr(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function qr(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function Jr(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return J(q(e.target));case`extendedWaitUntil`:return J(q(e.visible??e.notVisible));case`scrollUntilVisible`:return J(q(e.element))}}function Yr(e){return Xr(e)?Zr(e):e.kind===`swipe`?Qr(e):e.kind===`runFlow`?J(e.label??(e.include.kind===`file`?e.include.path:``)):e.kind===`assertTrue`?J(String(e.condition)):{}}function Xr(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function Zr(e){switch(e.kind){case`openLink`:return J(e.link);case`takeScreenshot`:return J(e.path);case`runScript`:return J(e.file);case`pressKey`:return J(e.key)}}function Qr(e){return J(e.gesture.kind===`coordinates`?`${ei(e.gesture.start)} to ${ei(e.gesture.end)}`:e.gesture.direction)}function $r(e){return e.space===`target`?q(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function q(e){return e?.id??e?.text}function ei(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function J(e){return e?{value:e}:{}}const ti=new Set(String.raw`^$\.*+?()[]{}|`);function ni(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function ri(e){try{new RegExp(e)}catch{return e}let t=``;for(let n=0;n<e.length;n+=1){let r=e[n];if(r!==`\\`){if(ti.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!ti.has(i))return;t+=i,n+=1}return t}function ii(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(g(e.rect))return t.isVisibleInEffectiveViewport(e);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=t.findAncestor(e,e=>te(e,n)?e:null);return r?g(r.rect)?t.isVisibleInEffectiveViewport(r):n!==`android`&&r.hittable===!0:!1}function ai(e,t,n){return!!n.findAncestor(e,e=>e.index===t.index?e:null)}function oi(e,t){let n=[t.id===void 0?void 0:ci(e.identifier,t.id),t.text===void 0?void 0:li(e,t.text)].filter(e=>e!==void 0);return!(n.length===0&&t.enabled===void 0&&t.selected===void 0||n.some(e=>!e)||t.enabled!==void 0&&e.enabled!==!1!==t.enabled||t.selected!==void 0&&e.selected===!0!==t.selected)}function si(e){return e.matches.filter(t=>ii(t,e.visibility,e.platform))}function ci(e,t){let n=e??``;return O(n)===O(t)||ni(n,t)}function li(e,t){return[e.label,rt(e),e.identifier].filter(e=>!!e).some(e=>ci(e,t))}function ui(e){return e.index!==void 0||e.childOf!==void 0||e.below!==void 0||e.above!==void 0||e.leftOf!==void 0||e.rightOf!==void 0||e.containsChild!==void 0||e.containsDescendants!==void 0}function di(e){return e.text!==void 0||e.id!==void 0||e.enabled!==void 0||e.selected!==void 0}function fi(e,t,n){let r=[],i=0;for(let a of e)for(let e of n){let n=mi(a.rect,e.rect);n===void 0||!pi(t,a.rect,e.rect)||r.push({node:a,distance:n,order:i++})}return r.sort((e,t)=>e.distance-t.distance||e.order-t.order),r.map(({node:e})=>e)}function pi(e,t,n){switch(e){case`below`:return t.y>n.y;case`above`:return t.y<n.y;case`leftOf`:return t.x<n.x;case`rightOf`:return t.x>n.x}}function mi(e,t){if(!(!hi(e)||!hi(t)))return Math.fround(Math.hypot(Y(e.x,e.width)-Y(t.x,t.width),Y(e.y,e.height)-Y(t.y,t.height)))}function hi(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite))}function Y(e,t){return e+Math.trunc(t/2)}function gi(e,t={},r={}){let i=ne(e.nodes,t);t.onVisibilityContextCreated?.();let a=new WeakMap,o=new WeakSet,s=new WeakMap,c=new Map,l=t=>t.parentIndex===void 0?void 0:i.nodeByIndex.get(t.parentIndex)??e.nodes[t.parentIndex],u=e=>{let t=s.get(e);if(t)return t;let n=new Set,r=new Set,i=l(e);for(;i&&!r.has(i.index);)r.add(i.index),n.add(i.index),i=l(i);return s.set(e,n),n},d=(n,r)=>{let i=c.get(n);i||(i=new WeakMap,c.set(n,i));let a=i.get(r);if(a)return a;t.onPositionComputed?.(n,r);let o=fi(e.nodes,n,m(r).indexed),s={ordered:o,candidateIndexes:new Set(o.map(e=>e.index))};return i.set(r,s),s},f=(e,t)=>d(e,t).ordered,p=(e,t)=>d(e,t).candidateIndexes,m=i=>{let s=a.get(i);if(s)return s;if(o.has(i))throw new n(`INVALID_ARGS`,`Maestro selector relations cannot contain cycles.`);o.add(i),t.onSelectorComputed?.(i);try{let t=_i(e,i,l,u,m,p),n={matches:t,indexed:xi(t,i.index,r.orderUnindexed)};return a.set(i,n),n}finally{o.delete(i)}};return{visibility:i,resolve:m,resolvePosition:f}}function _i(e,t,n,r,i,a){let{index:o,childOf:s,below:c,above:l,leftOf:u,rightOf:d,containsChild:f,containsDescendants:p,...m}=t,h=di(m)?e.nodes.filter(e=>oi(e,m)):[...e.nodes];if(s){let e=new Set(i(s).indexed.map(e=>e.index));h=h.filter(t=>yi(r(t),e))}if(f){let e=new Set(i(f).indexed.map(n).filter(e=>e!==void 0).map(e=>e.index));h=h.filter(t=>e.has(t.index))}if(p){let e=p.map(e=>vi(i(e).indexed,r));h=h.filter(t=>e.every(e=>e.has(t.index)))}for(let[e,n]of bi(t)){let t=a(e,n);h=h.filter(e=>t.has(e.index))}return h}function vi(e,t){let n=new Set;for(let r of e)for(let e of t(r))n.add(e);return n}function yi(e,t){for(let n of e)if(t.has(n))return!0;return!1}function bi(e){return[[`below`,e.below],[`above`,e.above],[`leftOf`,e.leftOf],[`rightOf`,e.rightOf]].filter(e=>e[1]!==void 0)}function xi(e,t,n){if(t===void 0)return n?n(e):[...e];let r=Ci(e)[wi(t)];return r?[r]:[]}function Si(e,t){return t===void 0?e[0]:Ci(e)[wi(t)]}function Ci(e){return[...e].sort((e,t)=>{let n=X(e.rect?.y),r=X(t.rect?.y);return n===r?X(e.rect?.x)-X(t.rect?.x):n-r})}function X(e){return e!==void 0&&Number.isFinite(e)?e:2**53-1}function wi(e){let t=typeof e==`number`?e:Number(e.trim());if(!Number.isSafeInteger(t)||t<0)throw new n(`INVALID_ARGS`,`Maestro selector.index must be a non-negative integer.`);return t}const Ti={android:{kind:`exact`,provider:`android-helper`},ios:{kind:`divergence`,provider:`apple-xctest`,reason:`maestro-clickable-not-exposed-by-provider`}};function Ei(e,t){let n=Ti[t];if(n.kind===`divergence`)return n;let r=s(e);return r?r.kind!==`exact`||r.provider!==n.provider?{kind:`divergence`,provider:n.provider,reason:`unregistered-provider-evidence`}:r:{kind:`divergence`,provider:n.provider,reason:`exact-evidence-not-retained`}}function Z(e,t){return t.kind===`exact`?e.map((e,n)=>({node:e,order:n,rank:Di(t.clickableByNodeIndex.get(e.index))})).sort((e,t)=>t.rank-e.rank||e.order-t.order).map(({node:e})=>e):[...e]}function Di(e){return e===!0?2:+(e===!1)}function Oi(e,t,n,r={}){let i=Ei(e,n),a=Ai(e,i,r),o=ki(t,a),s=si({visibility:a.visibility,matches:o.matches,platform:n});return{...o,visible:s,clickability:i,ranked:ji(s,t,n,a.visibility,i)}}function ki(e,t){return{matches:t.resolve(e).matches,parentMatched:e.childOf===void 0||t.resolve(e.childOf).indexed.length>0}}function Ai(e,t,n={}){return gi(e,n,t?{orderUnindexed:e=>Z(e,t)}:{})}function ji(e,t,n,r,i){let a=n!==`ios`||!Fi(t)?e:e.filter(n=>{if(zi(n))return!0;let i=e.filter(e=>e!==n&&Ii(n,e,t));return!i.some(e=>zi(e)&&ai(n,e,r))&&!i.some(e=>ai(e,n,r))});return t.index===void 0&&i?Z(a,i):a}function Mi(e,t){let n=t===void 0?e.find(Q):Ni(e,t);return!n||!Q(n)?null:{node:n,rect:n.rect}}function Ni(e,t){return Si(e,t)}function Pi(e){return Q(e)?e.rect:void 0}function Q(e){return g(e.rect)}function Fi(e){return e.id!==void 0||e.text!==void 0}function Ii(e,t,n){if(n.id!==void 0&&Ri(e.identifier)!==Ri(t.identifier))return!1;if(n.text!==void 0){let n=Li(e),r=new Set(Li(t));if(!n.some(e=>r.has(e)))return!1}return!0}function Li(e){return[e.label,e.value,e.identifier].map(Ri).filter(e=>e!==void 0)}function Ri(e){if(e)return O(e)||void 0}function zi(e){let t=re(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}const Bi=Symbol(`maestroFlowProgram`),Vi=Symbol(`maestroFailureCommand`),Hi=Symbol(`maestroFailurePlan`);function Ui(e,t){let n=ot(e,{sourcePath:t});return{sourcePath:t,name:n.config.name,appTarget:Ji(n),[Bi]:n}}async function Wi(e,t,n){let r;try{let i=it(A.dirname(e.sourcePath),n.readSource),a=await fr(e[Bi],{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,runtimeHints:n.runtimeHints,loadProgram:i,signal:n.signal}),o=gr(a,{from:n.from,planDigest:n.planDigest}),s=await Hr(a,t,{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,loadProgram:i,signal:n.signal,startIndex:o,trustedScripts:n.trustedScripts,observer:Ki(a,n.observer,e=>{r=e})});return{ok:!0,replayed:a.total-o,planDigest:a.digest,startIndex:o,artifactPaths:s.artifactPaths,...s.warnings?{warnings:s.warnings}:{}}}catch(e){return{ok:!1,error:r?.error??e,...r?{failure:r}:{}}}}function Gi(e,t){let n=Xi(e[Vi]),r=e[Hi].platform;return!n||r!==`android`&&r!==`ios`?[]:Oi(t,n.selector,r).ranked.map(e=>({node:e,basis:Zi(n.selector,e)}))}function Ki(e,t,n){return{commandStarted:e=>t?.actionStarted?.(qi(e)),commandCompleted:e=>t?.actionCompleted?.({...qi(e),durationMs:e.durationMs,runtimeMetrics:e.runtimeMetrics,data:e.data}),commandFailed:r=>{let i=hr(e,{from:r.stepIndex,planDigest:e.digest}),a={...qi(r),durationMs:r.durationMs,error:r.error,artifactPaths:r.artifactPaths,warnings:[...r.warnings],isControl:Vn(r.command),redactions:r.command.kind===`inputText`&&r.command.text.length>0?[{name:`inputText.text`,value:r.command.text}]:[],resume:i.allowed?{allowed:!0,from:r.stepIndex,planDigest:e.digest}:{allowed:!1,from:r.stepIndex,planDigest:e.digest,reason:i.reason},[Vi]:r.command,[Hi]:e};n(a),t?.actionFailed?.(a)}}}function qi(e){let t=Wr(e.command);return{action:t.command,...t.value?{value:t.value}:{},source:e.source,generation:e.generation,stepIndex:e.stepIndex,stepTotal:e.stepTotal}}function Ji(e){return[e.config.appId,...[...e.config.onFlowStart??[],...e.commands].filter(e=>e.kind===`launchApp`).map(e=>e.kind===`launchApp`?e.appId:void 0)].find(Yi)}function Yi(e){return!!(e?.trim()&&!e.includes(`$`)&&!a(e))}function Xi(e){switch(e.kind){case`tapOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`doubleTapOn`:case`longPressOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`assertVisible`:case`assertNotVisible`:return{selector:e.target};case`extendedWaitUntil`:return e.visible?{selector:e.visible}:e.notVisible?{selector:e.notVisible}:void 0;case`scrollUntilVisible`:return{selector:e.element};case`swipe`:return e.gesture.kind===`target`?{selector:e.gesture.from}:void 0;default:return}}function Zi(e,t){return e.id!==void 0||e.text!==void 0&&oi({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text===void 0?`other`:`label`}const Qi=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;function $i(e,t){let r=e.files[t];if(r===void 0)throw new n(`INVALID_ARGS`,`replay script source is missing ${t}; it was not part of the script sources sent with this request.`,{path:t,entry:e.entry});return r}function ea(e){let t=ce(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return ra(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function ta(e,t){return t===`ios`?ia(e)??{}:{}}function na(e,t){let n=ea(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function ra(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!a(e))}function ia(e){let t=Tn(e);return t?{appleSimulatorAppTarget:t}:void 0}function aa(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[r]=le(`waitMs`);if(!r)throw new n(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return o(t,`waitMs`,{min:r.min,max:r.max})}function oa(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function sa(e){return{...oa(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function ca(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return ua({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function la(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function ua(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=ge.fromTimeoutMs(a),s=()=>la(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;Ae({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await me(Math.min(250,o.remainingMs())),ke(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};da(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function da(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}const fa={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},$=new Map;async function pa(e){let t=await j.mkdtemp(A.join(k.tmpdir(),`agent-device-materialized-`));try{let n=await va(e.installablePath,A.join(t,`installable`)),r=e.archivePath?await va(e.archivePath,A.join(t,`archive`)):void 0,i=pt.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{ga(i)},a);return $.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await j.rm(t,{recursive:!0,force:!0}),e}}async function ma(e,t){await _a(e,Ne($,e,t,fa))}async function ha(e){let t=Array.from($.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await _a(e,t)}))}async function ga(e){let t=$.get(e);if(t)try{await _a(e,t)}catch{}}async function _a(e,t){clearTimeout(t.timer),$.delete(e),await j.rm(t.rootPath,{recursive:!0,force:!0})}async function va(e,t){let n=await j.stat(e);await j.mkdir(t,{recursive:!0});let r=A.join(t,A.basename(e));return n.isDirectory()?(await j.cp(e,r,{recursive:!0}),r):(await j.copyFile(e,r),r)}function ya(e){return e.device.platform===`web`}function ba(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function xa(e){let t=e.sessionStore.refresh(e.ref);if(!t.session.appLog)return;let{forceCleanupSessionAppLog:n}=await import(`./app-log-session-resource.js`).then(e=>e.r);await n({...e,ref:t})}async function Sa(e){let t=ut(e.sessionStore,e.ref);t.read()&&await Ze({binding:t,intent:`disposal`})}async function Ca(e,t){await t.stopSnapshotHelper(e.device)}async function wa(e){let{ref:t,sessionStore:n,platformCleanup:r}=e,i=n.resolveCurrent(t)??t.session,a=t.address;await r.closeManagedBrowser({device:i.device,sessionName:a,stateDir:n.resolveDaemonStateDir(),openSessionNames:()=>ba(n)})}async function Ta(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function Ea(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),r=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return c({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:r}}),new n(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${r.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function Da(e){let{ref:t,sessionStore:r}=e,i=r.resolveCurrent(t)??t.session,a=t.address;if(!e.platformCleanup)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let o=e.platformCleanup,s=[{step:`recording`,run:()=>Oa({ref:t,sessionStore:r})},...e.appLog===`run`?[{step:`app_log`,run:()=>xa({ref:t,sessionStore:r})}]:[],{step:`audio_probe`,run:()=>ka({ref:t,sessionStore:r})},{step:`perf_capture`,run:()=>Sa({ref:t,sessionStore:r})},{step:`platform_snapshot_helper`,run:()=>Ca(i,o)},{step:`web_browser`,run:()=>wa({ref:t,sessionStore:r,platformCleanup:o})}];s.push({step:`materialized_paths`,run:()=>ha(a)});let c=Ea({sessionName:a,phase:`session_teardown_cleanup_failed`,failures:await Ta(s)});if(c)throw c}async function Oa(e){let t=dt(e.sessionStore,e.ref);t.read()&&await ft({binding:t,intent:`disposal`})}async function ka(e){let t=lt(e.sessionStore,e.ref);t.read()&&await Ye({binding:t,intent:`disposal`})}function Aa(e){return f(e)&&e.kind===`simulator`}function ja(e){return e.platform===`android`&&e.kind===`emulator`}const Ma=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Na(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Pa(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function Fa(e){return He(Pa(e))}function Ia(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return v(e)}}function La(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new n(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Ra(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return La(e)}}function za(e,t,i){if(e===void 0)return i;if(!r(e))throw new n(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(i&&e!==i)throw new n(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${i}.`);return e}function Ba(e){if(r(e))return e}function Va(e,t){return{platform:t,metroHost:v(e?.metroHost),metroPort:La(e?.metroPort),bundleUrl:v(e?.bundleUrl),launchUrl:v(e?.launchUrl)}}function Ha(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Ua(e){if(ja(e))return`10.0.2.2`;if(Aa(e))return`127.0.0.1`}function Wa(e,t){if(!e||v(e.metroHost)||v(e.bundleUrl)||e.metroPort===void 0)return e;let n=Ua(t);return n?{...e,metroHost:n}:e}function Ga(e){let{runtime:t,sessionName:r,platform:i}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new n(`INVALID_ARGS`,`open runtime must be an object.`);let a=t,o=Object.keys(a).find(e=>!Ma.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Ma.join(`, `)}.`);return{platform:za(a.platform,r,i),metroHost:Ia(a.metroHost,`metroHost`),metroPort:Ra(a.metroPort),bundleUrl:Ia(a.bundleUrl,`bundleUrl`),launchUrl:Ia(a.launchUrl,`launchUrl`)}}function Ka(e,t,n){if(n){if(Na(n)===0){e.setRuntimeHints(t,void 0);return}return e.setRuntimeHints(t,n),n}}function qa(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?p(r):void 0,s=Ba(o)??i;if(a.platform&&r&&!s)throw new n(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new n(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Ja(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Ba(p(i)):e.platform,o=n.getRuntimeHints(r),s=Ga({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=qa(n,r,i,a);return{runtime:i?Wa(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Na(s)>0?s:void 0;return{runtime:i?Wa(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Ya(e){return Ja(e).runtime}function Xa(t){try{return{ok:!0,data:Ja(t)}}catch(t){let n=e(t);return i(n.code,n.message,n.details)}}async function Za(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Qa(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Pa(t)})}function Qa(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&Fa(e.previousRuntime)&&!Fa(e.runtime)}function $a(e){let{device:t,owner:n,stateDir:r,intent:i}=e,a=i.kind===`exact-owner`&&se(i.owner,n)?ie(i.fence):null;if(!a)return{status:`binding-invalid`};let o=w(T(t)),s=qe(We(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!to(c.stateDir,r)||!se(Ke(c),n)?{status:`conflict`,conflict:s}:c.allocator.identityIncarnationId===a.identityIncarnationId?{status:`covered`}:{status:`incarnation-stale`,heldIncarnationId:c.allocator.identityIncarnationId}}function eo(e){let t=w(T(e));return Ue(We(t))}function to(e,t){return A.resolve(e)===A.resolve(t)}function no(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=p(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=l(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${_e(i)}`,`${a} ${_e(e.id)}`,...n===`release`||Ge(t.classification)?[`--stale`]:[]].join(` `)}function ro(e,t){if(t.classification===`allocator-held`)return ao(e,t);let r=t.claim,i=no(e,t,Je(t.classification)?`release`:`status`),a=p(r?{platform:r.device.family,appleOs:r.device.appleOs}:e);return new n(`DEVICE_IN_USE`,r?`${a} device ${e.id} is owned by session "${r.session}" in workspace "${r.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:po(t.classification),classification:t.classification,deviceKey:t.deviceKey,...r?{owner:{session:r.session,workspace:r.workspace,stateDir:r.stateDir}}:{},recovery:{command:i},hint:Je(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${i}`:`Inspect the owner with: ${i}`,retriable:!1})}function io(e,t){return fo(ro(e,t))}function ao(e,t){let r=t.allocatorClaim,i=p({platform:r.device.family,appleOs:r.device.appleOs}),a=no(e,t);return new n(`DEVICE_IN_USE`,`${i} device ${e.id} is held by managed-device allocator "${r.allocator.instanceId}" for installation "${r.stateDir}".`,{reason:`DEVICE_CLAIM_ALLOCATOR_HELD`,classification:t.classification,deviceKey:t.deviceKey,owner:{kind:`allocator`,stateDir:r.stateDir,allocator:r.allocator},recovery:{command:a},hint:`This device belongs to a managed pool and is released only after its allocator proves the identity removed; inspect with: ${a}`,retriable:!1})}function oo(e,t){return new n(`COMMAND_FAILED`,`${p(e)} device ${e.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:_(t),deviceKey:w(T(e)),retriable:!1,hint:`A managed identity becomes executable only after its allocator activates it and this installation holds its allocator-held claim.`})}function so(e,t,r){return new n(`COMMAND_FAILED`,`${p(e)} device ${e.id} is held for identity incarnation "${r}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:_(t),deviceKey:w(T(e)),heldIncarnationId:r,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function co(e,t){return new n(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:_(t),deviceKey:w(T(e)),retriable:!1})}function lo(e,t,n){switch(n.status){case`binding-invalid`:return{admitted:!1,error:co(e,t)};case`missing`:return{admitted:!1,error:oo(e,t)};case`covered`:return{admitted:!0};case`incarnation-stale`:return{admitted:!1,error:so(e,t,n.heldIncarnationId)};case`conflict`:return{admitted:!1,error:ro(e,n.conflict)}}}function uo(e,t,n){let r=lo(e,t,n);return r.admitted?void 0:fo(r.error)}function fo(e){let{hint:t,retriable:n,...r}=e.details??{};return i(e.code,e.message,r,{hint:t,retriable:n})}function po(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:case`allocator-inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function mo(e,t){if(t?.backend===`macos-app`)return`none`;switch(e.kind){case`local-family`:return`ordinary`;case`managed-local`:return`allocator-held`;case`provider-runtime`:return`none`}}export{ui as $,pa as A,Gi as B,Sa as C,Jt as Ct,ba as D,M as Dt,ya as E,Ut as Et,ta as F,Oi as G,Ui as H,na as I,Ni as J,ji as K,ea as L,sa as M,aa as N,ma as O,zt as Ot,ia as P,gi as Q,Qi as R,xa as S,Wt as St,Da as T,Ft as Tt,Ai as U,Wi as V,ki as W,Z as X,Pi as Y,Ei as Z,Ba as _,hn as _t,ro as a,Dn as at,Oa as b,en as bt,Va as c,bn as ct,Za as d,Sn as dt,si as et,Ha as f,mn as ft,Qa as g,gn as gt,Ka as h,dn as ht,lo as i,R as it,ca as j,ha as k,_t as kt,Na as l,yn as lt,Pa as m,pn as mt,uo as n,ri as nt,eo as o,En as ot,Ya as p,fn as pt,Mi as q,io as r,H as rt,$a as s,wn as st,mo as t,ii as tt,Fa as u,xn as ut,Xa as v,on as vt,Ca as w,Xt as wt,Ea as x,qt as xt,ka as y,tn as yt,$i as z};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{G as t,N as n}from"./sdk-contracts.js";import{AsyncLocalStorage as r}from"node:async_hooks";var i=e({listDeviceInventory:()=>l,listLocalDeviceInventory:()=>d,readDeviceInventory:()=>u,readInstalledAppProbe:()=>c,shouldPropagateDeviceInventoryProbeError:()=>m,withDeviceInventoryContext:()=>s});const a=`device_inventory_context_unavailable`,o=new r;async function s(e,t){return await o.run(e,t)}function c(){return o.getStore()?.findInstalledApp}async function l(e){return await f(`providerFirst`,e)}async function u(e){let t=p(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function d(e){return await f(`localOnly`,e)}async function f(e,t){let n=p();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function p(){let e=o.getStore();if(!e)throw new n(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:a});return e}function m(e){return t(e)||e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===a?!0:e instanceof Error&&e.name===`AbortError`}export{m as a,u as i,l as n,s as o,d as r,i as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{K as t,P as n}from"./sdk-contracts.js";import{AsyncLocalStorage as r}from"node:async_hooks";var i=e({listDeviceInventory:()=>l,listLocalDeviceInventory:()=>d,readDeviceInventory:()=>u,readInstalledAppProbe:()=>c,shouldPropagateDeviceInventoryProbeError:()=>m,withDeviceInventoryContext:()=>s});const a=`device_inventory_context_unavailable`,o=new r;async function s(e,t){return await o.run(e,t)}function c(){return o.getStore()?.findInstalledApp}async function l(e){return await f(`providerFirst`,e)}async function u(e){let t=p(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function d(e){return await f(`localOnly`,e)}async function f(e,t){let n=p();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function p(){let e=o.getStore();if(!e)throw new n(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:a});return e}function m(e){return t(e)||e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===a?!0:e instanceof Error&&e.name===`AbortError`}export{m as a,u as i,l as n,s as o,d as r,i as t};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-batch-runner.js";import{m as t,p as n}from"./sdk-device.js";import{r}from"./recording-export-quality.js";import{n as i}from"./recording-scope.js";import{i as a,n as o}from"./recording-stop-observation.js";import{t as s}from"./screen-recording-completion.js";import{t as c}from"./artifact-paths.js";async function l(e,t){try{return await e()}catch{if(t?.aborted)throw t.reason;return!1}}function u(e){return e.exitCode===0}function d(e){return process.platform===`darwin`&&(t(e)||n(e)&&e.kind===`simulator`||e.platform===`android`&&e.kind===`emulator`)}const f=[`scope`,`showTouches`,`recordOnlySession`,`activeSessionApp`,`exportQuality`];function p(e){return i(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`&&(e.exportQuality===void 0||r(e.exportQuality))&&m(e.activeSessionApp)}function m(t){return t===void 0?!0:!e(t)||!h(t.bundleId)?!1:t.name===void 0||h(t.name)}function h(e){return typeof e==`string`&&e.length>0}function g(e){return e.exportPath===void 0?e.observation===void 0||e.observation.recorder===`unconfirmed`:!1}const _=`stopObservation`,v=`stoppedAtMs`,y=`stopRecorderWarning`,b=`collectedPath`,x=`exportPath`,S=`stopFinalization`,C=Symbol(`unreadable`),w={telemetryPath:j(),warning:j(),overlayWarning:j(),nativePathDisposition:{encode:e=>e,read:e=>e===void 0?void 0:a(e)?e:C},chunks:{encode:e=>e.map(M),read:e=>e===void 0?void 0:N(e)??C},capturedDurationMs:{encode:e=>e,read:e=>e===void 0?void 0:F(e)?e:C}};function T(e){return{...e.observation===void 0?{}:{[_]:D(e.observation)},...e.stoppedAtMs===void 0?{}:{[v]:e.stoppedAtMs},...e.recorderWarning===void 0?{}:{[y]:e.recorderWarning},...e.collectedPath===void 0?{}:{[b]:e.collectedPath},...e.exportPath===void 0?{}:{[x]:e.exportPath},...e.finalization===void 0?{}:{[S]:O(e.finalization)}}}function E(e){let t=e?.[_],n=e?.[v],r=I(e?.[y]),i=I(e?.[b]),a=I(e?.[x]),s=k(e?.[S]);return{...o(t)?{observation:t}:{},...F(n)?{stoppedAtMs:n}:{},...r===void 0?{}:{recorderWarning:r},...i===void 0?{}:{collectedPath:i},...a===void 0?{}:{exportPath:a},...s===void 0?{}:{finalization:s}}}function D(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function O(e){let t={};for(let n of A()){let r=e[n];r!==void 0&&(t[n]=w[n].encode(r))}return t}function k(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n={};for(let e of A()){let r=w[e].read(t[e]);if(r===C)return;r!==void 0&&(n[e]=r)}return Object.keys(n).length===0?void 0:n}function A(){return Object.keys(w)}function j(){return{encode:e=>e,read:I}}function M(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function N(e){if(!Array.isArray(e))return;let t=e.map(P);return t.every(e=>e!==void 0)?t:void 0}function P(e){if(typeof e!=`object`||!e)return;let{index:t,path:n,clientOutPath:r}=e,i=I(n),a=I(r);if(!(!Number.isInteger(t)||t<1||i===void 0)&&(r===void 0||a!==void 0))return{index:t,path:i,...a===void 0?{}:{clientOutPath:a}}}function F(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function I(e){return typeof e==`string`&&e.length>0?e:void 0}async function L(e){let{steps:t,snapshot:n,progress:r,now:i=Date.now}=e,a=E(r?.learned),o=a.observation,l=a.recorderWarning,u=a.stoppedAtMs;if(g(a)){u=i();let e=await t.stop();o=e.observation,l=e.warning,r?.record(T({observation:o,stoppedAtMs:u,recorderWarning:e.warning}))}if(o===void 0)throw Error(`record stop reached collection without an observation of its recorder and a committed export`);let d=a.collectedPath??c(n.outPath);a.collectedPath===void 0&&(await t.collect(d),r?.record(T({collectedPath:d})));let f=a.finalization??await t.finalize({collectedPath:d,exportPath:n.outPath,stoppedAtMs:u??i()});r?.record(T({exportPath:n.outPath,finalization:f})),await t.discard(d);let{nativePathDisposition:p,warning:m,...h}=f,_=[m,l].filter(e=>e!==void 0&&e.length>0);return s(n,{...h,..._.length===0?{}:{warning:_.join(` `)}},{stopObservation:o,...p===void 0?{}:{nativePathDisposition:p}})}const R=`boot_timeout`;export{p as a,l as c,f as i,L as n,d as o,E as r,u as s,R as t};
1
+ import{v as e}from"./sdk-batch-runner.js";import{m as t,p as n}from"./sdk-device.js";import{r}from"./recording-export-quality.js";import{n as i}from"./recording-scope.js";import{i as a,n as o}from"./recording-stop-observation.js";import{t as s}from"./screen-recording-completion.js";import{t as c}from"./artifact-paths.js";async function l(e,t){try{return await e()}catch{if(t?.aborted)throw t.reason;return!1}}function u(e){return e.exitCode===0}function d(e){return process.platform===`darwin`&&(t(e)||n(e)&&e.kind===`simulator`||e.platform===`android`&&e.kind===`emulator`)}const f=[`scope`,`showTouches`,`recordOnlySession`,`activeSessionApp`,`exportQuality`,`fps`];function p(e){return i(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`&&(e.exportQuality===void 0||r(e.exportQuality))&&m(e.fps)&&h(e.activeSessionApp)}function m(e){return e===void 0||typeof e==`number`&&Number.isInteger(e)&&e>0}function h(t){return t===void 0?!0:!e(t)||!g(t.bundleId)?!1:t.name===void 0||g(t.name)}function g(e){return typeof e==`string`&&e.length>0}function _(e){return e.exportPath===void 0?e.observation===void 0||e.observation.recorder===`unconfirmed`:!1}const v=`stopObservation`,y=`stoppedAtMs`,b=`stopRecorderWarning`,x=`collectedPath`,S=`exportPath`,C=`stopFinalization`,w=Symbol(`unreadable`),T={telemetryPath:M(),warning:M(),overlayWarning:M(),nativePathDisposition:{encode:e=>e,read:e=>e===void 0?void 0:a(e)?e:w},chunks:{encode:e=>e.map(N),read:e=>e===void 0?void 0:P(e)??w},capturedDurationMs:{encode:e=>e,read:e=>e===void 0?void 0:I(e)?e:w}};function E(e){return{...e.observation===void 0?{}:{[v]:O(e.observation)},...e.stoppedAtMs===void 0?{}:{[y]:e.stoppedAtMs},...e.recorderWarning===void 0?{}:{[b]:e.recorderWarning},...e.collectedPath===void 0?{}:{[x]:e.collectedPath},...e.exportPath===void 0?{}:{[S]:e.exportPath},...e.finalization===void 0?{}:{[C]:k(e.finalization)}}}function D(e){let t=e?.[v],n=e?.[y],r=L(e?.[b]),i=L(e?.[x]),a=L(e?.[S]),s=A(e?.[C]);return{...o(t)?{observation:t}:{},...I(n)?{stoppedAtMs:n}:{},...r===void 0?{}:{recorderWarning:r},...i===void 0?{}:{collectedPath:i},...a===void 0?{}:{exportPath:a},...s===void 0?{}:{finalization:s}}}function O(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function k(e){let t={};for(let n of j()){let r=e[n];r!==void 0&&(t[n]=T[n].encode(r))}return t}function A(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n={};for(let e of j()){let r=T[e].read(t[e]);if(r===w)return;r!==void 0&&(n[e]=r)}return Object.keys(n).length===0?void 0:n}function j(){return Object.keys(T)}function M(){return{encode:e=>e,read:L}}function N(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function P(e){if(!Array.isArray(e))return;let t=e.map(F);return t.every(e=>e!==void 0)?t:void 0}function F(e){if(typeof e!=`object`||!e)return;let{index:t,path:n,clientOutPath:r}=e,i=L(n),a=L(r);if(!(!Number.isInteger(t)||t<1||i===void 0)&&(r===void 0||a!==void 0))return{index:t,path:i,...a===void 0?{}:{clientOutPath:a}}}function I(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function L(e){return typeof e==`string`&&e.length>0?e:void 0}async function R(e){let{steps:t,snapshot:n,progress:r,now:i=Date.now}=e,a=D(r?.learned),o=a.observation,l=a.recorderWarning,u=a.stoppedAtMs;if(_(a)){u=i();let e=await t.stop();o=e.observation,l=e.warning,r?.record(E({observation:o,stoppedAtMs:u,recorderWarning:e.warning}))}if(o===void 0)throw Error(`record stop reached collection without an observation of its recorder and a committed export`);let d=a.collectedPath??c(n.outPath);a.collectedPath===void 0&&(await t.collect(d),r?.record(E({collectedPath:d})));let f=a.finalization??await t.finalize({collectedPath:d,exportPath:n.outPath,stoppedAtMs:u??i()});r?.record(E({exportPath:n.outPath,finalization:f})),await t.discard(d);let{nativePathDisposition:p,warning:m,...h}=f,g=[m,l].filter(e=>e!==void 0&&e.length>0);return s(n,{...h,...g.length===0?{}:{warning:g.join(` `)}},{stopObservation:o,...p===void 0?{}:{nativePathDisposition:p}})}const z=`boot_timeout`;export{p as a,l as c,f as i,R as n,d as o,D as r,u as s,z as t};
@@ -1 +1 @@
1
- import{w as e}from"./perf-runtime-plan.js";import{r as t,t as n}from"./platform-request-scope.js";async function r(r,i){return await e({selectors:r,reconcile:t(n(),i)})}export{r as runStaleDeviceClaimRelease};
1
+ import{g as e}from"./perf-runtime-plan.js";import{r as t,t as n}from"./platform-request-scope.js";async function r(r,i){return await e({selectors:r,reconcile:t(n(),i)})}export{r as runStaleDeviceClaimRelease};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";const t=`native-panel`,n=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`],r={portrait:0,"landscape-left":1,"portrait-upside-down":2,"landscape-right":3};function i(e){return n.find(t=>r[t]===e)}function a(e){return typeof e==`string`&&n.includes(e)}function o(e){return r[e]*90}function s(e){return r[e]%2==0?`PORTRAIT`:`LANDSCAPE`}function c(t){if(t===void 0)throw new e(`INVALID_ARGS`,`orientation requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(t?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new e(`INVALID_ARGS`,`Invalid rotation: ${t}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}const l=[`closed`,`half-open`,`open`],u=`closed|half-open|open`;function d(e){if(Number.isFinite(e))return e<=f?`closed`:e>=p?`open`:`half-open`}const f=1,p=179;function m(t){if(t===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose argument. Use ${u}.`);switch(t.trim().toLowerCase()){case`closed`:case`close`:case`fold`:case`folded`:return`closed`;case`half-open`:case`half`:case`half-unfolded`:case`partially-open`:case`book`:return`half-open`;case`open`:case`unfold`:case`unfolded`:case`fully-open`:case`flat`:return`open`;default:throw new e(`INVALID_ARGS`,`Invalid fold pose: ${t}. Use ${u}.`)}}const h=6e4;function g(t){if(t.keyframes===void 0){if(t.pose===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose or keyframes`);if(typeof t.pose!=`string`)throw new e(`INVALID_ARGS`,`fold pose must be a string`);return{pose:m(t.pose)}}if(t.pose!==void 0)throw new e(`INVALID_ARGS`,`fold accepts either pose or keyframes`);return{keyframes:_(t.keyframes)}}function _(t){if(!Array.isArray(t)||t.length<2||t.length>64)throw new e(`INVALID_ARGS`,`fold requires 2–64 keyframes`);let n=t.map(y);if(n[0].atMs!==0||n.some((e,t)=>t>0&&e.atMs<=n[t-1].atMs))throw new e(`INVALID_ARGS`,`Fold keyframes must start at 0ms and increase strictly`);return n}function v(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>=0&&e<=t}function y(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Each fold keyframe requires atMs and angle`);let{atMs:n,angle:r}=t;if(Object.keys(t).some(e=>e!==`atMs`&&e!==`angle`))throw new e(`INVALID_ARGS`,`Fold keyframes only accept atMs and angle`);if(!v(n,6e4)||!Number.isSafeInteger(n))throw new e(`INVALID_ARGS`,`Fold keyframe times must be integers from 0 to ${h}ms`);if(!v(r,180))throw new e(`INVALID_ARGS`,`Fold keyframe angles must be finite numbers from 0 to 180`);return{atMs:n,angle:r}}function b(t){let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`--keyframes requires a JSON array of {atMs, angle} objects`)}return _(n)}export{t as a,s as c,a as d,c as f,m as h,u as i,o as l,b as m,r as n,h as o,g as p,l as r,i as s,n as t,d as u};
1
+ import{P as e}from"./sdk-contracts.js";const t=`native-panel`,n=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`],r={portrait:0,"landscape-left":1,"portrait-upside-down":2,"landscape-right":3};function i(e){return n.find(t=>r[t]===e)}function a(e){return typeof e==`string`&&n.includes(e)}function o(e){return r[e]*90}function s(e){return r[e]%2==0?`PORTRAIT`:`LANDSCAPE`}function c(t){if(t===void 0)throw new e(`INVALID_ARGS`,`orientation requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(t?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new e(`INVALID_ARGS`,`Invalid rotation: ${t}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}const l=[`closed`,`half-open`,`open`],u=`closed|half-open|open`;function d(e){if(Number.isFinite(e))return e<=f?`closed`:e>=p?`open`:`half-open`}const f=1,p=179;function m(t){if(t===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose argument. Use ${u}.`);switch(t.trim().toLowerCase()){case`closed`:case`close`:case`fold`:case`folded`:return`closed`;case`half-open`:case`half`:case`half-unfolded`:case`partially-open`:case`book`:return`half-open`;case`open`:case`unfold`:case`unfolded`:case`fully-open`:case`flat`:return`open`;default:throw new e(`INVALID_ARGS`,`Invalid fold pose: ${t}. Use ${u}.`)}}const h=6e4;function g(t){if(t.keyframes===void 0){if(t.pose===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose or keyframes`);if(typeof t.pose!=`string`)throw new e(`INVALID_ARGS`,`fold pose must be a string`);return{pose:m(t.pose)}}if(t.pose!==void 0)throw new e(`INVALID_ARGS`,`fold accepts either pose or keyframes`);return{keyframes:_(t.keyframes)}}function _(t){if(!Array.isArray(t)||t.length<2||t.length>64)throw new e(`INVALID_ARGS`,`fold requires 2–64 keyframes`);let n=t.map(y);if(n[0].atMs!==0||n.some((e,t)=>t>0&&e.atMs<=n[t-1].atMs))throw new e(`INVALID_ARGS`,`Fold keyframes must start at 0ms and increase strictly`);return n}function v(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>=0&&e<=t}function y(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Each fold keyframe requires atMs and angle`);let{atMs:n,angle:r}=t;if(Object.keys(t).some(e=>e!==`atMs`&&e!==`angle`))throw new e(`INVALID_ARGS`,`Fold keyframes only accept atMs and angle`);if(!v(n,6e4)||!Number.isSafeInteger(n))throw new e(`INVALID_ARGS`,`Fold keyframe times must be integers from 0 to ${h}ms`);if(!v(r,180))throw new e(`INVALID_ARGS`,`Fold keyframe angles must be finite numbers from 0 to 180`);return{atMs:n,angle:r}}function b(t){let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`--keyframes requires a JSON array of {atMs, angle} objects`)}return _(n)}export{t as a,s as c,a as d,c as f,m as h,u as i,o as l,b as m,r as n,h as o,g as p,l as r,i as s,n as t,d as u};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{E as n,b as r,l as i,p as a,v as o}from"./sdk-device.js";var s=e({markSelectionBootOccurred:()=>u,resolveExistingSessionDeviceSelection:()=>l,resolveInventoryDeviceSelection:()=>c});async function c(e){let{devices:t,selector:a,source:o}=e,s=i(a);if(o===`provider`&&!s)return p(t,a);if(o===`local`&&!s){let n=await m(t,a,e.appleSimulatorAppTarget);if(n)return n}let c=t.filter(e=>r(e,a,{includeExplicitSelectors:s}));try{return d(await n([...t],a),c,{explicitSelector:s,source:o})}catch(e){throw h(e,c)}}function l(e){return{device:e,reason:`existing-session`,source:`session`,candidateCount:1,bootOccurred:!1}}function u(e){if(!e||e.source!==`local`)return e;let{device:t}=e;return t.booted!==!0&&(t.kind===`simulator`||t.kind===`emulator`)?{...e,bootOccurred:!0}:e}function d(e,t,n){return{device:e,reason:n.explicitSelector?`explicit-selector`:n.source===`provider`?`single-provider-device`:f(e,t),source:n.source,candidateCount:t.length,bootOccurred:!1}}function f(e,t){return e.booted===!0&&t.filter(e=>e.booted===!0).length===1?`single-booted-local`:!e.booted&&t.length===1?`single-bootable-local`:`preferred-local`}async function p(e,i){let a=e.filter(e=>r(e,i)),o=a[0];if(o!==void 0&&a.length===1)return d(o,a,{explicitSelector:!1,source:`provider`});try{await n([...e],i)}catch(e){throw h(e,a)}throw new t(`AMBIGUOUS_MATCH`,`Multiple provider devices match this request.`,{...g(a),matches:a.length,hint:`Select the leased provider device explicitly with --device, --udid, or --serial.`,retrySelectors:_(a)})}async function m(e,n,i){let o=i?.trim();if(!o)return;let{readInstalledAppProbe:s}=await import(`./device-inventory-context.js`).then(e=>e.t),c=s();if(!c)return;let l=e.filter(e=>r(e,n)&&a(e)&&e.kind===`simulator`&&e.booted===!0);if(l.length<2)return;let u=(await Promise.all(l.map(async e=>await c(e,o)?e:void 0))).filter(e=>e!==void 0),d=u[0];if(d!==void 0&&u.length===1)return{device:d,reason:`single-app-installed-local`,source:`local`,candidateCount:1,bootOccurred:!1};throw u.length===0?new t(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${o} installed`,{appTarget:o,...g(l),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`,retrySelectors:_(l)}):new t(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${o} installed`,{appTarget:o,...g(u),hint:`Pass --udid to select the intended simulator explicitly.`,retrySelectors:_(u)})}function h(e,n){return!(e instanceof t)||e.code!==`AMBIGUOUS_MATCH`?e:new t(e.code,e.message,{...e.details??{},...g(n),retrySelectors:_(n)},e)}function g(e){return{devices:e.slice(0,10).map(e=>({id:e.id,name:e.name}))}}function _(e){return e.slice(0,10).flatMap(e=>[{flag:o(e.platform)?`--serial`:`--udid`,value:e.id},{flag:`--device`,value:e.name}])}export{u as n,l as r,s as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{D as n,l as r,p as i,v as a,x as o}from"./sdk-device.js";var s=e({markSelectionBootOccurred:()=>u,resolveExistingSessionDeviceSelection:()=>l,resolveInventoryDeviceSelection:()=>c});async function c(e){let{devices:t,selector:i,source:a}=e,s=r(i);if(a===`provider`&&!s)return p(t,i);if(a===`local`&&!s){let n=await m(t,i,e.appleSimulatorAppTarget);if(n)return n}let c=t.filter(e=>o(e,i,{includeExplicitSelectors:s}));try{return d(await n([...t],i),c,{explicitSelector:s,source:a})}catch(e){throw h(e,c)}}function l(e){return{device:e,reason:`existing-session`,source:`session`,candidateCount:1,bootOccurred:!1}}function u(e){if(!e||e.source!==`local`)return e;let{device:t}=e;return t.booted!==!0&&(t.kind===`simulator`||t.kind===`emulator`)?{...e,bootOccurred:!0}:e}function d(e,t,n){return{device:e,reason:n.explicitSelector?`explicit-selector`:n.source===`provider`?`single-provider-device`:f(e,t),source:n.source,candidateCount:t.length,bootOccurred:!1}}function f(e,t){return e.booted===!0&&t.filter(e=>e.booted===!0).length===1?`single-booted-local`:!e.booted&&t.length===1?`single-bootable-local`:`preferred-local`}async function p(e,r){let i=e.filter(e=>o(e,r)),a=i[0];if(a!==void 0&&i.length===1)return d(a,i,{explicitSelector:!1,source:`provider`});try{await n([...e],r)}catch(e){throw h(e,i)}throw new t(`AMBIGUOUS_MATCH`,`Multiple provider devices match this request.`,{...g(i),matches:i.length,hint:`Select the leased provider device explicitly with --device, --udid, or --serial.`,retrySelectors:_(i)})}async function m(e,n,r){let a=r?.trim();if(!a)return;let{readInstalledAppProbe:s}=await import(`./device-inventory-context.js`).then(e=>e.t),c=s();if(!c)return;let l=e.filter(e=>o(e,n)&&i(e)&&e.kind===`simulator`&&e.booted===!0);if(l.length<2)return;let u=(await Promise.all(l.map(async e=>await c(e,a)?e:void 0))).filter(e=>e!==void 0),d=u[0];if(d!==void 0&&u.length===1)return{device:d,reason:`single-app-installed-local`,source:`local`,candidateCount:1,bootOccurred:!1};throw u.length===0?new t(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${a} installed`,{appTarget:a,...g(l),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`,retrySelectors:_(l)}):new t(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${a} installed`,{appTarget:a,...g(u),hint:`Pass --udid to select the intended simulator explicitly.`,retrySelectors:_(u)})}function h(e,n){return!(e instanceof t)||e.code!==`AMBIGUOUS_MATCH`?e:new t(e.code,e.message,{...e.details??{},...g(n),retrySelectors:_(n)},e)}function g(e){return{devices:e.slice(0,10).map(e=>({id:e.id,name:e.name}))}}function _(e){return e.slice(0,10).flatMap(e=>[{flag:a(e.platform)?`--serial`:`--udid`,value:e.id},{flag:`--device`,value:e.name}])}export{u as n,l as r,s as t};
@@ -1 +1 @@
1
- import{N as e,z as t}from"./sdk-contracts.js";import{i as n}from"./sdk-batch-runner.js";import{n as r}from"./app-inventory.js";import"./device.js";import{t as i}from"./request-cancellation.js";import{n as a,t as o}from"./ios-client.js";import{i as s}from"./snapshot.js";import c from"node:path";import l from"node:fs";import u from"node:os";import{setTimeout as d}from"node:timers/promises";function f(e){return e?.trim()||void 0}async function p(e,t){let n=await a({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t},i={exec:async(e,t)=>await y(r,e,t),text:async e=>{await n.setText(e.target,e.text)}};return i.reverse=await t.android.createPortReverse(i.exec),Object.assign(r,{adbProvider:i})}function m(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function h(e,t,n,r,a,o){a?.throwIfAborted();let s=f(r?.packageNameHint);r?.relaunch&&s&&await t.dependencies.android.forceStopApp(async(e,n)=>await y(t,e,n),s,a);let c=await i(o,e.assets.getOrUpload({path:n,name:T(s,n)},{signal:a}),a);await i(o,t.client.sendAsset(c.signedDownloadUrl),a),a?.throwIfAborted();let l=s?await t.dependencies.android.inferAppName(s):void 0;return{...s?{packageName:s,launchTarget:s}:{},...l?{appName:l}:{}}}async function g(e,t){await e.adbProvider.reverse?.ensure({local:w(t.devicePort),remote:w(t.hostPort),ownerId:t.name})}async function _(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await v(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function v(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[];for(let e of n)e.ownerId?r.add(e.ownerId):i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function y(e,t,n){let{invocation:r,result:i}=await b(e,t,n);return await x(r,i,n?.allowFailure,e.dependencies)}async function b(e,t,n){let r=await S(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function x(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function S(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??C(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function C(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function w(t){if(!Number.isInteger(t)||t<1||t>65535)throw new e(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${t}`);return`tcp:${t}`}function T(e,t){let n=c.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}async function E(e,t){let n=await o({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t}}async function D(e,t,n,r,a,o){a?.throwIfAborted();let s=await j(n,t.dependencies);try{a?.throwIfAborted();let n=await i(o,e.assets.getOrUpload({path:s.uploadPath,name:s.assetName},{signal:a}),a),c=(await O(t,n.signedDownloadUrl,{md5:n.md5,relaunch:r?.relaunch,appIdentifierHint:r?.appIdentifierHint},a,o)).appId;return{...c?{bundleId:c,launchTarget:c}:{},...s.appName?{appName:s.appName}:{}}}finally{await s.cleanup()}}async function O(t,n,r,a,o){a?.throwIfAborted();let s=await i(o,t.client.listApps(),a).catch(e=>{if(a?.aborted)throw e}),c=f((await i(o,t.client.installApp(n,{md5:r?.md5,launchMode:r?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),a)).bundleId),l=f(r?.appIdentifierHint),u=[];for(let e of N){e>0&&await d(e,void 0,{signal:a}),u=await i(o,t.client.listApps(),a);let n=I({resultBundleId:c,requestedBundleId:l,beforeInstallApps:s,afterInstallApps:u});if(n)return{appId:n}}throw new e(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:c,requestedBundleId:l,installedUserApps:u.filter(R).map(e=>e.bundleId).sort()})}function k(e){return new A(e)}var A=class{session;constructor(e){this.session=e}async open(e,t){if(t?.url){await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e)),await this.session.client.openUrl(t.url);return}if(n(e)){await this.session.client.openUrl(e);return}await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e))}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(s(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:F},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=P){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>d(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(e,n){if(n&&n>0){let r=0;try{for(let t of Array.from(e))await this.session.client.typeText(t,!1,{requireFocus:!1}),r+=1,await d(n)}catch(e){throw t(e,r)}return}await this.session.client.typeText(e,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);l.mkdirSync(c.dirname(e),{recursive:!0}),await l.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async setOrientation(e){if(e===`portrait-upside-down`)throw z(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async setSetting(){throw z(`settings`,`Limrun iOS direct sessions do not expose settings changes yet.`)}};async function j(e,t){if(!(await l.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:c.basename(e),appName:M(e),cleanup:async()=>{}};let n=await l.promises.mkdtemp(c.join(u.tmpdir(),`agent-device-limrun-ios-app-`)),r=c.join(n,`${c.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:c.dirname(e),entryName:c.basename(e),archivePath:r})}catch(e){throw await l.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:c.basename(r),appName:await t.ios.readBundleAppName(e)??M(e),cleanup:async()=>{await l.promises.rm(n,{recursive:!0,force:!0})}}}function M(e){return c.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const N=[0,250],P=800,F=80;function I(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??L(e.beforeInstallApps,e.afterInstallApps)}function L(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>R(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function R(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}function z(t,n){throw new e(`UNSUPPORTED_OPERATION`,n,{command:t})}function B(e){return e.platform===`android`?V(e):H(e)}function V(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:m(e),adb:e.adbProvider,listApps:async n=>await e.dependencies.android.listApps(t,r(n)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function H(e){return{platform:`ios`,device:e.device,interactor:k(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>r(t)===`all`||R(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await O(e,t,n),runSimctl:t=>e.client.simctl(t)}}function U(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}export{_ as a,p as c,D as i,h as l,k as n,g as o,E as r,m as s,B as t};
1
+ import{B as e,P as t}from"./sdk-contracts.js";import{i as n}from"./sdk-batch-runner.js";import{n as r}from"./app-inventory.js";import"./device.js";import{t as i}from"./ios-client.js";import{t as a}from"./instance-client.js";import{t as o}from"./request-cancellation.js";import{i as s}from"./snapshot.js";import c from"node:fs";import l from"node:os";import u from"node:path";import{setTimeout as d}from"node:timers/promises";function f(e){return e?.trim()||void 0}async function p(e,t){let n=await a({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,ownership:e.ownership,device:e.device,client:n,token:e.token,dependencies:t},i={exec:async(e,t)=>await y(r,e,t),text:async e=>{await n.setText(e.target,e.text)}};return i.reverse=await t.android.createPortReverse(i.exec,{noRebind:e.ownership===`attached`}),Object.assign(r,{adbProvider:i})}function m(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function h(e,t,n,r,i,a){i?.throwIfAborted();let s=f(r?.packageNameHint);r?.relaunch&&s&&await t.dependencies.android.forceStopApp(async(e,n)=>await y(t,e,n),s,i);let c=await o(a,e.assets.getOrUpload({path:n,name:T(s,n)},{signal:i}),i);await o(a,t.client.sendAsset(c.signedDownloadUrl),i),i?.throwIfAborted();let l=s?await t.dependencies.android.inferAppName(s):void 0;return{...s?{packageName:s,launchTarget:s}:{},...l?{appName:l}:{}}}async function g(e,t){await e.adbProvider.reverse?.ensure({local:w(t.devicePort),remote:w(t.hostPort),ownerId:t.name})}async function _(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await v(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function v(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[],a=e.ownership===`attached`;for(let e of n)e.ownerId?r.add(e.ownerId):a||i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function y(e,t,n){let{invocation:r,result:i}=await b(e,t,n);return await x(r,i,n?.allowFailure,e.dependencies)}async function b(e,t,n){let r=await S(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function x(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function S(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??C(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function C(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function w(e){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${e}`);return`tcp:${e}`}function T(e,t){let n=u.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}async function E(e,t){let n=await i({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,ownership:e.ownership,device:e.device,client:n,token:e.token,dependencies:t}}async function D(e,t,n,r,i,a){i?.throwIfAborted();let s=await j(n,t.dependencies);try{i?.throwIfAborted();let n=await o(a,e.assets.getOrUpload({path:s.uploadPath,name:s.assetName},{signal:i}),i),c=(await O(t,n.signedDownloadUrl,{md5:n.md5,relaunch:r?.relaunch,appIdentifierHint:r?.appIdentifierHint},i,a)).appId;return{...c?{bundleId:c,launchTarget:c}:{},...s.appName?{appName:s.appName}:{}}}finally{await s.cleanup()}}async function O(e,n,r,i,a){i?.throwIfAborted();let s=await o(a,e.client.listApps(),i).catch(e=>{if(i?.aborted)throw e}),c=f((await o(a,e.client.installApp(n,{md5:r?.md5,launchMode:r?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),i)).bundleId),l=f(r?.appIdentifierHint),u=[];for(let t of N){t>0&&await d(t,void 0,{signal:i}),u=await o(a,e.client.listApps(),i);let n=I({resultBundleId:c,requestedBundleId:l,beforeInstallApps:s,afterInstallApps:u});if(n)return{appId:n}}throw new t(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:c,requestedBundleId:l,installedUserApps:u.filter(R).map(e=>e.bundleId).sort()})}function k(e){return new A(e)}var A=class{session;constructor(e){this.session=e}async open(e,t){if(t?.url){await this.launch(e,t.launchArgs),await this.session.client.openUrl(t.url);return}if(n(e)){await this.session.client.openUrl(e);return}await this.launch(e,t?.launchArgs)}async launch(e,n=[]){let r=await this.session.dependencies.ios.resolveAppAlias(e);if(n.length===0){await this.session.client.launchApp(r);return}let i=await this.session.client.simctl([`launch`,`--terminate-running-process`,`booted`,r,...n]).wait();if(i.code!==0)throw new t(`COMMAND_FAILED`,`Limrun iOS could not launch ${r} with arguments.`,{bundleId:r,exitCode:i.code,stderr:i.stderr.trim()})}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(s(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:F},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=P){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>d(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(t,n){if(n&&n>0){let r=0;try{for(let e of Array.from(t))await this.session.client.typeText(e,!1,{requireFocus:!1}),r+=1,await d(n)}catch(t){throw e(t,r)}return}await this.session.client.typeText(t,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);c.mkdirSync(u.dirname(e),{recursive:!0}),await c.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async setOrientation(e){if(e===`portrait-upside-down`)throw z(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async setSetting(e,t,n,r){let{setLimrunIosSetting:i}=await import(`./ios-settings.js`);return await i(this.session,e,t,n,r)}};async function j(e,t){if(!(await c.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:u.basename(e),appName:M(e),cleanup:async()=>{}};let n=await c.promises.mkdtemp(u.join(l.tmpdir(),`agent-device-limrun-ios-app-`)),r=u.join(n,`${u.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:u.dirname(e),entryName:u.basename(e),archivePath:r})}catch(e){throw await c.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:u.basename(r),appName:await t.ios.readBundleAppName(e)??M(e),cleanup:async()=>{await c.promises.rm(n,{recursive:!0,force:!0})}}}function M(e){return u.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const N=[0,250],P=800,F=80;function I(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??L(e.beforeInstallApps,e.afterInstallApps)}function L(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>R(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function R(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}function z(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}function B(e){return e.platform===`android`?V(e):H(e)}function V(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:m(e),adb:e.adbProvider,listApps:async n=>await e.dependencies.android.listApps(t,r(n)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function H(e){return{platform:`ios`,device:e.device,interactor:k(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>r(t)===`all`||R(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await O(e,t,n),runSimctl:t=>e.client.simctl(t)}}function U(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}export{_ as a,p as c,D as i,h as l,k as n,g as o,E as r,m as s,B as t};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";const t=/^[A-Za-z0-9_@%+=:,./-]+$/;function n(e){return`'${e.replaceAll(`'`,String.raw`'\''`)}'`}function r(e){return t.test(e)?e:n(e)}function i(e){return Object.freeze({script:e})}const a=new WeakMap,o=/[\\$"`]/g;function s(e){return e.replaceAll(o,e=>`\\${e}`)}function c(t,n){if(typeof t==`number`)return String(t);if(typeof t==`string`){if(n===`hdc`){if(t===``)throw new e(`INVALID_ARGS`,`hdc drops an empty element instead of carrying it, so the device command would lose an operand.`,{reason:`hdc-empty-word-unsupported`,hint:`Pass a value the transport can carry, or use a device action that needs no operand.`});return s(t)}return r(t)}if(n===`hdc`)throw new e(`INVALID_ARGS`,`hdc wraps every element in double quotes, so a shell fragment would reach the device as literal text instead of a script.`,{reason:`hdc-shell-fragment-unsupported`});return t.script}function l(e,t,n,r=[]){let i=Object.freeze([...r,t,...n.map(t=>c(t,e))]);return a.set(i,r.length),i}function u(e,t,n){if(n===0)return e;let r=a.get(e),i=[...e.slice(0,t),...e.slice(t+n)];if(r===void 0||t+n>r)return i;let o=r-n,s=Object.freeze(i);return a.set(s,o),s}function d(t,n){if(!(!t.includes(`shell`)&&!t.includes(`exec-out`))&&!a.has(t))throw new e(`INVALID_ARGS`,`${n}: device-shell argv must be built with deviceShellArgv (got ${JSON.stringify(t)}).`,{reason:`unguarded-device-shell-argv`})}function f(e){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1).replace(/\.(?:com|exe|bat|cmd)$/i,``);return t===`adb`||t===`hdc`?t:void 0}export{i as a,u as i,l as n,n as o,f as r,r as s,d as t};
1
+ import{P as e}from"./sdk-contracts.js";const t=/^[A-Za-z0-9_@%+=:,./-]+$/;function n(e){return`'${e.replaceAll(`'`,String.raw`'\''`)}'`}function r(e){return t.test(e)?e:n(e)}function i(e){return Object.freeze({script:e})}const a=new WeakMap,o=/[\\$"`]/g;function s(e){return e.replaceAll(o,e=>`\\${e}`)}function c(t,n){if(typeof t==`number`)return String(t);if(typeof t==`string`){if(n===`hdc`){if(t===``)throw new e(`INVALID_ARGS`,`hdc drops an empty element instead of carrying it, so the device command would lose an operand.`,{reason:`hdc-empty-word-unsupported`,hint:`Pass a value the transport can carry, or use a device action that needs no operand.`});return s(t)}return r(t)}if(n===`hdc`)throw new e(`INVALID_ARGS`,`hdc wraps every element in double quotes, so a shell fragment would reach the device as literal text instead of a script.`,{reason:`hdc-shell-fragment-unsupported`});return t.script}function l(e,t,n,r=[]){let i=Object.freeze([...r,t,...n.map(t=>c(t,e))]);return a.set(i,r.length),i}function u(e,t,n){if(n===0)return e;let r=a.get(e),i=[...e.slice(0,t),...e.slice(t+n)];if(r===void 0||t+n>r)return i;let o=r-n,s=Object.freeze(i);return a.set(s,o),s}function d(t,n){if(!(!t.includes(`shell`)&&!t.includes(`exec-out`))&&!a.has(t))throw new e(`INVALID_ARGS`,`${n}: device-shell argv must be built with deviceShellArgv (got ${JSON.stringify(t)}).`,{reason:`unguarded-device-shell-argv`})}function f(e){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1).replace(/\.(?:com|exe|bat|cmd)$/i,``);return t===`adb`||t===`hdc`?t:void 0}export{i as a,u as i,l as n,n as o,f as r,r as s,d as t};
@@ -1 +1 @@
1
- import{m as e,p as t,x as n}from"./sdk-device.js";const r=[`android`,`harmonyos`,`apple`,`vega`,`linux`];function i(e){let{booted:t,kind:n,...r}=e;return r}const a={platform:`web`,id:`agent-browser-chrome`,name:`Agent Browser Chrome`,kind:`device`,target:`desktop`,booted:!0};function o(e){let t=c();for(let n of e){let e=l(n);t[e].available+=1,n.booted===!0&&(t[e].booted+=1)}return t}function s(e,t){return e.filter(e=>n(e,t.platform)&&(t.target===void 0||(e.target??`mobile`)===t.target)&&(t.kind===void 0||e.kind===t.kind)&&(t.booted===void 0||e.booted===t.booted))}function c(){return{android:{available:0,booted:0},harmonyos:{available:0,booted:0},apple:{available:0,booted:0},vega:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}}}function l(n){return t(n)||e(n)?`apple`:n.platform}const u=new Set([`DEVICE_CLAIM_LIVE_OWNER`,`DEVICE_CLAIM_RECOVERY_PENDING`,`DEVICE_CLAIM_OWNER_UNCERTAIN`]);function d(e){return u.has(e)}export{d as a,s as i,a as n,i as o,o as r,r as t};
1
+ import{S as e,m as t,p as n}from"./sdk-device.js";const r=[`android`,`harmonyos`,`apple`,`vega`,`linux`];function i(e){let{booted:t,kind:n,...r}=e;return r}const a={platform:`web`,id:`agent-browser-chrome`,name:`Agent Browser Chrome`,kind:`device`,target:`desktop`,booted:!0};function o(e){let t=c();for(let n of e){let e=l(n);t[e].available+=1,n.booted===!0&&(t[e].booted+=1)}return t}function s(t,n){return t.filter(t=>e(t,n.platform)&&(n.target===void 0||(t.target??`mobile`)===n.target)&&(n.kind===void 0||t.kind===n.kind)&&(n.booted===void 0||t.booted===n.booted))}function c(){return{android:{available:0,booted:0},harmonyos:{available:0,booted:0},apple:{available:0,booted:0},vega:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}}}function l(e){return n(e)||t(e)?`apple`:e.platform}const u=new Set([`DEVICE_CLAIM_LIVE_OWNER`,`DEVICE_CLAIM_RECOVERY_PENDING`,`DEVICE_CLAIM_OWNER_UNCERTAIN`]);function d(e){return u.has(e)}export{d as a,s as i,a as n,i as o,o as r,r as t};
@@ -1,3 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{C as t}from"./sdk-device.js";import{s as n}from"./device-shell.js";import{i as r,n as i,t as a}from"./device-claim-inspection.js";import{t as o}from"./shared.js";const s=async({positionals:t,flags:n})=>{if(t.length!==1||t[0]!==`status`&&t[0]!==`release`)throw new e(`INVALID_ARGS`,`device accepts only: status, release`);if(t[0]===`release`)return await c(n);let s=r({platform:n.platform,device:n.device,udid:n.udid,serial:n.serial}),l=s.filter(e=>i(e.classification)),u=(n.stale?l:s.filter(e=>!i(e.classification))).map(m),d={claims:u,...n.stale?{}:{hiddenStaleClaims:l.length}};return await o(n,d,()=>g(u,{staleOnly:n.stale===!0,hiddenStaleClaims:l.length,staleCommand:x(n,`status`),releasableClaims:l.filter(e=>a(e.classification)).length,releaseCommand:x(n,`release`)})),!0};async function c(t){if(t.stale!==!0)throw new e(`INVALID_ARGS`,`device release only releases provably stale claims; pass --stale to confirm.`,{hint:`A live owner is released by closing its session from its own workspace, or by stopping its daemon: agent-device daemon stop --state-dir <owner state dir>.`});let{runStaleDeviceClaimRelease:n}=await import(`./device-release.js`),r=await n({platform:t.platform,device:t.device,udid:t.udid,serial:t.serial}),i={released:r.filter(e=>e.status===`released`).map(l),retained:r.filter(e=>e.status===`retained`).map(l),refused:r.filter(e=>e.status===`refused`).map(l),changed:r.filter(e=>e.status===`changed`).map(l)};return await o(t,i,()=>u(r)),!0}function l(e){let{device:t,...n}=e;return{...n,...t?{device:h(t)}:{}}}function u(e){return e.length===0?`No local device claims matched.`:e.map(d).join(`
2
- `)}function d(e){let n=e.device?`${t({platform:e.device.family,appleOs:e.device.appleOs})} ${e.device.name}`:e.deviceKey??e.fileName,r=f(e);switch(e.status){case`released`:return`released ${n}${r}`;case`retained`:return`retained ${n}${r} — resources not settled (${e.reason}); the claim stays until they are.`;case`refused`:return`refused ${n}${r} — ${e.reason} (${e.classification}); ${p(e)}`;case`changed`:return`changed ${n} — the claim changed while releasing; re-run device status.`}}function f(e){return e.allocator?` allocator=${e.allocator.instanceId} incarnation=${e.allocator.identityIncarnationId}`:e.session?` session=${e.session} workspace=${e.workspace}`:``}function p(e){return e.classification===`allocator-held`?`held by its managed-device allocator; it is cleared only after the allocator proves the identity removed.`:e.classification===`live`||e.classification===`owner-state-dir-gone`?e.stateDir?`close the owning session from its workspace, or stop its daemon: agent-device daemon stop --state-dir ${n(e.stateDir)}`:`close the owning session from its workspace first.`:`only provably dead owners are released; nothing was changed.`}function m(e){let t=e.claim??e.allocatorClaim;return{...e.deviceKey?{deviceKey:e.deviceKey}:{},...t?{}:{fileName:e.fileName},classification:e.classification,...t?{device:h(t.device)}:{},...e.claim?{owner:{session:e.claim.session,workspace:e.claim.workspace,stateDir:e.claim.stateDir,pid:e.claim.ownerPid,startTime:e.claim.ownerStartTime}}:{},...e.allocatorClaim?{owner:{kind:`allocator`,stateDir:e.allocatorClaim.stateDir,allocator:e.allocatorClaim.allocator}}:{},...e.error?{error:e.error}:{}}}function h(e){let{family:n,...r}=e;return{...r,platform:t({platform:n,appleOs:e.appleOs})}}function g(e,t){let n=e.map(v);if(n.length===0){if(t.staleOnly)return`No stale local device claims found.`;if(t.hiddenStaleClaims===0)return`No local device claims found.`}return[...n.length===0?[`No live local device claims found.`]:n,..._(t)].join(`
3
- `)}function _(e){if(e.staleOnly)return e.releasableClaims>0?[`Release provably dead owners with: ${e.releaseCommand}`]:[];if(e.hiddenStaleClaims===0)return[];let t=e.hiddenStaleClaims===1?`claim`:`claims`;return[`${e.hiddenStaleClaims} stale ${t} hidden; inspect with: ${e.staleCommand}`]}function v(e){return`${y(e)}: ${e.classification}${b(e.owner)}`}function y(e){let t=e.device;return t?`${t.platform??`unknown`} ${t.name??t.id??`claim`}`:String(e.deviceKey??e.fileName??`claim`)}function b(e){if(!e||typeof e!=`object`)return``;let t=e;return t.allocator?` allocator=${t.allocator.instanceId} incarnation=${t.allocator.identityIncarnationId} installation=${t.stateDir}`:` session=${t.session} workspace=${t.workspace}`}function x(e,t){let r=[e.platform?`--platform ${n(e.platform)}`:null,e.device?`--device ${n(e.device)}`:null,e.udid?`--udid ${n(e.udid)}`:null,e.serial?`--serial ${n(e.serial)}`:null].filter(e=>!!e);return[`agent-device device ${t}`,...r,`--stale`].join(` `)}export{s as deviceCommand};
1
+ import{createHash as e}from"node:crypto";const t=`limrun`,n={provider:t,label:`Limrun`,fields:{providerApp:`consumed`,providerOsVersion:`refused`,providerProject:`refused`,providerBuild:`refused`,providerSessionName:`refused`,providerDeviceOrientation:`refused`,providerGeoLocation:`refused`,providerTimezone:`refused`,providerAppiumVersion:`refused`,providerLanguage:`refused`,providerLocale:`refused`,providerNetworkProfile:`refused`,providerCustomNetwork:`refused`,providerNoResignApp:`refused`,awsProjectArn:`refused`,awsDeviceArn:`refused`,awsAppArn:`refused`,awsRegion:`refused`,awsInteractionMode:`refused`}},r=t;function i(e){if(e===`ios-instance`)return`ios`;if(e===`android-instance`)return`android`}function a(e,t,n){return{platform:e===`ios`?`apple`:`android`,...e===`ios`?{appleOs:`ios`}:{},id:c(e,t.leaseId),name:`Limrun ${e} ${n.slice(0,8)}`,kind:e===`ios`?`simulator`:`emulator`,target:`mobile`,booted:!0}}function o(t){return`attached-${e(`sha256`).update(t).digest(`hex`).slice(0,12)}`}function s(e){let[t,n,i]=e.split(`:`);if(t===r&&(n===`ios`||n===`android`)&&i)return{platform:n,leaseId:i}}function c(e,t){return`${r}:${e}:${t}`}function l(e){let t=s(e.id);return!t||e.target!==`mobile`?!1:t.platform===`ios`?u(e):d(e)}function u(e){return e.platform===`apple`&&e.appleOs===`ios`&&e.kind===`simulator`&&e.iosPhysicalDeviceBackend===void 0}function d(e){return e.platform===`android`&&e.appleOs===void 0&&e.kind===`emulator`&&e.iosPhysicalDeviceBackend===void 0}export{l as a,a as i,t as n,s as o,o as r,i as s,n as t};