agent-device 0.21.19 → 0.21.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.apk → agent-device-android-ime-helper-0.21.21.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.21.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.manifest.json → agent-device-android-ime-helper-0.21.21.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.19.manifest.json → agent-device-android-snapshot-helper-0.21.21.manifest.json} +6 -6
  7. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AppWindowScreenshot.swift +73 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/BackgroundInteraction.swift +557 -0
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/GhostCursor.swift +141 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +107 -3
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +136 -22
  12. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/BackgroundInteractionTests.swift +88 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +133 -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+CommandJournal.swift +1 -14
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +14 -16
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +67 -14
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
  31. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
  32. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
  33. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +20 -5
  34. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +2 -15
  35. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +10 -25
  36. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +1 -18
  37. package/dist/src/adapter.js +1 -1
  38. package/dist/src/adb-executor.js +2 -2
  39. package/dist/src/adb-failure.js +1 -1
  40. package/dist/src/adb-transport.js +1 -1
  41. package/dist/src/agent-browser-lifecycle.js +1 -1
  42. package/dist/src/agent-browser-process-record.js +1 -1
  43. package/dist/src/agent-browser-provider.js +1 -1
  44. package/dist/src/agent-browser-tool.js +1 -1
  45. package/dist/src/agent-device-client.js +2 -2
  46. package/dist/src/ai-sdk.js +1 -1
  47. package/dist/src/alert-runtime.js +1 -1
  48. package/dist/src/alert.js +1 -0
  49. package/dist/src/android-adb.d.ts +12 -0
  50. package/dist/src/android-input-ownership.js +1 -1
  51. package/dist/src/app-backend.js +1 -0
  52. package/dist/src/app-catalog.js +1 -1
  53. package/dist/src/app-deployment-resolution.js +1 -1
  54. package/dist/src/app-inventory.js +1 -1
  55. package/dist/src/app-launch.js +2 -2
  56. package/dist/src/app-lifecycle.js +2 -2
  57. package/dist/src/app-lifecycle2.js +1 -1
  58. package/dist/src/app-log-files.js +1 -1
  59. package/dist/src/app-log-reconnect.js +1 -1
  60. package/dist/src/app-log-runtime2.js +3 -3
  61. package/dist/src/app-log-session-resource.js +1 -0
  62. package/dist/src/app-resolution.js +2 -2
  63. package/dist/src/apple-runner-platform.js +1 -1
  64. package/dist/src/application-lifecycle-interaction.js +1 -1
  65. package/dist/src/archive.js +2 -2
  66. package/dist/src/artifact-download.js +1 -1
  67. package/dist/src/auth-session.js +1 -1
  68. package/dist/src/auth.js +1 -1
  69. package/dist/src/back-mode.js +1 -1
  70. package/dist/src/backend-snapshot-options.js +1 -1
  71. package/dist/src/boot-diagnostics.js +1 -1
  72. package/dist/src/browser-launch.js +1 -1
  73. package/dist/src/cache.js +1 -1
  74. package/dist/src/capabilities.js +1 -1
  75. package/dist/src/capture.js +1 -1
  76. package/dist/src/cli-config.js +1 -1
  77. package/dist/src/cli-help.js +317 -323
  78. package/dist/src/cli-runner.js +1 -1
  79. package/dist/src/cli.js +4 -4
  80. package/dist/src/click-button.js +1 -1
  81. package/dist/src/client-metro-companion.js +1 -1
  82. package/dist/src/client-metro.js +1 -1
  83. package/dist/src/client-options.js +3 -0
  84. package/dist/src/client-types.d.ts +101 -6
  85. package/dist/src/clipboard-shell-response.js +1 -1
  86. package/dist/src/{scroll-command.d.ts → cloud-artifacts.d.ts} +249 -240
  87. package/dist/src/code-signature-cache.js +1 -1
  88. package/dist/src/code-signature.js +1 -1
  89. package/dist/src/command-schema.js +3 -3
  90. package/dist/src/command-tools.js +2 -2
  91. package/dist/src/command.js +1 -1
  92. package/dist/src/config.js +1 -1
  93. package/dist/src/connection-runtime.js +1 -1
  94. package/dist/src/connection.js +5 -5
  95. package/dist/src/contracts.d.ts +1 -1
  96. package/dist/src/contracts.js +1 -1
  97. package/dist/src/daemon-artifacts.js +1 -0
  98. package/dist/src/daemon-client-lease-beat.js +1 -1
  99. package/dist/src/daemon-client-lifecycle.js +1 -1
  100. package/dist/src/daemon-client-liveness-probe.js +1 -0
  101. package/dist/src/daemon-client-transport.js +1 -1
  102. package/dist/src/daemon-http.js +1 -0
  103. package/dist/src/daemon-policy-file.js +1 -1
  104. package/dist/src/daemon-registration-owner.js +1 -0
  105. package/dist/src/daemon-registration.js +1 -1
  106. package/dist/src/daemon-resolution.js +1 -1
  107. package/dist/src/daemon-shutdown-report.js +1 -1
  108. package/dist/src/daemon.js +2 -2
  109. package/dist/src/debug-symbols-facade.js +3 -3
  110. package/dist/src/device-claim-inspection.js +1 -1
  111. package/dist/src/device-claim-rule.js +1 -1
  112. package/dist/src/device-inventory-context.js +1 -1
  113. package/dist/src/device-readiness-runtime.js +1 -1
  114. package/dist/src/device-release.js +1 -1
  115. package/dist/src/device-rotation.js +1 -1
  116. package/dist/src/device-selection-resolver.js +1 -1
  117. package/dist/src/device-session.js +1 -1
  118. package/dist/src/device-shell.js +1 -1
  119. package/dist/src/device.js +1 -1
  120. package/dist/src/device2.js +1 -3
  121. package/dist/src/device3.js +3 -0
  122. package/dist/src/devicectl.js +1 -1
  123. package/dist/src/diagnostics.js +3 -3
  124. package/dist/src/dispatch-resolve.js +4 -1
  125. package/dist/src/display-inventory.js +1 -1
  126. package/dist/src/doctor-facade.js +1 -1
  127. package/dist/src/doctor2.js +1 -1
  128. package/dist/src/durable-capture-resource.js +1 -0
  129. package/dist/src/engine-eval-script.js +1 -1
  130. package/dist/src/error.js +1 -1
  131. package/dist/src/exec.js +1 -1
  132. package/dist/src/file.js +1 -1
  133. package/dist/src/find.js +1 -1
  134. package/dist/src/generic-settle.js +1 -1
  135. package/dist/src/generic.js +1 -1
  136. package/dist/src/gesture-admission.js +1 -1
  137. package/dist/src/gesture-plan.js +1 -1
  138. package/dist/src/gesture-runtime.js +1 -1
  139. package/dist/src/harmonyos.js +1 -1
  140. package/dist/src/hdc.js +1 -1
  141. package/dist/src/helper.js +2 -2
  142. package/dist/src/host-file.js +1 -1
  143. package/dist/src/host.js +1 -1
  144. package/dist/src/human-control-contract.js +1 -1
  145. package/dist/src/human-control.js +1 -1
  146. package/dist/src/index.d.ts +2 -2
  147. package/dist/src/index.js +1 -1
  148. package/dist/src/input-actions.js +1 -1
  149. package/dist/src/input-actions2.js +2 -2
  150. package/dist/src/install-artifact-facade.js +1 -1
  151. package/dist/src/install-source-network-transport.js +1 -1
  152. package/dist/src/install-source.d.ts +5 -0
  153. package/dist/src/install-source2.js +1 -1
  154. package/dist/src/instance-client.js +1 -0
  155. package/dist/src/interaction-positionals.js +1 -1
  156. package/dist/src/interaction-ref-policy.js +1 -1
  157. package/dist/src/interaction.js +1 -1
  158. package/dist/src/interaction2.js +1 -1
  159. package/dist/src/interactor-operation-binding.js +1 -1
  160. package/dist/src/interactor.js +5 -5
  161. package/dist/src/interactor2.js +1 -1
  162. package/dist/src/interactors.js +1 -1
  163. package/dist/src/internal/bin.js +1 -1
  164. package/dist/src/internal/daemon.js +1 -2
  165. package/dist/src/internal/png-worker.js +1 -1
  166. package/dist/src/internal/run-script-http-child.js +1 -1
  167. package/dist/src/inventory.js +4 -4
  168. package/dist/src/inventory2.js +1 -1
  169. package/dist/src/inventory3.js +1 -1
  170. package/dist/src/inventory5.js +1 -1
  171. package/dist/src/ios-client.js +4 -30
  172. package/dist/src/ios-settings.js +1 -0
  173. package/dist/src/ios-snapshot-engine.js +1 -1
  174. package/dist/src/ios-snapshot-runtime.js +1 -1
  175. package/dist/src/launch-confirmation.js +1 -0
  176. package/dist/src/lease-context.js +1 -1
  177. package/dist/src/lease-registry-scope.js +1 -0
  178. package/dist/src/lease-scope.js +1 -1
  179. package/dist/src/lease.js +1 -1
  180. package/dist/src/legacy-xctest-device-set.js +1 -1
  181. package/dist/src/limrun-download-file.js +1 -1
  182. package/dist/src/limrun-runtime-dependencies.js +1 -1
  183. package/dist/src/limrun.d.ts +78 -44
  184. package/dist/src/limrun.js +1 -1
  185. package/dist/src/linux.js +1 -1
  186. package/dist/src/load.js +1 -0
  187. package/dist/src/location-coordinates.js +1 -1
  188. package/dist/src/macos-facade.js +1 -1
  189. package/dist/src/managed-device-scope.js +1 -1
  190. package/dist/src/mechanics.js +16 -16
  191. package/dist/src/observation.js +1 -1
  192. package/dist/src/observe-until.js +1 -1
  193. package/dist/src/overlay.js +2 -2
  194. package/dist/src/owner-identity.js +3 -3
  195. package/dist/src/path-resolution.js +1 -1
  196. package/dist/src/perf-facade.js +1 -1
  197. package/dist/src/perf-runtime-operation-builder.js +1 -1
  198. package/dist/src/perf-runtime-plan.js +1 -1
  199. package/dist/src/perf-target.js +1 -1
  200. package/dist/src/perf.js +1 -1
  201. package/dist/src/physical-device-control.js +1 -1
  202. package/dist/src/platform-request-scope.js +1 -1
  203. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  204. package/dist/src/platform-runtime-app-log-process.js +1 -1
  205. package/dist/src/platform-runtime-host.js +1 -1
  206. package/dist/src/platform-runtime-managed-owner.js +1 -1
  207. package/dist/src/platform-runtime-open-target.js +1 -1
  208. package/dist/src/platform-runtime-operation-host.js +2 -2
  209. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  210. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  211. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  212. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  213. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  214. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
  215. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  216. package/dist/src/platform-runtime-unavailable.js +1 -1
  217. package/dist/src/platform-runtime.js +1 -1
  218. package/dist/src/platform-runtime2.js +1 -1
  219. package/dist/src/plugins.d.ts +9 -0
  220. package/dist/src/plugins.js +1 -0
  221. package/dist/src/plugins2.js +2 -0
  222. package/dist/src/png-crop-bytes.js +1 -1
  223. package/dist/src/png-size.js +1 -1
  224. package/dist/src/png-worker-client.js +1 -1
  225. package/dist/src/png.js +1 -1
  226. package/dist/src/prepare-kind.js +1 -1
  227. package/dist/src/process.js +1 -1
  228. package/dist/src/project-runtime.js +1 -1
  229. package/dist/src/provider-credential-fingerprint.js +1 -0
  230. package/dist/src/provider-device-admission.js +1 -1
  231. package/dist/src/provider-device-runtimes.js +1 -0
  232. package/dist/src/provider-limrun-credentials.js +1 -0
  233. package/dist/src/provider-profile-fields.js +1 -0
  234. package/dist/src/provider-session-ownership.js +2 -2
  235. package/dist/src/provider-webdriver.js +2 -1
  236. package/dist/src/providers.js +1 -1
  237. package/dist/src/proxy.js +1 -1
  238. package/dist/src/quality-warnings.js +1 -1
  239. package/dist/src/react-native.js +1 -1
  240. package/dist/src/record-runtime.js +1 -1
  241. package/dist/src/record-trace.js +1 -1
  242. package/dist/src/recording.js +1 -1
  243. package/dist/src/rect-center.js +1 -1
  244. package/dist/src/register-builtins.js +1 -1
  245. package/dist/src/registry.js +52 -36
  246. package/dist/src/remote-config2.js +1 -1
  247. package/dist/src/replay-divergence.js +1 -1
  248. package/dist/src/replay.js +2 -2
  249. package/dist/src/reporting.js +5 -5
  250. package/dist/src/request-admission.js +1 -1
  251. package/dist/src/request-cancel.js +1 -1
  252. package/dist/src/request-cancellation.js +1 -1
  253. package/dist/src/request-runtime-binding.js +1 -1
  254. package/dist/src/result-serialization.js +1 -1
  255. package/dist/src/retry.js +1 -1
  256. package/dist/src/runner-artifact-manifest.js +1 -1
  257. package/dist/src/runner-cache-metadata.js +3 -3
  258. package/dist/src/runner-client.js +1 -1
  259. package/dist/src/runner-dev-tools-security.js +1 -1
  260. package/dist/src/runner-device-readiness.js +1 -1
  261. package/dist/src/runner-disposal.js +1 -1
  262. package/dist/src/runner-error-classification.js +2 -2
  263. package/dist/src/runner-exchange.js +1 -1
  264. package/dist/src/runner-operations-facade.js +1 -1
  265. package/dist/src/runner-session-types.js +1 -1
  266. package/dist/src/runner-start-budget.js +1 -1
  267. package/dist/src/runner.js +1 -1
  268. package/dist/src/runtime-admission.js +1 -1
  269. package/dist/src/runtime-transport-hints.js +1 -1
  270. package/dist/src/runtime.js +1 -1
  271. package/dist/src/runtime10.js +2 -2
  272. package/dist/src/runtime2.js +3 -3
  273. package/dist/src/runtime3.js +1 -1
  274. package/dist/src/runtime4.js +5 -5
  275. package/dist/src/runtime5.js +1 -1
  276. package/dist/src/runtime6.js +1 -1
  277. package/dist/src/runtime7.js +1 -1
  278. package/dist/src/runtime8.js +1 -1
  279. package/dist/src/runtime9.js +1 -1
  280. package/dist/src/screen-recording-admission-ledger.js +1 -1
  281. package/dist/src/screen-recording-completion.js +1 -1
  282. package/dist/src/screen-recording-options.js +1 -1
  283. package/dist/src/screen-recording-resource-recovery.js +1 -1
  284. package/dist/src/screen-recording-transport.js +1 -1
  285. package/dist/src/screenshot-density.js +1 -1
  286. package/dist/src/screenshot-image.js +1 -1
  287. package/dist/src/screenshot-result.js +1 -1
  288. package/dist/src/screenshot-runtime.js +1 -1
  289. package/dist/src/screenshot.js +1 -1
  290. package/dist/src/screenshot3.js +1 -1
  291. package/dist/src/script.js +1 -1
  292. package/dist/src/scroll-command.js +1 -1
  293. package/dist/src/scroll-gesture.js +1 -1
  294. package/dist/src/sdk-batch-runner.js +2 -2
  295. package/dist/src/sdk-batch.js +2 -2
  296. package/dist/src/sdk-contracts.d.ts +47 -2
  297. package/dist/src/sdk-contracts.js +2 -2
  298. package/dist/src/sdk-device.js +1 -1
  299. package/dist/src/sdk-io.js +1 -1
  300. package/dist/src/sdk-remote-config.js +1 -1
  301. package/dist/src/sdk-selectors.d.ts +37 -8
  302. package/dist/src/selection.js +0 -0
  303. package/dist/src/selector-runtime.js +1 -1
  304. package/dist/src/selectors.d.ts +2 -2
  305. package/dist/src/selectors.js +1 -1
  306. package/dist/src/server.js +1 -1
  307. package/dist/src/session-allocation.js +1 -1
  308. package/dist/src/session-artifact-paths.js +1 -1
  309. package/dist/src/session-repair-tombstone.js +1 -1
  310. package/dist/src/session-routing.js +1 -1
  311. package/dist/src/session-runtime-admission.js +1 -1
  312. package/dist/src/session-snapshot.js +1 -1
  313. package/dist/src/session-stream.js +27 -0
  314. package/dist/src/session.js +1 -1
  315. package/dist/src/session2.js +5 -5
  316. package/dist/src/settings.js +1 -1
  317. package/dist/src/settings2.js +1 -1
  318. package/dist/src/simctl-settings-facade.js +1 -0
  319. package/dist/src/simctl-settings.js +1 -0
  320. package/dist/src/simctl.js +1 -1
  321. package/dist/src/simulator-boot.js +1 -1
  322. package/dist/src/simulator.js +1 -1
  323. package/dist/src/snapshot-diagnostics.js +1 -1
  324. package/dist/src/snapshot-runtime-binding.js +1 -1
  325. package/dist/src/snapshot-runtime.js +1 -1
  326. package/dist/src/snapshot-state.js +1 -1
  327. package/dist/src/snapshot2.js +1 -1
  328. package/dist/src/snapshot3.js +1 -1
  329. package/dist/src/snapshot4.js +1 -1
  330. package/dist/src/src.js +1 -1
  331. package/dist/src/src7.js +1 -1
  332. package/dist/src/src8.js +2 -2
  333. package/dist/src/store.js +1 -0
  334. package/dist/src/string-enum.js +1 -1
  335. package/dist/src/surface-snapshot.js +1 -1
  336. package/dist/src/takeover.js +1 -1
  337. package/dist/src/target-evidence.js +1 -1
  338. package/dist/src/telemetry.js +1 -1
  339. package/dist/src/text-entry-focus.js +1 -1
  340. package/dist/src/tool-provider.js +3 -3
  341. package/dist/src/tool-provider2.js +1 -1
  342. package/dist/src/tool-provider3.js +1 -1
  343. package/dist/src/toolchain-probe.js +2 -2
  344. package/dist/src/touch-runtime.js +1 -1
  345. package/dist/src/touch-runtime2.js +1 -1
  346. package/dist/src/transport.js +2 -2
  347. package/dist/src/tv-remote.js +1 -1
  348. package/dist/src/type-text-runtime.js +1 -1
  349. package/dist/src/update-check.js +1 -1
  350. package/dist/src/vars.js +1 -1
  351. package/dist/src/verified-file.js +1 -1
  352. package/dist/src/version.js +1 -1
  353. package/dist/src/video.js +1 -1
  354. package/dist/src/viewport.js +1 -1
  355. package/dist/src/web.js +1 -1
  356. package/dist/src/web2.js +1 -1
  357. package/dist/src/webdriver-source.js +1 -1
  358. package/package.json +5 -1
  359. package/server.json +2 -2
  360. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.19.apk.sha256 +0 -1
  361. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk +0 -0
  362. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk.sha256 +0 -1
  363. package/dist/src/api.js +0 -3
  364. package/dist/src/daemon-process.js +0 -1
  365. package/dist/src/multitouch-support.js +0 -1
  366. package/dist/src/parameterized-recorded-fill.js +0 -1
  367. package/dist/src/runner-startup-transport.js +0 -1
  368. package/dist/src/runner-xctestrun.js +0 -1
  369. package/dist/src/session-store.js +0 -4
@@ -1,5 +1,5 @@
1
- import{E as e,F as t,G as n,N as r,P as i,_ as a,b as o,d as s,o as c,q as l,t as u,tt as d,x as f}from"./sdk-contracts.js";import"./capture.js";import{i as p,k as m,n as h,t as g}from"./sdk-batch-runner.js";import{a as _,n as v,t as y}from"./snapshot-diagnostics.js";import{f as b}from"./android-input-ownership.js";import{C as x,T as S,b as C,d as w,h as ee,m as T,p as E,v as te,x as D}from"./sdk-device.js";import{$r as O,B as ne,Ct as re,Dr as ie,E as ae,F as oe,G as se,Gr as ce,I as le,J as ue,K as de,Kn as fe,L as pe,M as me,Or as he,P as ge,Pt as _e,Q as ve,R as ye,Tt as be,Un as xe,V as Se,Vn as Ce,W as we,Wn as Te,Wt as Ee,X as De,Y as Oe,Yn as ke,Yr as Ae,Z as je,Zr as Me,_n as Ne,an as Pe,at as Fe,bn as Ie,cr as Le,d as Re,f as ze,gn as Be,it as Ve,j as He,mt as Ue,or as We,p as Ge,pt as Ke,q as qe,sn as Je,sr as Ye,st as Xe,vn as Ze,wt as Qe,y as $e,yn as et,z as tt}from"./sdk-batch.js";import{u as nt}from"./scroll-gesture.js";import{a as rt,b as it,f as at,g as ot,n as st,p as ct,r as lt,w as ut,y as dt}from"./script.js";import{_ as ft,a as pt,c as k,d as mt,f as ht,g as gt,h as _t,l as vt,m as yt,p as bt,t as A,u as xt}from"./session-store.js";import{a as St,d as Ct,n as wt,o as Tt,r as Et,t as Dt}from"./target-evidence.js";import{a as Ot,i as kt,n as At,o as jt,r as Mt,s as Nt,t as Pt}from"./vars.js";import{n as Ft,r as It,t as Lt}from"./format.js";import{A as Rt,O as zt,c as Bt,f as Vt,g as Ht,h as Ut,j as Wt,k as Gt,l as Kt,m as qt,o as Jt,p as Yt,u as Xt}from"./parameterized-recorded-fill.js";import{F as Zt,M as Qt,N as $t,P as en,_ as tn,c as nn,h as rn}from"./runtime.js";import{n as an,t as on}from"./catalog.js";import{g as sn,i as cn}from"./observability.js";import{i as ln,n as un,r as j}from"./success-text.js";import{o as dn,p as fn}from"./overlay.js";import{t as pn}from"./app-inventory.js";import{a as mn,r as hn,t as gn}from"./device.js";import{a as _n,o as vn,r as M}from"./diagnostics.js";import{a as yn,i as bn,r as xn}from"./verified-file.js";import{c as Sn,p as Cn}from"./exec.js";import{t as wn}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Tn,r as En}from"./output-path.js";import"./command.js";import{a as Dn,i as On,n as kn,t as An}from"./replay-divergence.js";import"./retry.js";import{a as jn}from"./version.js";import{t as Mn}from"./session-paths.js";import{i as Nn,r as Pn}from"./session-artifact-paths.js";import{t as Fn}from"./project-runtime.js";import{r as In}from"./rect-center.js";import{t as Ln}from"./android-snapshot-quality.js";import{t as Rn}from"./keyed-lock.js";import{n as zn,t as Bn}from"./deploy-result-target.js";import{t as Vn}from"./keyboard-actions.js";import{a as Hn,i as Un,n as Wn,o as Gn,r as Kn}from"./request-cancel.js";import{t as qn}from"./request.js";import{i as Jn,s as Yn}from"./provider-session-ownership.js";import{$ as Xn,A as Zn,B as Qn,C as $n,E as er,F as tr,G as nr,H as rr,I as ir,J as ar,K as or,M as sr,O as cr,Q as lr,R as ur,S as dr,U as fr,V as pr,W as mr,X as hr,Y as gr,Z as _r,_ as vr,_t as yr,b as br,c as xr,ct as Sr,d as Cr,et as wr,f as Tr,g as Er,gt as Dr,h as Or,it as N,k as kr,l as Ar,lt as jr,m as Mr,n as Nr,nt as Pr,p as Fr,q as Ir,r as Lr,rt as Rr,s as zr,st as Br,t as Vr,tt as Hr,u as Ur,v as Wr,w as Gr,x as Kr,y as qr,yt as Jr,z as Yr}from"./device-claim-rule.js";import{n as Xr}from"./provider-device-admission.js";import{M as Zr,N as Qr,O as P,_ as $r,f as ei,h as ti,i as ni,n as ri,p as ii,s as ai}from"./session-snapshot.js";import{c as oi,i as si,t as ci}from"./device-claim-inspection.js";import{t as li}from"./audio-probe-result.js";import{T as ui,_ as di,a as fi,b as pi,c as mi,d as hi,f as gi,g as _i,h as vi,i as yi,l as bi,m as xi,n as Si,o as Ci,r as wi,s as Ti,t as Ei,u as Di,v as Oi,x as ki}from"./perf-runtime-plan.js";import{i as Ai,n as ji}from"./lease-context.js";import{h as Mi}from"./screenshot-runtime.js";import{n as F,r as Ni}from"./device-isolation.js";import{a as Pi,n as Fi,r as Ii}from"./device-inventory-context.js";import{n as Li,r as Ri,t as zi}from"./dispatch-resolve.js";import{t as Bi}from"./touch-reference-frame.js";import"./screen-recording-admission-ledger.js";import{a as Vi,d as Hi,i as Ui,l as Wi,n as Gi,o as Ki,s as qi,u as Ji}from"./session-routing.js";import{d as I}from"./src8.js";import{i as Yi,n as L,r as Xi}from"./compatibility-policy.js";import{n as R,t as Zi}from"./runtime-admission.js";import{s as Qi}from"./quality-warnings.js";import{t as $i}from"./png-worker-client.js";import{a as ea,i as z,n as ta,r as na,t as ra}from"./session-runtime-admission.js";import{a as ia}from"./ios-snapshot-engine.js";import{n as aa,r as oa}from"./device-selection-resolver.js";import{n as sa,r as ca}from"./doctor-output.js";import{t as la}from"./record-runtime.js";import{n as ua}from"./gesture-runtime.js";import{i as da,n as fa,r as pa}from"./platform-runtime-open-target.js";import{t as ma}from"./snapshot-runtime.js";import{t as ha}from"./app-log-files.js";import B from"node:path";import V,{promises as H}from"node:fs";import{createHash as ga}from"node:crypto";import _a from"node:os";import{fileURLToPath as va}from"node:url";import{setTimeout as ya}from"node:timers/promises";import ba from"node:vm";function U(e,t){return I({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function xa(e){return I({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Sa(e,t){let n=Da(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},xa(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:Ca(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Ca(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function wa(e,t,n,r){let i=Da(await r.resolveTarget({selector:e,...t},U(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Rr(`Maestro target did not resolve to a visible element.`,{selector:e,candidateCount:i.candidateCount});return{kind:`selector`,selector:e,query:{selector:e,...t},...i,rect:i.rect}}function Ta(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function Ea(e){if(!e||typeof e!=`object`)return!1;let t=e;return[`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`&&Number.isFinite(t[e]))}function Da(e,t){return Oa(e,t),ka(e),Aa(e),ja(e),e}function Oa(e,t){if(e.generation!==t)throw new r(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function ka(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Aa(e){if(e.rect!==void 0&&!Ea(e.rect)||e.viewport!==void 0&&!Ea(e.viewport))throw new r(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function ja(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ma(e,t,n,r,i,a={}){let o=Na(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Ra(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Na(e,t,n,r,i){let a=n===`up`||n===`down`,o=fr(e,_r(e,r),i),s=o.visibility,c=wr({visibility:s,matches:e.nodes.filter(e=>ce(e)),platform:r}),l=Me(s.viewportRects)??Fa(c);if(!l||!Ae(l))return;let u=c.flatMap(e=>{if(!Ae(e.rect))return[];let t=Ia(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=Pa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(La)[0]?.viewport}function Pa(e,t){return ce(e)?e:he(e,t)}function Fa(e){let t;for(let n of e)Ae(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ia(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width)-n,a=Math.min(e.y+e.height,t.y+t.height)-r;return i>0&&a>0?{x:n,y:r,width:i,height:a}:void 0}function La(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ra(e,t){let n=W(e,.5,.5),r=L.scrollUntilVisibleSwipe.nearEdgeFraction,i=L.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:W(e,.5,i)};case`down`:return{start:n,end:W(e,.5,r)};case`left`:return{start:n,end:W(e,i,.5)};case`right`:return{start:n,end:W(e,r,.5)}}}async function za(e,t,n){let i=N(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new r(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await n.resolveGestureViewport(U(t,t.command)):void 0;return{authored:e,gesture:Va(await Ba(e.start,t,n,a),await Ba(e.end,t,n,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let r=await n.resolveGestureViewport(U(t,t.command)),{start:a,end:o}=Ha(r,e.direction,n.platform);return{authored:e,gesture:Va(a,o,i),viewport:r}}let a=await wa(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs},t,n),o=a.viewport??await n.resolveGestureViewport(U(t,t.command)),{start:s,end:c}=Ua(a,e.direction,o);return{authored:e,gesture:Va(s,c,i),target:a,viewport:o}}async function Ba(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(U(t,t.command));return{x:i.x+Math.trunc(i.width*e.x/100),y:i.y+Math.trunc(i.height*e.y/100)}}function Va(e,t,n){return{from:e,to:t,durationMs:n??L.command.swipeDurationMs}}function Ha(e,t,n){if(t===`left`||t===`right`){let n=nt(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=L.screenSwipe,i=W(e,r.centerFraction,r.nearEdgeFraction),a=W(e,r.centerFraction,r.farEdgeFraction),o=W(e,r.centerFraction,r.downStartFraction),s=W(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function W(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Ua(e,t,n){let r=In(e.rect),i=n.x+Math.trunc(n.width*L.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*L.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*L.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*L.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const Wa={launchApp:Ya,stopApp:Ya,setPermissions:Ya,clearState:Ya,openLink:Ya,tapOn:Qa,doubleTapOn:Qa,longPressOn:Qa,swipe:ro,inputText:io,eraseText:io,scroll:G,scrollUntilVisible:G,hideKeyboard:G,pressKey:G,back:G,waitForAnimationToEnd:G,takeScreenshot:so,runScript:so,evalScript:lo,assertVisible:co,assertNotVisible:co,assertTrue:co,extendedWaitUntil:co},Ga={launchApp:!0,stopApp:!0,setPermissions:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ka(e){return Ga[e.kind]}async function qa(e,t){let n=e.command;return await Ja(n,e,t,U(e,n))}function Ja(e,t,n,r){let i=Wa[e.kind];return i(e,t,n,r)}async function Ya(e,t,n,r){switch(e.kind){case`launchApp`:return await K(n.launchApp,Xa(e,t),r,`invalidate`);case`stopApp`:return await K(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`setPermissions`:return await K(n.setPermissions,{appId:e.appId??t.appId,permissions:Za(e.permissions)},r,`invalidate`);case`clearState`:return await K(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await K(n.openLink,{link:e.link},r,`invalidate`)}}function Xa(e,t){return I({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?Za(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function Za(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function Qa(e,t,n,r){switch(e.kind){case`tapOn`:return await $a(e,t,n,r);case`doubleTapOn`:{let i=await vo(e.target,{purpose:`doubleTap`,timeoutMs:to(e)},t,n),a=N(e.delay,`doubleTapOn.delay`)??L.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}case`longPressOn`:{let i=await vo(e.target,{purpose:`longPress`,timeoutMs:to(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}}}async function $a(e,t,n,r){let i=await eo(e,t,n);return await K(n.tapOn,no(e,i),r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}async function eo(e,t,n){let r={purpose:`tap`,timeoutMs:to(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await vo(e.target,r,t,n)}function to(e){return e.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs}function no(e,t){let n=N(e.repeat,`tapOn.repeat`),r=N(e.delay,`tapOn.delay`),i=n===void 0?r:r??L.command.repeatDelayMs;return I({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function ro(e,t,n,r){let i=await za(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?Ta(i.target):void 0)}async function io(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,I({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,I({charactersToErase:N(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function G(e,t,n,r){switch(e.kind){case`scroll`:return await K(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await K(n.scrollUntilVisible,ao(e),r,`invalidate`);case`hideKeyboard`:return await K(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await K(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await K(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await K(n.waitForAnimationToEnd,oo(e),r,`preserve`)}}function ao(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:N(e.timeout,`scrollUntilVisible.timeout`)??L.command.scrollUntilVisibleTimeoutMs,durationMs:Yi(L.command.scrollUntilVisibleSpeed)}}function oo(e){return I({timeoutMs:N(e.timeout,`waitForAnimationToEnd.timeout`)})}async function so(e,t,n,r){switch(e.kind){case`takeScreenshot`:return fo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,I({file:e.file,env:e.env}),r,`preserve`)}}async function co(e){throw new r(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function lo(e){throw new r(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function K(e,t,n,r,i){let a=uo(n,r);return fo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function uo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function fo(e,t,n,r){let i=e?.observation;return po(i,r),{...mo(n??i),...ho(e?.outputEnv),...go(t,e?.artifactPaths),..._o(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function po(e,t){if(!(!e||t===void 0||e.generation===t))throw new r(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function mo(e){return e?{observation:e}:{}}function ho(e){return e?{outputEnv:{...e}}:{}}function go(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function _o(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function vo(e,t,n,r){if(e.space===`target`){let i=await wa(e.selector,t,n,r);return{authored:e,point:In(i.rect),resolution:i}}return{authored:e,point:await Ba(e,n,r)}}function yo(e,t,n,r={}){let i=n===`ios`&&r.presentation?xo(r.presentation):void 0,a=i?So(e,t,i):nr(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Eo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?ar(s,t.selector.index):Ir(s,t.selector.index)?.node,l=Eo(t,o,s,c);if(!c)return Co(t,o,s,l);let u=i?Ir(i.visibleForSource(c),void 0):null,d=gr(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!bo(t.selector)&&i?wo(d,s,u):0,evidence:l}:Co(t,o,s,l)}const bo=Xn;function xo(e){let t=ie(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>Hr(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function So(e,t,n){let r=_r(e,`ios`),i=lr(e,{},{orderUnindexed:e=>hr(e,r)}),a=mr(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:or(o,t.selector,`ios`,i.visibility,r)}}function Co(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function wo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&To(n.rect,e)?1:0:t.length}function To(e,t){let n=In(e),r=In(t);return n.x===r.x&&n.y===r.y}function Eo(e,t,n,r){return I({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:Xi,retryTapMaxAttempts:L.command.retryTapMaxAttempts,longPressDurationMs:L.command.longPressDurationMs,eraseTextMaxCharacters:L.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:L.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:L.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:L.command.waitForAnimationToEndDifferencePercent,observationPollMs:L.observation.pollIntervalMs};function Do(e,t={}){return{execute:async n=>{let r=U(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ka(n.command)&&!i,visualStabilityBarrier:i});let a=await qa(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Sa(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Oo(e){throw new r(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function ko(e){let t=e.meta?.installSource;if(!t)throw new r(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new r(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Oo(t)}}function Ao(e){let t=ko(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Yn(n,e.meta?.tenantId)},cleanup:()=>{Jn(n)}}}function J(e,t,n){return t||Sr(n)?null:c(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function jo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function Y(e){return jr(e.flags)||!e.session?await Li(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Mo(e.session.device)}async function Mo(e){if(Xr(e)||!E(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ii.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Li(t)}catch(e){if(!(e instanceof r)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Li({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function No(e,t){return t?Wi(t,e).length===0:!1}async function Po(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a,o,s;try{a=Ao(t);let c=Ro(t),l=await Io(i,t.flags),u=await na(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await ta(e.bindDevice)(l,je);await f.operations.ensureReady({}),o=await f.operations.materializeAppSource({source:a.source}),s=await zo({artifact:o,retention:c,req:t,session:i,sessionName:n}),i&&P(i);let p=await f.operations.deployMaterializedApp({artifact:o}),m=Bo(l,o,p,s),h=ln(m,`Installed: ${zn(m)}`);return k(r,i,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return s&&await cr(s.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:l(e)}}finally{await o?.cleanup(),a?.cleanup()}}async function Fo(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new r(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await cr(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:l(e)}}}async function Io(e,t){let n=Lo(t?.platform);if(e&&n&&!D(e.device,n))throw new r(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${x(e.device)}`);if(!e&&!n)throw new r(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await Y({session:e,flags:t})}function Lo(e){return e===`ios`||e===`android`?e:void 0}function Ro(e){let t=e.meta?.retainMaterializedPaths===!0,n=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(n!==void 0&&n<=0)throw new r(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...n===void 0?{}:{ttlMs:n}}}async function zo(e){if(e.retention.enabled)return await Zn({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Bo(e,t,n,r){return E(e)?Vo(t,n,r):Ho(t,n,r)}function Vo(e,t,n){let i=t.bundleId??e.bundleId;if(!i)throw new r(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Wo(n),bundleId:i,...Uo(t,e),launchTarget:t.launchTarget??i}}function Ho(e,t,n){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new r(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Wo(n),packageName:i,...Uo(t,e),launchTarget:t.launchTarget??i}}function Uo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Wo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Go(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Ko(t);if(!a.ok)return a.response;let o=J(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await Y({session:n,flags:t.flags}),l=await R({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:Se});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==a.options.provider)return c(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let u=await l.runtime.operations.configureProviderPortReverse(a.options);return u?{ok:!0,data:{action:`port-reverse`,...u}}:c(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Ko(e){let t=qo(e);if(!t.ok)return t;let n=Jo(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function qo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Jo(e){let t=Yo(e.flags?.devicePort),n=Yo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Yo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Xo(e){return await R({...e,command:`runtime clear`,use:ye})}async function Zo(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Go({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Qo({...e,session:r.get(n)});if(!$o(i))return c(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await es({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?ts(n,o):rs({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Qo(e){if(!e.session)return c(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ua({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=ti(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function $o(e){return e===`set`||e===`show`||e===`clear`}async function es(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(Ur(i)&&r?.appBundleId){let e=await Xo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;P(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Mr(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function ts(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function ns(e){return e?x(e.device):void 0}function rs(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=ns(i),s=vr(t.flags?.platform??a?.platform??o);if(!s)return c(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(o!==void 0&&o!==s)return c(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let l=Tr(a,xr(t.flags,s));return Ar(l)===0?c(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,l),{ok:!0,data:{session:n,configured:!0,runtime:l}})}const is=/^[A-Za-z0-9_.:-]{1,64}$/,as=8192,os=4096;function ss(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new r(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!is.test(t))throw new r(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new r(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:ls(n,t)}}function cs(e,t,n){let i=x(e),a=us(e);if(!a)throw new r(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>os)throw new r(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:os});return s}function ls(e,t){if(e)try{let n=JSON.parse(e);if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(n);if(Buffer.byteLength(i,`utf8`)>as)throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${as} bytes`);return n}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function us(e){return((E(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function ds(e,t,n,r){let{eventName:i,payload:a}=ss([...r]),o=cs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ei(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...j(`Triggered app event: ${i}`)}}async function fs(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await R({command:`trigger-app-event`,device:t,use:Ve,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>ds(s,t,e,n)}}function ps(e){let t=(e[0]??`status`).toLowerCase();if(!Vn(t))throw new r(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new r(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return ms(t)}function ms(e){return e===`get`?`status`:e===`return`?`enter`:e}const hs={"ime-probe":`android`},gs={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},_s={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function vs(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ei(e)}}async function ys(e,t){let n=await R(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function bs(e,t){return e.operations.keyboardStatus(vs(t)).then(e=>({platform:hs[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function xs(e,t){let n=await e.operations.keyboardDismiss(vs(t)),r=gs[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...j(ws(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...j(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function Ss(e,t){let n=await e.operations.keyboardEnter(vs(t)),r=_s[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...j(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...j(`Keyboard enter pressed`)}}async function Cs(e){let t=ps(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ys({command:`keyboard status`,device:n,use:be,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>bs(e,t)):t===`dismiss`?await ys({command:`keyboard dismiss`,device:n,use:re,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>xs(e,t)):await ys({command:`keyboard enter`,device:n,use:Qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>Ss(e,t))}function ws(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Ts(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=J(i,l,u);if(d)return d;let f=await Y({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Mi(t)===`may-invalidate`&&P(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function Es(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return c(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Ds(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await Ts({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...ti(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Os(e){return Es(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Ds({...e,command:an.keyboard,resolveRuntime:e=>Cs(e)})}async function ks(e){return await Ds({...e,command:an.triggerAppEvent,resolveRuntime:e=>fs(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await pa(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function As(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function js(e,t){let n=t?.subject??`Payload`,i=e.trim();if(!i)throw new r(`INVALID_ARGS`,`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!V.statSync(a).isFile())throw new r(`INVALID_ARGS`,`${n} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof r)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new r(`INVALID_ARGS`,`${n} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new r(`COMMAND_FAILED`,`Unable to read ${n} file: ${a}`,{cause:String(e)})}if(As(i))return{kind:`inline`,text:i};throw new r(`INVALID_ARGS`,`${n} file not found: ${a}`)}async function Ms(e){let t=js(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ns(t.path);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ns(e){try{return await H.readFile(e,`utf8`)}catch(t){let n=t.code;throw n===`ENOENT`?new r(`INVALID_ARGS`,`Push payload file not found: ${e}`):n===`EISDIR`?new r(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):n===`EACCES`||n===`EPERM`?new r(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new r(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Ps(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=J(n,a,o);if(s)return s;let l=Bs(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let s=u?Yn(u,t.meta?.tenantId):A.expandHome(l.appPathInput);if(!V.existsSync(s))return c(`INVALID_ARGS`,`App binary not found: ${s}`);let d=await Y({session:a,flags:o}),f=await na(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await ta(e.bindDevice)(d,De);a&&P(a);let h=await m.operations.deployApp({app:l.app,appPath:s,replaceExisting:n===`reinstall`}),g=Is(d,l.app,s,h),_=ln(g,`Installed: ${g.appName??Bn(g)}`),v=zs(a,g);return v&&v!==a&&i.set(r,v),k(i,v,t,n,_),{ok:!0,data:_}}finally{u&&Jn(u)}}async function Fs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=J(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!s||!l)return c(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await Ms(Vs(l,t.meta?.cwd)),d=await Y({session:i,flags:a}),f=await na(e.inspectFacts)(d),p=z(`push`,f.operations.ensureReady)??z(`push`,f.operations.sendPushNotification);if(p)return p;let m=await ta(e.bindDevice)(d,ve);await m.operations.ensureReady({}),i&&P(i);let h=await m.operations.sendPushNotification({appId:s,payload:u}),g=E(d)?ln({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):ln({platform:x(d),package:s,action:h.action,extrasCount:h.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,g,{positionals:[s,l]}),{ok:!0,data:g}}function Is(e,t,n,r){return E(e)?Ls(t,n,r):Rs(e,t,n,r)}function Ls(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Rs(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function zs(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Bs(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:c(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:c(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Vs(e,t){let n=js(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Hs(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Ps({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Po({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await Fs({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Us(e,t,n){return await h(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Ws=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Gs(e){return Ws.has(e)}const Ks=new Map(ze.map(e=>[e.name,e]));function qs(e){let t=new Set;for(let n of e){let e=Js(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Js(e){let t=Ks.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(Gs)?n:void 0}function Ys(e){if(e!==void 0&&e.remainingSteps.length!==0)return qs(e.remainingSteps)}function Xs(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(e),plannedOperations:Ys(e.internal?.executionPlan)}}function Zs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...j(`Closed: ${t.name}`)}})}function Qs(e,t,n){if(!ht(t))return{kind:`not-armed`};let r=t.actions.length;Zs(e,t,n);let i=Vt(t),a=e.writeSessionLog(t,{force:Kt(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(vt(t),{kind:`aborted`})}function $s(e,t){let n=l(t),r=Gt(e.scriptPublication??Ht);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...r?{savedScript:r}:{}},retriable:!0}}}function ec(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Zs(r,n,t);try{let e=r.writeSessionLog(n,{force:Kt(n,t.flags?.force)});e.written&&qt(n,e.path);return}catch(e){return tc(e)}}function tc(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof r?new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${l(e).message}`,t)}async function nc(e){let t=e.clearRuntimeHints?ne:tt,n=await Zi({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,tt)};let r=await n.bind(e.device,ne);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function rc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await ic({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&Ur(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Mr(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>kr(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function ic(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>br({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>dr({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>qr({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>$n({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Gr(a,r))}function ac(e,t){return Kr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function oc(e){if(e instanceof r)return e;let t=e instanceof Error?e.message:String(e);return new r(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const sc=(e,t)=>(e.positionals?.length??0)>0||er(t);async function cc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=ht(n),s=JSON.stringify(t.positionals??[]);if(o&&!mt(n,s)){let e=await uc({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:$s(n,oc(e))};_t(n,s)}let c=Qs(i,n,t);return c.kind===`failed`?{response:$s(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function lc(e){try{return{providerData:await Dr(e)}}catch(t){let n=l(t);return{response:{ok:!1,error:{...n,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...n.details,session:e.session.name},retriable:!0}}}}}async function uc(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(sc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Xs(t,r,n.trace?.outPath)});return}catch(e){return e}}function dc(e,t){if(!e.flags?.saveScript||Xt(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new r(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new r(`INVALID_ARGS`,`close --save-script cannot ${n.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function fc(e){let{req:t,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,l=a.get(n);if(!l)return await gc({req:t,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});dc(t,l);let u=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!u)return c(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=e.platformResourceCleanup,f=await nc({device:l.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!l.appBundleId&&Ur(a.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(f.type===`response`)return f.response;if(P(l),t.internal?.closeAppOnly===!0&&u)return await hc({req:t,session:l,logPath:i,lifecycle:f.runtime,app:u});let p=await cc({req:t,session:l,logPath:i,sessionStore:a,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await pc({req:t,session:l,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:mc({session:l,repair:p,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function pc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await rc({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:uc,finalizeOrdinaryCloseScript:ec,platformResourceCleanup:e.platformResourceCleanup}),m=await lc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ac(r,u),g=d??h;if(g?n.deviceClaim&&M({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await pi(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function mc(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:ln({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...j(c),...o,...s}}}async function hc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await uc({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...j(`Closed: ${a}`)}}}async function gc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return c(`SESSION_NOT_FOUND`,`No active session`);let a=await nc({device:await Y({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Xs(t,n)}),{ok:!0,data:{app:t.positionals[0],...j(`Closed: ${t.positionals[0]}`)}})}function _c(e,t){return e.operations.ensureReady(t)}function vc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function yc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return bc(t,r);case`devices`:return await Sc(t);case`capabilities`:return await Ac({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Ic({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function bc(e,t){let n=Vi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ki(e.session,n)).map(e=>xc(e,t))}}}function xc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Nn(r),platform:x(t.device),...w(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...w(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function Sc(e){try{let t=Cc();return{ok:!0,data:{devices:(await Tc(e)).map(e=>({...Uc(e),...wc(e,t)}))}}}catch(e){let t=i(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function Cc(){let e=new Map;for(let t of si({})){let n=t.claim;!n||ci(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function wc(e,t){let n=t.get(oi(ki(e)));return n?{claimedBy:n}:{}}async function Tc(e){let t=e.flags?.platform;return kc(await Fi(Ec(e,t)),e.flags?.platform,e.flags?.target)}function Ec(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Dc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Oc(n?.androidDeviceAllowlist)}}function Dc(e,t,n){return S({simulatorSetPath:Ni(e),platform:t,target:n})}function Oc(e){let t=F(e);return t?Array.from(t).sort():void 0}function kc(e,t,n){let r=t?e.filter(e=>Wc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Ac(e){let t=await Hc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=jc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await zc(n,e.inspectFacts);return{ok:!0,data:{device:Uc(n),availableCommands:$e().filter(e=>e===`appstate`&&r?!0:Pc(e,i))}}}function jc(e,t,n){return!t||!E(e)&&!T(e)||!No(n,t)?!1:Mc(t)||Nc(e,t)}function Mc(e){return!!(e.appName||e.appBundleId)}function Nc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Pc(e,t){let n=Ge(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Fc(t,e)))}function Fc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Ic(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Lc(t,e.providerAppCatalog);if(o)return o;let s=await Hc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=pn(t.flags?.appsFilter),u=F(t.flags?.androidDeviceAllowlist),d=await Bc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Vc(await vc(f,await _c(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Lc(e,t){let n=Rc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,Kn(e.meta?.requestId))]}}}function Rc(e){let t=ji(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function zc(e,t){if(t)try{return await t(e)}catch{return}}async function Bc(e){if(!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(n&&!n.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}};if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Xe)}}function Vc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Hc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=J(t.command,a,o);return s?{response:s}:{device:await Y({session:a,flags:o,androidAvdSelection:i})}}function Uc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:x({platform:r.platform,appleOs:n}),...w(r.platform)&&n?{appleOs:n}:{}}}function Wc(e,t){return D(e,t)}function Gc(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function Kc(e){return c(`INVALID_ARGS`,e)}function qc(e,t,n,i){try{return fa({device:e,surfaceFlag:t,openTarget:n,existingSurface:i})}catch(e){return c(e instanceof r?e.code:`INVALID_ARGS`,String(e.message))}}async function Jc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await da({target:n,platform:i.platform,surface:r});return a?Kc(a):null}async function Yc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await da({target:n,platform:r});return i?Kc(i):null}function Xc(e){let t=Wr(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:Ur(n),clearRemovedRuntimeHints:Er({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Zc(e){let{req:t,logPath:n,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!p(a??``),execution:{startupDeadlineAtMs:$c(t),requestId:t.meta?.requestId,logPath:n,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(t)}});let{appBundleId:d,appName:f}=await Qc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new r(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Cr({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:f,runtime:c.runtime}}}async function Qc(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function $c(e){return Gc(e.flags?.timeoutMs)}async function el(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:c(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:c(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:c(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function tl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,openResponse:a}=e;if(!a.ok||t.flags?.foreground!==!0)return a;try{let o=await ma({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n,logPath:r,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return o.ok?{ok:!0,data:{...a.data,snapshot:o.data}}:nl(a.data,o.error)}catch(e){return nl(a.data,l(e))}}function nl(e,t){return{ok:!0,data:{...e,warnings:[...un(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function rl(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...il(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=x(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,te(d.platform)&&(g.serial=d.id)),d&&E(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...j(`Opened: ${o??s??t}`)}}function il(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function al(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const ol=Object.freeze({async observeBootTimeMs(e){if(E(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function sl(e,t){e.warnings=[...un(e),t]}function cl(e){return e.internal?.resolvedSessionScope??Vi(e)}function ll(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Bt(t,{});return}Xt(n)&&(Jt(t),sl(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function ul(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function dl(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function fl(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function pl(e,t){if(!t)return;let n=await ui(t);if(n.status!==`renewed`)return n.conflict?Lr(e,n.conflict):c(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function ml(e){let{req:n,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:l,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=n.flags?.relaunch===!0,x=f,S=Date.now(),C=await hl({req:n,sessionName:r,sessionStore:i,device:o,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(C.type===`response`)return C.response;let w=C.session??g,ee=Date.now(),T=await m.operations.openApplication({target:s,positionals:l,outPath:n.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:n.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:dl(o,n),stateDir:i.resolveDaemonStateDir(),runtimeHints:Mr(p),applyRuntimeHints:h,execution:Xs(n,a,g?.trace?.outPath)});x=T.appBundleId??x;let E={...T.timing},te=aa(y),D=s?fl(ee,s,x):void 0;if(Un(n.meta?.requestId)){let e=t();return c(e.code,e.message,e.details)}g&&$r({session:g,command:`open`,positionals:[],flags:void 0});let O=al({existingSession:w,sessionName:g?.name??Ui(n),sessionScope:g?.sessionScope??cl(n),device:o,surface:d,appBundleId:x,appName:u});O.lease=yr({req:n,existingLease:g?.lease}),_&&(O.deviceClaim=_),n.runtime!==void 0&&Or(i,r,p);let ne=i.ensureSessionDir(r),re=Pn(ne,n.meta?.requestId??_n().requestId);E.totalDurationMs=Math.max(0,Date.now()-S),M({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let ie=rl({sessionName:O.name,sessionStateDir:ne,runnerLogPath:Nn(ne),requestLogPath:re,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:x,surface:d,startup:D,timing:E,device:o,runtime:p,runtimeHintCount:Ar,sessionReused:g!==void 0,selection:te});return v&&sl(ie,ul(v)),ll({session:O,existingSession:g,saveScriptRequested:!!n.flags?.saveScript,responseData:ie}),i.set(r,O),i.recordAction(O,{command:`open`,positionals:l,flags:n.flags??{},runtime:n.runtime===void 0?void 0:p,result:ie}),{ok:!0,data:ie}}async function hl(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=gl(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function gl(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=al({existingSession:o,sessionName:o?.name??Ui(t),sessionScope:o?.sessionScope??cl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=yr({req:t,existingLease:o?.lease}),s}function _l(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=sr(t);return Gi(t,i.session)?Hi(i,n,a):Ji(i,n,a)}async function vl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Vr(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Nr(n,r,zr({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Oi({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:ol})}}async function yl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=_l({req:t,device:a,sessionStore:i});if(m)return m;let h=await vl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Lr(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await bl({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Zc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await pl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await ml({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function bl(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pi(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await di(t);M({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const xl=new Map;async function Sl(e){let t=Oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Zi({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,we)};case`open-apply-runtime-hints`:{let t=await r(e.device,de);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,qe);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function Cl(e){let t=Xc(e);if(t.type===`response`)return t;let n=await Sl({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function wl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await el({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return c(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],l=s??(a?i.appName:void 0),u=qc(i.device,o.flags?.surface,l,i.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return Kc(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let d=await Jc({shouldRelaunch:a,openTarget:l,surface:u,device:i.device});if(d)return d;let f=await pl(i.device,i.deviceClaim);if(f)return f;let p=await Mo(i.device),m=oa(p);await o.internal?.retainDeviceExecutionLock?.(p.id);let h=await Cl({req:o,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;P(i);let v=await Zc({req:o,logPath:n,surface:u,openTarget:l,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await pl(p,i.deviceClaim)||await ml({req:o,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:l,openPositionals:s?o.positionals??[]:l?[l]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:u,existingSession:i,selection:m})}let s=o.flags?.relaunch===!0,l=o.positionals?.[0];if(s&&!l)return Kc(`open --relaunch requires an app argument.`);let u=await Yc({shouldRelaunch:s,openTarget:l,platform:o.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await Ri(o.flags??{},Br(l)),f=d.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=qc(f,o.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Jc({shouldRelaunch:s,openTarget:l,surface:p,device:f});if(m)return m;let h=await Cl({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await Rn(xl,f.id,async()=>await yl({req:o,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:l,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:d}))}async function Tl(e){let t=await wl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await tl({...e,inspectFacts:na(e.inspectFacts),bindDevice:ta(e.bindDevice),openResponse:t})}const El=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Dl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Ol(e){return t=>c(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function kl(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function Al(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function jl(e){return e.available?null:c(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Ml(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Nl(e,t){if(!t.appBundleId)return;let r=await R({command:`appstate`,device:t.device,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(r.type!==`response`)try{return(await r.runtime.operations.appState({appBundleId:t.appBundleId})).applicationState}catch(e){if(n(e))throw e;M({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:i(e).code,message:i(e).message}});return}}async function Pl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&jo(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return c(`SESSION_NOT_FOUND`,e)}let s=J(`appstate`,i,a);if(s)return s;let l=w(i?.device.platform)&&No(a,i),u=o===`ios`,d=o===`macos`;if(u&&!l)return c(`SESSION_NOT_FOUND`,El);if(d&&!l)return c(`SESSION_NOT_FOUND`,Dl);if(l&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:x(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return c(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await Nl(e,i);return{ok:!0,data:{platform:x(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...E(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let f=await Y({session:i,flags:a});if(E(f))return c(`SESSION_NOT_FOUND`,El);if(T(f))return c(`SESSION_NOT_FOUND`,Dl);let p=await R({command:`appstate`,device:f,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>c(`UNSUPPORTED_OPERATION`,f.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(p.type===`response`)return p.response;let m=p.runtime;await m.operations.ensureReady({serial:a.serial,androidSerialAllowlist:Il(a.androidDeviceAllowlist)});let h=await m.operations.appState();return{ok:!0,data:{platform:x(f),package:h.package,activity:h.activity}}}async function Fl(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let a=r.get(n),o=t.flags??{},s=J(t.command,a,o);if(s)return s;let l=F(o.androidDeviceAllowlist),u=l?[...l].sort():void 0,d=_e({headless:o.headless===!0}),f;try{f=await Y({session:a,flags:o,androidAvdSelection:`include-stopped`})}catch(e){let t=i(e);if(d.kind===`boot-target-headless`&&!Ml(o.device,a?.device)&&t.code===`DEVICE_NOT_FOUND`)return c(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(o.target&&(f.target??`mobile`)!==o.target)return c(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${o.target}.`);let p=await Zi({command:`boot`,device:f,required:d.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Ol(d.kind===`boot-target-headless`)});if(p.type===`response`)return p.response;let m={serial:o.serial,androidSerialAllowlist:u,deadlineAtMs:Gc(o.timeoutMs)};return f=d.kind===`boot-target-headless`?await(await p.bind(f,d.use)).operations.bootTargetHeadless(m):await(await p.bind(f,d.use)).operations.bootTarget(m),{ok:!0,data:{platform:x(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...w(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=J(t.command,i,a);if(o)return o;let s=await Y({flags:a,session:i,androidAvdSelection:`include-stopped`}),l=jl((await kl(e.inspectFacts)(s)).operations.shutdownTarget);if(l)return l;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return c(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let u=await(await Al(e.bindDevice)(s,Ee)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u,...w(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:c(u.error?.code??`COMMAND_FAILED`,Ll(u),{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u})}return t.command===`appstate`?await Pl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Il(e){let t=F(e);return t?[...t].sort():void 0}function Ll(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Rl(e){let t=bn(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=V.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{V.closeSync(t)}}function zl(e,t){ha(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=xn(e);try{V.writeFileSync(r,n,`utf8`)}finally{V.closeSync(r)}}function Bl(e){let t=B.dirname(e),n=B.basename(e);V.existsSync(t)||V.mkdirSync(t,{recursive:!0});let r=yn(e);try{V.fsyncSync(r)}finally{V.closeSync(r)}let i=0;for(let e of V.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{V.unlinkSync(B.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Vl(e){return Di.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Hl(e){try{return await Ul(e)}catch(e){return{ok:!1,error:l(e)}}}async function Ul(e){let t=Wl(e);if(!t.ok)return t;let n=t.session,r=ge(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Gl(a,o);let c=oe({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await Kl(e,n,r,c.use);case`capture-status`:return await ql(e,n);case`capture-stop`:return await Jl(e,n)}}function Wl(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:c(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Gl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return c(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Kl(e,t,n,r){if(t.audioProbe){await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return c(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=Ti.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=Ti.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=B.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await Ci({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...l,throwIfCanceled:e.throwIfCanceled});let u=e.sessionStore.get(e.sessionName)?.audioProbe;if(!u)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await u.handle.status()}}async function ql(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Yl()};let r=await n.handle.status();return r.state===`stopped`&&await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Jl(e,t){return t.audioProbe?{ok:!0,data:await mi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Yl()}}function Yl(){return li({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Xl(e){let t=e.sessionStore.get(e.sessionName);if(!t)return c(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(sn(e.req.positionals?.[0]))throw new r(`INVALID_ARGS`,cn);_u(e.req);let n=Ei({positionals:e.req.positionals,kind:yu(e.req.flags?.kind),outPath:yu(e.req.flags?.out)}),i=Si(n);if(i.kind===`capture-stop`)return Zl(e,await tu(e,t,i.request));let a=await ra({device:t.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Zl(e,await Ql(e,t,a)):z(`perf`,a.fact)??c(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:l(e)}}}function Zl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,fu(t.data)?{...t.data}:{}),t}async function Ql(e,t,n){let{device:i,plan:a}=ea(n),o=ta(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:su(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:pu(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:mu(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:B.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await $l(e,t,await o(i,a.use),a.request);case`profile-report`:{let n=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=gu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await n.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:A.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function $l(e,t,n,r){if(t.perfCapture)return c(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return c(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=gu(e,r.outPath,i),o=fi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=fi.createNextFence({admissionLedger:eu(e),resourcePath:o,device:t.device}),l=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await wi({admissionLedger:eu(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function eu(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new r(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function tu(e,t,n){let r=t.perfCapture;if(!r)return c(`INVALID_ARGS`,`no active native perf capture`);let i=ou(r.handle.inspect(),n);if(i)return c(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let a=await yi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=nu(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function nu(e){if(ru(e)||iu(e))return e;throw new r(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function ru(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function iu(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&au(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function au(e,t){return t.every(t=>typeof e[t]==`string`)}function ou(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function su(e,t){return{...hu(e),metrics:{fps:cu(t.metric,e)},sampling:{fps:t.sampling}}}function cu(e,t){if(!fu(e)||e.available!==!0)return e;let n=lu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function lu(e,t){let n=uu(t.windowStartedAt),r=uu(t.windowEndedAt)??uu(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:du(e)})).slice(-12)}function uu(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function du(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function fu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function pu(e,t){return{...hu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function mu(e,t){return{...hu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function hu(e){return{session:e.name,platform:x(e.device),device:e.device.name,deviceId:e.device.id}}function gu(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):B.join(e.sessionStore.ensureSessionDir(e.sessionName),`${vu()}-${n}`)}function _u(e){let t=e.positionals?.[0]?.toLowerCase(),n=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||n!==`snapshot`))throw new r(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function vu(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function yu(e){return typeof e==`string`&&e.length>0?e:void 0}const bu=[`dump`,`log`],xu=`network requires ${bu.join(` or `)}`,Su=`network include mode must be one of: ${u.join(`, `)}`,Cu=2048;async function wu(e){let t=e.sessionStore.get(e.sessionName);if(!t)return c(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=Tu(e.bindDevice),r=(await n(t.device,He)).facts.networkDump;if(!r.available)return Au(r.hint);let i=Eu(e.req);if(!i.ok)return i;let a=me({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return ju(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:Cu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:l(e)}}}function Tu(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Eu(e){let t=Du(e);if(!t.ok)return t;let n=Ou(e);if(!n.ok)return n;let r=ku(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Du(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return bu.includes(t)?{ok:!0,action:t}:c(`INVALID_ARGS`,xu)}function Ou(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?c(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ku(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return c(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return u.includes(r)?{ok:!0,include:r}:c(`INVALID_ARGS`,Su)}function Au(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ju(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:Cu,maxScanLines:e.entries.length},notes:e.notes}}}function Mu(e,t){let n=xi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Nu(e.appLogFailure)]:Pu(n.state)}}function Nu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Pu(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function Fu(e,t){return Le([...e,...t.notes??[]])}async function Iu(e){let{req:t}=e;return t.command===`perf`?await Xl({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Ru(e):t.command===`events`?await Lu(e):t.command===`network`?await wu(e):t.command===`audio`?await Hl(Xu(e)):null}async function Lu(e){let{req:t,sessionName:n,sessionStore:r}=e;try{return await r.flushEvents(n),{ok:!0,data:r.readEvents(n,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:l(e)}}}async function Ru(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return c(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Zu({...e,session:i}),r=(await n.bindDevice(i.device,le)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let a=Vu(pe({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),i);return`ok`in a?a:await zu(n,a)}catch(e){return{ok:!1,error:l(e)}}}async function zu(e,t){switch(t.kind){case`path`:return Hu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Uu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Bu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Ju(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Wu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Gu(e)}}async function Bu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await qu(e,t.appBundleId,n.owner,n.operations.appLogStart):await Ku(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Vu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):c(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Hu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Rl(a),s=Mu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Uu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Mu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:Fu(t.notes,o)}}}function Wu(e,t,n){let r=n.resolveAppLogPath(t);return zl(r,e),{ok:!0,data:{path:r,marked:!0}}}function Gu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return c(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Bl(r.resolveAppLogPath(n));return hi({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Ku(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await gi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:_i.resolvePath(o.resolveSessionDir(a))});let s=Bl(o.resolveAppLogPath(a)),c=await Yu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function qu(e,t,n,r){let{session:i}=e;return i.appLog?c(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Yu(e,t,r,n)}async function Ju(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return c(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await gi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:_i.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Yu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=_i.resolvePath(o.resolveSessionDir(a));try{let l=Vl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await bi({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:vi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Xu(e){if(!e.bindDevice||!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new r(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Zu(e){if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new r(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}const Qu=new WeakMap;function $u(e){return{store:t=>ed(e,t),finalize:(t,n)=>td({...e,evidence:t,projection:n})}}function ed(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{ni(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Qu.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Zr(a),refFrame:Qr(a)}),{evidence:s,refsGeneration:o}}function td(e){let t=Qu.get(e.evidence);Qu.delete(e.evidence);let n=rd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!nd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!id(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ri(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function nd(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Zr(n)===t.runtimeRevision&&Qr(n)===t.refFrame}function rd(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function id(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function ad(e){let t=od(e),n=We(t);return ga(`sha256`).update(n,`utf8`).digest(`hex`)}function od(e){let{actions:t,actionLines:n,actionSourcePaths:r,metadata:i}=e;return{platform:i.platform??null,target:i.target??null,steps:t.map((e,t)=>sd(e,n[t]??null,r?.[t]??null))}}function sd(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function cd(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=ld({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function ld(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>ud({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>dd({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>fd(n,r)];for(let e of s){let t=e();if(t)return t}}function ud(e){let{from:t,actionCount:n,pendingRecordAndHeal:r}=e,i=t===n+1&&r!==void 0&&r.expectedFrom===t;return Number.isInteger(t)&&t>=1&&(t<=n||i)?void 0:`replay --from ${t} is out of range for a ${n}-step plan.`}function dd(e){let{from:t,pendingRecordAndHeal:n,sessionActionsLength:r}=e;if(n?.expectedFrom===t&&r===n.actionsCountAtDivergence)return`replay --from ${t} continues a record-and-heal-shaped repair, but no corrective action was recorded in this repair segment; press the correct control via a blessed @ref from the divergence's screen.refs (recorded, no --no-record) — or, if your corrective action was a read (get/is/find/snapshot), re-run it with --record so it lands in the heal — before resuming with --from ${t}.`}function fd(e,t){if(e!==t)return`replay --plan-digest does not match the current plan digest; the script, its includes, or its platform-conditioned expansion changed since the divergence report was generated. Run a fresh full replay to get a new digest.`}function pd(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new r(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=st(e),a=lt(e),o=ad({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??rt(i.actions)??a.platform,target:t?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>cd(e,s,o)}}function md(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function hd(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ze(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function gd(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function _d(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=gd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Te(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function vd(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Te(e,r),...xe(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function yd(e,t,n,r,i,a){if(n.targetEvidences)return bd(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return X(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return X(e,n,r,i,a);if(s.kind===`post-resolution`){let c=md({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return X(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return Sd(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=hd({recorded:o,token:s.token});if(c.kind===`skip`)return X(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.observeTarget({action:n,index:i,token:l});if(u.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,xd(u),a,t)};let{classification:d}=u;return d.verified?Sd(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function bd(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return X(e,n,r,i,a);let d=hd({recorded:o[c],token:u.token});if(d.kind===`skip`)return X(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.observeTarget({action:l,index:i,token:d.token});if(f.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,xd(f),a,t)};let{classification:p}=f;if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return Sd(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function xd(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function X(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function Sd(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=Cd(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=wd(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function Cd(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function wd(e,t,n){return n.status===`guard-mismatch`?_d(e,n.evidence,t):vd(e,n.evidence)}async function Td(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Pt(e.varSources),o=[],s=[],c=kd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Od(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Ad(u,n.length,r,e))}let d=Nt(r,a,Dd(e,u)),f=At(a),p=t.diagnosticsMarker(),m=await yd(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:Ed(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function Ed(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Dd(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Od(e){return!!(e&&e.command!==`replay`)}function kd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Od(n))return n.command===`close`?t:void 0}}function Ad(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function jd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Ze(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function Md(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),ot(e.command)){let n=Nd(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Ze(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=jd([...e.positionals]);n&&t.push(n)}return Le(t).filter(e=>e.trim().length>0)}function Nd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Pd(n)?t.slice(0,-1):t}function Pd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Fd(e){let t=B.dirname(e),n=B.basename(e,B.extname(e));return B.join(t,`${n}.healed.ad`)}function Id(e){let t=Ld({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Ld(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Rd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Rd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function zd(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Bd(n))return`manual`;let i=Vd(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Bd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Hd(e.scrollRegion)}function Vd(e,t){let n=en(t),r=Wd(e.ancestry,n,t),i=e.scrollRegion;return i&&Hd(i)?r&&Ud(i,n,t):r}function Hd(e){return e.id!==void 0||e.label!==void 0}function Ud(e,t,n){return n.some(n=>Tt(wt(n,t),e))}function Wd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=$t(n,t,e.length);return!r.broken&&fe(r.chain,e)})}function Gd(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:i}=e,a,o,s=An({divergence:r,level:i,writeOverflowArtifact:e=>{let n=d(e),r=Jd(t,n);return`artifactPath`in r&&(a=n,o=r.artifactPath),r}}),c=(a??s).screen;if(c.state!==`available`||c.refs.length===0)return e.evidence&&n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.state===`available`?c.refsGeneration:void 0,refs:[]}),s;if(!e.evidence)return qd(o),Kd(s,`missing-evidence`);let l=n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.refsGeneration,refs:c.refs.map(e=>e.ref)});return l.published===!0?s:(qd(o),Kd(s,l.reason))}function Kd(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function qd(e){if(e)try{V.unlinkSync(e)}catch{}}function Jd(e,t){try{let n=B.join(e.ensureSessionDir(),`replay-divergence`);V.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=B.join(n,r);return V.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const Yd={id:0,"role-label":1,label:2,other:3};function Xd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Zd(n.basis)<Zd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Zd(e.basis)-Zd(t.basis)||e.nodeIndex-t.nodeIndex)}function Zd(e){return Yd[e]}async function Qd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionStore:s,observationStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=kn(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await tf({session:o,observationStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=of(v,g),b=v.state===`available`&&o?df({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=zd({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:$d(v)}),S=Id({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Gd({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(at(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function $d(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const ef=[300,500,800,1200,2e3,3e3,4e3];async function tf(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=rf(i),s=Date.now()+12e3,c=await nf({session:t,observationStore:n,logPath:r,flags:o});if(!a)return c.observation;for(let e of ef){if(c.observation.state===`available`||!c.retryable)break;let i=s-Date.now();if(i<=0)break;await wn(Math.min(e,i)),c=await nf({session:t,observationStore:n,logPath:r,flags:o})}return c.observation}async function nf(e){let{session:t,observationStore:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).snapshot;if(Qi(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let a=n.bindAuthority().store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:a.refsGeneration,evidence:a.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:Ln(e)}}}function rf(e){return{snapshotInteractiveOnly:af(e)}}function af(e){return!ff(e.command)||pf(e).requiresRect}function of(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=uf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function sf(e){return!!fn(e,f(e.type??`Element`))||e.hittable===!0}function cf(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function lf(e,t){let n=Qt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&sf(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>cf(e,t)),...o.filter(e=>!cf(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function uf(e,t,n){let{nodes:r,truncated:i}=lf(e,n);return{refs:r.map(e=>{let n=f(e.type??`Element`),r=fn(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function df(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!ff(t.command))return[];let a=Md(t);return a.length===0?[]:mf({candidates:a,nodes:r,session:n,action:t,matching:pf(t),sanitize:i})}function ff(e){return ot(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function pf(e){let t=ot(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function mf(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=hf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Xd(s).map(e=>e.suggestion)}function hf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Ie(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:gf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function gf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Be(t,r.device.platform,{action:i.command===`fill`?`fill`:ot(i.command)?`click`:`get`,nodes:n}),c=f(t.type??`Element`),l=fn(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function _f(e){return{...e,hint:e.hint??bf(e.details,`hint`),diagnosticId:e.diagnosticId??bf(e.details,`diagnosticId`),logPath:e.logPath??bf(e.details,`logPath`)}}function vf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return yf({error:t,actionLabel:at(n),action:n.command,positionals:pt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function yf(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Dn(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Dn(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Sf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>Dn(e,u))}:{},divergence:l}}}}function bf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const xf=[`readiness`,`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function Sf(e){if(!e)return{};let t={};for(let n of xf)e[n]!==void 0&&(t[n]=e[n]);return t}async function Cf(e){return await wf({...e,snapshotDiagnostics:_(e.snapshotDiagnosticSamples)})}async function wf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Tf(t.error.details?.replaySource),v=_f(t.error),y=await Qd({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:Kn(u.meta?.requestId)});return vf({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Tf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(n!==void 0||r!==void 0)return{path:n,line:r}}function Ef(e,t){if(e)try{V.appendFileSync(e,`${JSON.stringify(d(t))}\n`)}catch(t){M({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Df(e){let{req:t,sessionName:n,action:i,resolved:a,filePath:o,line:s,step:c,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();Ef(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,positionals:pt(a)??[]});let g;try{g=await kf({req:t,sessionName:n,resolved:a,sourceAction:i,invoke:f,resolvedSessionScope:p,dependencies:m,readinessTimeoutMs:e.readinessTimeoutMs})}catch(e){if(!(e instanceof r))throw e;g={ok:!1,error:l(e)}}let _=Date.now();return Ef(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?jf(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Of(g,u??o,s)}function Of(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function kf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Nf(t.flags,r.flags,r.command);e.readinessTimeoutMs!==void 0&&(c.readinessTimeoutMs=e.readinessTimeoutMs);let l=i.command===`fill`?Wt(Rt(i)):void 0;return l&&(c.recordAs=l),await a(Af({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Af(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:it(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ut(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function jf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}async function Mf(e,t){let{readinessTimeoutMs:n}=Nf(e,t.flags,t.command);if(n===void 0)return;let{SELECTOR_PIPELINE_POLICIES:r,readinessScheduleFor:i}=await import(`./selector-pipeline-policy.js`).then(e=>e.r);return i(r.promotedTarget.poll,n)}function Nf(e,t,n){let r=g(e,{...t??{}});return Re(n)&&r.readinessTimeoutMs===void 0&&(r.readinessTimeoutMs=2e3),r}function Pf(e){return Vf(e.ok?If(e.data):Ff(e.error.details?.artifactPaths))}function Ff(e){return Array.isArray(e)?e.filter(Bf):[]}function If(e){return e?[zf(e.path),zf(e.outPath),...Lf(e.artifacts)].filter(Bf):[]}function Lf(e){return Array.isArray(e)?e.map(Rf).filter(Bf):[]}function Rf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return zf(t.localPath)??zf(t.path)}function zf(e){return typeof e==`string`?e:void 0}function Bf(e){return typeof e==`string`}function Vf(e){return[...new Set(e.filter(Hf))]}function Hf(e){try{return V.statSync(e).isFile()}catch{return!1}}function Uf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Wf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=en(r),u=Ce(t),d=Zt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Et(r,e)===t.sibling),p=d.filter(e=>Tt(wt(e,l),t.scrollRegion)),m=St(p)[t.viewportOrder]?.ref,h=Ct({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...qf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Wf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Gf(n,t,i,a):Kf(n,t,r,a,o)}function Gf(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),s=e(n),c=s?o(t,s):null;if(a(c))return{matchedNodes:[c],winnerRef:c.ref};let l=r?tn(t,r):null;return a(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Kf(e,t,n,r,i){let a=et(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=rn(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function qf(e){let{classification:t,matchCount:n,winnerNode:r,identitySet:i,byIndex:a,recorded:o}=e;switch(t.reason){case`selector-miss`:return{kind:`selector-miss`,matchCount:0,observedNode:void 0,candidateNodes:[],mismatches:[],causeCode:`SELECTOR_MISS`,causeMessage:`The recorded target no longer matches any current element.`};case`identity-set-empty`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Jf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`The recorded selector/ref still matches, but nothing in the current tree carries the recorded identity.`};case`unique-but-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Jf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Exactly one current element carries the recorded identity, but the resolved target is a different element.`};case`signal-isolated-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Jf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`A disambiguation signal (sibling or viewport position) isolated a different element than the resolved target.`};case`no-signal-isolation`:return{kind:`identity-unverifiable`,matchCount:n,observedNode:r,candidateNodes:i.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`${i.length} current elements carry the recorded identity and neither disambiguation signal isolated one.`}}}function Jf(e,t,n){let r=Dt(t),i=$t(t,n,Math.max(e.ancestry.length,1)).chain;return[...Te(e,r),...xe(e.ancestry,i)].slice(0,5)}function Yf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=dt(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ze(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!ot(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Zf(r)&&Zf(n[1])))return r}function Xf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Zf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Qf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=kn(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:cp(Ce(n),h),...t.observed?{observed:cp(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>lp(e,h))},_=zd({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Id({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(at(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=Gd({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return vf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function $f(e,t,n){let r=kn(e.scrubVars);return Qf(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:of(n,r),publicationEvidence:rp(n),repairCapture:$d(n)})}async function ep(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await tf({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function tp(e,t){return $f(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await ep({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function np(e,t,n){return $f(e,t,await ep({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function rp(e){return e.state===`available`?e.evidence:void 0}function ip(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?ae(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Je(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Yf(n,i),platform:a.device.platform}:{kind:`inactive`}}function ap(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=pf(r),s=Uf({recorded:t,token:n,nodes:i,platform:a,refLabel:Xf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Dt(s.winnerNode),structural:ke(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Dt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function op(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function sp(e){return!e.ok&&e.error.details?.reason===nn}function cp(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function lp(e,t){let n=f(e.type??`Element`),r=fn(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function up(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function dp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.role==`string`)return{...typeof t.id==`string`?{id:t.id}:{},role:t.role,...typeof t.label==`string`?{label:t.label}:{}}}function fp(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function pp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.documentOrder==`number`&&typeof t.sibling==`number`)return{documentOrder:t.documentOrder,sibling:t.sibling}}function mp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:dp(e?.observed),expectedStructural:pp(e?.expectedStructural),observedStructural:pp(e?.observedStructural)}}function hp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:dp(e?.observed),observedAncestry:fp(e?.observedAncestry)}}function gp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function _p(e,t,n){let r=gp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&op(e)?{status:`guard-mismatch`,evidence:mp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&sp(e)?{status:`landmark-mismatch`,evidence:hp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function vp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c,l=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),u=e=>(o=e,gp(yp(e),Pf(e))),d=async e=>{let n=t.observationStore.get();return n?await tf({session:n,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:!0}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`}};return{runtime:{beginTargetVerification(e,n,r,i){return ip({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async observeTarget({action:e,token:n}){let r=async()=>{let r=await d(e);if(s=r,r.state!==`available`)return{state:`unavailable`,reason:r.reason,hint:r.hint};let i=t.sessionStore.get();return{state:`classified`,classification:ap({recorded:e.targetEvidence,token:n,action:e,nodes:[...r.nodes],platform:i.device.platform})}},i=n.startsWith(`@`)?void 0:await Mf(t.replayReq.flags,e);if(!i)return await r();let{observeUntil:a}=await import(`./observe-until.js`).then(e=>e.n),o=await a({capture:r,verdict:e=>Tp(e)?{kind:`continue`}:{kind:`done`,result:e},schedule:i,...t.signal?{signal:t.signal}:{},...t.dependencies.clock?{clock:t.dependencies.clock}:{}});if(o.polls.length>1&&(c={remainingBudgetMs:Math.max(0,i.budgetMs-Ep(o)),readiness:{polls:o.polls.length,waitedMs:o.waitedMs,end:o.kind}},M({level:`debug`,phase:`interaction_target_readiness`,data:{...c.readiness,command:e.command}})),o.kind===`done`)return o.result;if(o.last!==void 0)return o.last;throw o.kind===`expired`?o.lastError:o.error},async dispatchStep(e,n,i,a,s){let l=t.actionLines[i]??1,u=await Df({...c?{readinessTimeoutMs:c.remainingBudgetMs}:{},req:up(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:l,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=u,Pf(u).forEach(e=>r.add(e));let d=[...r];return u.ok?{status:`ok`,artifactPaths:d}:_p(u,s,d)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await tp(l(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=$f(l(e,t,r,i),n,a);return u(n.kind===`selector-miss`&&c?Dp(o,c.readiness):o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await np(l(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=yp(o),l=await bp(t,n,e,r,c,[...i],[...a],s);return u(l)},armStep:()=>{s=void 0,c=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>xp(e),onStep:i,diagnosticsMarker:()=>Cp(t.sessionStore),diagnosticsSince:e=>wp(t.sessionStore,e)},readLastResponse:()=>o}}function yp(e){return e&&!e.ok?e:c(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function bp(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Sp(i)?c(i):c(await Cf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function xp(e){let t=e.positionals??[],n=Ne(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Sp(e){if(e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence,n=t&&typeof t==`object`?t.kind:void 0;return typeof n==`string`&&n!==`action-failure`}function Cp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function wp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Tp(e){return e.state===`classified`&&!e.classification.verified&&e.classification.kind===`selector-miss`}function Ep(e){let t=e.polls[0];return t?e.waitedMs-(t.startedMs+t.durationMs):0}function Dp(e,t){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,readiness:t}}}}function Op(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:kp(t,i)};return jp(o,`AD_PLATFORM`,a.platform??r.platform),jp(o,`AD_TARGET`,a.target??r.target),jp(o,`AD_DEVICE`,a.device),jp(o,`AD_DEVICE_ID`,Ap(a)),Mp(o,`AD_SHARD_INDEX`,a.shardIndex),Mp(o,`AD_SHARD_COUNT`,a.shardCount),jp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function kp(e,t){let n=e.meta?.cwd??process.cwd();return B.relative(n,t)||t}function Ap(e){return typeof e.serial==`string`?e.serial:e.udid}function jp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Mp(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Np=3e4,Pp=1e3;function Fp(e){let{scriptPath:t,env:n,publicNetworkOnly:i}=e,a=V.readFileSync(t,`utf8`),o=Object.create(null);try{ba.runInNewContext(a,Ip(n,o,i),{filename:t,timeout:Np})}catch(e){let n=l(e);throw new r(n.code,`Maestro runScript failed: ${n.message}`,m({...n.details??{},hint:n.hint,diagnosticId:n.diagnosticId,logPath:n.logPath,retriable:n.retriable,supportedOn:n.supportedOn,scriptPath:t}),e instanceof Error?e:void 0)}return Up(o,t),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Wp(t)]))}function Ip(e,t,n){return{...e,output:t,json:Lp,http:{post:(e,t)=>zp(`POST`,e,n,t)}}}function Lp(e){if(typeof e!=`string`)throw new r(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new r(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Rp)}catch(t){throw new r(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Pp)},t instanceof Error?t:void 0)}}function Rp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function zp(e,t,n,i){let a=Cn(process.execPath,Bp(),{stdin:JSON.stringify(Hp(e,t,i,n)),timeoutMs:Np,allowFailure:!0});if(a.exitCode!==0)throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Gp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(n){throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:a.stdout.slice(0,Pp),stderr:a.stderr.slice(0,Pp)},n instanceof Error?n:void 0)}}function Bp(){let e=Vp(import.meta.url);if(!e)throw new r(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Vp(e){try{let t=va(e),n=B.extname(t)||`.js`;return[B.join(B.dirname(t),`run-script-http-child`+n),B.join(B.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>V.existsSync(e))??null}catch{return null}}function Hp(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Up(e,t){for(let n of Object.keys(e))if(n.includes(`.`))throw new r(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${n}`,{scriptPath:t,key:n})}function Wp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Gp(e){let t=e.trim();return t.length>0?t.slice(0,Pp):`request process exited without stderr`}async function Kp(e){return await qp(`tap`,async t=>{let n=B.join(t,`before.png`),r=B.join(t,`after.png`),i=await Yp(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Yp(e,r)))return await Jp(n,r,e.signal,`tap`)}})})}async function qp(e,t){let n=await H.mkdtemp(B.join(_a.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await H.rm(n,{recursive:!0,force:!0})}catch{}}}async function Jp(e,t,n,r){try{let[i,a]=await Promise.all([H.readFile(e),H.readFile(t)]);$p(n);let o=await $i(i,a,`Maestro screenshot`);return $p(n),Xp(o,r)}catch(e){Qp(e,n),M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Yp(e,t){try{return await H.rm(t,{force:!0}),$p(e.signal),await e.capture(t),$p(e.signal),!0}catch(t){return Qp(t,e.signal),!1}}function Xp(e,t){if(e.status!==`compared`)return Zp(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return Zp(t,n?`stable`:`changed`,e),n}function Zp(e,t,n){M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Qp(e,r){if(r?.aborted||n(e))throw t()}function $p(e){if(e?.aborted)throw t()}async function em(e){nm(e.timeoutMs),$p(e.signal);let t=e.now()+e.timeoutMs;return await qp(`animation`,async n=>{let r=B.join(n,`first.png`),i=B.join(n,`second.png`);for(;;){if($p(e.signal),await tm(e,r,i))return!0;if(e.now()>=t)return!1}})}async function tm(e,t,n){let r=[await Yp(e,t),await Yp(e,n)];return!r[0]||!r[1]?!1:await Jp(t,n,e.signal,`animation`)===!0}function nm(e){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const rm=q.observationPollMs;async function im(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!bm(n)||(Z(e.context.signal),!await vm(e.dependencies,t,rm,e.context.signal)))throw n}}}function am(e){return om({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function om(e){let t=Bi(e.snapshot),n=e.platform===`ios`?ia(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:a(n.nodes)}:e.snapshot;return dm(yo(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function sm(e){ym(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await im(e,n),i=om({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Ca(e.condition,i))return i;if(e.dependencies.now()>=n)break;await vm(e.dependencies,n,rm,e.context.signal)}return Z(e.context.signal),Cm(t)}async function cm(e){ym(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await im(e,t);if(r=void 0,n=om({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===q.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),Cm(n)}async function lm(e){ym(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await im(e,t),r=xm(n);for(;;){Z(e.context.signal),await vm(e.dependencies,t,rm,e.context.signal);let i=await im(e,t),a=xm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function um(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function dm(e,t,n,r,i,a,o){if(!e.ok){let t=um(r);return{generation:n,matched:e.evidence.matched,visible:e.evidence.visible,candidateCount:e.evidence.candidateCount,...e.evidence.ref?{ref:e.evidence.ref}:{},...t?{viewport:t}:{}}}let s=pm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=um(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:fm(e.rect,c)}:{},candidateCount:e.evidence.candidateCount,rect:e.rect,...e.evidence.ref?{ref:e.evidence.ref}:{},...c?{viewport:c}:{},...s?{dispatchSelector:s}:{},...i.includeSurfaceSignature?{surfaceSignature:xm(t)}:{}}}function fm(e,t){return!Ae(e)||!Ae(t)?0:O(t,e)?100:Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))*100/(e.width*e.height)}function pm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!mm(t,n,r)||i!==1))return hm(t.selector)}function mm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!bo(e.selector)}function hm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!gm(n)||typeof r!=`string`)return;let i=Pr(r)?.trim();return i?{key:n,value:i}:void 0}function gm(e){return e===`id`||e===`label`||e===`text`}async function _m(e,n,r){try{await e.sleep(n,r)}catch(e){throw r?.aborted?t():e}Z(r)}async function vm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await _m(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw t()}function ym(e,t){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function bm(e){return e instanceof r&&e.details?.retriable===!0}function xm(e){return ga(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,checked:e.checked??!1,bounds:Sm(e.rect)})))).digest(`hex`)}function Sm(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function Cm(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function wm(e){return e.kind===`clearState`?km(e):Tm(e)?Em(e):Wm(e)?Gm(e):e.kind===`settingsPermission`?Lm(e):Rm(e)}function Tm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Em(e){switch(e.kind){case`launchApp`:return Dm(e);case`stopApp`:return Om(e);case`openLink`:return Am(e)}}function Dm(e){return{command:`open`,positionals:e.appId?[e.appId]:[],flags:{...e.relaunch?{relaunch:!0}:{},...e.clearState?{clearAppState:!0}:{},...e.launchArgs.length>0?{launchArgs:e.launchArgs}:{}}}}function Om(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function km(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Am(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const jm={camera:`camera`,microphone:`microphone`,photos:`photos`,contacts:`contacts`,notifications:`notifications`,calendar:`calendar`,location:`location`,medialibrary:`media-library`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`},Mm={allow:`grant`,deny:`deny`,unset:`reset`},Nm={location:{always:{state:`grant`,permission:`location-always`},inuse:{state:`grant`,permission:`location`},never:{state:`deny`,permission:`location`}},photos:{limited:{state:`grant`,permission:`photos`,mode:`limited`}}};function Pm(e){let t=Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]);if(t.length===0)throw new r(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...t.filter(([e])=>e===`all`),...t.filter(([e])=>e!==`all`)].map(([e,t])=>Fm(e,t))}function Fm(e,t){let n=e===`all`?`all`:Im(jm,e);if(n===void 0)throw new r(`UNSUPPORTED_OPERATION`,`Maestro permission "${e}" is not supported.`,{hint:`Supported: all, ${Object.keys(jm).join(`, `)}.`});let i=Nm[e],a=i?Im(i,t):void 0;if(a)return a;let o=Im(Mm,t);if(o)return{state:o,permission:n};throw new r(`INVALID_ARGS`,`Maestro permission "${e}" does not accept "${t}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(i??{})].join(`|`)}.`})}function Im(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function Lm(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Rm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return zm(e);case`clickPoint`:return Bm(e);case`swipe`:return Vm(e);case`scroll`:return Hm(e);case`pressKey`:return Um(e)}}function zm(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Bm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Vm(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function Hm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Um(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Wm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Gm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Km(e,t){let n=wm(t),i=await e.invoke(m({...n,flags:qm(e.flags,n.flags??{})}));if(!i.ok)throw $m(i);if(t.kind===`gestureViewport`){let e=i.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new r(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function qm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=m({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Jm(e){return e?e.kind===`scalar`?[String(e.value)]:e.kind===`list`?e.values.map(String):Object.entries(e.values).flatMap(([e,t])=>[e,String(t)]):[]}function Ym(e,t){return{generation:t.generation,matched:t.matched&&t.visible,candidateCount:t.candidateCount,evidence:{kind:`selector`,selector:e,visible:t.visible,candidateCount:t.candidateCount,...t.ref?{ref:t.ref}:{}}}}function Xm(e){if(!e)return[];let t=[];if(typeof e.path==`string`&&t.push(e.path),Array.isArray(e.artifactPaths)&&t.push(...e.artifactPaths.filter(e=>typeof e==`string`)),Array.isArray(e.artifacts))for(let n of e.artifacts)typeof n.localPath==`string`?t.push(n.localPath):typeof n.path==`string`&&t.push(n.path);return[...new Set(t)]}function Zm(e,t,n){if(B.isAbsolute(e))return e;let i=t.source?.path??n;if(!i)throw new r(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return B.resolve(B.dirname(i),e)}function Qm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function $m(e){let t=e.error,n=m({...t.details??{},hint:t.hint??eh(t.details,`hint`),diagnosticId:t.diagnosticId??eh(t.details,`diagnosticId`),logPath:t.logPath??eh(t.details,`logPath`),retriable:t.retriable??th(t.details,`retriable`),supportedOn:t.supportedOn??eh(t.details,`supportedOn`)});return new r(t.code,t.message,Object.keys(n).length?n:void 0)}function eh(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function th(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function nh(e){let t,n,i,a,o,s=0,c=0,l=async n=>{c+=1;let i=await Km(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new r(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=b(i,i);return t={generation:n.generation,snapshot:a},a};return{capture:async e=>{if(n?.generation===e.generation){let r=n.snapshot;return n=void 0,t={generation:e.generation,snapshot:r},r}return n=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,n=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,n=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,n=void 0}},prime:(e,t)=>{n={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await lm({timeoutMs:q.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,n={generation:i.generation,snapshot:c.snapshot},c}}}async function rh(e){let{input:t,context:n,snapshots:r,options:i}=e,a=i.dependencies.now()+t.timeoutMs,o=e.allowObservationReuse===!1?void 0:r.reuseObservation(n);for(;;){let e=i.dependencies.now(),s=o!==void 0;o??=await im({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=am({query:t,context:n,snapshot:o,platform:i.platform});if(lh(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await vm(i.dependencies,a,rm,n.signal)}}}async function ih(e,t,n,r,i,a){let o=async()=>await sh(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Kp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Km(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await ah(e,t,n,r,i,a.click,o)});return}await ah(e,t,n,r,i,a.click)}async function ah(e,t,n,r,i,a,o){let s=async()=>await sh(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:xm(await t.capture(i))),l=async()=>{let r=await lm({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await oh({baselineSignature:c,screenshotBaseline:o,dispatch:s,settle:l,onRetry:()=>{n.tapRetries+=1}});t.prime(i.generation,e.snapshot)}catch(e){throw t.requireStability(i.generation),e}}async function oh(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<q.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function sh(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await uh(e,o,n.point,i);return}catch(n){if(!dh(n))throw n;let o=await rh({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!ch(o))throw n;t.invalidate(r.generation),await fh(e,In(o.rect),i);return}}t.invalidate(r.generation),await fh(e,n.point,i)}function ch(e){return e.matched&&e.visible&&e.rect!==void 0}function lh(e,t){return ch(e)?!t||e.dispatchSelector!==void 0:!1}async function uh(e,t,n,r){M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Km(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function dh(e){let t=i(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===dn.selectorNotFound}async function fh(e,t,n){if(!t)throw new r(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Km(e,{kind:`clickPoint`,point:t,options:n})}function ph(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function mh(e){let t=nh(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},i=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},a=e.platform,o=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Km(e,t)),s=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},c=async(e,t,n=`none`)=>await s(()=>o(e),t,n),l=async(e,t,n)=>{let i=[];for(let a of t){try{await c({kind:`settingsPermission`,...e?{appId:e}:{},state:a.state,permission:a.permission,...a.mode?{mode:a.mode}:{}},n)}catch(e){throw e instanceof r?new r(e.code,e.message,{...e.details,appliedPermissionMutations:i,failedPermissionMutation:ph(a)}):e}i.push(ph(a))}},u=async(n,r)=>{vn(n),await c({kind:`typeText`,text:n},r);let a=await lm({timeoutMs:q.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});i(a),t.prime(r.generation,a.snapshot)};return{operations:{platform:a,resolveTarget:async(n,r)=>await rh({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await sm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a}),resolveGestureViewport:async()=>await o({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Jm(e.arguments),...Jm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Pm(e.permissions);i&&await c({kind:`clearState`,...n?{appId:n}:{}},t),await l(n,r,t)}await c({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i&&!e.permissions,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`stopApp`,...n?{appId:n}:{}},t)},setPermissions:async(e,t)=>{await l(e.appId??t.appId,Pm(e.permissions),t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await c({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:a===`ios`},t,`deferred`)},tapOn:async(r,i)=>await ih(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await s(()=>fh(e,t.target.point,m({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await s(()=>fh(e,t.target.point,{holdMs:q.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await c({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await u(e.text,t),eraseText:async(e,t)=>await u(`\b`.repeat(e.charactersToErase??q.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await c({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let i=await cm({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a,scroll:async(i,o)=>{let s=Ma(o,n.selector,n.direction,n.durationMs,a);return await c(s?{kind:`swipe`,...s}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await lm({timeoutMs:Math.min(q.settleTimeoutMs,i),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(i.visiblePercentage!==q.scrollUntilVisiblePercentage)throw Rr(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Ym(n.selector,i))}},pressKey:async(e,t)=>{await c({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await c({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await c({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await em({timeoutMs:t.timeoutMs??q.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await o({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Xm(await o({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Fp({scriptPath:Zm(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?Qm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:i}}function hh(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=mh(e);return Do(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function gh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),_h(()=>bh(r,e)),_h(()=>xh(n,t,e))},actionCompleted:e=>{let r=vh(i,e.stepIndex);_h(()=>Sh(n,t,yh(r,e),!0))},actionFailed:e=>{let r=vh(i,e.stepIndex);_h(()=>Sh(n,t,yh(r,e),!1))}}}function _h(e){try{e()}catch{}}function vh(e,t){let n=e.get(t);return e.delete(t),n}function yh(e,t){return m({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function bh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function xh(e,t,n){Ef(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function Sh(e,t,n,i){let a=Ch(n);Ef(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,ok:i,durationMs:n.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in n&&n.error instanceof r?{errorCode:n.error.code}:{}})}function Ch(e){let t=`data`in e?e.data:void 0,n=wh(t?.timing)?t.timing:void 0;return m({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function wh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Th(e,t){let n=m({...e.dispatch,...Eh(t.dispatch)});return m({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,dispatch:Object.keys(n).length>0?n:void 0})}function Eh(e){return m({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function Dh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:jh(e.action),positionals:Mh(e.action,e.value),flags:t.flags??{}}}}async function Oh(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=Kn(r.meta?.requestId),c=Dh(t,r),l=_f(e.error),u=[...t.redactions],d=kn(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await tf({session:p,observationStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?kh({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Ah(t.value)].filter(Boolean).join(` `),_=Gd({sessionStore:i,observationStore:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:of(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:zd({kind:`action-failure`,targetEvidence:void 0,capture:$d(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return yf({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u,warnings:t.warnings})}function kh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Xd(Qn(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>gf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Ah(e){return!e||e===`<text>`?e??``:ct(e)}function jh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Mh(e,t){return!t||e===`inputText`?[]:[t]}function Nh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=Fh(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:Ih(c,Date.now()-r)}}}async function Ph(e){let{command:t,replayPath:n,state:r,outcome:i}=e,{request:a,session:{store:o,observationStore:s,logPath:c}}=t,{failure:u}=i,d=l(i.error);return u?await Oh({error:d,failure:u,replayPath:n,req:a,sessionStore:o,observationStore:s,logPath:c,snapshotDiagnostics:Fh(o,r.snapshotStart)}):{ok:!1,error:d}}function Fh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return _(n)}function Ih(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Lh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return c(`INVALID_ARGS`,ur);if(t.flags?.saveScript!==void 0)return c(`INVALID_ARGS`,`Maestro YAML does not support --save-script; ADR 0012 repair recording applies only to .ad scripts.`);let r=Date.now(),i={snapshotStart:0};try{return await Rh({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Ph({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Rh(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await zh({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Kh({command:t,device:l.device,platform:l.platform,runtimeHints:l.runtimeHints,sourcePath:l.filePath,publicNetworkOnly:u});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await pr(l.flow,d,{defaults:l.defaults,env:l.env,platform:l.platform,target:l.target,runtimeHints:l.runtimeHints,signal:l.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:!u,readSource:e=>Yr(n,e),observer:gh({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?Nh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Ph({command:t,replayPath:n.entry,state:i,outcome:f})}async function zh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=rr(Yr(n,o),o),c=a.lookup(),l=c?.session;c&&a.assertSelectorMatches(r.flags);let u=await Bh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Wh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Gh(r),signal:Kn(r.meta?.requestId)}}async function Bh(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await Li(t.flags??{},tr(a.appTarget,o))),c=Zh(t,s),l=Hh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Vh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Qh(t,s),runtimeHints:l,flow:a})}async function Vh(e){if(e.device||!Uh(e.runtimeHints))return e;let t=await Li(e.req.flags??{},tr(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Qh(e.req,t),runtimeHints:Hh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Hh(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function Uh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Wh(e){return{...Op({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Gh(e){return{...Mt(jt(e.flags?.replayShellEnv)),...kt(Ot(e.flags?.replayEnv))}}function Kh(e){let{command:t,device:n,platform:r,runtimeHints:i,sourcePath:a,publicNetworkOnly:o}=e,{request:s,invoke:c}=t,l={...s,runtime:i,...t.dispatch?{dispatch:t.dispatch}:{}};return hh({invoke:e=>c(Th(l,e)),flags:qh(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await ya(e,void 0,{signal:t})}}})}function qh(e,t,n){if(!e)return Jh(t,n);let r={platform:t,target:e.target,noRecord:!0};return t===`android`?{...r,serial:e.id}:{...r,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}}}function Jh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Yh(n,t):Xh(n,t)}function Yh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Xh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Zh(e,t){let n=e.flags?.platform;if(n===`android`||n===`ios`)return n;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new r(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Qh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function $h(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(It(t,a.flags?.replayBackend)===`maestro`)return n?c(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Lh(i):c(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function eg(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=tg(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=ng(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=rg({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:ag({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function tg(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return c(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function ng(e,t,n){let r=pd(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:ig({...e,flags:ir(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function rg(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:c(`INVALID_ARGS`,a.message)}}function ig(e,t){return!t.platform&&!t.target?e:{...e,flags:og(e.flags,t)}}function ag(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Op({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Mt(jt(t.flags?.replayShellEnv)),cliEnv:kt(Ot(t.flags?.replayEnv))}}function og(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const sg={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function cg(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=lg({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(fg({req:t,coordinator:a}),dg({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function lg(e){let t=pg(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return s()}function ug(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?c(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):mg({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function dg(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=ug({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??sg,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:hg({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function fg(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function pg(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return c(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function mg(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Mn(t):a??Fd(i);if(!(n||r&&o===a)&&V.existsSync(o))return c(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function hg(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function gg(e){let{request:t,session:{name:n,logPath:r,store:i,observationStore:a,coordinator:o},tracePath:s,onStep:u,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return c(`INVALID_ARGS`,ur);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,Lt(h)&&t.flags?.replayBackend!==`maestro`)return c(`INVALID_ARGS`,Ft(`replay`,h));let l=await $h({resolved:h,keepSession:m,coordinator:o,command:e});if(l)return l;let _=eg({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:h,script:Yr(f,h),coordinator:o,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:ee}=_.value,T=cg({req:t,entryIndex:C,sessionStore:i,sourcePath:h,coordinator:o});if(!T.ok)return T.response;let{runtime:E,readLastResponse:te}=vp({ctx:{replayReq:v,sessionName:n,sessionStore:i,observationStore:a,logPath:r,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:ee,responseLevel:t.meta?.responseLevel,invoke:d,signal:Kn(t.meta?.requestId),coordinator:o,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:u,armSaveScript:T.armSaveScript}),D=await Td({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},E);return D.status===`failed`?te()??c(`COMMAND_FAILED`,`replay step failed with no recorded response`):_g({startedAt:p,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:o,keepSession:m})}catch(e){let t=l(e);return g.size===0?{ok:!1,error:t}:{ok:!1,error:{...t,details:{...t.details,artifactPaths:[...g]}}}}}function _g(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=yg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=_([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:vg(i,Date.now()-t)}}}function vg(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function yg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return c(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function bg(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=B.resolve(n??`.`,t??`.agent-device/test-artifacts`);return B.join(i,r)}function xg(e,t){let n=t?B.relative(t,e):B.basename(e),r=n.length===0||n.startsWith(`..`)?B.basename(e):n;return Ye(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function Sg(e,t){V.mkdirSync(t,{recursive:!0}),Tg(e,t)}function Cg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=B.join(o,`result.txt`),u=B.join(o,`failure.txt`),d=wg([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>B.basename(e)).join(`, `)}`);let p=`${f.join(`
2
- `)}\n`;V.writeFileSync(l,p),s||V.writeFileSync(u,p)}function wg(e,t,n){let r=[],i=new Set(n.map(e=>B.basename(e).toLowerCase()));for(let n of e){if(!Dg(n))continue;let e=B.basename(n);if(B.resolve(n)===B.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=Eg(e,t,i),o=B.join(t,a);V.copyFileSync(n,o),r.push(o)}return r}function Tg(e,t){let n=B.join(t,`replay.ad`);if(V.copyFileSync(e,n),B.extname(e).toLowerCase()===`.ad`)return;let r=B.join(t,B.basename(e));B.resolve(r)!==B.resolve(n)&&V.copyFileSync(e,r)}function Eg(e,t,n){let r=B.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||V.existsSync(B.join(t,a));)a=`${i}-${o++}${r}`;return a}function Dg(e){try{return V.statSync(e).isFile()}catch{return!1}}function Og(e){let{platformFilter:t,discoverSources:n}=e,i=n(),a=[];for(let e of i){let{path:n,manifest:r}=e,i={kind:`run`,path:n,title:r.title,manifest:r};if(!t){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}Pg(t,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=t?` for --platform ${t}`:``;throw new r(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function kg(e,t,n,r,i=0){let a=B.basename(n,B.extname(n)),o=Ye(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Ag(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return Ye(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function jg(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,B.basename(r),`attempt`,a+1].join(`:`)}function Mg(e,t){return typeof e==`number`?e:t}function Ng(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Pg(e,t){return e===`apple`?w(t):t===e}function Fg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Ig=2e3;async function Lg(e){let{filePath:t,sessionName:n,requestId:r,parentRequestId:i,timeoutMs:a,platform:o,target:s,artifactsDir:c,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:r,parentAttemptId:i}),v=new Set,y,b=!1,x,S=Date.now(),C=Wg({artifactsDir:c,artifactPaths:v,filePath:t,sessionName:n,requestId:r,timeoutMs:a,platform:o,target:s}),w=f({filePath:t,sessionName:n,platform:o,target:s,requestId:r,artifactsDir:c,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>Fg({error:l(e)})).finally(()=>{_.release()});try{x=typeof a==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Gg(a,[...v]))},a)})]):await w,Q(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:n,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await zg(w)||(x=Hg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:r,graceMs:Ig}}),Bg({replayPromise:w,cleanupSession:p,sessionName:n,requestId:r,emitDiagnostic:h})));let e=await Vg({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:c,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Ug(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:n}),await p(n),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!0,durationMs:Date.now()-t})}catch(e){let r=l(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-t,errorCode:r.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:n,error:r.message}}),x=Rg(x,r,v)}}return x??Fg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Rg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:Fg({error:t,artifactPaths:[...n],infrastructure:!0})}async function zg(e){return await Promise.race([e.then(()=>!0),ya(Ig).then(()=>!1)])}async function Bg(e){let{replayPromise:t,cleanupSession:n,sessionName:r,requestId:i,emitDiagnostic:a}=e;try{await t}finally{try{await n(r)}catch(e){a({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:r,requestId:i,error:l(e).message}})}}}async function Vg(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:a,emitDiagnostic:o}=e;if(!t)return;let s=Date.now();Q(a,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:n});try{let e=await t({sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:a,appendTimingEvent:e=>Q(a,e)});return Q(a,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:e===void 0,durationMs:Date.now()-s,errorCode:e?.error.code}),e}catch(e){let t=l(e);return Q(a,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-s,errorCode:t.code}),o({level:`warn`,phase:`test_finalize_failed`,data:{session:n,error:t.message}}),Fg({error:t})}}function Hg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Ug(e,t){return{...e,warnings:[...e.warnings,t]}}function Wg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=B.join(t,`replay-timing.ndjson`);return V.mkdirSync(B.dirname(l),{recursive:!0}),V.writeFileSync(l,``),n.add(l),Q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Q(e,t){e&&V.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Gg(e,t=[]){return Fg({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function Kg(e){let t=qg(e),n=await Jg(e,t);return{result:e_(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function qg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:B.join(i,...a?[`shard-${a.shardIndex+1}`]:[],xg(t.path,n)),maxAttempts:r+1}}async function Jg(e,t){Xg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Yg(e,t,r);if(Zg(n,i),Qg(e,i.outcome,r))break;$g(e,t,i)}return n}async function Yg(e,t,n){let{entry:r,sessionName:i,suiteInvocationId:a,caseIndex:o,suiteIndex:s,suiteTotal:c,requestId:l,timeoutMs:u,shard:d}=e,f=n+1,p=Date.now(),m=kg(i,a,r.path,o,n),h=B.join(t.testArtifactsDir,`attempt-${f}`);Sg(r.path,h);let g=jg({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...a_(d)},v=await Lg({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return Cg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Xg(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:kg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...a_(c)})}function Zg(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function Qg(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function $g(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...a_(e.shard)})}function e_(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?t_(e,t,n,r):n_(e,t,n,r)}function t_(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...a_(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,replayed:c.replayed,healed:c.healed,...c.warnings.length>0?{warnings:[...c.warnings]}:{},...c.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...i_(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function n_(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...a_(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...r_(c),...i_(s)}}function r_(e){let t=e?.status===`failed`?e:void 0;return{...t&&t.warnings.length>0?{warnings:[...t.warnings]}:{},...t?.infrastructure?{infrastructure:!0}:{},...e?.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function i_(e){return a_(e)}function a_(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function o_(e,t,n,r){if(!e||t.length===0)return;let i=await r(e.count);return{mode:e.kind,shardCount:e.count,total:n+(e.kind===`all`?t.length*e.count:t.length),shards:i.map((n,r)=>({shardIndex:r,shardCount:e.count,device:n,entries:e.kind===`all`?t:t.filter((t,n)=>n%e.count===r)}))}}async function s_(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),i=await c_(t,u,d);f_(i,o);let p=i.shardPlan?p_({entries:i.entries,total:i.total,emitProgress:o}):[];return i.shardPlan?p.push(...await m_({shards:i.shardPlan.shards,sessionName:f,suiteInvocationId:i.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:i.suiteArtifactsDir,suiteTotal:i.total,runReplay:n,cleanupSession:r,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await v_({discoveryEntries:i.entries,sessionName:f,suiteInvocationId:i.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:i.suiteArtifactsDir,suiteTotal:i.total,runReplay:n,cleanupSession:r,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:x_(i.total,p,Date.now()-e,i.suiteArtifactsDir)}}catch(e){let t=i(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function c_(e,t,n){let r=l_(e,t),i=u_(r),a=r.length-i.length,o=Ag(e.requestId),s=await o_(e.shard?{kind:e.shard.mode,count:e.shard.count}:void 0,i,a,n);return{entries:r,runnable:i,shardPlan:s,suiteInvocationId:o,suiteArtifactsDir:d_(e,o),total:s?.total??r.length}}function l_(e,t){return Og({platformFilter:e.platformFilter,discoverSources:t})}function u_(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function d_(e,t){return bg({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function f_(e,t){t({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function p_(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function m_(e){return(await Promise.allSettled(e.shards.map(async t=>await g_({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[h_(r,e.sessionName,t.reason)]:[]})}function h_(e,t,n){let r=l(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:__(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:r.code,message:r.message,hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,details:r.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function g_(e){let{shard:t,sessionName:n}=e;return await y_({...e,entries:t.entries,sessionName:__(n,t),shard:t})}function __(e,t){return`${e}:shard-${t.shardIndex+1}`}async function v_(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await Kg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Ng(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Mg(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),b_(t,o,p))break}return g}async function y_(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await Kg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Ng(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Mg(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),b_(b,o,m))break}return _}function b_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function x_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=y(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function S_(e,t){return()=>e.map(e=>C_(e,t))}function C_(e,t){let n=e.entry,r=Yr(e,n),i=It(n,t)===`maestro`,a=lt(r);return{path:n,manifest:{...i?{title:rr(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function w_(e){return async t=>(await D_(e,t)).map(T_)}function T_(e){if(e.platform===`web`||!ee(e))throw new r(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function E_(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}async function D_(e,t){let n=j_(e),i=k_(await Fi(O_(e)),n,e);if(i.length<t)throw new r(`DEVICE_NOT_FOUND`,`test sharding requires ${A_(t)}, but only ${i.length} matched`);return i.slice(0,t)}function O_(e){let t=F(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:S({simulatorSetPath:Ni(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function k_(e,t,n){return t.length>0?M_(e,t,n):e.filter(e=>N_(e,n)).sort(I_)}function A_(e){return`${e} device${e===1?``:`s`}`}function j_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function M_(e,t,n){return t.map(t=>{let i=F_(t),a=e.find(e=>P_(e,n)&&(e.id===t||F_(e.name)===i));if(!a)throw new r(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function N_(e,t){return!P_(e,t)||!ee(e)?!1:e.booted!==!1}function P_(e,t){return!(!D(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function F_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function I_(e,t){return e.id.localeCompare(t.id)}function L_(e){let t=R_(e?.shardAll,`--shard-all`),n=R_(e?.shardSplit,`--shard-split`);if(t!==void 0&&n!==void 0)throw new r(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(n!==void 0)return{mode:`split`,count:n}}function R_(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new r(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const z_=new Set([`IOS_BOOT_TIMEOUT`,`IOS_RUNNER_CONNECT_TIMEOUT`,`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,`IOS_TOOL_MISSING`,`ANDROID_BOOT_TIMEOUT`,`ADB_TRANSPORT_UNAVAILABLE`,`CI_RESOURCE_STARVATION_SUSPECTED`]);function B_(e){return z_.has(e.toUpperCase())}const V_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function H_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=U_(e);return t?W_(t.details)||G_(t.code,t.message):!1}function U_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function W_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||mn(t)?!0:t?B_(t):!1}function G_(e,t){let n=`${e}\n${t}`.toLowerCase();return V_.some(e=>n.includes(e))}function K_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Y_(e.error.details?.artifactPaths),warnings:un(e.error.details),infrastructure:H_(e),...X_(e.error.details?.snapshotDiagnostics)};let t=e.data;return{status:`passed`,replayed:typeof t?.replayed==`number`?t.replayed:0,healed:typeof t?.healed==`number`?t.healed:0,warnings:un(t),artifactPaths:Y_(t?.artifactPaths),...X_(t?.snapshotDiagnostics)}}function q_(e){if(!e||e.ok)return;let t=K_(e);return t.status===`failed`?t:void 0}function J_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Y_(e){return[...new Set(J_(e))]}function X_(e){let t=v(e);return t?{snapshotDiagnostics:t}:{}}const Z_=1e3,Q_=3e3;function $_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await ev(e)}}async function ev(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=En(o.device.platform),c=i?B.join(i,`recording${s}`):Tn(o.device.platform);nv(a,{type:`video_recording_start`,session:n,videoPath:c}),M({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(rv({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return nv(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await wn(Z_),nv(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:Z_}),M({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:Z_}}),l}async function tv(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;nv(a,{type:`video_tail_start`,session:n,requestedDurationMs:Q_});let o=Date.now();await wn(Q_);let s=Date.now(),c=await e.video.record(rv({req:t,sessionName:n,phase:`stop`}));return Pf(c).forEach(e=>i.add(e)),nv(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),M({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function nv(e,t){e({...t,ts:new Date().toISOString()})}function rv(e){let t={token:e.req.token,meta:e.req.meta};return e.phase===`start`?{request:t,sessionName:e.sessionName,phase:`start`,outputPath:e.outputPath}:{request:t,sessionName:e.sessionName,phase:`stop`}}const iv=[{keys:[`replayKeepSession`],requested:e=>e.replayKeepSession===!0,message:`test does not support --keep-session; suite attempts own their cleanup. Run one native .ad script directly with replay --keep-session.`},{keys:[`replayFrom`,`replayPlanDigest`],requested:e=>e.replayFrom!==void 0||e.replayPlanDigest!==void 0,message:`test does not support --from/--plan-digest; resume is replay-only. Run the failing script directly with replay --from.`},{keys:[`saveScript`,`force`],requested:e=>!!e.saveScript||e.force===!0,message:`test does not support --save-script/--force; the agent-supervised repair loop is replay-only. Repair the failing script directly with replay --save-script.`}],av=({attemptId:e,parentAttemptId:t})=>{Gn(e);let n=ov(e,t);return{cancel:()=>Hn(e),release:()=>{n(),Wn(e)}}};function ov(e,t){if(!t||t===e)return()=>{};let n=Kn(t);if(!n)return()=>{};let r=()=>{Hn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function sv(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=cv(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:E_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function cv(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function lv(e){let{request:t,session:{name:n,logPath:r},createSession:a,invoke:o,cleanupSession:s,video:l}=e;if(t.flags?.recordVideo===!0&&l===void 0)return c(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let u=t.flags??{};for(let e of iv)if(e.requested(u))return c(`INVALID_ARGS`,e.message);let d,f;try{d=fv(t,n),f=dv(t)}catch(e){let t=i(e);return c(t.code,t.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await s_({request:d,emitProgress:qn,isCanceled:()=>Un(t.meta?.requestId),emitDiagnostic:M,bindAttemptCancellation:av,runReplay:async({filePath:n,sessionName:i,platform:s,target:c,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&Pf(e).forEach(e=>f.add(e)),e),y=sv({parentFlags:t.flags,platform:s,target:c,artifactsDir:d,shard:g,sourceBundle:p.get(n)}),b=a(i,r),x=l?{req:t,sessionName:i,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:l}:void 0,S=x?$_(x):void 0;return K_(await gg({...pv(e,{request:{...t,command:`replay`,session:i,positionals:[n],flags:y,meta:{...t.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await ev(x):void 0;return t&&!t.ok?t:v(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:i,appendTimingEvent:o})=>{if(l)return q_(await tv({req:t,sessionName:e,sessionStore:a(e,r).store,artifactsDir:i,appendTimingEvent:o,artifactPaths:n,video:l}))},discoverSources:S_(f,t.flags?.replayBackend),resolveShardTargets:w_(t.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:uv(m.data,t)}:c(m.error.code,m.error.message)}function uv(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=B.join(n,B.basename(r)),a=e=>e===r||e.startsWith(r+B.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return V.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:B.basename(r)}]}:o}function dv(e){let t=e.flags?.replayScriptSources;if(!t)throw new r(`INVALID_ARGS`,ur);return t}function fv(e,t){let n=e.flags??{},r=e.meta?.cwd,i=hv(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:Mn(i,r),failFast:n.failFast===!0,retries:mv(n.retries),timeoutMs:mv(n.timeoutMs),shard:L_(n)}}function pv(e,t){let{publicNetworkOnly:n,resolvedSessionScope:r,dispatch:i,dependencies:a}=e,o=i||t.openLifecycle?{...i,...t.openLifecycle?{openLifecycle:t.openLifecycle}:{}}:void 0;return{request:t.request,...n?{publicNetworkOnly:n}:{},...r?{resolvedSessionScope:r}:{},...o?{dispatch:o}:{},dependencies:a}}function mv(e){return typeof e==`number`?e:void 0}function hv(e){return typeof e==`string`?e:void 0}function gv(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority,capture:r.capture},coordinator:r.createCoordinator()}}function _v(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function vv(e,t){let n=m({...e,...t});return Object.keys(n).length>0?n:void 0}function yv(e,t){return async({dispatch:n,...r})=>{let i=vv(t.internal,n);return await e(i?{...r,internal:i}:r)}}function bv(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:gt(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:xv(e.scriptPublication??Ht)}},armStep(e){n.update(t=>{xt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Fd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){gt(r())!==void 0&&n.update(ft)},markCompleteIfArmed(){gt(r())!==void 0&&n.update(yt)},markSessionHeldIfArmed(e){if(e.ok||!bt(r()))return e;let t=On(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&Cv(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Sv({session:t,...e})})}}}}function xv(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Gt(e),targetForce:zt(e)}}function Sv(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=wv({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Cv(e){e.pendingRecordAndHeal=void 0}function wv(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Tv(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await la({req:Ev(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function Ev(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const Dv={resolveSessionScope:Vi},Ov=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await gg({..._v(e),session:Av(t,n,r),invoke:yv(a??i,e),dependencies:Dv}),kv=async({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Tv({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await lv({..._v(e),session:Av(t,n,i),createSession:(e,t)=>Av(e,t,i),invoke:yv(s??o,e),dependencies:Dv,cleanupSession:async t=>await jv({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Av(e,t,n){let i=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1},a={get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)};return gv(e,t,a,{createCoordinator:()=>bv({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>n.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let r=n.lookup(e);r&&qi(r,t)},resolveOpenRuntimeHints:({request:t,device:r,platform:i})=>Fr({req:t,sessionStore:{getRuntimeHints:t=>t===e?n.getRuntimeHints(e):void 0},sessionName:e,device:r,platform:i}),bindAuthority:t=>$u({sessionStore:{get:()=>n.get(e),update:i},sessionName:e,...t?{signal:t}:{}}),capture:async({flags:t,logPath:i})=>{let a=n.get(e);if(!a)throw new r(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await ai({device:a.device,session:a,flags:t,logPath:i})}})}async function jv(e){let{req:t,sessionName:n,logPath:i,sessionStore:a}=e;if(!a.get(n))return;let o=await fc({req:{token:t.token,session:n,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:n,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new r(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function Mv(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command!==on.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return Iv(new r(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(n);if(!a)return Iv(new r(`SESSION_NOT_FOUND`,`No active session "${n}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=Fv(a);if(o)return Iv(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return Iv(new r(`INVALID_ARGS`,`session save-script path cannot be empty.`));Ut(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:Kt(a,t.flags?.force),publication:`active`});return c.written?(Yt(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...j(`Published script: ${c.path}`)}}):Iv(c.error??new r(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Nv(e){if(ht(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Xt(e)?void 0:`not-armed`}const Pv={repair:()=>new r(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new r(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new r(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new r(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function Fv(e){let t=Nv(e);return t?Pv[t]():void 0}function Iv(e){return{ok:!1,error:l(e)}}function Lv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function Rv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ei(e)}}async function zv(e,t,n){if(n.length!==1)throw new r(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(Rv(t))}}async function Bv(e,t,n){if(n.length<2)throw new r(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `),a={...Rv(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...j(`Clipboard updated`)}}async function Vv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await R({command:`clipboard`,device:t,use:Ke,inspectFacts:i,bindDevice:a,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>zv(n,e,r)}}let o=await R({command:`clipboard`,device:t,use:Ue,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>Bv(s,e,r)}}async function Hv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),l=t.flags??{},u=J(an.clipboard,s,l);if(u)return u;let d=t.positionals??[],f=Lv(d);if(!f)return c(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let p=await Y({session:s,flags:l}),m=await Vv({device:p,action:f,positionals:d,inspectFacts:a,bindDevice:o});if(!m.ok)return m.response;let h=await m.execute(ti(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,h),{ok:!0,data:{platform:x(p),...h}}}function Uv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Wv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Gv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Kv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),qn({type:`command`,status:`progress`,message:qv(t)})}function qv(e){return[ca(e),...sa(e)].join(`
3
- `)}async function Jv(e,t){let{device:n,targetApp:r,session:i,listInstalledApps:a}=t;if(r)try{let t=a?Yv(r,await a(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${x(n)}.`,evidence:{requested:r,platform:x(n)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:r,resolved:t,sessionApp:i?.appBundleId}})}catch(t){let r=l(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${r.message}`,hint:r.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${x(n)} --all`,evidence:{code:r.code,message:r.message}})}}function Yv(e,t){let n=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===n||e.name.toLowerCase()===n);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n));if(a.length===1)return a[0];throw a.length>1?new r(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new r(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Xv(e,t,n){let r=Qv(t,n);try{let t=await ey(r),n=$v(t.devices,r);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:iy(n,r,t.failures),hint:n.length===0?sy(t.failures):void 0,command:n.length===0?fy(r):void 0,evidence:py(n,t.failures)}),n.length>0&&ty(e,t.failures),{devices:n,platform:r.platform,target:r.target}}catch(t){let n=l(t);return $(e,{id:`device`,status:`fail`,summary:n.message,hint:n.hint,command:`agent-device devices`,evidence:{code:n.code,details:n.details}}),{devices:[],platform:r.platform,target:r.target}}}function Zv(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:x(e),id:e.id,name:e.name}))}})}function Qv(e,t){let n=e.flags??{};return zi({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function $v(e,t){return e.filter(e=>C(e,t,{includeExplicitSelectors:!0}))}async function ey(e){if(e.platform)return{devices:await Fi(e),failures:[]};let t=[],n=[];for(let r of gn)try{t.push(...await Fi({...e,platform:r}))}catch(e){n.push(ry(r,e))}return{devices:t,failures:n}}function ty(e,t){for(let n of t)$(e,ny(n))}function ny(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${uy(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${uy(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function ry(e,t){let n=l(t);return{platform:e,message:n.message,hint:n.hint,code:n.code}}function iy(e,t,n){if(e.length===0)return n.length>0?`No ${ay(t)} devices found; ${oy(n)}.`:`No ${ay(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${ay(t)} ${dy(e.length,`device`)} available; ${r} booted`,a=cy(e,t);return a?`${i} (${a}).`:`${i}.`}function ay(e){let t=e.platform?uy(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function oy(e){return e.slice(0,2).map(e=>`${uy(e.platform)} inventory failed: ${e.message}`).join(`; `)}function sy(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function cy(e,t){if(t.platform||t.target)return;let n=hn(e),r=ly();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function ly(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function uy(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function dy(e,t){return e===1?t:`${t}s`}function fy(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function py(e,t){let n=new Map;for(let t of e){let e=x(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const my=1500;async function hy(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await gy(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?_y(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function gy(e,t,n){try{return await(n.resolveProcessInfo??vy)(e,t)}catch{return}}function _y(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function vy(e,t){if(!yy(e))return;let n=await by(t);if(n!==void 0)return{pid:n,cwd:await xy(n)}}function yy(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function by(e){let t=await Sn(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:my});if(t.exitCode===0)return t.stdout.split(`
4
- `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function xy(e){let t=await Sn(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:my});if(t.exitCode===0)return t.stdout.split(`
5
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Sy=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Cy=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function wy(e,t){let n=Fn(e.meta?.cwd);return{targetApp:ky(e.flags?.targetApp)??t?.appBundleId,metroHost:ky(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Ay(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Dy(e,n)}}function Ty(e,t={}){let n=Oy(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Ey(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${x(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Dy(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Oy(e){let t={...Object.fromEntries([...Sy,...Cy].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function ky(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Ay(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function jy(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==an.doctor)return null;let s=My(e.hostDiagnostics),c=r.get(n),l=wy(t,c),u=Fy(r,n),d=[];if(Kv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${jn()} using ${u}`,evidence:{version:jn(),stateDir:u}},...Ty(t,{required:l.remote}),...Ey(r,n,c,{remote:l.remote})),l.remote)return By(d,l);let f=Ny(l,u,i),p=await Xv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await Iy({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??Py(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return By(d,l,{device:h,includeMetro:!0,inventory:p})}function My(e){if(!e)throw new r(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function Ny(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>Xr(e),emitProgress:e=>qn({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ii(e),shouldPropagateInventoryProbeError:Pi,transportOverrides:Object.freeze({androidAdb:n})})}function Py(e){let t=(e?.devices??[]).filter(e=>E(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function Fy(e,t){let n=B.dirname(e.resolveSessionDir(t));return B.basename(n)===`sessions`?B.dirname(n):n}async function Iy(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Zv(t,i,a.targetApp);return u&&await Ly(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await hy(a.metroHost,a.metroPort,a.kind)),Kv(t,...await r.ambientChecks(n)),u}async function Ly(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await Ry({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await Jv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),Kv(e,...await r.deviceChecks(i,n))}async function Ry(e){if(e.device.platform!==`harmonyos`)return zy(e)}async function zy(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Xe),u=F(n.flags?.androidDeviceAllowlist),d=await _c(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await vc(l,d,e)}function By(e,t,n={}){let r=Uv(e);return{ok:!0,data:{status:r,summary:Wv(r),kind:t.kind,platform:n.device?x(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:Gv(e)}}}async function Vy(e){return await R({...e,command:`prepare`,use:ue})}async function Hy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return c(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},l=J(an.prepare,o,s);if(l)return l;let u=await Y({session:o,flags:s}),d=await Vy({device:u,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:Uy(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(t)}});return{ok:!0,data:Wy(a,u,Math.max(0,Date.now()-f),p)}}function Uy(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Pe}function Wy(e,t,n,r){return{action:e,platform:x(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Gy(n,r),message:`Prepared Apple runner: ${t.name}`}}function Gy(e,t){let n=Ky(t.buildMs),r=qy(t.connectMs),i=qy(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function Ky(e){return e===void 0?void 0:qy(e)}function qy(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Jy=e=>yc(e),Yy=e=>Tl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Xy=e=>fc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Zy=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Fl({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),Qy=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await Iu({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),$y={session_list:Jy,devices:Jy,capabilities:Jy,apps:Jy,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await jy({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Zy,shutdown:Zy,appstate:Zy,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Mv({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Zo({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Hv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Os,perf:Qy,logs:Qy,events:Qy,network:Qy,audio:Qy,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Hy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Hs,reinstall:Hs,install_source:Hs,release_materialized_paths:async({req:e})=>await Fo({req:e}),push:Hs,"trigger-app-event":ks,open:Yy,replay:Ov,test:kv,batch:async({req:e,sessionName:t,invoke:n})=>await Us(e,t,n),close:Xy};async function eb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Jr,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=$y[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{eb as handleSessionCommands};
1
+ import{D as e,F as t,I as n,J as r,K as i,P as a,S as o,et as s,f as c,it as l,n as u,s as d,v as f,x as p}from"./sdk-contracts.js";import"./capture.js";import{A as m,i as h,n as g,t as _}from"./sdk-batch-runner.js";import{a as v,n as y,t as b}from"./snapshot-diagnostics.js";import{f as x}from"./android-input-ownership.js";import{a as S,o as C,r as w}from"./diagnostics.js";import"./diagnostics2.js";import{E as T,S as E,d as D,h as O,m as k,p as A,v as ee,w as j,x as te}from"./sdk-device.js";import{B as ne,Ct as re,Dr as ie,E as ae,F as oe,G as se,Gr as ce,I as le,J as ue,K as de,Kn as fe,L as pe,M as me,Or as he,P as ge,Pt as _e,Q as ve,R as ye,Tt as be,Un as xe,V as Se,Vn as Ce,W as we,Wn as Te,Wt as Ee,X as De,Y as Oe,Yn as ke,Yr as Ae,Z as je,Zr as Me,_n as Ne,an as Pe,at as Fe,bn as Ie,cr as Le,d as Re,ei as ze,f as Be,gn as Ve,it as He,j as Ue,mt as We,or as Ge,p as Ke,pt as qe,q as Je,sn as Ye,sr as Xe,st as Ze,vn as Qe,wt as $e,y as et,yn as tt,z as nt}from"./sdk-batch.js";import{u as rt}from"./scroll-gesture.js";import{a as it,b as at,f as ot,g as st,n as ct,p as lt,r as ut,w as dt,y as ft}from"./script.js";import{_ as pt,b as mt,f as M,g as ht,h as gt,l as _t,m as vt,n as yt,p as bt,r as xt,t as St,v as Ct,x as wt,y as Tt}from"./dispatch-resolve.js";import{a as Et,d as Dt,n as Ot,o as kt,r as At,t as jt}from"./target-evidence.js";import{a as Mt,i as Nt,n as Pt,o as Ft,r as It,s as Lt,t as Rt}from"./vars.js";import{n as zt,r as Bt,t as Vt}from"./format.js";import{A as Ht,M as Ut,N as Wt,_ as Gt,c as Kt,d as qt,f as Jt,g as Yt,h as Xt,j as Zt,m as Qt,n as $t,u as en,v as tn}from"./provider-device-admission.js";import{F as nn,M as rn,N as an,P as on,_ as sn,c as cn,h as ln}from"./runtime.js";import{n as un,t as dn}from"./catalog.js";import{g as fn,i as pn}from"./observability.js";import{i as mn,n as hn,r as N}from"./success-text.js";import{o as gn,p as _n}from"./overlay.js";import{t as vn}from"./app-inventory.js";import{a as yn,r as bn,t as xn}from"./device.js";import{l as Sn,m as Cn}from"./exec.js";import{t as wn}from"./timeouts.js";import{n as Tn,r as En}from"./output-path.js";import"./command.js";import{t as P}from"./session-paths.js";import{o as Dn,s as On}from"./session-artifact-paths.js";import{a as kn}from"./version.js";import"./retry.js";import{t as An}from"./project-runtime.js";import{t as jn}from"./keyed-lock.js";import{r as Mn}from"./rect-center.js";import{t as Nn}from"./android-snapshot-quality.js";import{a as Pn,i as Fn,n as In,t as Ln}from"./replay-divergence.js";import{n as Rn,t as zn}from"./deploy-result-target.js";import{t as Bn}from"./keyboard-actions.js";import{a as Vn,i as Hn,n as Un,o as Wn,r as Gn}from"./request-cancel.js";import{t as Kn}from"./request.js";import{i as qn,s as Jn}from"./provider-session-ownership.js";import{$ as Yn,A as Xn,B as Zn,C as Qn,E as $n,F as er,G as tr,H as nr,I as rr,J as ir,K as ar,M as or,O as sr,Q as cr,R as lr,S as ur,U as dr,V as fr,W as pr,X as mr,Y as hr,Z as gr,_ as _r,_t as vr,b as yr,bt as br,c as xr,ct as Sr,d as Cr,et as wr,f as Tr,g as Er,gt as Dr,h as Or,it as F,k as kr,l as Ar,lt as jr,m as Mr,n as Nr,nt as Pr,p as Fr,q as Ir,r as Lr,rt as Rr,s as zr,st as Br,t as Vr,tt as Hr,u as Ur,v as Wr,w as Gr,x as Kr,y as qr,z as Jr}from"./device-claim-rule.js";import{g as Yr}from"./screenshot-runtime.js";import{A as I,F as Xr,P as Zr,_ as Qr,h as $r,l as ei,m as ti,o as ni,r as ri,t as ii,y as ai}from"./session-snapshot.js";import{c as oi,i as si,t as ci}from"./device-claim-inspection.js";import{t as li}from"./audio-probe-result.js";import{_ as ui,a as di,c as fi,f as pi,i as mi,l as hi,n as gi,o as _i,p as vi,r as yi,s as bi,t as xi,u as Si}from"./perf-runtime-plan.js";import{i as Ci,n as wi}from"./lease-context.js";import{n as Ti,r as Ei}from"./device-isolation.js";import{a as Di,i as Oi,n as ki,r as Ai}from"./device-inventory-context.js";import{t as ji}from"./touch-reference-frame.js";import"./screen-recording-admission-ledger.js";import{a as Mi,d as Ni,i as Pi,l as Fi,n as Ii,o as Li,s as Ri,u as zi}from"./session-routing.js";import{d as L}from"./src8.js";import{i as Bi,n as R,r as Vi}from"./compatibility-policy.js";import{i as Hi,o as Ui}from"./durable-capture-resource.js";import{a as Wi,c as Gi,d as Ki,i as qi,l as Ji,n as Yi,o as Xi,s as Zi,t as Qi,u as $i}from"./app-log-session-resource.js";import{n as z,t as ea}from"./runtime-admission.js";import{s as ta}from"./quality-warnings.js";import{t as na}from"./png-worker-client.js";import{a as ra,i as B,n as ia,r as aa,t as oa}from"./session-runtime-admission.js";import{a as sa}from"./ios-snapshot-engine.js";import{n as ca,r as la}from"./device-selection-resolver.js";import{n as ua,r as da}from"./doctor-output.js";import{t as fa}from"./record-runtime.js";import{n as pa}from"./gesture-runtime.js";import{i as ma,n as ha,r as ga}from"./platform-runtime-open-target.js";import{t as _a}from"./snapshot-runtime.js";import{createHash as va}from"node:crypto";import V,{promises as ya}from"node:fs";import ba from"node:os";import H from"node:path";import{fileURLToPath as xa}from"node:url";import{setTimeout as Sa}from"node:timers/promises";import Ca from"node:vm";function U(e,t){return L({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function wa(e){return L({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Ta(e,t){let n=Aa(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},wa(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:Ea(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Ea(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function Da(e,t,n,r){let i=Aa(await r.resolveTarget({selector:e,...t},U(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Rr(`Maestro target did not resolve to a visible element.`,{selector:e,candidateCount:i.candidateCount});return{kind:`selector`,selector:e,query:{selector:e,...t},...i,rect:i.rect}}function Oa(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function ka(e){if(!e||typeof e!=`object`)return!1;let t=e;return[`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`&&Number.isFinite(t[e]))}function Aa(e,t){return ja(e,t),Ma(e),Na(e),Pa(e),e}function ja(e,t){if(e.generation!==t)throw new a(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Ma(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new a(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Na(e){if(e.rect!==void 0&&!ka(e.rect)||e.viewport!==void 0&&!ka(e.viewport))throw new a(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Pa(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new a(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Fa(e,t,n,r,i,a={}){let o=Ia(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Va(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Ia(e,t,n,r,i){let a=n===`up`||n===`down`,o=dr(e,gr(e,r),i),s=o.visibility,c=wr({visibility:s,matches:e.nodes.filter(e=>ce(e)),platform:r}),l=Me(s.viewportRects)??Ra(c);if(!l||!Ae(l))return;let u=c.flatMap(e=>{if(!Ae(e.rect))return[];let t=za(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=La(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(Ba)[0]?.viewport}function La(e,t){return ce(e)?e:he(e,t)}function Ra(e){let t;for(let n of e)Ae(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function za(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width)-n,a=Math.min(e.y+e.height,t.y+t.height)-r;return i>0&&a>0?{x:n,y:r,width:i,height:a}:void 0}function Ba(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Va(e,t){let n=W(e,.5,.5),r=R.scrollUntilVisibleSwipe.nearEdgeFraction,i=R.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:W(e,.5,i)};case`down`:return{start:n,end:W(e,.5,r)};case`left`:return{start:n,end:W(e,i,.5)};case`right`:return{start:n,end:W(e,r,.5)}}}async function Ha(e,t,n){let r=F(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new a(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let i=e.start.space===`percent`?await n.resolveGestureViewport(U(t,t.command)):void 0;return{authored:e,gesture:Wa(await Ua(e.start,t,n,i),await Ua(e.end,t,n,i),r),...i?{viewport:i}:{}}}if(e.kind===`screen`){let i=await n.resolveGestureViewport(U(t,t.command)),{start:a,end:o}=Ga(i,e.direction,n.platform);return{authored:e,gesture:Wa(a,o,r),viewport:i}}let i=await Da(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?R.command.optionalTargetLookupTimeoutMs:R.command.targetLookupTimeoutMs},t,n),o=i.viewport??await n.resolveGestureViewport(U(t,t.command)),{start:s,end:c}=Ka(i,e.direction,o);return{authored:e,gesture:Wa(s,c,r),target:i,viewport:o}}async function Ua(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(U(t,t.command));return{x:i.x+Math.trunc(i.width*e.x/100),y:i.y+Math.trunc(i.height*e.y/100)}}function Wa(e,t,n){return{from:e,to:t,durationMs:n??R.command.swipeDurationMs}}function Ga(e,t,n){if(t===`left`||t===`right`){let n=rt(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=R.screenSwipe,i=W(e,r.centerFraction,r.nearEdgeFraction),a=W(e,r.centerFraction,r.farEdgeFraction),o=W(e,r.centerFraction,r.downStartFraction),s=W(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function W(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Ka(e,t,n){let r=Mn(e.rect),i=n.x+Math.trunc(n.width*R.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*R.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*R.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*R.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const qa={launchApp:Qa,stopApp:Qa,setPermissions:Qa,clearState:Qa,openLink:Qa,tapOn:to,doubleTapOn:to,longPressOn:to,swipe:oo,inputText:so,eraseText:so,scroll:co,scrollUntilVisible:co,hideKeyboard:co,pressKey:co,back:co,waitForAnimationToEnd:co,takeScreenshot:fo,runScript:fo,evalScript:mo,assertVisible:po,assertNotVisible:po,assertTrue:po,extendedWaitUntil:po},Ja={launchApp:!0,stopApp:!0,setPermissions:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ya(e){return Ja[e.kind]}async function Xa(e,t){let n=e.command;return await Za(n,e,t,U(e,n))}function Za(e,t,n,r){let i=qa[e.kind];return i(e,t,n,r)}async function Qa(e,t,n,r){switch(e.kind){case`launchApp`:return await G(n.launchApp,$a(e,t),r,`invalidate`);case`stopApp`:return await G(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`setPermissions`:return await G(n.setPermissions,{appId:e.appId??t.appId,permissions:eo(e.permissions)},r,`invalidate`);case`clearState`:return await G(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await G(n.openLink,{link:e.link},r,`invalidate`)}}function $a(e,t){return L({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?eo(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function eo(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function to(e,t,n,r){switch(e.kind){case`tapOn`:return await no(e,t,n,r);case`doubleTapOn`:{let i=await So(e.target,{purpose:`doubleTap`,timeoutMs:io(e)},t,n),a=F(e.delay,`doubleTapOn.delay`)??R.command.repeatDelayMs;return await G(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?Oa(i.resolution):void 0)}case`longPressOn`:{let i=await So(e.target,{purpose:`longPress`,timeoutMs:io(e)},t,n);return await G(n.longPressOn,{target:i},r,`invalidate`,i.resolution?Oa(i.resolution):void 0)}}}async function no(e,t,n,r){let i=await ro(e,t,n);return await G(n.tapOn,ao(e,i),r,`invalidate`,i.resolution?Oa(i.resolution):void 0)}async function ro(e,t,n){let r={purpose:`tap`,timeoutMs:io(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await So(e.target,r,t,n)}function io(e){return e.optional===!0?R.command.optionalTargetLookupTimeoutMs:R.command.targetLookupTimeoutMs}function ao(e,t){let n=F(e.repeat,`tapOn.repeat`),r=F(e.delay,`tapOn.delay`),i=n===void 0?r:r??R.command.repeatDelayMs;return L({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function oo(e,t,n,r){let i=await Ha(e.gesture,t,n);return await G(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?Oa(i.target):void 0)}async function so(e,t,n,r){switch(e.kind){case`inputText`:return await G(n.inputText,L({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await G(n.eraseText,L({charactersToErase:F(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function co(e,t,n,r){switch(e.kind){case`scroll`:return await G(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await G(n.scrollUntilVisible,lo(e),r,`invalidate`);case`hideKeyboard`:return await G(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await G(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await G(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await G(n.waitForAnimationToEnd,uo(e),r,`preserve`)}}function lo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:F(e.timeout,`scrollUntilVisible.timeout`)??R.command.scrollUntilVisibleTimeoutMs,durationMs:Bi(R.command.scrollUntilVisibleSpeed)}}function uo(e){return L({timeoutMs:F(e.timeout,`waitForAnimationToEnd.timeout`)})}async function fo(e,t,n,r){switch(e.kind){case`takeScreenshot`:return go(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await G(n.runScript,L({file:e.file,env:e.env}),r,`preserve`)}}async function po(e){throw new a(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function mo(e){throw new a(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function G(e,t,n,r,i){let a=ho(n,r);return go(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function ho(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function go(e,t,n,r){let i=e?.observation;return _o(i,r),{...vo(n??i),...yo(e?.outputEnv),...bo(t,e?.artifactPaths),...xo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function _o(e,t){if(!(!e||t===void 0||e.generation===t))throw new a(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function vo(e){return e?{observation:e}:{}}function yo(e){return e?{outputEnv:{...e}}:{}}function bo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function xo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function So(e,t,n,r){if(e.space===`target`){let i=await Da(e.selector,t,n,r);return{authored:e,point:Mn(i.rect),resolution:i}}return{authored:e,point:await Ua(e,n,r)}}function Co(e,t,n,r={}){let i=n===`ios`&&r.presentation?To(r.presentation):void 0,a=i?Eo(e,t,i):tr(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Ao(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?ir(s,t.selector.index):Ir(s,t.selector.index)?.node,l=Ao(t,o,s,c);if(!c)return Do(t,o,s,l);let u=i?Ir(i.visibleForSource(c),void 0):null,d=hr(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!wo(t.selector)&&i?Oo(d,s,u):0,evidence:l}:Do(t,o,s,l)}const wo=Yn;function To(e){let t=ie(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>Hr(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function Eo(e,t,n){let r=gr(e,`ios`),i=cr(e,{},{orderUnindexed:e=>mr(e,r)}),a=pr(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:ar(o,t.selector,`ios`,i.visibility,r)}}function Do(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function Oo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&ko(n.rect,e)?1:0:t.length}function ko(e,t){let n=Mn(e),r=Mn(t);return n.x===r.x&&n.y===r.y}function Ao(e,t,n,r){return L({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const K={settleTimeoutMs:Vi,retryTapMaxAttempts:R.command.retryTapMaxAttempts,longPressDurationMs:R.command.longPressDurationMs,eraseTextMaxCharacters:R.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:R.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:R.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:R.command.waitForAnimationToEndDifferencePercent,observationPollMs:R.observation.pollIntervalMs};function jo(e,t={}){return{execute:async n=>{let r=U(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ya(n.command)&&!i,visualStabilityBarrier:i});let a=await Xa(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Ta(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Mo(e){throw new a(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function No(e){let t=e.meta?.installSource;if(!t)throw new a(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new a(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new a(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new a(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Mo(t)}}function Po(e){let t=No(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Jn(n,e.meta?.tenantId)},cleanup:()=>{qn(n)}}}function q(e,t,n){return t||Sr(n)?null:d(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`,s())}function Fo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function J(e){return jr(e.flags)||!e.session?await yt(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Io(e.session.device)}async function Io(e){if($t(e)||!A(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await $r.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await yt(t)}catch(e){if(!(e instanceof a)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await yt({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Lo(e,t){return t?Fi(t,e).length===0:!1}async function Ro(e){let{req:t,sessionName:n,sessionStore:i}=e,a=i.lookup(n),o=a?.session,s,c,l;try{s=Po(t);let r=Ho(t),u=await Bo(o,t.flags),d=await aa(e.inspectFacts)(u),f=B(`install_from_source`,d.operations.ensureReady)??B(`install_from_source`,d.operations.materializeAppSource)??B(`install_from_source`,d.operations.deployMaterializedApp);if(f)return f;let p=await ia(e.bindDevice)(u,je);await p.operations.ensureReady({}),c=await p.operations.materializeAppSource({source:s.source}),l=await Uo({artifact:c,retention:r,req:t,session:o,sessionName:n}),a&&I(i.requireCurrent(a));let m=await p.operations.deployMaterializedApp({artifact:c}),h=Wo(u,c,m,l),g=mn(h,`Installed: ${Rn(h)}`);return M(i,a,t,`install_source`,g,{positionals:[]}),{ok:!0,data:g}}catch(e){return l&&await sr(l.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:r(e)}}finally{await c?.cleanup(),s?.cleanup()}}async function zo(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new a(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await sr(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:r(e)}}}async function Bo(e,t){let n=Vo(t?.platform);if(e&&n&&!E(e.device,n))throw new a(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${j(e.device)}`);if(!e&&!n)throw new a(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await J({session:e,flags:t})}function Vo(e){return e===`ios`||e===`android`?e:void 0}function Ho(e){let t=e.meta?.retainMaterializedPaths===!0,n=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(n!==void 0&&n<=0)throw new a(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...n===void 0?{}:{ttlMs:n}}}async function Uo(e){if(e.retention.enabled)return await Xn({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Wo(e,t,n,r){return A(e)?Go(t,n,r):Ko(t,n,r)}function Go(e,t,n){let r=t.bundleId??e.bundleId;if(!r)throw new a(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Jo(n),bundleId:r,...qo(t,e),launchTarget:t.launchTarget??r}}function Ko(e,t,n){let r=t.packageName??t.launchTarget??e.packageName;if(!r)throw new a(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Jo(n),packageName:r,...qo(t,e),launchTarget:t.launchTarget??r}}function qo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Jo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Yo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Xo(t);if(!a.ok)return a.response;let o=q(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await J({session:n,flags:t.flags}),c=await z({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:Se});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return d(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:d(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Xo(e){let t=Zo(e);if(!t.ok)return t;let n=Qo(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Zo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:d(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:d(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Qo(e){let t=$o(e.flags?.devicePort),n=$o(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:d(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function $o(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function es(e){return await z({...e,command:`runtime clear`,use:ye})}async function ts(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Yo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await ns({...e,session:r.get(n)});if(!rs(i))return d(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.lookup(n),o=a?.session,s=r.getRuntimeHints(n);return i===`clear`?await is({sessionName:n,sessionStore:r,ref:a,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?as(n,s):ss({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function ns(e){if(!e.session)return d(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await pa({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Qr(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function rs(e){return e===`set`||e===`show`||e===`clear`}async function is(e){let{sessionName:t,sessionStore:n,ref:r,current:i,inspectFacts:a,bindDevice:o}=e,s=r?n.requireCurrent(r):void 0;if(Ur(i)&&s?.appBundleId){let e=await es({device:s.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;let t=n.requireCurrent(r);I(t),await e.runtime.operations.clearRuntimeHints({appId:t.appBundleId,values:Mr(i)})}let c=r?n.clearRuntimeHints(r):!!i;return r||n.setRuntimeHints(t,void 0),{ok:!0,data:{session:t,cleared:c}}}function as(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function os(e){return e?j(e.device):void 0}function ss(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=os(i),s=_r(t.flags?.platform??a?.platform??o);if(!s)return d(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(o!==void 0&&o!==s)return d(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Tr(a,xr(t.flags,s));return Ar(c)===0?d(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const cs=/^[A-Za-z0-9_.:-]{1,64}$/,ls=8192,us=4096;function ds(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new a(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!cs.test(t))throw new a(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new a(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:ps(n,t)}}function fs(e,t,n){let r=j(e),i=ms(e);if(!i)throw new a(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${r}.`,{hint:`Set AGENT_DEVICE_${r.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):``,s=i.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(r));if(s.length>us)throw new a(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:us});return s}function ps(e,t){if(e)try{let n=JSON.parse(e);if(!n||typeof n!=`object`||Array.isArray(n))throw new a(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let r=JSON.stringify(n);if(Buffer.byteLength(r,`utf8`)>ls)throw new a(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${ls} bytes`);return n}catch(t){throw t instanceof a?t:new a(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function ms(e){return((A(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:k(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function hs(e,t,n,r){let{eventName:i,payload:a}=ds([...r]),o=fs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ti(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...N(`Triggered app event: ${i}`)}}async function gs(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await z({command:`trigger-app-event`,device:t,use:He,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>hs(s,t,e,n)}}function _s(e){let t=(e[0]??`status`).toLowerCase();if(!Bn(t))throw new a(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new a(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return vs(t)}function vs(e){return e===`get`?`status`:e===`return`?`enter`:e}const ys={"ime-probe":`android`},bs={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},xs={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function Ss(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ti(e)}}async function Cs(e,t){let n=await z(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ws(e,t){return e.operations.keyboardStatus(Ss(t)).then(e=>({platform:ys[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function Ts(e,t){let n=await e.operations.keyboardDismiss(Ss(t)),r=bs[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...N(Os(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...N(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function Es(e,t){let n=await e.operations.keyboardEnter(Ss(t)),r=xs[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...N(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...N(`Keyboard enter pressed`)}}async function Ds(e){let t=_s(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await Cs({command:`keyboard status`,device:n,use:be,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ws(e,t)):t===`dismiss`?await Cs({command:`keyboard dismiss`,device:n,use:re,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>Ts(e,t)):await Cs({command:`keyboard enter`,device:n,use:$e,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>Es(e,t))}function Os(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ks(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,updateSession:s,prepare:c}=e,l=r.lookup(n),u=l?.session,d=t.flags??{},f=q(i,u,d);if(f)return f;let p=await J({session:u,flags:d});l&&r.requireCurrent(l);let m=await c(p,l);if(!m.ok)return m.response;let h=l?r.requireCurrent(l):void 0;h&&Yr(t)===`may-invalidate`&&I(h);let g=await m.execute();return l&&(s&&await s(l,g),M(r,l,t,i,g??{},{positionals:o??a})),{ok:!0,data:g??{}}}function As(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return d(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function js(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ks({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.updateSession?{updateSession:e.updateSession}:{},prepare:async(n,c)=>{let l=await e.resolveRuntime({device:n,positionals:s,readiness:!0,inspectFacts:a,bindDevice:o});if(!l.ok)return{ok:!1,response:l.response};let u=c?i.requireCurrent(c):void 0,d={...Qr(r,t.flags,u?.appBundleId,u?.trace?.outPath),surface:u?.surface};return{ok:!0,execute:()=>l.execute(d)}}})}async function Ms(e){return As(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await js({...e,command:un.keyboard,resolveRuntime:e=>Ds(e)})}async function Ns(e){return await js({...e,command:un.triggerAppEvent,resolveRuntime:e=>gs(e),updateSession:async(t,n)=>{let r=typeof n?.eventUrl==`string`?n.eventUrl:void 0;if(!r)return;let i=e.sessionStore.requireCurrent(t),a=await ga(i.device,r,i.appBundleId);a!==void 0&&e.sessionStore.update(t,{appBundleId:a})}})}function Ps(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Fs(e,t){let n=t?.subject??`Payload`,r=e.trim();if(!r)throw new a(`INVALID_ARGS`,`${n} cannot be empty`);let i=t?.expandPath?t.expandPath(r,t.cwd):r;try{if(!V.statSync(i).isFile())throw new a(`INVALID_ARGS`,`${n} path is not a file: ${i}`);return{kind:`file`,path:i}}catch(e){if(e instanceof a)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new a(`INVALID_ARGS`,`${n} file is not readable: ${i}`);if(t&&t!==`ENOENT`)throw new a(`COMMAND_FAILED`,`Unable to read ${n} file: ${i}`,{cause:String(e)})}if(Ps(r))return{kind:`inline`,text:r};throw new a(`INVALID_ARGS`,`${n} file not found: ${i}`)}async function Is(e){let t=Fs(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ls(t.path);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof a?t:new a(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ls(e){try{return await ya.readFile(e,`utf8`)}catch(t){let n=t.code;throw n===`ENOENT`?new a(`INVALID_ARGS`,`Push payload file not found: ${e}`):n===`EISDIR`?new a(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):n===`EACCES`||n===`EPERM`?new a(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new a(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Rs(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.lookup(r),o=a?.session,s=t.flags??{},c=q(n,o,s);if(c)return c;let l=Ws(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let r=u?Jn(u,t.meta?.tenantId):P(l.appPathInput);if(!V.existsSync(r))return d(`INVALID_ARGS`,`App binary not found: ${r}`);let c=await J({session:o,flags:s}),f=await aa(e.inspectFacts)(c),p=B(n,f.operations.deployApp);if(p)return p;let m=await ia(e.bindDevice)(c,De);a&&I(i.requireCurrent(a));let h=await m.operations.deployApp({app:l.app,appPath:r,replaceExisting:n===`reinstall`}),g=Bs(c,l.app,r,h),_=mn(g,`Installed: ${g.appName??zn(g)}`);return Us(i,a,g),M(i,a,t,n,_),{ok:!0,data:_}}finally{u&&qn(u)}}async function zs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),a=i?.session,o=t.flags??{},s=q(`push`,a,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return d(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await Is(Gs(l,t.meta?.cwd)),f=await J({session:a,flags:o}),p=await aa(e.inspectFacts)(f),m=B(`push`,p.operations.ensureReady)??B(`push`,p.operations.sendPushNotification);if(m)return m;let h=await ia(e.bindDevice)(f,ve);await h.operations.ensureReady({}),i&&I(r.requireCurrent(i));let g=await h.operations.sendPushNotification({appId:c,payload:u}),_=A(f)?mn({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):mn({platform:j(f),package:c,action:g.action,extrasCount:g.extrasCount},`Pushed notification to ${c}`);return M(r,i,t,`push`,_,{positionals:[c,l]}),{ok:!0,data:_}}function Bs(e,t,n,r){return A(e)?Vs(t,n,r):Hs(e,t,n,r)}function Vs(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Hs(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function Us(e,t,n){!t||n.platform!==`harmonyos`||!n.appId||e.update(t,{appBundleId:n.appId,appName:n.appName??n.app})}function Ws(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:d(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:d(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Gs(e,t){let n=Fs(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>P(e,t)});return n.kind===`file`?n.path:n.text}async function Ks(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Rs({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Ro({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await zs({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function qs(e,t,n){return await g(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Js=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Ys(e){return Js.has(e)}const Xs=new Map(Be.map(e=>[e.name,e]));function Zs(e){let t=new Set;for(let n of e){let e=Qs(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Qs(e){let t=Xs.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(Ys)?n:void 0}function $s(e){if(e!==void 0&&e.remainingSteps.length!==0)return Zs(e.remainingSteps)}function ec(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:Ci(e),plannedOperations:$s(e.internal?.executionPlan)}}function tc(e,t,n){let r=e.requireCurrent(t);e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:r.name,...N(`Closed: ${r.name}`)}})}function nc(e,t,n){let r=e.requireCurrent(t);if(!ht(r))return{kind:`not-armed`};let i=r.actions.length;tc(e,t,n);let a=Qt(r),o=e.writeSessionLog(t,{force:qt(r,n.flags?.force)});return o.written?{kind:`committed`,path:o.path}:o.error?(r.actions.length=i,{kind:`failed`,error:o.error}):a?{kind:`committed`}:(bt(r),{kind:`aborted`})}function rc(e,t){let n=r(t),i=Zt(e.scriptPublication??tn);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function ic(e){let{req:t,ref:n,sessionStore:r,platformCloseError:i}=e,a=r.requireCurrent(n);i||tc(r,n,t);try{let e=r.writeSessionLog(n,{force:qt(a,t.flags?.force)});e.written&&Yt(a,e.path);return}catch(e){return ac(e)}}function ac(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof a?new a(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new a(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${r(e).message}`,t)}async function oc(e){let t=e.clearRuntimeHints?ne:nt,n=await ea({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,nt)};let r=await n.bind(e.device,ne);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function sc(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a,clearRuntimeHints:o,cleanupFailures:s,repairArmed:c,dispatchTargetedPlatformClose:l,finalizeOrdinaryCloseScript:u}=e,{address:d}=n,f=i.requireCurrent(n),p=async(e,t)=>{try{return await t()}catch(t){s.push({step:e,error:t});return}},m=e.platformResourceCleanup.retainExecutionHostAfterClose({device:f.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!f.screenRecording,hasLease:!!f.lease}),h=i.getRuntimeHints(d);await cc(n,i,p,e.platformResourceCleanup),f=i.requireCurrent(n);let g=c?void 0:await l({req:t,session:f,logPath:r,lifecycle:a});o&&f.appBundleId&&Ur(h)&&await p(`runtime_hints`,async()=>{await o({appId:f.appBundleId,values:Mr(h)})});let _=await p(`application_lifecycle`,async()=>await a.operations.finalizeApplicationClose({appBundleId:f.appBundleId,surface:f.surface??`app`,retainRunner:m,stateDir:i.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),v=c?void 0:u({req:t,ref:n,sessionStore:i,platformCloseError:g});return await p(`materialized_paths`,()=>kr(d)),{platformCloseError:g,saveScriptError:v,shutdownResult:_?.shutdown}}async function cc(e,t,n,r){let i=t.resolveCurrent(e)??e.session;await n(`recording`,()=>yr({ref:e,sessionStore:t})),await n(`app_log`,()=>ur({ref:e,sessionStore:t})),await n(`audio_probe`,()=>qr({ref:e,sessionStore:t})),await n(`perf_capture`,()=>Qn({ref:e,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Gr(i,r))}function lc(e,t){return Kr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function uc(e){if(e instanceof a)return e;let t=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const dc=(e,t)=>(e.positionals?.length??0)>0||$n(t);async function fc(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=i.requireCurrent(n),s=ht(o),c=JSON.stringify(t.positionals??[]);if(s&&!gt(o,c)){let e=await mc({req:t,session:o,logPath:r,lifecycle:a});if(e)return{response:rc(o,uc(e))};Tt(i.requireCurrent(n),c)}let l=nc(i,n,t);return l.kind===`failed`?{response:rc(o,l.error)}:{repairArmed:s,...l.kind===`committed`&&l.path?{healedScriptPath:l.path}:{},...l.kind===`aborted`?{aborted:!0}:{}}}async function pc(e){try{return{providerData:await Dr(e)}}catch(t){let n=r(t);return{response:{ok:!1,error:{...n,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...n.details,session:e.session.name},retriable:!0}}}}}async function mc(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(dc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:ec(t,r,n.trace?.outPath)});return}catch(e){return e}}function hc(e,t){if(!e.flags?.saveScript||Jt(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new a(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new a(`INVALID_ARGS`,`close --save-script cannot ${n.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function gc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=i.lookup(n);if(!c)return await bc({req:t,logPath:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});let l=i.requireCurrent(c);hc(t,l);let u=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!u)return d(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let f=e.platformResourceCleanup,p=await oc({device:l.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!l.appBundleId&&Ur(i.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(p.type===`response`)return p.response;if(l=i.requireCurrent(c),I(l),t.internal?.closeAppOnly===!0&&u)return await yc({req:t,session:l,logPath:r,lifecycle:p.runtime,app:u});let m=await fc({req:t,ref:c,logPath:r,sessionStore:i,lifecycle:p.runtime});if(`response`in m)return m.response;let h=await _c({req:t,ref:c,logPath:r,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:p.runtime,clearRuntimeHints:p.clearRuntimeHints,repairArmed:m.repairArmed,platformResourceCleanup:f});return h.kind===`response`?h.response:vc({session:l,repair:m,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:h.shutdownResult,providerData:h.providerData})}async function _c(e){let{req:t,ref:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,lifecycle:s,clearRuntimeHints:c}=e,{address:l}=n,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await sc({req:t,ref:n,logPath:r,sessionStore:i,lifecycle:s,clearRuntimeHints:c,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:mc,finalizeOrdinaryCloseScript:ic,platformResourceCleanup:e.platformResourceCleanup}),m=i.requireCurrent(n),h=await pc({session:m,leaseRegistry:a,leaseLifecycleProvider:o});if(h.response)return{kind:`response`,response:h.response};m=i.resolveCurrent(n)??m;let g=lc(l,u),_=d??g;if(_?m.deviceClaim&&w({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:m.deviceClaim.deviceKey,session:l}}):await pi(m.deviceClaim),i.retire(n),_)throw _;if(f)throw f;return{kind:`closed`,providerData:h.providerData,shutdownResult:p}}function vc(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:mn({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...N(c),...o,...s}}}async function yc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await mc({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...N(`Closed: ${a}`)}}}async function bc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return d(`SESSION_NOT_FOUND`,`No active session`);let a=await oc({device:await J({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:ec(t,n)}),{ok:!0,data:{app:t.positionals[0],...N(`Closed: ${t.positionals[0]}`)}})}function xc(e,t){return e.operations.ensureReady(t)}function Sc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function Cc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return wc(t,r);case`devices`:return await Ec(t);case`capabilities`:return await Pc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Bc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function wc(e,t){let n=Mi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Li(e.session,n)).map(e=>Tc(e,t))}}}function Tc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:On(r),platform:j(t.device),...D(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...D(t.device.platform)&&!k(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function Ec(e){try{let t=Dc();return{ok:!0,data:{devices:(await kc(e)).map(e=>({...qc(e),...Oc(e,t)}))}}}catch(e){let n=t(e);return{ok:!1,error:{code:n.code,message:n.message,...n.details?{details:n.details}:{}}}}}function Dc(){let e=new Map;for(let t of si({})){let n=t.claim;!n||ci(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function Oc(e,t){let n=t.get(oi(vi(e)));return n?{claimedBy:n}:{}}async function kc(e){let t=e.flags?.platform;return Nc(await ki(Ac(e,t)),e.flags?.platform,e.flags?.target)}function Ac(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:jc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Mc(n?.androidDeviceAllowlist)}}function jc(e,t,n){return T({simulatorSetPath:Ei(e),platform:t,target:n})}function Mc(e){let t=Ti(e);return t?Array.from(t).sort():void 0}function Nc(e,t,n){let r=t?e.filter(e=>Jc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Pc(e){let t=await Kc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Fc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Uc(n,e.inspectFacts);return{ok:!0,data:{device:qc(n),availableCommands:et().filter(e=>e===`appstate`&&r?!0:Rc(e,i))}}}function Fc(e,t,n){return!t||!A(e)&&!k(e)||!Lo(n,t)?!1:Ic(t)||Lc(e,t)}function Ic(e){return!!(e.appName||e.appBundleId)}function Lc(e,t){return!!(k(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Rc(e,t){let n=Ke(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>zc(t,e)))}function zc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Bc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Vc(t,e.providerAppCatalog);if(o)return o;let s=await Kc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=vn(t.flags?.appsFilter),u=Ti(t.flags?.androidDeviceAllowlist),d=await Wc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Gc(await Sc(f,await xc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Vc(e,t){let n=Hc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,Gn(e.meta?.requestId))]}}}function Hc(e){let t=wi(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Uc(e,t){if(t)try{return await t(e)}catch{return}}async function Wc(e){if(!e.inspectFacts)throw new a(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(n&&!n.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}};if(!e.bindDevice)throw new a(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Ze)}}function Gc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Kc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=q(t.command,a,o);return s?{response:s}:{device:await J({session:a,flags:o,androidAvdSelection:i})}}function qc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:j({platform:r.platform,appleOs:n}),...D(r.platform)&&n?{appleOs:n}:{}}}function Jc(e,t){return E(e,t)}function Yc(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function Xc(e){return d(`INVALID_ARGS`,e)}function Zc(e,t,n,r){try{return ha({device:e,surfaceFlag:t,openTarget:n,existingSurface:r})}catch(e){return d(e instanceof a?e.code:`INVALID_ARGS`,String(e.message))}}async function Qc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await ma({target:n,platform:i.platform,surface:r});return a?Xc(a):null}async function $c(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await ma({target:n,platform:r});return i?Xc(i):null}function el(e){let t=Wr(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:Ur(n),clearRemovedRuntimeHints:Er({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function tl(e){let{req:t,logPath:n,surface:r,openTarget:i,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:i,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:r,prewarmRunnerOnColdBoot:r===`app`&&!!i&&!h(i??``),execution:{startupDeadlineAtMs:rl(t),requestId:t.meta?.requestId,logPath:n,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ci(t)}});let{appBundleId:d,appName:f}=await nl({runtime:s,surface:r,openTarget:i,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new a(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Cr({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:f,runtime:c.runtime}}}async function nl(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function rl(e){return Yc(e.flags?.timeoutMs)}async function il(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:d(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:d(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:d(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function al(e){let{req:t,ref:n,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let r=await _a({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n.address,sessionRef:n,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?{ok:!0,data:{...o.data,snapshot:r.data}}:ol(o.data,r.error)}catch(e){return ol(o.data,r(e))}}function ol(e,t){return{ok:!0,data:{...e,warnings:[...hn(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function sl(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h,launchConfirmation:g}=e,_={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...cl(h)};return o&&(_.appName=o),s&&(_.appBundleId=s),l&&(_.startup=l),u&&(_.timing=u),g&&(_.launchConfirmation=g),f&&p(f)>0&&(_.runtime=f),d&&(_.platform=j(d),_.target=d.target??`mobile`,_.device=d.name,_.id=d.id,_.kind=d.kind,ee(d.platform)&&(_.serial=d.id)),d&&A(d)&&(_.device_udid=d.id,_.ios_simulator_device_set=d.simulatorSetPath??null),{..._,...N(`Opened: ${o??s??t}`)}}function cl(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function Y(e,t,n){n?(e.assertAdmissionOpen(n.address),e.requireCurrent(n)):e.assertPublishable(t)}function ll(e){let{req:t,sessionStore:n,sessionName:r,existingRef:i,device:a,surface:o,appBundleId:s,appName:c,deviceClaim:l}=e;if(Y(n,r,i),i){let e=n.update(i,{device:a,surface:o,appBundleId:s,appName:c});return e.lease=vr({req:t,existingLease:e.lease}),l&&(e.deviceClaim=l),ii(e),n.refresh(i)}return n.publish(r,{name:Pi(t),sessionScope:t.internal?.resolvedSessionScope??Mi(t),device:a,surface:o,appBundleId:s,appName:c,createdAt:Date.now(),actions:[],lease:vr({req:t}),deviceClaim:l})}const ul=Object.freeze({async observeBootTimeMs(e){if(A(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function dl(e,t){e.warnings=[...hn(e),t]}function fl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){en(t,{});return}Jt(n)&&(Kt(t),dl(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function pl(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function ml(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function hl(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function gl(e,t){if(!t)return;let n=await ui(t);if(n.status!==`renewed`)return n.conflict?Lr(e,n.conflict):d(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function _l(e){let{req:t,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:u,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingRef:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e;Y(i,r,g);let b=g?i.requireCurrent(g):void 0,x=b?.snapshot,C=t.flags?.relaunch===!0,T=f,E=Date.now(),D=await vl({req:t,sessionName:r,sessionStore:i,device:o,surface:u,sessionAppBundleId:T,appName:l,existingRef:g});if(D.type===`response`)return D;let O=D.ref;Y(i,r,O);let k=O?i.requireCurrent(O):void 0,A=Date.now(),ee=await m.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:T,surface:u,hasExistingSession:b!==void 0,relaunch:C,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:ml(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Mr(p),applyRuntimeHints:h,execution:ec(t,a,k?.trace?.outPath)});T=ee.appBundleId??T;let j={...ee.timing},te=ca(y),ne=s?hl(A,s,T):void 0;if(Hn(t.meta?.requestId)){let e=n();return{type:`response`,response:d(e.code,e.message,e.details)}}Y(i,r,O),g&&ai({session:i.requireCurrent(g),command:`open`,positionals:[],flags:void 0,androidFreshnessBaseline:x});let re=i.ensureSessionDir(r),ie=Dn(re,t.meta?.requestId??S().requestId);j.totalDurationMs=Math.max(0,Date.now()-E),w({level:`info`,phase:`open_timing`,durationMs:j.totalDurationMs,data:j});let ae=sl({sessionName:k?.name??Pi(t),sessionStateDir:re,runnerLogPath:On(re),requestLogPath:ie,eventLogPath:i.resolveEventLogPath(r),appName:l,appBundleId:T,surface:u,startup:ne,timing:j,device:o,runtime:p,runtimeHintCount:Ar,sessionReused:b!==void 0,selection:te,launchConfirmation:ee.launchConfirmation});v&&dl(ae,pl(v));let oe=ll({req:t,sessionStore:i,sessionName:r,existingRef:O,device:o,surface:u,appBundleId:T,appName:l,deviceClaim:_}),se=i.requireCurrent(oe);return t.runtime!==void 0&&Or(i,r,p),fl({session:se,existingSession:g?se:void 0,saveScriptRequested:!!t.flags?.saveScript,responseData:ae}),i.recordAction(oe,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:ae}),{type:`opened`,ref:oe,response:{ok:!0,data:ae}}}async function vl(e){let{req:t,sessionName:n,sessionStore:r,existingRef:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,ref:i};let o=ll({req:t,sessionName:n,sessionStore:r,existingRef:i,device:e.device,surface:e.surface,appBundleId:e.sessionAppBundleId,appName:e.appName}),s=await a();return s&&!s.ok?{type:`response`,response:s}:(Y(r,n,o),{type:`session`,ref:r.refresh(o)})}function yl(e){return e.internal?.admittedLease?.backend===`macos-app`}function bl(e){let{req:t,device:n,sessionStore:r}=e,i=yl(t)?r.listRefs().find(e=>e.session.device.id===n.id&&e.session.lease?.leaseBackend!==`macos-app`):r.findByDevice(n.id);if(!i)return;let a=or(t);return Ii(t,i.session)?Ni(i,n,a):zi(i,n,a)}async function xl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Vr(r,t.internal?.admittedLease)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Nr(n,r,zr({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Si({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:ul})}}async function Sl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e;Y(i,n,void 0);let m=bl({req:t,device:a,sessionStore:i});if(m)return{type:`response`,response:m};let h=await xl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return{type:`response`,response:Lr(a,h.conflict)};if(h.status===`refused`)return{type:`response`,response:h.response};let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await Cl({ownership:g,effects:v,sessionName:n,sessionStore:i});try{Y(i,n,void 0);let e=await tl({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),{type:`response`,response:e.response};let f=await gl(a,g);if(f)return{type:`response`,response:f};v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await _l({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.response.ok||await y(),b}catch(e){throw await y(),e}}async function Cl(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pi(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await hi(t);w({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const wl=new Map;async function Tl(e){let t=Oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await ea({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,we)};case`open-apply-runtime-hints`:{let t=await r(e.device,de);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,Je);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function El(e){let t=el(e);if(t.type===`response`)return t;let n=await Tl({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function Dl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.lookup(t),a=await il({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return{type:`response`,response:a.response};let o=a.type===`resolved`?a.req:e.req;if(Y(r,t,i),i){let a=r.requireCurrent(i);if(o.flags?.saveScript)return{type:`response`,response:d(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`)};let s=o.flags?.relaunch===!0,c=o.positionals?.[0],l=c??(s?a.appName:void 0),u=Zc(a.device,o.flags?.surface,l,a.surface);if(typeof u!=`string`)return{type:`response`,response:u};if(!l&&u===`app`)return{type:`response`,response:Xc(s?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`)};let f=await Qc({shouldRelaunch:s,openTarget:l,surface:u,device:a.device});if(f)return{type:`response`,response:f};let p=r.requireCurrent(i),m=await gl(p.device,p.deviceClaim);if(m)return{type:`response`,response:m};let h=await Io(a.device),g=la(h);await o.internal?.retainDeviceExecutionLock?.(h.id);let _=await El({req:o,sessionStore:r,sessionName:t,device:h,existingSession:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(_.type===`response`)return{type:`response`,response:_.response};let{admission:v,runtimeHintPlan:y}=_;Y(r,t,i);let b=r.requireCurrent(i);I(b);let x=await tl({req:o,logPath:n,surface:u,openTarget:l,existingSession:b,runtime:v.runtime,runtimeHintPlan:y,clearRuntimeHints:v.clearRuntimeHints,foreground:!1});if(x.type===`response`)return{type:`response`,response:x.response};Y(r,t,i);let S=await gl(h,r.requireCurrent(i).deviceClaim);return S?{type:`response`,response:S}:await _l({req:o,sessionName:t,sessionStore:r,logPath:n,device:h,openTarget:l,openPositionals:c?o.positionals??[]:l?[l]:[],appBundleId:x.details.appBundleId,appName:x.details.appName,runtimeHints:x.details.runtime,lifecycle:v.runtime,applyRuntimeHints:v.applyRuntimeHints,surface:u,existingRef:i,selection:g})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return{type:`response`,response:Xc(`open --relaunch requires an app argument.`)};let l=await $c({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return{type:`response`,response:l};let u=await xt(o.flags??{},Br(c)),f=u.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=Zc(f,o.flags?.surface,c);if(typeof p!=`string`)return{type:`response`,response:p};let m=await Qc({shouldRelaunch:s,openTarget:c,surface:p,device:f});if(m)return{type:`response`,response:m};let h=await El({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return{type:`response`,response:h.response};let{admission:g,runtimeHintPlan:_}=h;return await jn(wl,f.id,async()=>await Sl({req:o,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:c,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:u}))}async function Ol(e){let t=await Dl(e),n=t.response;return t.type!==`opened`||e.req.flags?.foreground!==!0?n:await al({...e,inspectFacts:aa(e.inspectFacts),bindDevice:ia(e.bindDevice),openResponse:n,ref:t.ref})}const kl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Al=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function jl(e){return t=>d(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function Ml(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function Nl(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Pl(e){return e.available?null:d(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Fl(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Il(e,n){if(!n.appBundleId)return;let r=await z({command:`appstate`,device:n.device,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(r.type!==`response`)try{return(await r.runtime.operations.appState({appBundleId:n.appBundleId})).applicationState}catch(e){if(i(e))throw e;w({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:t(e).code,message:t(e).message}});return}}async function Ll(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Fo(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return d(`SESSION_NOT_FOUND`,e)}let s=q(`appstate`,i,a);if(s)return s;let c=D(i?.device.platform)&&Lo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return d(`SESSION_NOT_FOUND`,kl);if(u&&!c)return d(`SESSION_NOT_FOUND`,Al);if(c&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(k(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:j(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=k(i.device)?`macOS`:`iOS`;return d(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await Il(e,i);return{ok:!0,data:{platform:j(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...A(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let f=await J({session:i,flags:a});if(A(f))return d(`SESSION_NOT_FOUND`,kl);if(k(f))return d(`SESSION_NOT_FOUND`,Al);let p=await z({command:`appstate`,device:f,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>d(`UNSUPPORTED_OPERATION`,f.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(p.type===`response`)return p.response;let m=p.runtime;await m.operations.ensureReady({serial:a.serial,androidSerialAllowlist:zl(a.androidDeviceAllowlist)});let h=await m.operations.appState();return{ok:!0,data:{platform:j(f),package:h.package,activity:h.activity}}}async function Rl(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command===`boot`){let a=i.get(r),o=n.flags??{},s=q(n.command,a,o);if(s)return s;let c=Ti(o.androidDeviceAllowlist),l=c?[...c].sort():void 0,u=_e({headless:o.headless===!0}),f;try{f=await J({session:a,flags:o,androidAvdSelection:`include-stopped`})}catch(e){let n=t(e);if(u.kind===`boot-target-headless`&&!Fl(o.device,a?.device)&&n.code===`DEVICE_NOT_FOUND`)return d(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(o.target&&(f.target??`mobile`)!==o.target)return d(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${o.target}.`);let p=await ea({command:`boot`,device:f,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:jl(u.kind===`boot-target-headless`)});if(p.type===`response`)return p.response;let m={serial:o.serial,androidSerialAllowlist:l,deadlineAtMs:Yc(o.timeoutMs)};return f=u.kind===`boot-target-headless`?await(await p.bind(f,u.use)).operations.bootTargetHeadless(m):await(await p.bind(f,u.use)).operations.bootTarget(m),{ok:!0,data:{platform:j(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...D(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}}}if(n.command===`shutdown`){let t=i.get(r),a=n.flags??{},o=q(n.command,t,a);if(o)return o;let s=await J({flags:a,session:t,androidAvdSelection:`include-stopped`}),c=Pl((await Ml(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(t&&t.device.platform===s.platform&&t.device.id===s.id)return d(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${r}`,session:r,platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await Nl(e.bindDevice)(s,Ee)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...D(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:d(l.error?.code??`COMMAND_FAILED`,Bl(l),{platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return n.command===`appstate`?await Ll({req:n,sessionName:r,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function zl(e){let t=Ti(e);return t?[...t].sort():void 0}function Bl(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Vl(e){return Yi.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Hl(e){try{return await Ul(e)}catch(e){return{ok:!1,error:r(e)}}}async function Ul(e){let t=Wl(e);if(!t.ok)return t;let n=t.ref,r=e.sessionStore.requireCurrent(n),i=ge(e.req.positionals),a=await e.inspectFacts(r.device),o=a.operations.audioProbeStart,s=a.operations.audioProbeQuery,c=o.available?`capture`:s.available?`query`:void 0;if(c===void 0)return Gl(o,s);let l=oe({probeAction:i.probeAction,mode:c});switch(l.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(r.device,l.use)).operations.audioProbeQuery({action:l.action,durationMs:i.durationMs,bucketMs:i.bucketMs})};case`capture-start`:return await Kl(e,n,i,l.use);case`capture-status`:return await ql(e,n);case`capture-stop`:return await Jl(e,n)}}function Wl(e){let t=e.sessionStore.lookup(e.sessionName);return t?{ok:!0,ref:t}:d(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Gl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return d(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Kl(e,t,n,r){let i=e.sessionStore.requireCurrent(t),a=Hi(e.sessionStore,t);i.audioProbe&&(await fi({intent:`disposal`,binding:a}),i=e.sessionStore.requireCurrent(t));let o=await e.bindDevice(i.device,r),s=bi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=bi.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:s,device:i.device}),l=H.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`);a.assertAdoptable();let u=await o.operations.audioProbeStart({sessionId:e.sessionName,statusPath:l,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:c});await _i({admissionLedger:e.audioProbeAdmissionLedger,binding:a,device:i.device,owner:o.owner,fence:c,...u,throwIfCanceled:e.throwIfCanceled});let d=a.read();if(!d)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await d.handle.status()}}async function ql(e,t){let n=Hi(e.sessionStore,t),r=n.read();if(!r)return{ok:!0,data:Yl()};let i=await r.handle.status();return i.state===`stopped`&&await fi({intent:`disposal`,binding:n}),{ok:!0,data:i}}async function Jl(e,t){let n=Hi(e.sessionStore,t);return n.read()?{ok:!0,data:await fi({intent:`capture`,binding:n})}:{ok:!0,data:Yl()}}function Yl(){return li({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Xl(e){let t=e.sessionStore.lookup(e.sessionName);if(!t)return d(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let n=e.sessionStore.requireCurrent(t),i={...e,ref:t};try{if(fn(e.req.positionals?.[0]))throw new a(`INVALID_ARGS`,pn);_u(e.req);let t=xi({positionals:e.req.positionals,kind:yu(e.req.flags?.kind),outPath:yu(e.req.flags?.out)}),r=gi(t);if(r.kind===`capture-stop`)return Zl(i,await tu(i,n,r.request));let o=await oa({device:n.device,plan:r,inspectFacts:e.inspectFacts});return o.admitted?Zl(i,await Ql(i,n,o)):B(`perf`,o.fact)??d(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:r(e)}}}function Zl(e,t){return t.ok&&M(e.sessionStore,e.ref,e.req,`perf`,fu(t.data)?{...t.data}:{}),t}async function Ql(e,t,n){let{device:r,plan:i}=ra(n),o=ia(e.bindDevice);switch(i.kind){case`frames`:return{ok:!0,data:su(t,await(await o(r,i.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:pu(t,await(await o(r,i.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:mu(t,await(await o(r,i.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:i.request.kind,outPath:i.request.outPath?P(i.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:H.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await $l(e,t,await o(r,i.use),i.request);case`profile-report`:{let n=await o(r,i.use),s=t.lastPerfProfile,c=i.request.tracePath??s?.outPath;if(!c)throw new a(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new a(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=gu(e,i.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await n.operations.perfProfileReport({appId:t.appBundleId,kind:i.request.kind,tracePath:P(c,e.req.meta?.cwd),outPath:l,template:i.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function $l(e,t,n,r){if(t.perfCapture)return d(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return d(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=gu(e,r.outPath,i),o=di.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=di.createNextFence({admissionLedger:eu(e),resourcePath:o,device:t.device}),c=Ui(e.sessionStore,e.ref);c.assertAdoptable();let l=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await yi({admissionLedger:eu(e),binding:c,device:t.device,owner:n.owner,fence:s,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function eu(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new a(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function tu(e,t,n){let r=t.perfCapture;if(!r)return d(`INVALID_ARGS`,`no active native perf capture`);let i=ou(r.handle.inspect(),n);if(i)return d(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(P(n.outPath,e.req.meta?.cwd));let a=await mi({intent:`capture`,binding:Ui(e.sessionStore,e.ref)});if(n.area===`cpu`){let t=nu(a);e.sessionStore.update(e.ref,{lastPerfProfile:t})}return{ok:!0,data:a}}function nu(e){if(ru(e)||iu(e))return e;throw new a(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function ru(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function iu(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&au(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function au(e,t){return t.every(t=>typeof e[t]==`string`)}function ou(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function su(e,t){return{...hu(e),metrics:{fps:cu(t.metric,e)},sampling:{fps:t.sampling}}}function cu(e,t){if(!fu(e)||e.available!==!0)return e;let n=lu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function lu(e,t){let n=uu(t.windowStartedAt),r=uu(t.windowEndedAt)??uu(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:du(e)})).slice(-12)}function uu(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function du(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function fu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function pu(e,t){return{...hu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function mu(e,t){return{...hu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function hu(e){return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id}}function gu(e,t,n){return t?P(t,e.req.meta?.cwd):H.join(e.sessionStore.ensureSessionDir(e.sessionName),`${vu()}-${n}`)}function _u(e){let t=e.positionals?.[0]?.toLowerCase(),n=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||n!==`snapshot`))throw new a(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function vu(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function yu(e){return typeof e==`string`&&e.length>0?e:void 0}const bu=[`dump`,`log`],xu=`network requires ${bu.join(` or `)}`,Su=`network include mode must be one of: ${u.join(`, `)}`,Cu=2048;async function wu(e){let t=e.sessionStore.get(e.sessionName);if(!t)return d(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=Tu(e.bindDevice),r=(await n(t.device,Ue)).facts.networkDump;if(!r.available)return Au(r.hint);let i=Eu(e.req);if(!i.ok)return i;let a=me({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return ju(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:Cu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:r(e)}}}function Tu(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Eu(e){let t=Du(e);if(!t.ok)return t;let n=Ou(e);if(!n.ok)return n;let r=ku(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Du(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return bu.includes(t)?{ok:!0,action:t}:d(`INVALID_ARGS`,xu)}function Ou(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?d(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ku(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return d(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return u.includes(r)?{ok:!0,include:r}:d(`INVALID_ARGS`,Su)}function Au(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ju(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:Cu,maxScanLines:e.entries.length},notes:e.notes}}}function Mu(e,t){let n=Zi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Nu(e.appLogFailure)]:Pu(n.state)}}function Nu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Pu(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function Fu(e,t){return Le([...e,...t.notes??[]])}async function Iu(e){let{req:t}=e;return t.command===`perf`?await Xl({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Ru(e):t.command===`events`?await Lu(e):t.command===`network`?await wu(e):t.command===`audio`?await Hl(Xu(e)):null}async function Lu(e){let{req:t,sessionName:n,sessionStore:i}=e;try{return await i.flushEvents(n),{ok:!0,data:i.readEvents(n,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:r(e)}}}async function Ru(e){let{req:t,sessionName:n,sessionStore:i}=e,a=i.lookup(n);if(!a)return d(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=i.requireCurrent(a),r=Zu({...e,session:n,ref:a}),o=(await r.bindDevice(n.device,le)).facts.appLogInspect;if(!o.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:o.hint}};let s=Vu(pe({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),n);return`ok`in s?s:await zu(r,s)}catch(e){return{ok:!1,error:r(e)}}}async function zu(e,t){switch(t.kind){case`path`:return Hu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Uu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Bu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Ju(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Wu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Gu(e)}}async function Bu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await qu(e,t.appBundleId,n.owner,n.operations.appLogStart):await Ku(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Vu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):d(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Hu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=$i(a),s=Mu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Uu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Mu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:Fu(t.notes,o)}}}function Wu(e,t,n){let r=n.resolveAppLogPath(t);return Ji(r,e),{ok:!0,data:{path:r,marked:!0}}}function Gu(e){return{ok:!0,data:Wi(e)}}async function Ku(e,t,n,r){let{session:i,sessionStore:a}=e;i.appLog&&await Xi({intent:`disposal`,ref:e.ref,sessionStore:a});let o=Wi(e),s=await Yu(e,t,r,n);return s.ok?{ok:!0,data:{...o,restarted:!0}}:s}async function qu(e,t,n,r){let{session:i}=e;return i.appLog?d(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Yu(e,t,r,n)}async function Ju(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return d(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await Xi({intent:`capture`,ref:e.ref,sessionStore:r}),{ok:!0,data:{path:i,stopped:!0}}}async function Yu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=Ki.resolvePath(o.resolveSessionDir(a));try{let l=Vl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device});qi(o,e.ref).assertAdoptable();let u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await Qi({admissionLedger:e.appLogAdmissionLedger,ref:e.ref,sessionStore:o,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(t){return{ok:!1,error:Gi({ref:e.ref,sessionStore:o,error:t})}}}function Xu(e){if(!e.bindDevice||!e.inspectFacts)throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new a(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Zu(e){if(!e.bindDevice)throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new a(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}const Qu=new WeakMap;function $u(e){return{store:t=>ed(e,t),finalize:(t,n)=>td({...e,evidence:t,projection:n})}}function ed(e,t){let{sessionStore:n,ref:r}=e;if(!r)throw Error(`Internal observation session is no longer available.`);let i=n.requireCurrent(r);ni(i,t);let a=i.snapshotGeneration;if(a===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let o={};return Qu.set(o,{ref:r,snapshot:t,snapshotGeneration:a,runtimeRevision:Zr(i),refFrame:Xr(i)}),{evidence:o,refsGeneration:a}}function td(e){let t=Qu.get(e.evidence);Qu.delete(e.evidence);let n=rd(e.projection.refs);if(n.size===0)return{published:!1,reason:`empty`};if(e.signal?.aborted===!0)return{published:!1,reason:`cancelled`};let r=t&&nd(e,t);return!t||!r?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!id(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ri(r,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function nd(e,t){if(!e.ref||e.ref.lifetime!==t.ref.lifetime)return;let n=e.sessionStore.resolveCurrent(e.ref);return n&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Zr(n)===t.runtimeRevision&&Xr(n)===t.refFrame?n:void 0}function rd(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function id(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function ad(e){let t=od(e),n=Ge(t);return va(`sha256`).update(n,`utf8`).digest(`hex`)}function od(e){let{actions:t,actionLines:n,actionSourcePaths:r,metadata:i}=e;return{platform:i.platform??null,target:i.target??null,steps:t.map((e,t)=>sd(e,n[t]??null,r?.[t]??null))}}function sd(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function cd(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=ld({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function ld(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>ud({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>dd({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>fd(n,r)];for(let e of s){let t=e();if(t)return t}}function ud(e){let{from:t,actionCount:n,pendingRecordAndHeal:r}=e,i=t===n+1&&r!==void 0&&r.expectedFrom===t;return Number.isInteger(t)&&t>=1&&(t<=n||i)?void 0:`replay --from ${t} is out of range for a ${n}-step plan.`}function dd(e){let{from:t,pendingRecordAndHeal:n,sessionActionsLength:r}=e;if(n?.expectedFrom===t&&r===n.actionsCountAtDivergence)return`replay --from ${t} continues a record-and-heal-shaped repair, but no corrective action was recorded in this repair segment; press the correct control via a blessed @ref from the divergence's screen.refs (recorded, no --no-record) — or, if your corrective action was a read (get/is/find/snapshot), re-run it with --record so it lands in the heal — before resuming with --from ${t}.`}function fd(e,t){if(e!==t)return`replay --plan-digest does not match the current plan digest; the script, its includes, or its platform-conditioned expansion changed since the divergence report was generated. Run a fresh full replay to get a new digest.`}function pd(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new a(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let r=ct(e),i=ut(e),o=ad({actions:r.actions,actionLines:r.actionLines,actionSourcePaths:r.actionSourcePaths,metadata:{platform:t?.platform??it(r.actions)??i.platform,target:t?.target??i.target}}),s=r.actions.length;return{actions:r.actions,actionLines:r.actionLines,actionSourcePaths:r.actionSourcePaths,metadata:i,planDigest:o,resolveEntryIndex:e=>cd(e,s,o)}}function md(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function hd(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Qe(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function gd(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function _d(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=gd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Te(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function vd(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Te(e,r),...xe(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function yd(e,t,n,r,i,a){if(n.targetEvidences)return bd(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return Sd(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return Sd(e,n,r,i,a);if(s.kind===`post-resolution`){let c=md({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return Sd(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return Cd(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=hd({recorded:o,token:s.token});if(c.kind===`skip`)return Sd(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.observeTarget({action:n,index:i,token:l});if(u.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,xd(u),a,t)};let{classification:d}=u;return d.verified?Cd(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function bd(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return Sd(e,n,r,i,a);let d=hd({recorded:o[c],token:u.token});if(d.kind===`skip`)return Sd(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.observeTarget({action:l,index:i,token:d.token});if(f.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,xd(f),a,t)};let{classification:p}=f;if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return Cd(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function xd(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function Sd(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function Cd(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=wd(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=Td(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function wd(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function Td(e,t,n){return n.status===`guard-mismatch`?_d(e,n.evidence,t):vd(e,n.evidence)}async function Ed(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Rt(e.varSources),o=[],s=[],c=Ad(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!kd(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(jd(u,n.length,r,e))}let d=Lt(r,a,Od(e,u)),f=Pt(a),p=t.diagnosticsMarker(),m=await yd(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:Dd(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function Dd(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Od(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function kd(e){return!!(e&&e.command!==`replay`)}function Ad(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(kd(n))return n.command===`close`?t:void 0}}function jd(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function Md(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Qe(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function Nd(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),st(e.command)){let n=Pd(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Qe(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Md([...e.positionals]);n&&t.push(n)}return Le(t).filter(e=>e.trim().length>0)}function Pd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Fd(n)?t.slice(0,-1):t}function Fd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Id(e){let t=H.dirname(e),n=H.basename(e,H.extname(e));return H.join(t,`${n}.healed.ad`)}function Ld(e){let t=Rd({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Rd(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=zd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function zd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function Bd(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Vd(n))return`manual`;let i=Hd(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Vd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Ud(e.scrollRegion)}function Hd(e,t){let n=on(t),r=Gd(e.ancestry,n,t),i=e.scrollRegion;return i&&Ud(i)?r&&Wd(i,n,t):r}function Ud(e){return e.id!==void 0||e.label!==void 0}function Wd(e,t,n){return n.some(n=>kt(Ot(n,t),e))}function Gd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=an(n,t,e.length);return!r.broken&&fe(r.chain,e)})}function Kd(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:i}=e,a,o,s=Ln({divergence:r,level:i,writeOverflowArtifact:e=>{let n=l(e),r=Yd(t,n);return`artifactPath`in r&&(a=n,o=r.artifactPath),r}}),c=(a??s).screen;if(c.state!==`available`||c.refs.length===0)return e.evidence&&n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.state===`available`?c.refsGeneration:void 0,refs:[]}),s;if(!e.evidence)return Jd(o),qd(s,`missing-evidence`);let u=n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.refsGeneration,refs:c.refs.map(e=>e.ref)});return u.published===!0?s:(Jd(o),qd(s,u.reason))}function qd(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function Jd(e){if(e)try{V.unlinkSync(e)}catch{}}function Yd(e,t){try{let n=H.join(e.ensureSessionDir(),`replay-divergence`);V.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=H.join(n,r);return V.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const Xd={id:0,"role-label":1,label:2,other:3};function Zd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Qd(n.basis)<Qd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Qd(e.basis)-Qd(t.basis)||e.nodeIndex-t.nodeIndex)}function Qd(e){return Xd[e]}async function $d(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionStore:s,observationStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=In(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await nf({session:o,observationStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=sf(v,g),b=v.state===`available`&&o?ff({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=Bd({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:ef(v)}),S=Ld({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Kd({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(ot(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function ef(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const tf=[300,500,800,1200,2e3,3e3,4e3];async function nf(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=af(i),s=Date.now()+12e3,c=n.bindAuthority(),l=await rf({session:t,observation:c,logPath:r,flags:o});if(!a)return l.observation;for(let e of tf){if(l.observation.state===`available`||!l.retryable)break;let n=s-Date.now();if(n<=0)break;await wn(Math.min(e,n)),l=await rf({session:t,observation:c,logPath:r,flags:o})}return l.observation}async function rf(e){let{session:t,observation:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).snapshot;if(ta(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let a=n.store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:a.refsGeneration,evidence:a.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:Nn(e)}}}function af(e){return{snapshotInteractiveOnly:of(e)}}function of(e){return!pf(e.command)||mf(e).requiresRect}function sf(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=df(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function cf(e){return!!_n(e,o(e.type??`Element`))||e.hittable===!0}function lf(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function uf(e,t){let n=rn(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&cf(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>lf(e,t)),...o.filter(e=>!lf(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function df(e,t,n){let{nodes:r,truncated:i}=uf(e,n);return{refs:r.map(e=>{let n=o(e.type??`Element`),r=_n(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function ff(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!pf(t.command))return[];let a=Nd(t);return a.length===0?[]:hf({candidates:a,nodes:r,session:n,action:t,matching:mf(t),sanitize:i})}function pf(e){return st(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function mf(e){let t=st(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function hf(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=gf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Zd(s).map(e=>e.suggestion)}function gf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Ie(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:_f({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function _f(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:s}=e,c=Ve(t,r.device.platform,{action:i.command===`fill`?`fill`:st(i.command)?`click`:`get`,nodes:n}),l=o(t.type??`Element`),u=_n(t,l);return{selector:s(c.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:s(l),...u?{label:s(u)}:{}}}function vf(e){return yf({...e,hint:e.hint??Sf(e.details,`hint`),diagnosticId:e.diagnosticId??Sf(e.details,`diagnosticId`),logPath:e.logPath??Sf(e.details,`logPath`)})}function yf(e){return e.details?.reason===`android_shell_text_unsupported`?{...e,hint:"On emulators the test IME activates automatically; on real devices pass `--test-ime` to this test/replay run to enable it for the sessions the flow opens (see `agent-device doctor` for the current IME state)."}:e}function bf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return xf({error:t,actionLabel:ot(n),action:n.command,positionals:_t(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function xf(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Pn(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Pn(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...wf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>Pn(e,u))}:{},divergence:l}}}}function Sf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const Cf=[`readiness`,`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function wf(e){if(!e)return{};let t={};for(let n of Cf)e[n]!==void 0&&(t[n]=e[n]);return t}async function Tf(e){return await Ef({...e,snapshotDiagnostics:v(e.snapshotDiagnosticSamples)})}async function Ef(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Df(t.error.details?.replaySource),v=vf(t.error),y=await $d({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:Gn(u.meta?.requestId)});return bf({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Df(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(n!==void 0||r!==void 0)return{path:n,line:r}}function Of(e,t){if(e)try{V.appendFileSync(e,`${JSON.stringify(l(t))}\n`)}catch(t){w({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function kf(e){let{req:t,sessionName:n,action:i,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();Of(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:_t(o)??[]});let g;try{g=await jf({req:t,sessionName:n,resolved:o,sourceAction:i,invoke:f,resolvedSessionScope:p,dependencies:m,readinessTimeoutMs:e.readinessTimeoutMs})}catch(e){if(!(e instanceof a))throw e;g={ok:!1,error:r(e)}}let _=Date.now();return Of(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?Nf(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Af(g,u??s,c)}function Af(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function jf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Ff(t.flags,r.flags,r.command);e.readinessTimeoutMs!==void 0&&(c.readinessTimeoutMs=e.readinessTimeoutMs);let l=i.command===`fill`?Wt(Ut(i)):void 0;return l&&(c.recordAs=l),await a(Mf({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Mf(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:at(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:dt(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Nf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}async function Pf(e,t){let{readinessTimeoutMs:n}=Ff(e,t.flags,t.command);if(n===void 0)return;let{SELECTOR_PIPELINE_POLICIES:r,readinessScheduleFor:i}=await import(`./selector-pipeline-policy.js`).then(e=>e.r);return i(r.promotedTarget.poll,n)}function Ff(e,t,n){let r=_(e,{...t??{}});return Re(n)&&r.readinessTimeoutMs===void 0&&(r.readinessTimeoutMs=2e3),r}function If(e){return Uf(e.ok?Rf(e.data):Lf(e.error.details?.artifactPaths))}function Lf(e){return Array.isArray(e)?e.filter(Hf):[]}function Rf(e){return e?[Vf(e.path),Vf(e.outPath),...zf(e.artifacts)].filter(Hf):[]}function zf(e){return Array.isArray(e)?e.map(Bf).filter(Hf):[]}function Bf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Vf(t.localPath)??Vf(t.path)}function Vf(e){return typeof e==`string`?e:void 0}function Hf(e){return typeof e==`string`}function Uf(e){return[...new Set(e.filter(Wf))]}function Wf(e){try{return V.statSync(e).isFile()}catch{return!1}}function Gf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Kf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=on(r),u=Ce(t),d=nn(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>At(r,e)===t.sibling),p=d.filter(e=>kt(Ot(e,l),t.scrollRegion)),m=Et(p)[t.viewportOrder]?.ref,h=Dt({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Yf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Kf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?qf(n,t,i,a):Jf(n,t,r,a,o)}function qf(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),o=e(n),s=o?p(t,o):null;if(a(s))return{matchedNodes:[s],winnerRef:s.ref};let c=r?sn(t,r):null;return a(c)?{matchedNodes:[c],winnerRef:c.ref}:{matchedNodes:[],winnerRef:``}}function Jf(e,t,n,r,i){let a=tt(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=ln(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Yf(e){let{classification:t,matchCount:n,winnerNode:r,identitySet:i,byIndex:a,recorded:o}=e;switch(t.reason){case`selector-miss`:return{kind:`selector-miss`,matchCount:0,observedNode:void 0,candidateNodes:[],mismatches:[],causeCode:`SELECTOR_MISS`,causeMessage:`The recorded target no longer matches any current element.`};case`identity-set-empty`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Xf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`The recorded selector/ref still matches, but nothing in the current tree carries the recorded identity.`};case`unique-but-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Xf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Exactly one current element carries the recorded identity, but the resolved target is a different element.`};case`signal-isolated-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Xf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`A disambiguation signal (sibling or viewport position) isolated a different element than the resolved target.`};case`no-signal-isolation`:return{kind:`identity-unverifiable`,matchCount:n,observedNode:r,candidateNodes:i.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`${i.length} current elements carry the recorded identity and neither disambiguation signal isolated one.`}}}function Xf(e,t,n){let r=jt(t),i=an(t,n,Math.max(e.ancestry.length,1)).chain;return[...Te(e,r),...xe(e.ancestry,i)].slice(0,5)}function Zf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=ft(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Qe(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!st(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!($f(r)&&$f(n[1])))return r}function Qf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function $f(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function ep(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=In(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:up(Ce(n),h),...t.observed?{observed:up(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>dp(e,h))},_=Bd({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Ld({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(ot(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=Kd({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return bf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function tp(e,t,n){let r=In(e.scrubVars);return ep(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:sf(n,r),publicationEvidence:ap(n),repairCapture:ef(n)})}async function np(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await nf({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function rp(e,t){return tp(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await np({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function ip(e,t,n){return tp(e,t,await np({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ap(e){return e.state===`available`?e.evidence:void 0}function op(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?ae(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Ye(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Zf(n,i),platform:a.device.platform}:{kind:`inactive`}}function sp(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=mf(r),s=Gf({recorded:t,token:n,nodes:i,platform:a,refLabel:Qf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:jt(s.winnerNode),structural:ke(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?jt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function cp(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function lp(e){return!e.ok&&e.error.details?.reason===cn}function up(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function dp(e,t){let n=o(e.type??`Element`),r=_n(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function fp(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function pp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.role==`string`)return{...typeof t.id==`string`?{id:t.id}:{},role:t.role,...typeof t.label==`string`?{label:t.label}:{}}}function mp(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function hp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.documentOrder==`number`&&typeof t.sibling==`number`)return{documentOrder:t.documentOrder,sibling:t.sibling}}function gp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:pp(e?.observed),expectedStructural:hp(e?.expectedStructural),observedStructural:hp(e?.observedStructural)}}function _p(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:pp(e?.observed),observedAncestry:mp(e?.observedAncestry)}}function vp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function yp(e,t,n){let r=vp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&cp(e)?{status:`guard-mismatch`,evidence:gp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&lp(e)?{status:`landmark-mismatch`,evidence:_p(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function bp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c,l=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),u=e=>(o=e,vp(xp(e),If(e))),d=async e=>{let n=t.observationStore.get();return n?await nf({session:n,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:!0}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`}};return{runtime:{beginTargetVerification(e,n,r,i){return op({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async observeTarget({action:e,token:n}){let r=async()=>{let r=await d(e);if(s=r,r.state!==`available`)return{state:`unavailable`,reason:r.reason,hint:r.hint};let i=t.sessionStore.get();return{state:`classified`,classification:sp({recorded:e.targetEvidence,token:n,action:e,nodes:[...r.nodes],platform:i.device.platform})}},i=n.startsWith(`@`)?void 0:await Pf(t.replayReq.flags,e);if(!i)return await r();let{observeUntil:a}=await import(`./observe-until.js`).then(e=>e.n),o=await a({capture:r,verdict:e=>Dp(e)?{kind:`continue`}:{kind:`done`,result:e},schedule:i,...t.signal?{signal:t.signal}:{},...t.dependencies.clock?{clock:t.dependencies.clock}:{}});if(o.polls.length>1&&(c={remainingBudgetMs:Math.max(0,i.budgetMs-Op(o)),readiness:{polls:o.polls.length,waitedMs:o.waitedMs,end:o.kind}},w({level:`debug`,phase:`interaction_target_readiness`,data:{...c.readiness,command:e.command}})),o.kind===`done`)return o.result;if(o.last!==void 0)return o.last;throw o.kind===`expired`?o.lastError:o.error},async dispatchStep(e,n,i,a,s){let l=t.actionLines[i]??1,u=await kf({...c?{readinessTimeoutMs:c.remainingBudgetMs}:{},req:fp(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:l,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=u,If(u).forEach(e=>r.add(e));let d=[...r];return u.ok?{status:`ok`,artifactPaths:d}:yp(u,s,d)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await rp(l(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=tp(l(e,t,r,i),n,a);return u(n.kind===`selector-miss`&&c?kp(o,c.readiness):o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await ip(l(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=xp(o),l=await Sp(t,n,e,r,c,[...i],[...a],s);return u(l)},armStep:()=>{s=void 0,c=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>Cp(e),onStep:i,diagnosticsMarker:()=>Tp(t.sessionStore),diagnosticsSince:e=>Ep(t.sessionStore,e)},readLastResponse:()=>o}}function xp(e){return e&&!e.ok?e:d(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Sp(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return wp(i)?c(i):c(await Tf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function Cp(e){let t=e.positionals??[],n=Ne(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function wp(e){if(e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence,n=t&&typeof t==`object`?t.kind:void 0;return typeof n==`string`&&n!==`action-failure`}function Tp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function Ep(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Dp(e){return e.state===`classified`&&!e.classification.verified&&e.classification.kind===`selector-miss`}function Op(e){let t=e.polls[0];return t?e.waitedMs-(t.startedMs+t.durationMs):0}function kp(e,t){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,readiness:t}}}}function Ap(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:jp(t,i)};return Np(o,`AD_PLATFORM`,a.platform??r.platform),Np(o,`AD_TARGET`,a.target??r.target),Np(o,`AD_DEVICE`,a.device),Np(o,`AD_DEVICE_ID`,Mp(a)),Pp(o,`AD_SHARD_INDEX`,a.shardIndex),Pp(o,`AD_SHARD_COUNT`,a.shardCount),Np(o,`AD_ARTIFACTS`,a.artifactsDir),o}function jp(e,t){let n=e.meta?.cwd??process.cwd();return H.relative(n,t)||t}function Mp(e){return typeof e.serial==`string`?e.serial:e.udid}function Np(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Pp(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Fp=3e4,Ip=1e3;function Lp(e){let{scriptPath:t,env:n,publicNetworkOnly:i}=e,o=V.readFileSync(t,`utf8`),s=Object.create(null);try{Ca.runInNewContext(o,Rp(n,s,i),{filename:t,timeout:Fp})}catch(e){let n=r(e);throw new a(n.code,`Maestro runScript failed: ${n.message}`,m({...n.details??{},hint:n.hint,diagnosticId:n.diagnosticId,logPath:n.logPath,retriable:n.retriable,supportedOn:n.supportedOn,scriptPath:t}),e instanceof Error?e:void 0)}return Gp(s,t),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Kp(t)]))}function Rp(e,t,n){return{...e,output:t,json:zp,http:{post:(e,t)=>Vp(`POST`,e,n,t)}}}function zp(e){if(typeof e!=`string`)throw new a(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new a(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Bp)}catch(t){throw new a(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Ip)},t instanceof Error?t:void 0)}}function Bp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Vp(e,t,n,r){let i=Cn(process.execPath,Hp(),{stdin:JSON.stringify(Wp(e,t,r,n)),timeoutMs:Fp,allowFailure:!0});if(i.exitCode!==0)throw new a(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${qp(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(n){throw new a(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:i.stdout.slice(0,Ip),stderr:i.stderr.slice(0,Ip)},n instanceof Error?n:void 0)}}function Hp(){let e=Up(import.meta.url);if(!e)throw new a(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Up(e){try{let t=xa(e),n=H.extname(t)||`.js`;return[H.join(H.dirname(t),`run-script-http-child`+n),H.join(H.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>V.existsSync(e))??null}catch{return null}}function Wp(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Gp(e,t){for(let n of Object.keys(e))if(n.includes(`.`))throw new a(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${n}`,{scriptPath:t,key:n})}function Kp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function qp(e){let t=e.trim();return t.length>0?t.slice(0,Ip):`request process exited without stderr`}async function Jp(e){return await Yp(`tap`,async t=>{let n=H.join(t,`before.png`),r=H.join(t,`after.png`),i=await Zp(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Zp(e,r)))return await Xp(n,r,e.signal,`tap`)}})})}async function Yp(e,t){let n=await ya.mkdtemp(H.join(ba.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await ya.rm(n,{recursive:!0,force:!0})}catch{}}}async function Xp(e,t,n,r){try{let[i,a]=await Promise.all([ya.readFile(e),ya.readFile(t)]);tm(n);let o=await na(i,a,`Maestro screenshot`);return tm(n),Qp(o,r)}catch(e){em(e,n),w({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Zp(e,t){try{return await ya.rm(t,{force:!0}),tm(e.signal),await e.capture(t),tm(e.signal),!0}catch(t){return em(t,e.signal),!1}}function Qp(e,t){if(e.status!==`compared`)return $p(t,e.status,e),!1;let n=e.differencePercent<=K.animationDifferencePercent;return $p(t,n?`stable`:`changed`,e),n}function $p(e,t,n){w({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function em(e,t){if(t?.aborted||i(e))throw n()}function tm(e){if(e?.aborted)throw n()}async function nm(e){im(e.timeoutMs),tm(e.signal);let t=e.now()+e.timeoutMs;return await Yp(`animation`,async n=>{let r=H.join(n,`first.png`),i=H.join(n,`second.png`);for(;;){if(tm(e.signal),await rm(e,r,i))return!0;if(e.now()>=t)return!1}})}async function rm(e,t,n){let r=[await Zp(e,t),await Zp(e,n)];return!r[0]||!r[1]?!1:await Xp(t,n,e.signal,`animation`)===!0}function im(e){if(!Number.isFinite(e)||e<0)throw new a(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const am=K.observationPollMs;async function om(e,t){for(;;){X(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!Sm(n)||(X(e.context.signal),!await bm(e.dependencies,t,am,e.context.signal)))throw n}}}function sm(e){return cm({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function cm(e){let t=ji(e.snapshot),n=e.platform===`ios`?sa(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:f(n.nodes)}:e.snapshot;return pm(Co(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function lm(e){xm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){X(e.context.signal);let r=await om(e,n),i=cm({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Ea(e.condition,i))return i;if(e.dependencies.now()>=n)break;await bm(e.dependencies,n,am,e.context.signal)}return X(e.context.signal),Tm(t)}async function um(e){xm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){X(e.context.signal);let i=r??await om(e,t);if(r=void 0,n=cm({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===K.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return X(e.context.signal),Tm(n)}async function dm(e){xm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await om(e,t),r=Cm(n);for(;;){X(e.context.signal),await bm(e.dependencies,t,am,e.context.signal);let i=await om(e,t),a=Cm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function fm(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function pm(e,t,n,r,i,a,o){if(!e.ok){let t=fm(r);return{generation:n,matched:e.evidence.matched,visible:e.evidence.visible,candidateCount:e.evidence.candidateCount,...e.evidence.ref?{ref:e.evidence.ref}:{},...t?{viewport:t}:{}}}let s=hm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=fm(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:mm(e.rect,c)}:{},candidateCount:e.evidence.candidateCount,rect:e.rect,...e.evidence.ref?{ref:e.evidence.ref}:{},...c?{viewport:c}:{},...s?{dispatchSelector:s}:{},...i.includeSurfaceSignature?{surfaceSignature:Cm(t)}:{}}}function mm(e,t){return!Ae(e)||!Ae(t)?0:ze(t,e)?100:Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))*100/(e.width*e.height)}function hm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!gm(t,n,r)||i!==1))return _m(t.selector)}function gm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!wo(e.selector)}function _m(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!vm(n)||typeof r!=`string`)return;let i=Pr(r)?.trim();return i?{key:n,value:i}:void 0}function vm(e){return e===`id`||e===`label`||e===`text`}async function ym(e,t,r){try{await e.sleep(t,r)}catch(e){throw r?.aborted?n():e}X(r)}async function bm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await ym(e,Math.min(n,i),r),!0)}function X(e){if(e?.aborted)throw n()}function xm(e,t){if(!Number.isFinite(e)||e<0)throw new a(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function Sm(e){return e instanceof a&&e.details?.retriable===!0}function Cm(e){return va(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,checked:e.checked??!1,bounds:wm(e.rect)})))).digest(`hex`)}function wm(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function Tm(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function Em(e){return e.kind===`clearState`?jm(e):Dm(e)?Om(e):Km(e)?qm(e):e.kind===`settingsPermission`?zm(e):Bm(e)}function Dm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Om(e){switch(e.kind){case`launchApp`:return km(e);case`stopApp`:return Am(e);case`openLink`:return Mm(e)}}function km(e){return{command:`open`,positionals:e.appId?[e.appId]:[],flags:{...e.relaunch?{relaunch:!0}:{},...e.clearState?{clearAppState:!0}:{},...e.launchArgs.length>0?{launchArgs:e.launchArgs}:{}}}}function Am(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function jm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Mm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const Nm={camera:`camera`,microphone:`microphone`,photos:`photos`,contacts:`contacts`,notifications:`notifications`,calendar:`calendar`,location:`location`,medialibrary:`media-library`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`},Pm={allow:`grant`,deny:`deny`,unset:`reset`},Fm={location:{always:{state:`grant`,permission:`location-always`},inuse:{state:`grant`,permission:`location`},never:{state:`deny`,permission:`location`}},photos:{limited:{state:`grant`,permission:`photos`,mode:`limited`}}};function Im(e){let t=Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]);if(t.length===0)throw new a(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...t.filter(([e])=>e===`all`),...t.filter(([e])=>e!==`all`)].map(([e,t])=>Lm(e,t))}function Lm(e,t){let n=e===`all`?`all`:Rm(Nm,e);if(n===void 0)throw new a(`UNSUPPORTED_OPERATION`,`Maestro permission "${e}" is not supported.`,{hint:`Supported: all, ${Object.keys(Nm).join(`, `)}.`});let r=Fm[e],i=r?Rm(r,t):void 0;if(i)return i;let o=Rm(Pm,t);if(o)return{state:o,permission:n};throw new a(`INVALID_ARGS`,`Maestro permission "${e}" does not accept "${t}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(r??{})].join(`|`)}.`})}function Rm(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function zm(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Bm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Vm(e);case`clickPoint`:return Hm(e);case`swipe`:return Um(e);case`scroll`:return Wm(e);case`pressKey`:return Gm(e)}}function Vm(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Hm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Um(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function Wm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Gm(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Km(e){return e.kind===`screenshot`||e.kind===`snapshot`}function qm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Jm(e,t){let n=Em(t),r=await e.invoke(m({...n,flags:Ym(e.flags,n.flags??{})}));if(!r.ok)throw th(r);if(t.kind===`gestureViewport`){let e=r.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new a(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return r.data}function Ym(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=m({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Xm(e){return e?e.kind===`scalar`?[String(e.value)]:e.kind===`list`?e.values.map(String):Object.entries(e.values).flatMap(([e,t])=>[e,String(t)]):[]}function Zm(e,t){return{generation:t.generation,matched:t.matched&&t.visible,candidateCount:t.candidateCount,evidence:{kind:`selector`,selector:e,visible:t.visible,candidateCount:t.candidateCount,...t.ref?{ref:t.ref}:{}}}}function Qm(e){if(!e)return[];let t=[];if(typeof e.path==`string`&&t.push(e.path),Array.isArray(e.artifactPaths)&&t.push(...e.artifactPaths.filter(e=>typeof e==`string`)),Array.isArray(e.artifacts))for(let n of e.artifacts)typeof n.localPath==`string`?t.push(n.localPath):typeof n.path==`string`&&t.push(n.path);return[...new Set(t)]}function $m(e,t,n){if(H.isAbsolute(e))return e;let r=t.source?.path??n;if(!r)throw new a(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return H.resolve(H.dirname(r),e)}function eh(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function th(e){let t=e.error,n=m({...t.details??{},hint:t.hint??nh(t.details,`hint`),diagnosticId:t.diagnosticId??nh(t.details,`diagnosticId`),logPath:t.logPath??nh(t.details,`logPath`),retriable:t.retriable??rh(t.details,`retriable`),supportedOn:t.supportedOn??nh(t.details,`supportedOn`)});return new a(t.code,t.message,Object.keys(n).length?n:void 0)}function nh(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function rh(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function ih(e){let t,n,r,i,o,s=0,c=0,l=async n=>{c+=1;let r=await Jm(e,{kind:`snapshot`});if(!r||!Array.isArray(r.nodes))throw new a(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let i=x(r,r);return t={generation:n.generation,snapshot:i},i};return{capture:async e=>{if(n?.generation===e.generation){let r=n.snapshot;return n=void 0,t={generation:e.generation,snapshot:r},r}return n=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{r=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,n=void 0},requireStability:e=>{o=e,i=r?.generation===e?r:void 0,r=void 0,n=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new a(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,i=void 0,r=void 0,n=void 0}},prime:(e,t)=>{n={generation:e,snapshot:t}},settlePending:async r=>{if(o===void 0)return;if(o!==r.generation)throw new a(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${r.generation}.`);let s=t?.generation===r.generation?t.snapshot:i?.snapshot,c=await dm({timeoutMs:K.settleTimeoutMs,context:r,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,i=void 0,n={generation:r.generation,snapshot:c.snapshot},c}}}async function ah(e){let{input:t,context:n,snapshots:r,options:i}=e,a=i.dependencies.now()+t.timeoutMs,o=e.allowObservationReuse===!1?void 0:r.reuseObservation(n);for(;;){let e=i.dependencies.now(),s=o!==void 0;o??=await om({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=sm({query:t,context:n,snapshot:o,platform:i.platform});if(dh(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await bm(i.dependencies,a,am,n.signal)}}}async function oh(e,t,n,r,i,a){let o=async()=>await lh(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Jp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Jm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await sh(e,t,n,r,i,a.click,o)});return}await sh(e,t,n,r,i,a.click)}async function sh(e,t,n,r,i,a,o){let s=async()=>await lh(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:Cm(await t.capture(i))),l=async()=>{let r=await dm({timeoutMs:K.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await ch({baselineSignature:c,screenshotBaseline:o,dispatch:s,settle:l,onRetry:()=>{n.tapRetries+=1}});t.prime(i.generation,e.snapshot)}catch(e){throw t.requireStability(i.generation),e}}async function ch(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<K.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function lh(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await fh(e,o,n.point,i);return}catch(n){if(!ph(n))throw n;let o=await ah({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!uh(o))throw n;t.invalidate(r.generation),await mh(e,Mn(o.rect),i);return}}t.invalidate(r.generation),await mh(e,n.point,i)}function uh(e){return e.matched&&e.visible&&e.rect!==void 0}function dh(e,t){return uh(e)?!t||e.dispatchSelector!==void 0:!1}async function fh(e,t,n,r){w({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Jm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function ph(e){let n=t(e);return n.code===`AMBIGUOUS_MATCH`||n.code===`ELEMENT_NOT_FOUND`||n.code===`ELEMENT_OFFSCREEN`||n.details?.reason===gn.selectorNotFound}async function mh(e,t,n){if(!t)throw new a(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);w({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Jm(e,{kind:`clickPoint`,point:t,options:n})}function hh(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function gh(e){let t=ih(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},r=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},i=e.platform,o=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Jm(e,t)),s=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},c=async(e,t,n=`none`)=>await s(()=>o(e),t,n),l=async(e,t,n)=>{let r=[];for(let i of t){try{await c({kind:`settingsPermission`,...e?{appId:e}:{},state:i.state,permission:i.permission,...i.mode?{mode:i.mode}:{}},n)}catch(e){throw e instanceof a?new a(e.code,e.message,{...e.details,appliedPermissionMutations:r,failedPermissionMutation:hh(i)}):e}r.push(hh(i))}},u=async(n,i)=>{C(n),await c({kind:`typeText`,text:n},i);let a=await dm({timeoutMs:K.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});r(a),t.prime(i.generation,a.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await ah({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await lm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async()=>await o({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Xm(e.arguments),...Xm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Im(e.permissions);i&&await c({kind:`clearState`,...n?{appId:n}:{}},t),await l(n,r,t)}await c({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i&&!e.permissions,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`stopApp`,...n?{appId:n}:{}},t)},setPermissions:async(e,t)=>{await l(e.appId??t.appId,Im(e.permissions),t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await c({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(r,i)=>await oh(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await s(()=>mh(e,t.target.point,m({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await s(()=>mh(e,t.target.point,{holdMs:K.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await c({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await u(e.text,t),eraseText:async(e,t)=>await u(`\b`.repeat(e.charactersToErase??K.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await c({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await um({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let s=Fa(o,n.selector,n.direction,n.durationMs,i);return await c(s?{kind:`swipe`,...s}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await dm({timeoutMs:Math.min(K.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==K.scrollUntilVisiblePercentage)throw Rr(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Zm(n.selector,a))}},pressKey:async(e,t)=>{await c({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await c({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await c({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await nm({timeoutMs:t.timeoutMs??K.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await o({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Qm(await o({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Lp({scriptPath:$m(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?eh(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function _h(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=gh(e);return jo(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function vh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),yh(()=>Sh(r,e)),yh(()=>Ch(n,t,e))},actionCompleted:e=>{let r=bh(i,e.stepIndex);yh(()=>wh(n,t,xh(r,e),!0))},actionFailed:e=>{let r=bh(i,e.stepIndex);yh(()=>wh(n,t,xh(r,e),!1))}}}function yh(e){try{e()}catch{}}function bh(e,t){let n=e.get(t);return e.delete(t),n}function xh(e,t){return m({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function Sh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function Ch(e,t,n){Of(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function wh(e,t,n,r){let i=Th(n);Of(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,ok:r,durationMs:n.durationMs,...Object.keys(i).length>0?{resultTiming:i}:{},...!r&&`error`in n&&n.error instanceof a?{errorCode:n.error.code}:{}})}function Th(e){let t=`data`in e?e.data:void 0,n=Eh(t?.timing)?t.timing:void 0;return m({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function Eh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Dh(e,t){let n=m({...e.dispatch,...Oh(t.dispatch)});return m({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,dispatch:Object.keys(n).length>0?n:void 0})}function Oh(e){return m({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function kh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:Nh(e.action),positionals:Ph(e.action,e.value),flags:t.flags??{}}}}async function Ah(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=Gn(r.meta?.requestId),c=kh(t,r),l=vf(e.error),u=[...t.redactions],d=In(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await nf({session:p,observationStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?jh({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Mh(t.value)].filter(Boolean).join(` `),_=Kd({sessionStore:i,observationStore:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:sf(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Bd({kind:`action-failure`,targetEvidence:void 0,capture:ef(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return xf({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u,warnings:t.warnings})}function jh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Zd(Zn(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>_f({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Mh(e){return!e||e===`<text>`?e??``:lt(e)}function Nh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Ph(e,t){return!t||e===`inputText`?[]:[t]}function Fh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=Lh(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:Rh(c,Date.now()-r)}}}async function Ih(e){let{command:t,replayPath:n,state:i,outcome:a}=e,{request:o,session:{store:s,observationStore:c,logPath:l}}=t,{failure:u}=a,d=r(a.error);return u?await Ah({error:d,failure:u,replayPath:n,req:o,sessionStore:s,observationStore:c,logPath:l,snapshotDiagnostics:Lh(s,i.snapshotStart)}):{ok:!1,error:d}}function Lh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return v(n)}function Rh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function zh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return d(`INVALID_ARGS`,lr);if(t.flags?.saveScript!==void 0)return d(`INVALID_ARGS`,`Maestro YAML does not support --save-script; ADR 0012 repair recording applies only to .ad scripts.`);let r=Date.now(),i={snapshotStart:0};try{return await Bh({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Ih({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Bh(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await Vh({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Jh({command:t,device:l.device,platform:l.platform,runtimeHints:l.runtimeHints,sourcePath:l.filePath,publicNetworkOnly:u});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await fr(l.flow,d,{defaults:l.defaults,env:l.env,platform:l.platform,target:l.target,runtimeHints:l.runtimeHints,signal:l.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:!u,readSource:e=>Jr(n,e),observer:vh({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?Fh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Ih({command:t,replayPath:n.entry,state:i,outcome:f})}async function Vh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=nr(Jr(n,o),o),c=a.lookup(),l=c?.session;c&&a.assertSelectorMatches(r.flags);let u=await Hh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Kh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:qh(r),signal:Gn(r.meta?.requestId)}}async function Hh(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await yt(t.flags??{},er(a.appTarget,o))),c=$h(t,s),l=Wh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Uh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:eg(t,s),runtimeHints:l,flow:a})}async function Uh(e){if(e.device||!Gh(e.runtimeHints))return e;let t=await yt(e.req.flags??{},er(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:eg(e.req,t),runtimeHints:Wh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Wh(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function Gh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Kh(e){return{...Ap({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function qh(e){return{...It(Ft(e.flags?.replayShellEnv)),...Nt(Mt(e.flags?.replayEnv))}}function Jh(e){let{command:t,device:n,platform:r,runtimeHints:i,sourcePath:a,publicNetworkOnly:o}=e,{request:s,invoke:c}=t,l={...s,runtime:i,...t.dispatch?{dispatch:t.dispatch}:{}};return _h({invoke:e=>c(Dh(l,e)),flags:Yh(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await Sa(e,void 0,{signal:t})}}})}function Yh(e,t,n){if(!e)return Xh(t,n);let r={platform:t,target:e.target,noRecord:!0,...n?.testIme===void 0?{}:{testIme:n.testIme}};return t===`android`?{...r,serial:e.id}:{...r,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}}}function Xh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0,...t?.testIme===void 0?{}:{testIme:t.testIme}};return t?.device&&(n.device=t.device),e===`android`?Zh(n,t):Qh(n,t)}function Zh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Qh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function $h(e,t){let n=e.flags?.platform;if(n===`android`||n===`ios`)return n;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new a(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function eg(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function tg(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(Bt(t,a.flags?.replayBackend)===`maestro`)return n?d(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await zh(i):d(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function ng(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=rg(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=ig(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=ag({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:sg({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function rg(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return d(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function ig(e,t,n){let r=pd(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:og({...e,flags:rr(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function ag(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:d(`INVALID_ARGS`,a.message)}}function og(e,t){return!t.platform&&!t.target?e:{...e,flags:cg(e.flags,t)}}function sg(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Ap({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:It(Ft(t.flags?.replayShellEnv)),cliEnv:Nt(Mt(t.flags?.replayEnv))}}function cg(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const lg={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function ug(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=dg({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(mg({req:t,coordinator:a}),pg({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function dg(e){let t=hg(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return c()}function fg(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?d(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):gg({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function pg(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=fg({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??lg,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:_g({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function mg(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function hg(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return d(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function gg(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?P(t):a??Id(i);if(!(n||r&&o===a)&&V.existsSync(o))return d(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function _g(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function vg(e){let{request:t,session:{name:n,logPath:i,store:a,observationStore:o,coordinator:s},tracePath:c,onStep:l,invoke:u}=e,f=t.flags?.replayScriptSource;if(!f)return d(`INVALID_ARGS`,lr);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,Vt(h)&&t.flags?.replayBackend!==`maestro`)return d(`INVALID_ARGS`,zt(`replay`,h));let r=await tg({resolved:h,keepSession:m,coordinator:s,command:e});if(r)return r;let _=ng({req:t,sessionName:n,sessionStore:a,tracePath:c,resolved:h,script:Jr(f,h),coordinator:s,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:T}=_.value,E=ug({req:t,entryIndex:C,sessionStore:a,sourcePath:h,coordinator:s});if(!E.ok)return E.response;let{runtime:D,readLastResponse:O}=bp({ctx:{replayReq:v,sessionName:n,sessionStore:a,observationStore:o,logPath:i,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:T,responseLevel:t.meta?.responseLevel,invoke:u,signal:Gn(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:l,armSaveScript:E.armSaveScript}),k=await Ed({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},D);return k.status===`failed`?O()??d(`COMMAND_FAILED`,`replay step failed with no recorded response`):yg({startedAt:p,sessionName:n,sessionStore:a,replayed:k.replayed,artifactPaths:k.artifactPaths,snapshotDiagnosticSamples:k.snapshotDiagnosticSamples,armSaveScript:E.armSaveScript,coordinator:s,keepSession:m})}catch(e){let t=r(e);return g.size===0?{ok:!1,error:t}:{ok:!1,error:{...t,details:{...t.details,artifactPaths:[...g]}}}}}function yg(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=xg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=v([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:bg(i,Date.now()-t)}}}function bg(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function xg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return d(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function Sg(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=H.resolve(n??`.`,t??`.agent-device/test-artifacts`);return H.join(i,r)}function Cg(e,t){let n=t?H.relative(t,e):H.basename(e),r=n.length===0||n.startsWith(`..`)?H.basename(e):n;return Xe(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function wg(e,t){V.mkdirSync(t,{recursive:!0}),Dg(e,t)}function Tg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=H.join(o,`result.txt`),u=H.join(o,`failure.txt`),d=Eg([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>H.basename(e)).join(`, `)}`);let p=`${f.join(`
2
+ `)}\n`;V.writeFileSync(l,p),s||V.writeFileSync(u,p)}function Eg(e,t,n){let r=[],i=new Set(n.map(e=>H.basename(e).toLowerCase()));for(let n of e){if(!kg(n))continue;let e=H.basename(n);if(H.resolve(n)===H.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=Og(e,t,i),o=H.join(t,a);V.copyFileSync(n,o),r.push(o)}return r}function Dg(e,t){let n=H.join(t,`replay.ad`);if(V.copyFileSync(e,n),H.extname(e).toLowerCase()===`.ad`)return;let r=H.join(t,H.basename(e));H.resolve(r)!==H.resolve(n)&&V.copyFileSync(e,r)}function Og(e,t,n){let r=H.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||V.existsSync(H.join(t,a));)a=`${i}-${o++}${r}`;return a}function kg(e){try{return V.statSync(e).isFile()}catch{return!1}}function Ag(e){let{platformFilter:t,discoverSources:n}=e,r=n(),i=[],o={undeclared:0,declaredOther:0};for(let e of r){let{path:n,manifest:r}=e,a={kind:`run`,path:n,title:r.title,manifest:r};if(!t){i.push(a);continue}let s=r.device.platform;if(s.kind===`caller-bound`){i.push(a);continue}if(s.kind===`unspecified`){o.undeclared+=1,i.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}if(!Bg(t,s.value)){o.declaredOther+=1;continue}i.push(a)}if(i.filter(e=>e.kind===`run`).length===0)throw new a(`INVALID_ARGS`,Ng({platformFilter:t,...o}));return i}const jg={web:!0};function Mg(e){return!Object.hasOwn(jg,e)}function Ng(e){let{platformFilter:t,undeclared:n,declaredOther:r}=e,i=t?` for --platform ${t}`:``;return t===void 0||n===0&&r===0?`No replay tests matched${i}.`:`No replay tests matched${i}: ${[...n>0?[`${n} without a platform declaration`]:[],...r>0?[`${r} declaring another platform`]:[]].join(`, `)}. ${Pg(t,n)}`}function Pg(e,t){return Mg(e)?t>0?`Add "context platform=${e}" to the first line of a script that has none, or drop --platform when the device is already selected.`:`Run a source that declares ${e}, or drop --platform.`:`No script can declare ${e} as its platform; run this suite without --platform.`}function Fg(e,t,n,r,i=0){let a=H.basename(n,H.extname(n)),o=Xe(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Ig(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return Xe(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function Lg(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,H.basename(r),`attempt`,a+1].join(`:`)}function Rg(e,t){return typeof e==`number`?e:t}function zg(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Bg(e,t){return e===`apple`?D(t):t===e}function Vg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Hg=2e3;async function Ug(e){let{filePath:t,sessionName:n,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=Xg({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:n,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:n,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Z(C,e),shard:u,onStep:d}).catch(e=>Vg({error:r(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Zg(o,[...v]))},o)})]):await w,Z(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:n,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Gg(w)||(x=Jg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:i,graceMs:Hg}}),Kg({replayPromise:w,cleanupSession:p,sessionName:n,requestId:i,emitDiagnostic:h})));let e=await qg({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Yg(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Z(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:n}),await p(n),Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!0,durationMs:Date.now()-t})}catch(e){let i=r(e);Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:n,error:i.message}}),x=Wg(x,i,v)}}return x??Vg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Wg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:Vg({error:t,artifactPaths:[...n],infrastructure:!0})}async function Gg(e){return await Promise.race([e.then(()=>!0),Sa(Hg).then(()=>!1)])}async function Kg(e){let{replayPromise:t,cleanupSession:n,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await n(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:r(e).message}})}}}async function qg(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Z(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:n});try{let e=await t({sessionName:n,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Z(o,e)});return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=r(e);return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:n,error:t.message}}),Vg({error:t})}}function Jg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Yg(e,t){return{...e,warnings:[...e.warnings,t]}}function Xg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=H.join(t,`replay-timing.ndjson`);return V.mkdirSync(H.dirname(l),{recursive:!0}),V.writeFileSync(l,``),n.add(l),Z(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Z(e,t){e&&V.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Zg(e,t=[]){return Vg({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function Qg(e){let t=$g(e),n=await e_(e,t);return{result:o_(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function $g(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:H.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Cg(t.path,n)),maxAttempts:r+1}}async function e_(e,t){n_(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await t_(e,t,r);if(r_(n,i),i_(e,i.outcome,r))break;a_(e,t,i)}return n}async function t_(e,t,n){let{entry:r,sessionName:i,suiteInvocationId:a,caseIndex:o,suiteIndex:s,suiteTotal:c,requestId:l,timeoutMs:u,shard:d}=e,f=n+1,p=Date.now(),m=Fg(i,a,r.path,o,n),h=H.join(t.testArtifactsDir,`attempt-${f}`);wg(r.path,h);let g=Lg({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Q(d)},v=await Ug({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return Tg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function n_(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:Fg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Q(c)})}function r_(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function i_(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function a_(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Q(e.shard)})}function o_(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?s_(e,t,n,r):c_(e,t,n,r)}function s_(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Q(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,replayed:c.replayed,healed:c.healed,...c.warnings.length>0?{warnings:[...c.warnings]}:{},...c.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...u_(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function c_(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...Q(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...l_(c),...u_(s)}}function l_(e){let t=e?.status===`failed`?e:void 0;return{...t&&t.warnings.length>0?{warnings:[...t.warnings]}:{},...t?.infrastructure?{infrastructure:!0}:{},...e?.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function u_(e){return Q(e)}function Q(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function d_(e,t,n,r){if(!e||t.length===0)return;let i=await r(e.count);return{mode:e.kind,shardCount:e.count,total:n+(e.kind===`all`?t.length*e.count:t.length),shards:i.map((n,r)=>({shardIndex:r,shardCount:e.count,device:n,entries:e.kind===`all`?t:t.filter((t,n)=>n%e.count===r)}))}}async function f_(e){let{request:n,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=n.sessionName;if(n.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),t=await p_(n,u,d);__(t,o);let p=t.shardPlan?v_({entries:t.entries,total:t.total,emitProgress:o}):[];return t.shardPlan?p.push(...await y_({shards:t.shardPlan.shards,sessionName:f,suiteInvocationId:t.suiteInvocationId,cwd:n.cwd,requestId:n.requestId,request:n,suiteArtifactsDir:t.suiteArtifactsDir,suiteTotal:t.total,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await C_({discoveryEntries:t.entries,sessionName:f,suiteInvocationId:t.suiteInvocationId,cwd:n.cwd,requestId:n.requestId,request:n,suiteArtifactsDir:t.suiteArtifactsDir,suiteTotal:t.total,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:E_(t.total,p,Date.now()-e,t.suiteArtifactsDir)}}catch(e){let n=t(e);return{status:`failed`,error:{code:n.code,message:n.message}}}}async function p_(e,t,n){let r=m_(e,t),i=h_(r),a=r.length-i.length,o=Ig(e.requestId),s=await d_(e.shard?{kind:e.shard.mode,count:e.shard.count}:void 0,i,a,n);return{entries:r,runnable:i,shardPlan:s,suiteInvocationId:o,suiteArtifactsDir:g_(e,o),total:s?.total??r.length}}function m_(e,t){return Ag({platformFilter:e.platformFilter,discoverSources:t})}function h_(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function g_(e,t){return Sg({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function __(e,t){t({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function v_(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function y_(e){return(await Promise.allSettled(e.shards.map(async t=>await x_({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[b_(r,e.sessionName,t.reason)]:[]})}function b_(e,t,n){let i=r(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:S_(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function x_(e){let{shard:t,sessionName:n}=e;return await w_({...e,entries:t.entries,sessionName:S_(n,t),shard:t})}function S_(e,t){return`${e}:shard-${t.shardIndex+1}`}async function C_(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await Qg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:zg(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Rg(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),T_(t,o,p))break}return g}async function w_(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await Qg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:zg(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Rg(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),T_(b,o,m))break}return _}function T_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function E_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=b(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function D_(e,t){return()=>e.map(e=>O_(e,t))}function O_(e,t){let n=e.entry,r=Jr(e,n),i=Bt(n,t)===`maestro`,a=ut(r);return{path:n,manifest:{...i?{title:nr(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function k_(e){return async t=>(await M_(e,t)).map(A_)}function A_(e){if(e.platform===`web`||!O(e))throw new a(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function j_(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}async function M_(e,t){let n=I_(e),r=P_(await ki(N_(e)),n,e);if(r.length<t)throw new a(`DEVICE_NOT_FOUND`,`test sharding requires ${F_(t)}, but only ${r.length} matched`);return r.slice(0,t)}function N_(e){let t=Ti(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:T({simulatorSetPath:Ei(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function P_(e,t,n){return t.length>0?L_(e,t,n):e.filter(e=>R_(e,n)).sort(V_)}function F_(e){return`${e} device${e===1?``:`s`}`}function I_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function L_(e,t,n){return t.map(t=>{let r=B_(t),i=e.find(e=>z_(e,n)&&(e.id===t||B_(e.name)===r));if(!i)throw new a(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return i})}function R_(e,t){return!z_(e,t)||!O(e)?!1:e.booted!==!1}function z_(e,t){return!(!E(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function B_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function V_(e,t){return e.id.localeCompare(t.id)}function H_(e){let t=U_(e?.shardAll,`--shard-all`),n=U_(e?.shardSplit,`--shard-split`);if(t!==void 0&&n!==void 0)throw new a(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(n!==void 0)return{mode:`split`,count:n}}function U_(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new a(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const W_=new Set([`IOS_BOOT_TIMEOUT`,`IOS_RUNNER_CONNECT_TIMEOUT`,`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,`IOS_TOOL_MISSING`,`ANDROID_BOOT_TIMEOUT`,`ADB_TRANSPORT_UNAVAILABLE`,`CI_RESOURCE_STARVATION_SUSPECTED`]);function G_(e){return W_.has(e.toUpperCase())}const K_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function q_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=J_(e);return t?Y_(t.details)||X_(t.code,t.message):!1}function J_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Y_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||yn(t)?!0:t?G_(t):!1}function X_(e,t){let n=`${e}\n${t}`.toLowerCase();return K_.some(e=>n.includes(e))}function Z_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:ev(e.error.details?.artifactPaths),warnings:hn(e.error.details),infrastructure:q_(e),...tv(e.error.details?.snapshotDiagnostics)};let t=e.data;return{status:`passed`,replayed:typeof t?.replayed==`number`?t.replayed:0,healed:typeof t?.healed==`number`?t.healed:0,warnings:hn(t),artifactPaths:ev(t?.artifactPaths),...tv(t?.snapshotDiagnostics)}}function Q_(e){if(!e||e.ok)return;let t=Z_(e);return t.status===`failed`?t:void 0}function $_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ev(e){return[...new Set($_(e))]}function tv(e){let t=y(e);return t?{snapshotDiagnostics:t}:{}}const nv=1e3,rv=3e3;function iv(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await av(e)}}async function av(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=En(o.device.platform),c=i?H.join(i,`recording${s}`):Tn(o.device.platform);sv(a,{type:`video_recording_start`,session:n,videoPath:c}),w({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(cv({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return sv(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await wn(nv),sv(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:nv}),w({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:nv}}),l}async function ov(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;sv(a,{type:`video_tail_start`,session:n,requestedDurationMs:rv});let o=Date.now();await wn(rv);let s=Date.now(),c=await e.video.record(cv({req:t,sessionName:n,phase:`stop`}));return If(c).forEach(e=>i.add(e)),sv(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),w({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function sv(e,t){e({...t,ts:new Date().toISOString()})}function cv(e){let t={token:e.req.token,meta:e.req.meta};return e.phase===`start`?{request:t,sessionName:e.sessionName,phase:`start`,outputPath:e.outputPath}:{request:t,sessionName:e.sessionName,phase:`stop`}}const lv=[{keys:[`replayKeepSession`],requested:e=>e.replayKeepSession===!0,message:`test does not support --keep-session; suite attempts own their cleanup. Run one native .ad script directly with replay --keep-session.`},{keys:[`replayFrom`,`replayPlanDigest`],requested:e=>e.replayFrom!==void 0||e.replayPlanDigest!==void 0,message:`test does not support --from/--plan-digest; resume is replay-only. Run the failing script directly with replay --from.`},{keys:[`saveScript`,`force`],requested:e=>!!e.saveScript||e.force===!0,message:`test does not support --save-script/--force; the agent-supervised repair loop is replay-only. Repair the failing script directly with replay --save-script.`}],uv=({attemptId:e,parentAttemptId:t})=>{Wn(e);let n=dv(e,t);return{cancel:()=>Vn(e),release:()=>{n(),Un(e)}}};function dv(e,t){if(!t||t===e)return()=>{};let n=Gn(t);if(!n)return()=>{};let r=()=>{Vn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function fv(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=pv(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:j_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function pv(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function mv(e){let{request:n,session:{name:r,logPath:i},createSession:a,invoke:o,cleanupSession:s,video:c}=e;if(n.flags?.recordVideo===!0&&c===void 0)return d(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=n.flags??{};for(let e of lv)if(e.requested(l))return d(`INVALID_ARGS`,e.message);let u,f;try{u=_v(n,r),f=gv(n)}catch(e){let n=t(e);return d(n.code,n.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await f_({request:u,emitProgress:Kn,isCanceled:()=>Hn(n.meta?.requestId),emitDiagnostic:w,bindAttemptCancellation:uv,runReplay:async({filePath:t,sessionName:r,platform:s,target:l,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&If(e).forEach(e=>f.add(e)),e),y=fv({parentFlags:n.flags,platform:s,target:l,artifactsDir:d,shard:g,sourceBundle:p.get(t)}),b=a(r,i),x=c?{req:n,sessionName:r,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:c}:void 0,S=x?iv(x):void 0;return Z_(await vg({...vv(e,{request:{...n,command:`replay`,session:r,positionals:[t],flags:y,meta:{...n.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await av(x):void 0;return t&&!t.ok?t:v(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:t,artifactsDir:r,appendTimingEvent:o})=>{if(c)return Q_(await ov({req:n,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:t,video:c}))},discoverSources:D_(f,n.flags?.replayBackend),resolveShardTargets:k_(n.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:hv(m.data,n)}:d(m.error.code,m.error.message)}function hv(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=H.join(n,H.basename(r)),a=e=>e===r||e.startsWith(r+H.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return V.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:H.basename(r)}]}:o}function gv(e){let t=e.flags?.replayScriptSources;if(!t)throw new a(`INVALID_ARGS`,lr);return t}function _v(e,t){let n=e.flags??{},r=e.meta?.cwd,i=bv(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:P(i,r),failFast:n.failFast===!0,retries:yv(n.retries),timeoutMs:yv(n.timeoutMs),shard:H_(n)}}function vv(e,t){let{publicNetworkOnly:n,resolvedSessionScope:r,dispatch:i,dependencies:a}=e,o=i||t.openLifecycle?{...i,...t.openLifecycle?{openLifecycle:t.openLifecycle}:{}}:void 0;return{request:t.request,...n?{publicNetworkOnly:n}:{},...r?{resolvedSessionScope:r}:{},...o?{dispatch:o}:{},dependencies:a}}function yv(e){return typeof e==`number`?e:void 0}function bv(e){return typeof e==`string`?e:void 0}function xv(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority},coordinator:r.createCoordinator()}}function Sv(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function Cv(e,t){let n=m({...e,...t});return Object.keys(n).length>0?n:void 0}function wv(e,t){return async({dispatch:n,...r})=>{let i=Cv(t.internal,n);return await e(i?{...r,internal:i}:r)}}function Tv(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:mt(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Ev(e.scriptPublication??tn)}},armStep(e){n.update(t=>{vt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Id(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){mt(r())!==void 0&&n.update(wt)},markCompleteIfArmed(){mt(r())!==void 0&&n.update(Ct)},markSessionHeldIfArmed(e){if(e.ok||!pt(r()))return e;let t=Fn(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&Ov(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Dv({session:t,...e})})}}}}function Ev(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Zt(e),targetForce:Ht(e)}}function Dv(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=kv({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Ov(e){e.pendingRecordAndHeal=void 0}function kv(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Av(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await fa({req:jv(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function jv(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const Mv={resolveSessionScope:Mi},Nv=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await vg({...Sv(e),session:Fv(t,n,r),invoke:wv(a??i,e),dependencies:Mv}),Pv=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Av({sessionStore:r,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await mv({...Sv(e),session:Fv(t,n,r),createSession:(e,t)=>Fv(e,t,r),invoke:wv(s??o,e),dependencies:Mv,cleanupSession:async t=>await Iv({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Fv(e,t,n){let r=t=>{let r=n.get(e);return r?(t(r),!0):!1},i={get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)};return xv(e,t,i,{createCoordinator:()=>Tv({sessionStore:i,mutationStore:{update:r,clearRepairTombstone:()=>n.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let r=n.lookup(e);r&&Ri(r,t)},resolveOpenRuntimeHints:({request:t,device:r,platform:i})=>Fr({req:t,sessionStore:{getRuntimeHints:t=>t===e?n.getRuntimeHints(e):void 0},sessionName:e,device:r,platform:i}),bindAuthority:t=>{let r=n.lookup(e);return{...$u({sessionStore:n,ref:r,signal:t}),capture:async({flags:i,logPath:o})=>{let s=r?n.requireCurrent(r):void 0;if(!s)throw new a(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await ei({device:s.device,session:s,flags:i,logPath:o,signal:t})}}}})}async function Iv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;if(!i.get(n))return;let o=await gc({req:{token:t.token,session:n,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:n,logPath:r,sessionStore:i,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new a(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function Lv(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command!==dn.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return Vv(new a(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let i=r.lookup(n);if(!i)return Vv(new a(`SESSION_NOT_FOUND`,`No active session "${n}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=r.requireCurrent(i),s=Bv(o);if(s)return Vv(s);let c=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!c)return Vv(new a(`INVALID_ARGS`,`session save-script path cannot be empty.`));Gt(o,{explicitPath:c,liveForce:t.flags?.force});let l=r.writeSessionLog(i,{force:qt(o,t.flags?.force),publication:`active`});return l.written?(Xt(o,l.path),{ok:!0,data:{session:o.name,savedScript:l.path,actionCount:l.actionCount,...N(`Published script: ${l.path}`)}}):Vv(l.error??new a(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Rv(e){if(ht(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Jt(e)?void 0:`not-armed`}const zv={repair:()=>new a(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new a(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new a(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new a(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function Bv(e){let t=Rv(e);return t?zv[t]():void 0}function Vv(e){return{ok:!1,error:r(e)}}function Hv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function Uv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ti(e)}}async function Wv(e,t,n){if(n.length!==1)throw new a(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(Uv(t))}}async function Gv(e,t,n){if(n.length<2)throw new a(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let r=n.slice(1).join(` `),i={...Uv(t),text:r};return await e.operations.writeClipboard(i),{action:`write`,textLength:Array.from(r).length,...N(`Clipboard updated`)}}async function Kv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await z({command:`clipboard`,device:t,use:qe,inspectFacts:i,bindDevice:a,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>Wv(n,e,r)}}let o=await z({command:`clipboard`,device:t,use:We,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>Gv(s,e,r)}}async function qv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.lookup(n),c=s?.session,l=t.flags??{},u=q(un.clipboard,c,l);if(u)return u;let f=t.positionals??[],p=Hv(f);if(!p)return d(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let m=await J({session:c,flags:l});s&&i.requireCurrent(s);let h=await Kv({device:m,action:p,positionals:f,inspectFacts:a,bindDevice:o});if(!h.ok)return h.response;let g=s?i.requireCurrent(s):void 0,_=await h.execute(Qr(r,t.flags,g?.appBundleId,g?.trace?.outPath));return M(i,s,t,t.command,_),{ok:!0,data:{platform:j(m),..._}}}function Jv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Yv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Xv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Zv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Kn({type:`command`,status:`progress`,message:Qv(t)})}function Qv(e){return[da(e),...ua(e)].join(`
3
+ `)}async function $v(e,t){let{device:n,targetApp:i,session:a,listInstalledApps:o}=t;if(i)try{let t=o?ey(i,await o(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${j(n)}.`,evidence:{requested:i,platform:j(n)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(t){let i=r(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${j(n)} --all`,evidence:{code:i.code,message:i.message}})}}function ey(e,t){let n=e.trim().toLowerCase(),r=t.find(e=>e.id.toLowerCase()===n||e.name.toLowerCase()===n);if(r)return r;let i=t.filter(e=>e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n));if(i.length===1)return i[0];throw i.length>1?new a(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:i.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new a(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function ty(e,t,n){let i=ry(t,n);try{let t=await ay(i),n=iy(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:uy(n,i,t.failures),hint:n.length===0?py(t.failures):void 0,command:n.length===0?vy(i):void 0,evidence:yy(n,t.failures)}),n.length>0&&sy(e,t.failures),{devices:n,hostDevices:n.filter(e=>t.hostDevices.includes(e)),platform:i.platform,target:i.target}}catch(t){let n=r(t);return $(e,{id:`device`,status:`fail`,summary:n.message,hint:n.hint,command:`agent-device devices`,evidence:{code:n.code,details:n.details}}),{devices:[],hostDevices:[],platform:i.platform,target:i.target}}}function ny(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:j(e),id:e.id,name:e.name}))}})}function ry(e,t){let n=e.flags??{};return St({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function iy(e,t){return e.filter(e=>te(e,t,{includeExplicitSelectors:!0}))}async function ay(e){if(e.platform)return{...oy([await Oi(e)]),failures:[]};let t=[],n=[];for(let r of xn)try{t.push(await Oi({...e,platform:r}))}catch(e){n.push(ly(r,e))}return{...oy(t),failures:n}}function oy(e){return{devices:e.flatMap(e=>e.devices),hostDevices:e.flatMap(e=>e.source===`local`?e.devices:[])}}function sy(e,t){for(let n of t)$(e,cy(n))}function cy(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${gy(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${gy(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function ly(e,t){let n=r(t);return{platform:e,message:n.message,hint:n.hint,code:n.code}}function uy(e,t,n){if(e.length===0)return n.length>0?`No ${dy(t)} devices found; ${fy(n)}.`:`No ${dy(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${dy(t)} ${_y(e.length,`device`)} available; ${r} booted`,a=my(e,t);return a?`${i} (${a}).`:`${i}.`}function dy(e){let t=e.platform?gy(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function fy(e){return e.slice(0,2).map(e=>`${gy(e.platform)} inventory failed: ${e.message}`).join(`; `)}function py(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function my(e,t){if(t.platform||t.target)return;let n=bn(e),r=hy();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function hy(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function gy(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function _y(e,t){return e===1?t:`${t}s`}function vy(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function yy(e,t){let n=new Map;for(let t of e){let e=j(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const by=1500;async function xy(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await Sy(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Cy(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function Sy(e,t,n){try{return await(n.resolveProcessInfo??wy)(e,t)}catch{return}}function Cy(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function wy(e,t){if(!Ty(e))return;let n=await Ey(t);if(n!==void 0)return{pid:n,cwd:await Dy(n)}}function Ty(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Ey(e){let t=await Sn(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:by});if(t.exitCode===0)return t.stdout.split(`
4
+ `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Dy(e){let t=await Sn(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:by});if(t.exitCode===0)return t.stdout.split(`
5
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Oy=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],ky=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Ay(e,t){let n=An(e.meta?.cwd);return{targetApp:Fy(e.flags?.targetApp)??t?.appBundleId,metroHost:Fy(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Iy(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Ny(e,n)}}function jy(e,t={}){let n=Py(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function My(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${j(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Ny(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Py(e){let t={...Object.fromEntries([...Oy,...ky].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function Fy(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Iy(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Ly(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==un.doctor)return null;let s=Ry(e.hostDiagnostics),c=r.get(n),l=Ay(t,c),u=Vy(r,n),d=[];if(Zv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${kn()} using ${u}`,evidence:{version:kn(),stateDir:u}},...jy(t,{required:l.remote}),...My(r,n,c,{remote:l.remote})),l.remote)return Ky(d,l);let f=zy(l,u,i),p=await ty(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await Hy({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=c?.device??By(p,h);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return Ky(d,l,{device:h,includeMetro:!0,inventory:p})}function Ry(e){if(!e)throw new a(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function zy(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>$t(e),emitProgress:e=>Kn({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ai(e),shouldPropagateInventoryProbeError:Di,transportOverrides:Object.freeze({androidAdb:n})})}function By(e,t){let n=e?.hostDevices??[];if(t)return n.includes(t)?t:void 0;let r=n.filter(e=>A(e)&&e.kind===`simulator`);return r.find(e=>e.booted===!0)??r[0]}function Vy(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function Hy(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??ny(t,i,a.targetApp);return u&&await Uy(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await xy(a.metroHost,a.metroPort,a.kind)),Zv(t,...await r.ambientChecks(n)),u}async function Uy(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await Wy({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await $v(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),Zv(e,...await r.deviceChecks(i,n))}async function Wy(e){if(e.device.platform!==`harmonyos`)return Gy(e)}async function Gy(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Ze),u=Ti(n.flags?.androidDeviceAllowlist),d=await xc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await Sc(l,d,e)}function Ky(e,t,n={}){let r=Jv(e);return{ok:!0,data:{status:r,summary:Yv(r),kind:t.kind,platform:n.device?j(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:Xv(e)}}}async function qy(e){return await z({...e,command:`prepare`,use:ue})}async function Jy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return d(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=q(un.prepare,o,s);if(c)return c;let l=await J({session:o,flags:s}),u=await qy({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let f=Date.now(),p=await u.runtime.operations.prepareAppleRunner({timeoutMs:Yy(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ci(t)}});return{ok:!0,data:Xy(a,l,Math.max(0,Date.now()-f),p)}}function Yy(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Pe}function Xy(e,t,n,r){return{action:e,platform:j(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Zy(n,r),message:`Prepared Apple runner: ${t.name}`}}function Zy(e,t){let n=Qy(t.buildMs),r=$y(t.connectMs),i=$y(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function Qy(e){return e===void 0?void 0:$y(e)}function $y(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const eb=e=>Cc(e),tb=e=>Ol({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),nb=e=>gc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),rb=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Rl({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),ib=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await Iu({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),ab={session_list:eb,devices:eb,capabilities:eb,apps:eb,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Ly({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:rb,shutdown:rb,appstate:rb,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Lv({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await ts({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await qv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Ms,perf:ib,logs:ib,events:ib,network:ib,audio:ib,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Jy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Ks,reinstall:Ks,install_source:Ks,release_materialized_paths:async({req:e})=>await zo({req:e}),push:Ks,"trigger-app-event":Ns,open:tb,replay:Nv,test:Pv,batch:async({req:e,sessionName:t,invoke:n})=>await qs(e,t,n),close:nb};async function ob(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new br,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=ab[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{ob as handleSessionCommands};