agent-device 0.21.23 → 0.21.25

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 (435) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.25.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -13
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +50 -106
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  31. package/dist/src/absence-observation-errors.js +1 -0
  32. package/dist/src/adapter.js +1 -1
  33. package/dist/src/adb-executor.js +2 -2
  34. package/dist/src/adb-failure.js +2 -2
  35. package/dist/src/adb.js +1 -1
  36. package/dist/src/agent-browser-lifecycle.js +1 -1
  37. package/dist/src/agent-browser-process-record.js +1 -1
  38. package/dist/src/agent-browser-provider.js +1 -1
  39. package/dist/src/agent-browser-tool.js +1 -1
  40. package/dist/src/agent-device-client.js +2 -2
  41. package/dist/src/alert.js +1 -1
  42. package/dist/src/android-adb.d.ts +3 -2
  43. package/dist/src/android-adb.js +1 -1
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/android-system-surface-disclosure.js +1 -0
  46. package/dist/src/android-text-entry.js +1 -0
  47. package/dist/src/android.js +1 -1
  48. package/dist/src/app-backend.js +1 -1
  49. package/dist/src/app-helpers.js +1 -1
  50. package/dist/src/app-inventory.d.ts +4 -0
  51. package/dist/src/app-launch.js +1 -1
  52. package/dist/src/app-lifecycle.js +4 -3
  53. package/dist/src/app-lifecycle2.js +2 -2
  54. package/dist/src/app-log-files.js +1 -1
  55. package/dist/src/app-log-reconnect.js +1 -1
  56. package/dist/src/app-log-runtime2.js +3 -3
  57. package/dist/src/app-resolution-facade.js +1 -1
  58. package/dist/src/app-resolution.js +2 -2
  59. package/dist/src/app-state-runtime.d.ts +15 -0
  60. package/dist/src/apple-runner-platform.js +1 -1
  61. package/dist/src/application-lifecycle-interaction.js +1 -1
  62. package/dist/src/artifact-download.js +1 -1
  63. package/dist/src/auth.js +1 -1
  64. package/dist/src/aws-device-farm-connection.js +1 -0
  65. package/dist/src/back-mode.js +1 -1
  66. package/dist/src/backend-snapshot-options.js +1 -1
  67. package/dist/src/boot-diagnostics.js +1 -1
  68. package/dist/src/browserstack-connection.js +1 -0
  69. package/dist/src/capture-disclosure.js +1 -0
  70. package/dist/src/cli-config.js +1 -1
  71. package/dist/src/cli-help.js +36 -17
  72. package/dist/src/cli-output.js +1 -1
  73. package/dist/src/cli-runner.js +3 -1
  74. package/dist/src/cli.js +3 -4
  75. package/dist/src/client-companion-tunnel.js +1 -0
  76. package/dist/src/client-metro.js +1 -1
  77. package/dist/src/client-types.d.ts +15 -7
  78. package/dist/src/cloud-artifacts.d.ts +3 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-metadata.js +73 -1
  82. package/dist/src/command-policy.js +1 -0
  83. package/dist/src/command-schema.js +3 -3
  84. package/dist/src/command-surface.js +1 -1
  85. package/dist/src/command-tools.js +2 -2
  86. package/dist/src/connection-runtime.js +1 -1
  87. package/dist/src/connection-verification.js +1 -0
  88. package/dist/src/connection.js +5 -5
  89. package/dist/src/contracts.d.ts +1 -1
  90. package/dist/src/contracts.js +1 -1
  91. package/dist/src/daemon-client-lease-beat.js +1 -1
  92. package/dist/src/daemon-client-lifecycle.js +1 -1
  93. package/dist/src/daemon-client-liveness-probe.js +1 -1
  94. package/dist/src/daemon-policy-file.js +1 -1
  95. package/dist/src/daemon-registration-owner.js +1 -1
  96. package/dist/src/daemon-registration.js +1 -1
  97. package/dist/src/daemon-resolution.js +3 -1
  98. package/dist/src/debug-symbols-facade.js +1 -1
  99. package/dist/src/device-claim-inspection.js +1 -1
  100. package/dist/src/device-input-state.d.ts +6 -17
  101. package/dist/src/device-inventory-context.js +1 -1
  102. package/dist/src/device-readiness-runtime.js +1 -1
  103. package/dist/src/device-release.js +1 -1
  104. package/dist/src/device-selection-resolver.js +1 -1
  105. package/dist/src/device-shell.js +1 -1
  106. package/dist/src/device.js +3 -1
  107. package/dist/src/devicectl.js +1 -1
  108. package/dist/src/diagnostics.js +1 -1
  109. package/dist/src/doctor-facade.js +1 -1
  110. package/dist/src/durable-capture-resource.js +1 -1
  111. package/dist/src/durable-resource.js +1 -1
  112. package/dist/src/engine-eval-script.js +1 -1
  113. package/dist/src/error.js +1 -1
  114. package/dist/src/exec.js +1 -1
  115. package/dist/src/expo-dev-client-launch.js +1 -0
  116. package/dist/src/file.js +3 -1
  117. package/dist/src/find.js +1 -1
  118. package/dist/src/finders.js +1 -1
  119. package/dist/src/generic-settle.js +1 -1
  120. package/dist/src/generic.js +1 -1
  121. package/dist/src/gesture-admission.js +1 -1
  122. package/dist/src/gesture-plan-types.d.ts +2 -5
  123. package/dist/src/gesture-plan.js +1 -1
  124. package/dist/src/gesture-runtime.js +1 -1
  125. package/dist/src/harmonyos.js +1 -1
  126. package/dist/src/hdc.js +1 -1
  127. package/dist/src/helper.js +2 -2
  128. package/dist/src/human-control.js +1 -1
  129. package/dist/src/ime-rebind.js +1 -1
  130. package/dist/src/ime-state.js +1 -1
  131. package/dist/src/index.d.ts +4 -4
  132. package/dist/src/index.js +1 -1
  133. package/dist/src/input-actions.js +1 -1
  134. package/dist/src/input-actions2.js +2 -2
  135. package/dist/src/install-source-network-transport.js +1 -1
  136. package/dist/src/install-source2.js +1 -1
  137. package/dist/src/interaction-error.js +1 -0
  138. package/dist/src/interaction-positionals.js +1 -1
  139. package/dist/src/interaction.js +1 -1
  140. package/dist/src/interaction2.js +1 -1
  141. package/dist/src/interactor-operation-catalog.js +1 -1
  142. package/dist/src/interactor.js +5 -5
  143. package/dist/src/interactor2.js +1 -1
  144. package/dist/src/interactors.js +1 -1
  145. package/dist/src/internal/bin.js +1 -1
  146. package/dist/src/internal/daemon.js +5 -1
  147. package/dist/src/internal/png-worker.js +1 -1
  148. package/dist/src/inventory.js +2 -2
  149. package/dist/src/inventory2.js +1 -1
  150. package/dist/src/inventory6.js +1 -1
  151. package/dist/src/io.d.ts +2 -2
  152. package/dist/src/ios-client.js +1 -1
  153. package/dist/src/ios-settings.js +1 -1
  154. package/dist/src/ios-snapshot-acquisition.js +1 -1
  155. package/dist/src/ios-snapshot-adapter.js +1 -1
  156. package/dist/src/ios-snapshot-engine.js +1 -1
  157. package/dist/src/ios-snapshot-runtime.js +1 -1
  158. package/dist/src/keyed-lock.js +1 -1
  159. package/dist/src/launch-confirmation.js +1 -1
  160. package/dist/src/lease.js +1 -1
  161. package/dist/src/limrun-runtime-dependencies.js +1 -1
  162. package/dist/src/limrun.d.ts +5 -564
  163. package/dist/src/limrun.js +1 -1
  164. package/dist/src/linux.js +1 -1
  165. package/dist/src/load.js +1 -1
  166. package/dist/src/local-interactor-operation-set.js +1 -1
  167. package/dist/src/log-stream.js +9 -9
  168. package/dist/src/mechanics.js +16 -16
  169. package/dist/src/metro.js +1 -1
  170. package/dist/src/metro2.js +1 -1
  171. package/dist/src/mobile-snapshot-semantics.js +1 -1
  172. package/dist/src/observability.js +1 -1
  173. package/dist/src/observation.js +1 -2
  174. package/dist/src/open-target-resolution.js +1 -1
  175. package/dist/src/output-path.js +1 -1
  176. package/dist/src/overlay.js +1 -3
  177. package/dist/src/perf-facade.js +1 -1
  178. package/dist/src/perf-runtime-operation-builder.js +1 -1
  179. package/dist/src/perf-runtime.js +1 -1
  180. package/dist/src/perf-target.js +1 -1
  181. package/dist/src/physical-device-control.js +1 -1
  182. package/dist/src/platform-request-scope.js +1 -1
  183. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  184. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  185. package/dist/src/platform-runtime-apple-resources.js +1 -0
  186. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  187. package/dist/src/platform-runtime-daemon-services.js +1 -0
  188. package/dist/src/platform-runtime-host.js +1 -1
  189. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  190. package/dist/src/platform-runtime-open-target.js +1 -1
  191. package/dist/src/platform-runtime-operation-host.js +4 -4
  192. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  193. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  194. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  195. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  196. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  197. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  198. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  199. package/dist/src/platform-runtime-unavailable.js +1 -1
  200. package/dist/src/platform-runtime.js +1 -1
  201. package/dist/src/platform-runtime2.js +1 -1
  202. package/dist/src/plugin.js +1 -0
  203. package/dist/src/plugins/webdriver.d.ts +111 -0
  204. package/dist/src/plugins/webdriver.js +1 -0
  205. package/dist/src/plugins.d.ts +2 -1
  206. package/dist/src/plugins2.js +1 -1
  207. package/dist/src/png-crop-bytes.js +1 -1
  208. package/dist/src/png-resize.js +1 -0
  209. package/dist/src/png-worker-client.js +1 -1
  210. package/dist/src/png-worker-contract.js +1 -1
  211. package/dist/src/process-entry.js +1 -1
  212. package/dist/src/process-exit.js +1 -1
  213. package/dist/src/process.js +1 -1
  214. package/dist/src/provider-credential-fingerprint.js +1 -1
  215. package/dist/src/provider-device-admission.js +1 -1
  216. package/dist/src/provider-device-runtime.d.ts +556 -0
  217. package/dist/src/provider-policy.js +1 -0
  218. package/dist/src/provider-profile-fields.js +1 -1
  219. package/dist/src/provider-webdriver.js +1 -2
  220. package/dist/src/proxy.js +2 -2
  221. package/dist/src/quality-warnings.js +1 -1
  222. package/dist/src/react-devtools.js +2 -0
  223. package/dist/src/react-native-overlay2.js +3 -0
  224. package/dist/src/react-native.js +1 -1
  225. package/dist/src/record-runtime.js +1 -1
  226. package/dist/src/record-trace.js +1 -1
  227. package/dist/src/recording.js +2 -2
  228. package/dist/src/register-builtins.js +1 -1
  229. package/dist/src/remote-bridge.js +1 -0
  230. package/dist/src/remote-config-core.js +1 -0
  231. package/dist/src/remote-config.js +1 -1
  232. package/dist/src/remote-config2.js +1 -1
  233. package/dist/src/replay-backend-registry.js +1 -0
  234. package/dist/src/replay-divergence.js +1 -1
  235. package/dist/src/replay-maestro-backend.js +117 -0
  236. package/dist/src/replay-script-selection.js +1 -0
  237. package/dist/src/replay.js +1 -3
  238. package/dist/src/replay2.js +1 -0
  239. package/dist/src/reporting.js +3 -3
  240. package/dist/src/request-cancel.js +1 -1
  241. package/dist/src/request-providers.js +1 -1
  242. package/dist/src/request-runtime-binding.js +1 -1
  243. package/dist/src/result-serialization.js +1 -1
  244. package/dist/src/retry.js +1 -1
  245. package/dist/src/retry2.js +1 -0
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-retention.js +1 -0
  248. package/dist/src/runner-cache-trim.js +1 -0
  249. package/dist/src/runner-client.js +1 -1
  250. package/dist/src/runner-dev-tools-security.js +1 -1
  251. package/dist/src/runner-device-readiness.js +1 -1
  252. package/dist/src/runner-device-set.js +1 -0
  253. package/dist/src/runner-error-classification.js +3 -3
  254. package/dist/src/runner-exchange.js +1 -1
  255. package/dist/src/runner-lease.js +1 -0
  256. package/dist/src/runner-operations-facade.js +1 -1
  257. package/dist/src/runner-retention.js +1 -0
  258. package/dist/src/runner-start-budget.js +1 -1
  259. package/dist/src/runner-startup-transport.js +1 -0
  260. package/dist/src/runner-toolchain-probe.js +2 -0
  261. package/dist/src/runner.js +2 -1
  262. package/dist/src/runtime-command-surface.js +1 -0
  263. package/dist/src/runtime-deployment.js +1 -0
  264. package/dist/src/runtime-factory.js +1 -0
  265. package/dist/src/runtime-session.js +1 -0
  266. package/dist/src/runtime-transport-hints.js +1 -1
  267. package/dist/src/runtime.js +2 -1
  268. package/dist/src/runtime10.js +2 -2
  269. package/dist/src/runtime2.js +4 -4
  270. package/dist/src/runtime3.js +1 -1
  271. package/dist/src/runtime4.js +5 -5
  272. package/dist/src/runtime5.js +1 -1
  273. package/dist/src/runtime6.js +1 -1
  274. package/dist/src/runtime7.js +1 -1
  275. package/dist/src/runtime8.js +1 -1
  276. package/dist/src/runtime9.js +1 -1
  277. package/dist/src/screen-recording-transport.js +1 -1
  278. package/dist/src/screenshot-density.js +1 -1
  279. package/dist/src/screenshot-image.js +1 -1
  280. package/dist/src/screenshot-runtime.js +1 -1
  281. package/dist/src/screenshot3.js +5 -5
  282. package/dist/src/sdk-batch-runner.js +2 -2
  283. package/dist/src/sdk-batch.js +2 -2
  284. package/dist/src/sdk-contracts.d.ts +20 -29
  285. package/dist/src/sdk-contracts.js +2 -2
  286. package/dist/src/sdk-device.js +1 -1
  287. package/dist/src/sdk-finders.d.ts +1 -1
  288. package/dist/src/sdk-finders.js +1 -1
  289. package/dist/src/sdk-io.d.ts +4 -2
  290. package/dist/src/sdk-remote-config.d.ts +4 -0
  291. package/dist/src/sdk-remote-config.js +1 -1
  292. package/dist/src/sdk-selectors.d.ts +5 -6
  293. package/dist/src/sdk-selectors.js +1 -1
  294. package/dist/src/selection.js +0 -0
  295. package/dist/src/selector-pipeline-policy.js +1 -1
  296. package/dist/src/selector-runtime.js +1 -1
  297. package/dist/src/selectors.js +1 -1
  298. package/dist/src/server.js +2 -2
  299. package/dist/src/session-allocation.js +1 -1
  300. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session.js +1 -1
  303. package/dist/src/session2.js +5 -5
  304. package/dist/src/settings.js +1 -1
  305. package/dist/src/settings2.js +1 -1
  306. package/dist/src/simctl-settings.js +1 -1
  307. package/dist/src/simctl.js +1 -1
  308. package/dist/src/simulator-boot.js +1 -1
  309. package/dist/src/simulator-state.js +1 -1
  310. package/dist/src/simulator.js +1 -1
  311. package/dist/src/snapshot-capture-annotations.js +1 -1
  312. package/dist/src/snapshot-chrome.js +1 -0
  313. package/dist/src/snapshot-desktop-projection.js +1 -1
  314. package/dist/src/snapshot-evidence.js +1 -0
  315. package/dist/src/snapshot-node-lookup.js +1 -0
  316. package/dist/src/snapshot-occlusion.js +1 -0
  317. package/dist/src/snapshot-quality-verdict.js +1 -0
  318. package/dist/src/snapshot-runtime-binding.js +1 -1
  319. package/dist/src/snapshot-runtime.js +1 -1
  320. package/dist/src/snapshot-state.js +1 -1
  321. package/dist/src/snapshot.js +1 -1
  322. package/dist/src/snapshot2.js +1 -1
  323. package/dist/src/snapshot3.js +1 -1
  324. package/dist/src/src.js +5 -1
  325. package/dist/src/src2.js +1 -1
  326. package/dist/src/src3.js +2 -1
  327. package/dist/src/store.js +1 -1
  328. package/dist/src/surface-snapshot2.js +1 -1
  329. package/dist/src/target-evidence-tree.js +1 -0
  330. package/dist/src/target-evidence.js +1 -1
  331. package/dist/src/text-entry-focus.js +1 -1
  332. package/dist/src/tool-provider2.js +1 -1
  333. package/dist/src/touch-runtime.js +1 -1
  334. package/dist/src/touch-runtime2.js +1 -1
  335. package/dist/src/tree.js +1 -1
  336. package/dist/src/tv-remote.js +1 -1
  337. package/dist/src/type-text-runtime.js +1 -1
  338. package/dist/src/undici.js +8 -8
  339. package/dist/src/update-check.js +1 -1
  340. package/dist/src/vars.js +1 -1
  341. package/dist/src/version.js +1 -1
  342. package/dist/src/video.js +2 -2
  343. package/dist/src/wait.js +1 -0
  344. package/dist/src/web.js +1 -1
  345. package/dist/src/web2.js +1 -1
  346. package/package.json +22 -19
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  351. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.manifest.json +0 -16
  352. package/dist/src/adb-transport.js +0 -1
  353. package/dist/src/alert-runtime.js +0 -1
  354. package/dist/src/app-deployment-resolution.js +0 -2
  355. package/dist/src/app-inventory-contract.js +0 -1
  356. package/dist/src/app-log-session-resource.js +0 -1
  357. package/dist/src/application-lifecycle-runtime.js +0 -1
  358. package/dist/src/auth-session.js +0 -1
  359. package/dist/src/cache.js +0 -1
  360. package/dist/src/capabilities.js +0 -1
  361. package/dist/src/capture.js +0 -1
  362. package/dist/src/catalog.js +0 -1
  363. package/dist/src/click-button.js +0 -1
  364. package/dist/src/client-metro-companion.js +0 -1
  365. package/dist/src/client-options.js +0 -3
  366. package/dist/src/compatibility-policy.js +0 -1
  367. package/dist/src/daemon-artifacts.js +0 -1
  368. package/dist/src/daemon-client-transport.js +0 -1
  369. package/dist/src/daemon-http.js +0 -1
  370. package/dist/src/device-claim-rule.js +0 -1
  371. package/dist/src/device-rotation.js +0 -1
  372. package/dist/src/device-session.js +0 -3
  373. package/dist/src/device2.js +0 -1
  374. package/dist/src/device3.js +0 -3
  375. package/dist/src/dispatch-resolve.js +0 -4
  376. package/dist/src/format.js +0 -1
  377. package/dist/src/gesture-plan-types.js +0 -1
  378. package/dist/src/host.js +0 -1
  379. package/dist/src/human-control-contract.js +0 -1
  380. package/dist/src/interaction-ref-policy.js +0 -1
  381. package/dist/src/interactor-operation-binding.js +0 -1
  382. package/dist/src/keyboard-actions.js +0 -1
  383. package/dist/src/lease-context.js +0 -1
  384. package/dist/src/lease-registry-scope.js +0 -1
  385. package/dist/src/lease-scope.js +0 -1
  386. package/dist/src/managed-device-scope.js +0 -1
  387. package/dist/src/observe-until.js +0 -1
  388. package/dist/src/output-common.js +0 -5
  389. package/dist/src/owner-identity.js +0 -3
  390. package/dist/src/path-resolution.js +0 -1
  391. package/dist/src/perf-runtime-plan.js +0 -1
  392. package/dist/src/platform-runtime-app-log-process.js +0 -1
  393. package/dist/src/platform-runtime-managed-owner.js +0 -1
  394. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  395. package/dist/src/png.js +0 -1
  396. package/dist/src/prepare-kind.js +0 -1
  397. package/dist/src/provider-device-runtimes.js +0 -1
  398. package/dist/src/provider-session-ownership.js +0 -2
  399. package/dist/src/providers.js +0 -1
  400. package/dist/src/registry.js +0 -68
  401. package/dist/src/request-admission.js +0 -1
  402. package/dist/src/request-cancellation.js +0 -1
  403. package/dist/src/request-progress-protocol.js +0 -1
  404. package/dist/src/runner-cache-metadata.js +0 -3
  405. package/dist/src/runner-disposal.js +0 -1
  406. package/dist/src/runner-session-types.js +0 -1
  407. package/dist/src/runtime-admission.js +0 -1
  408. package/dist/src/screen-recording-admission-ledger.js +0 -1
  409. package/dist/src/screen-recording-resource-recovery.js +0 -1
  410. package/dist/src/screenshot-result.js +0 -1
  411. package/dist/src/script.js +0 -1
  412. package/dist/src/scroll-command.js +0 -1
  413. package/dist/src/scroll-gesture.js +0 -1
  414. package/dist/src/scroll-indicator.js +0 -1
  415. package/dist/src/session-artifact-paths.js +0 -1
  416. package/dist/src/session-paths.js +0 -1
  417. package/dist/src/session-repair-tombstone.js +0 -1
  418. package/dist/src/session-routing.js +0 -1
  419. package/dist/src/session-snapshot.js +0 -1
  420. package/dist/src/snapshot4.js +0 -1
  421. package/dist/src/src4.js +0 -1
  422. package/dist/src/src5.js +0 -1
  423. package/dist/src/src6.js +0 -1
  424. package/dist/src/src7.js +0 -2
  425. package/dist/src/src8.js +0 -115
  426. package/dist/src/string-enum.js +0 -1
  427. package/dist/src/success-text.js +0 -1
  428. package/dist/src/timeouts.js +0 -1
  429. package/dist/src/touch-reference-frame.js +0 -1
  430. package/dist/src/transport.js +0 -3
  431. package/dist/src/ttl-memo.js +0 -1
  432. package/dist/src/verified-file.js +0 -1
  433. package/dist/src/viewport.js +0 -1
  434. package/dist/src/window-state.js +0 -1
  435. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
@@ -1,5 +1,5 @@
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};
1
+ import{D as e,I as t,L as n,P as r,S as i,Y as a,f as o,n as s,q as c,s as l,tt as u,x as d}from"./sdk-contracts.js";import{C as f,D as p,H as m,T as h,U as g,V as _}from"./tv-remote.js";import{A as v,i as y,n as b,t as x,v as S}from"./sdk-batch-runner.js";import{a as C,n as w,t as T}from"./snapshot-diagnostics.js";import{$ as E,A as ee,E as D,F as O,G as k,I as te,M as ne,N as re,Q as ie,R as ae,T as oe,Y as se,j as ce,k as le,m as ue,rt as de}from"./back-mode.js";import{a as fe,r as A}from"./diagnostics.js";import"./diagnostics2.js";import{C as pe,E as j,O as me,_ as he,b as ge,f as M,g as N,h as P,w as _e}from"./sdk-device.js";import{B as ve,Bn as ye,Ct as be,E as xe,F as Se,G as Ce,Hn as we,I as Te,J as Ee,Jn as De,K as Oe,L as ke,M as Ae,P as je,Pt as Me,Q as Ne,R as Pe,Tt as Fe,Un as Ie,V as Le,W as Re,Wt as ze,X as Be,Y as Ve,Z as He,_n as Ue,ar as We,at as Ge,d as Ke,f as qe,gn as Je,in as Ye,it as Xe,j as Ze,mt as Qe,on as $e,or as et,p as tt,pt as nt,q as rt,sr as it,st as at,vn as ot,wt as st,y as ct,z as lt}from"./sdk-batch.js";import{a as ut,n as dt,o as ft,r as pt,s as mt,t as ht}from"./target-evidence.js";import{a as gt,i as _t,n as vt,o as yt,r as bt,s as xt,t as St}from"./vars.js";import{n as Ct,r as wt,t as Tt}from"./target-evidence-tree.js";import{g as Et,i as Dt}from"./observability.js";import{t as Ot}from"./app-inventory.js";import{l as kt}from"./exec.js";import{i as At}from"./retry.js";import{d as F,l as jt,u as Mt}from"./daemon-resolution.js";import{n as Nt,r as Pt}from"./output-path.js";import"./command.js";import{a as Ft}from"./version.js";import"./retry2.js";import{t as It}from"./project-runtime.js";import{t as Lt}from"./keyed-lock.js";import{i as Rt,n as zt}from"./replay-divergence.js";import{n as Bt,t as Vt}from"./deploy-result-target.js";import{i as Ht}from"./snapshot-chrome.js";import{a as Ut,d as Wt,f as Gt,g as Kt,l as qt,o as Jt,r as Yt,u as Xt}from"./replay-script-selection.js";import{a as Zt,i as Qt,n as $t,o as en,r as tn}from"./request-cancel.js";import{t as nn}from"./request.js";import{n as rn}from"./provider-device-admission.js";import{i as an,o as on,t as sn}from"./device-claim-inspection.js";import{t as cn}from"./audio-probe-result.js";import{A as ln,D as un,E as dn,N as fn,O as pn,P as mn,R as hn,T as gn,_ as _n,a as vn,c as yn,d as bn,f as xn,g as Sn,h as Cn,j as wn,k as Tn,l as En,m as Dn,o as On,p as kn,v as An,w as jn}from"./platform-request-scope.js";import{n as I,r as Mn}from"./device-isolation.js";import{a as Nn,i as Pn,n as Fn,r as In}from"./device-inventory-context.js";import{d as Ln}from"./selector-pipeline-policy.js";import{i as Rn,o as zn}from"./durable-capture-resource.js";import{$t as Bn,A as Vn,At as Hn,B as Un,Bt as Wn,C as Gn,D as Kn,E as qn,Et as Jn,F as Yn,Ft as Xn,G as Zn,Gt as Qn,H as $n,Ht as er,I as tr,It as nr,Jt as rr,K as ir,Kt as ar,L as or,Lt as sr,M as cr,Mt as lr,Nt as ur,O as dr,Ot as L,P as fr,Pt as pr,R as mr,Rt as hr,S as gr,T as _r,V as vr,Vt as yr,Wt as br,Xt as xr,Yt as Sr,Zt as Cr,_ as wr,_t as Tr,a as Er,at as Dr,b as Or,bt as kr,d as Ar,dt as jr,f as Mr,ft as Nr,g as Pr,gt as Fr,h as Ir,j as Lr,jt as Rr,k as zr,l as Br,m as Vr,mt as Hr,o as Ur,ot as Wr,p as Gr,pt as Kr,qt as qr,s as R,tt as z,u as Jr,ut as Yr,v as Xr,w as Zr,wt as Qr,x as $r,y as ei,z as ti,zt as ni}from"./internal/daemon.js";import{n as ri,r as ii}from"./device-selection-resolver.js";import{n as ai,r as oi}from"./doctor-lines.js";import{t as si}from"./replay-backend-registry.js";import{c as ci,d as li,f as ui,g as di,h as fi,i as pi,l as mi,o as hi,p as gi,r as _i,s as vi,t as yi,u as bi}from"./session-replay-runtime-failure-response.js";import{n as xi}from"./snapshot-node-lookup.js";import{n as Si}from"./replay2.js";import{c as Ci,f as wi,o as Ti,r as Ei}from"./runtime-session.js";import{t as Di}from"./record-runtime.js";import{a as Oi,i as B,n as V,r as H,t as ki}from"./session-runtime-admission.js";import{n as Ai}from"./gesture-runtime.js";import{t as ji}from"./snapshot-runtime.js";import{createHash as Mi}from"node:crypto";import U,{promises as Ni}from"node:fs";import W from"node:path";import{setTimeout as Pi}from"node:timers/promises";function Fi(e){throw new r(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Ii(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:Fi(t)}}function Li(e){let t=Ii(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Jn(n,e.meta?.tenantId)},cleanup:()=>{Qr(n)}}}function G(e,t,n){return t||Yr(n)?null:l(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`,u())}function Ri(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function K(e){return jr(e.flags)||!e.session?await Wt(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await zi(e.session.device,e.platformServices)}async function zi(e,t){if(rn(e)||!P(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await t.appleSessionObservation.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Wt(n)}catch(e){if(!(e instanceof r)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Wt({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Bi(e,t){return t?ti(t,e).length===0:!1}async function Vi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),o=i?.session,s,c,l;try{s=Li(t);let a=Gi(t),u=await Ui(o,t.flags,e.platformServices),d=await H(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 V(e.bindDevice)(u,He);await p.operations.ensureReady({}),c=await p.operations.materializeAppSource({source:s.source}),l=await Ki({artifact:c,retention:a,req:t,session:o,sessionName:n}),i&&z(r.requireCurrent(i));let m=await p.operations.deployMaterializedApp({artifact:c}),h=qi(u,c,m,l),_=g(h,`Installed: ${Bt(h)}`);return L(r,i,t,`install_source`,_,{positionals:[]}),{ok:!0,data:_}}catch(e){return l&&await zr(l.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:a(e)}}finally{await c?.cleanup(),s?.cleanup()}}async function Hi(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 zr(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:a(e)}}}async function Ui(e,t,n){let i=Wi(t?.platform);if(e&&i&&!_e(e.device,i))throw new r(`INVALID_ARGS`,`install_from_source requested platform ${i}, but session is bound to ${j(e.device)}`);if(!e&&!i)throw new r(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await K({session:e,flags:t,platformServices:n})}function Wi(e){return e===`ios`||e===`android`?e:void 0}function Gi(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 Ki(e){if(e.retention.enabled)return await Lr({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 qi(e,t,n,r){return P(e)?Ji(t,n,r):Yi(t,n,r)}function Ji(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{...Zi(n),bundleId:i,...Xi(t,e),launchTarget:t.launchTarget??i}}function Yi(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{...Zi(n),packageName:i,...Xi(t,e),launchTarget:t.launchTarget??i}}function Xi(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Zi(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Qi(e){let{req:t,session:n,inspectFacts:r,bindDevice:i,platformServices:a}=e,o=$i(t);if(!o.ok)return o.response;let s=G(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await K({session:n,flags:t.flags,platformServices:e.platformServices}),u=await R({device:c,inspectFacts:r,bindDevice:i,platformServices:a,command:`runtime port-reverse`,use:Le});if(u.type===`response`)return u.response;if(u.runtime.owner.kind!==`provider-runtime`||u.runtime.owner.provider!==o.options.provider)return l(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:o.options.provider});let d=await u.runtime.operations.configureProviderPortReverse(o.options);return d?{ok:!0,data:{action:`port-reverse`,...d}}:l(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function $i(e){let t=ea(e);if(!t.ok)return t;let n=ta(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 ea(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function ta(e){let t=na(e.flags?.devicePort),n=na(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function na(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function ra(e){return await R({...e,command:`runtime clear`,use:Pe})}async function ia(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Qi({req:t,session:r.get(n),inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await aa({...e,session:r.get(n)});if(!oa(i))return l(`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 sa({sessionName:n,sessionStore:r,ref:a,current:s,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice}):i===`show`?ca(n,s):ua({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function aa(e){if(!e.session)return l(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await Ai({device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=$n(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 oa(e){return e===`set`||e===`show`||e===`clear`}async function sa(e){let{sessionName:t,sessionStore:n,ref:r,current:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=r?n.requireCurrent(r):void 0;if(Gr(i)&&c?.appBundleId){let e=await ra({device:c.device,inspectFacts:a,bindDevice:o,platformServices:s});if(e.type===`response`)return e.response;let t=n.requireCurrent(r);z(t),await e.runtime.operations.clearRuntimeHints({appId:t.appBundleId,values:wr(i)})}let l=r?n.clearRuntimeHints(r):!!i;return r||n.setRuntimeHints(t,void 0),{ok:!0,data:{session:t,cleared:l}}}function ca(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function la(e){return e?j(e.device):void 0}function ua(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=la(i),s=Or(t.flags?.platform??a?.platform??o);if(!s)return l(`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 l(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Ir(a,Ar(t.flags,s));return Mr(c)===0?l(`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 da=/^[A-Za-z0-9_.:-]{1,64}$/,fa=8192,pa=4096;function ma(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new r(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!da.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:ga(n,t)}}function ha(e,t,n){let i=j(e),a=_a(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>pa)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:pa});return s}function ga(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`)>fa)throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${fa} bytes`);return n}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function _a(e){return((P(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:N(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 va(e,t,n,r){let{eventName:i,payload:a}=ma([...r]),o=ha(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Er(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...m(`Triggered app event: ${i}`)}}async function ya(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o}=e,s=await R({command:`trigger-app-event`,device:t,use:Xe,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>va(c,t,e,n)}}function ba(e){let t=(e[0]??`status`).toLowerCase();if(!Ht(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 xa(t)}function xa(e){return e===`get`?`status`:e===`return`?`enter`:e}const Sa={"ime-probe":`android`},Ca={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},wa={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function Ta(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Er(e)}}async function Ea(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 Da(e,t){return e.operations.keyboardStatus(Ta(t)).then(e=>({platform:Sa[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 Oa(e,t){let n=await e.operations.keyboardDismiss(Ta(t)),r=Ca[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...m(ja(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...m(`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 ka(e,t){let n=await e.operations.keyboardEnter(Ta(t)),r=wa[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...m(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...m(`Keyboard enter pressed`)}}async function Aa(e){let t=ba(e.positionals),{device:n,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o}=e;return t===`status`?await Ea({command:`keyboard status`,device:n,use:Fe,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>Da(e,t)):t===`dismiss`?await Ea({command:`keyboard dismiss`,device:n,use:be,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>Oa(e,t)):await Ea({command:`keyboard enter`,device:n,use:st,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>ka(e,t))}function ja(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Ma(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=G(i,u,d);if(f)return f;let p=await K({session:u,flags:d,platformServices:e.platformServices});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&&kr(t)===`may-invalidate`&&z(h);let g=await m.execute();return l&&(s&&await s(l,g),L(r,l,t,i,g??{},{positionals:o??a})),{ok:!0,data:g??{}}}function Na(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return l(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Pa(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=t.positionals??[];return await Ma({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:c,platformServices:s,...e.updateSession?{updateSession:e.updateSession}:{},prepare:async(n,l)=>{let u=await e.resolveRuntime({device:n,positionals:c,readiness:!0,inspectFacts:a,bindDevice:o,platformServices:s});if(!u.ok)return{ok:!1,response:u.response};let d=l?i.requireCurrent(l):void 0,f={...$n(r,t.flags,d?.appBundleId,d?.trace?.outPath),surface:d?.surface};return{ok:!0,execute:()=>u.execute(f)}}})}async function Fa(e){return Na(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Pa({...e,command:D.keyboard,resolveRuntime:e=>Aa(e)})}async function Ia(e){return await Pa({...e,command:D.triggerAppEvent,resolveRuntime:e=>ya(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 e.platformServices.resolveSessionAppBundleIdForTarget(i.device,r,i.appBundleId);a!==void 0&&e.sessionStore.update(t,{appBundleId:a})}})}function La(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Ra(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(!U.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(La(i))return{kind:`inline`,text:i};throw new r(`INVALID_ARGS`,`${n} file not found: ${a}`)}async function za(e){let t=Ra(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ba(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 Ba(e){try{return await Ni.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 Va(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.lookup(r),o=a?.session,s=t.flags??{},c=G(n,o,s);if(c)return c;let u=qa(n,t.positionals??[]);if(!u.ok)return u.response;let d=t.meta?.uploadedArtifactId;try{let r=d?Jn(d,t.meta?.tenantId):F(u.appPathInput);if(!U.existsSync(r))return l(`INVALID_ARGS`,`App binary not found: ${r}`);let c=await K({session:o,flags:s,platformServices:e.platformServices}),f=await H(e.inspectFacts)(c),p=B(n,f.operations.deployApp);if(p)return p;let m=await V(e.bindDevice)(c,Be);a&&z(i.requireCurrent(a));let h=await m.operations.deployApp({app:u.app,appPath:r,replaceExisting:n===`reinstall`}),_=Ua(c,u.app,r,h),v=g(_,`Installed: ${_.appName??Vt(_)}`);return Ka(i,a,_),L(i,a,t,n,v),{ok:!0,data:v}}finally{d&&Qr(d)}}async function Ha(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),a=i?.session,o=t.flags??{},s=G(`push`,a,o);if(s)return s;let c=t.positionals?.[0]?.trim(),u=t.positionals?.[1]?.trim();if(!c||!u)return l(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let d=await za(Ja(u,t.meta?.cwd)),f=await K({session:a,flags:o,platformServices:e.platformServices}),p=await H(e.inspectFacts)(f),m=B(`push`,p.operations.ensureReady)??B(`push`,p.operations.sendPushNotification);if(m)return m;let h=await V(e.bindDevice)(f,Ne);await h.operations.ensureReady({}),i&&z(r.requireCurrent(i));let _=await h.operations.sendPushNotification({appId:c,payload:d}),v=P(f)?g({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):g({platform:j(f),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return L(r,i,t,`push`,v,{positionals:[c,u]}),{ok:!0,data:v}}function Ua(e,t,n,r){return P(e)?Wa(t,n,r):Ga(e,t,n,r)}function Wa(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 Ga(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 Ka(e,t,n){!t||n.platform!==`harmonyos`||!n.appId||e.update(t,{appBundleId:n.appId,appName:n.appName??n.app})}function qa(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:l(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:l(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ja(e,t){let n=Ra(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>F(e,t)});return n.kind===`file`?n.path:n.text}async function Ya(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}=e;return t.command===`install`||t.command===`reinstall`?await Va({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):t.command===`install_source`?await Vi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):t.command===`push`?await Ha({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):null}async function Xa(e,t,n){return await b(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Za=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 Qa(e){return Za.has(e)}const $a=new Map(qe.map(e=>[e.name,e]));function eo(e){let t=new Set;for(let n of e){let e=to(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function to(e){let t=$a.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(Qa)?n:void 0}function no(e){if(e!==void 0&&e.remainingSteps.length!==0)return eo(e.remainingSteps)}function ro(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:Fr(e),plannedOperations:no(e.internal?.executionPlan)}}function io(e,t,n){let r=e.requireCurrent(t);e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:r.name,...m(`Closed: ${r.name}`)}})}function ao(e,t,n){let r=e.requireCurrent(t);if(!ur(r))return{kind:`not-armed`};let i=r.actions.length;io(e,t,n);let a=br(r),o=e.writeSessionLog(t,{force:yr(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`}:(Hn(r),{kind:`aborted`})}function oo(e,t){let n=a(t),r=xr(e.scriptPublication??rr);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...r?{savedScript:r}:{}},retriable:!0}}}function so(e){let{req:t,ref:n,sessionStore:r,platformCloseError:i}=e,a=r.requireCurrent(n);i||io(r,n,t);try{let e=r.writeSessionLog(n,{force:yr(a,t.flags?.force)});e.written&&ar(a,e.path);return}catch(e){return co(e)}}function co(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: ${a(e).message}`,t)}async function lo(e){let t=e.clearRuntimeHints?ve:lt,n=await Ur({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,lt)};let r=await n.bind(e.device,ve);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function uo(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 fo(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&&Gr(h)&&await p(`runtime_hints`,async()=>{await o({appId:f.appBundleId,values:wr(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`,()=>Vn(d)),{platformCloseError:g,saveScriptError:v,shutdownResult:_?.shutdown}}async function fo(e,t,n,r){let i=t.resolveCurrent(e)??e.session;await n(`recording`,()=>Gn({ref:e,sessionStore:t})),await n(`app_log`,()=>_r({ref:e,sessionStore:t})),await n(`audio_probe`,()=>gr({ref:e,sessionStore:t})),await n(`perf_capture`,()=>qn({ref:e,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Kn(i,r))}function po(e,t){return Zr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function mo(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 ho=(e,t)=>(e.positionals?.length??0)>0||dr(t);async function go(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=i.requireCurrent(n),s=ur(o),c=JSON.stringify(t.positionals??[]);if(s&&!lr(o,c)){let e=await vo({req:t,session:o,logPath:r,lifecycle:a});if(e)return{response:oo(o,mo(e))};nr(i.requireCurrent(n),c)}let l=ao(i,n,t);return l.kind===`failed`?{response:oo(o,l.error)}:{repairArmed:s,...l.kind===`committed`&&l.path?{healedScriptPath:l.path}:{},...l.kind===`aborted`?{aborted:!0}:{}}}async function _o(e){try{return{providerData:await Nr(e)}}catch(t){let n=a(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 vo(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(ho(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:ro(t,r,n.trace?.outPath)});return}catch(e){return e}}function yo(e,t){if(!e.flags?.saveScript||er(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 bo(e){let{req:t,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.lookup(n);if(!c)return await wo({req:t,logPath:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});let u=a.requireCurrent(c);yo(t,u);let d=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!d)return l(`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 f=e.platformResourceCleanup,p=await lo({device:u.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!u.appBundleId&&Gr(a.getRuntimeHints(n)),inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(p.type===`response`)return p.response;if(u=a.requireCurrent(c),z(u),t.internal?.closeAppOnly===!0&&d)return await Co({req:t,session:u,logPath:i,lifecycle:p.runtime,app:d});let m=await go({req:t,ref:c,logPath:i,sessionStore:a,lifecycle:p.runtime});if(`response`in m)return m.response;let h=await xo({req:t,ref:c,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:p.runtime,clearRuntimeHints:p.clearRuntimeHints,repairArmed:m.repairArmed,platformResourceCleanup:f});return h.kind===`response`?h.response:So({session:u,repair:m,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:h.shutdownResult,providerData:h.providerData})}async function xo(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 uo({req:t,ref:n,logPath:r,sessionStore:i,lifecycle:s,clearRuntimeHints:c,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:vo,finalizeOrdinaryCloseScript:so,platformResourceCleanup:e.platformResourceCleanup}),m=i.requireCurrent(n),h=await _o({session:m,leaseRegistry:a,leaseLifecycleProvider:o});if(h.response)return{kind:`response`,response:h.response};m=i.resolveCurrent(n)??m;let g=po(l,u),_=d??g;if(_?m.deviceClaim&&A({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:m.deviceClaim.deviceKey,session:l}}):await fn(m.deviceClaim),i.retire(n),_)throw _;if(f)throw f;return{kind:`closed`,providerData:h.providerData,shutdownResult:p}}function So(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:g({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...m(c),...o,...s}}}async function Co(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await vo({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...m(`Closed: ${a}`)}}}async function wo(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i,platformServices:a}=e;if(!t.positionals||t.positionals.length===0)return l(`SESSION_NOT_FOUND`,`No active session`);let o=await lo({device:await K({session:void 0,flags:t.flags,platformServices:a}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i,platformServices:a});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:ro(t,n)}),{ok:!0,data:{app:t.positionals[0],...m(`Closed: ${t.positionals[0]}`)}})}function To(e,t){return e.operations.ensureReady(t)}function Eo(e,t,n){return e.operations.listApps({device:t,filter:n})}async function Do(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return Oo(t,r);case`devices`:return await Ao(t);case`capabilities`:return await Ro({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,platformServices:e.platformServices});case`apps`:return await Wo({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,platformServices:e.platformServices,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function Oo(e,t){let n=tr(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>or(e.session,n)).map(e=>ko(e,t))}}}function ko({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Mt(r),platform:j(t.device),...M(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,...M(t.device.platform)&&!N(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function Ao(e){try{let t=jo();return{ok:!0,data:{devices:(await No(e)).map(e=>({...Zo(e),...Mo(e,t)}))}}}catch(e){let n=t(e);return{ok:!1,error:{code:n.code,message:n.message,...n.details?{details:n.details}:{}}}}}function jo(){let e=new Map;for(let t of an({})){let n=t.claim;!n||sn(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function Mo(e,t){let n=t.get(on(mn(e)));return n?{claimedBy:n}:{}}async function No(e){let t=e.flags?.platform;return Lo(await Fn(Po(e,t)),e.flags?.platform,e.flags?.target)}function Po(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Fo(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Io(n?.androidDeviceAllowlist)}}function Fo(e,t,n){return me({simulatorSetPath:Mn(e),platform:t,target:n})}function Io(e){let t=I(e);return t?Array.from(t).sort():void 0}function Lo(e,t,n){let r=t?e.filter(e=>Qo(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Ro(e){let t=await Xo({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=zo(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await qo(n,e.inspectFacts);return{ok:!0,data:{device:Zo(n),availableCommands:ct().filter(e=>e===`appstate`&&r?!0:Ho(e,i))}}}function zo(e,t,n){return!t||!P(e)&&!N(e)||!Bi(n,t)?!1:Bo(t)||Vo(e,t)}function Bo(e){return!!(e.appName||e.appBundleId)}function Vo(e,t){return!!(N(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Ho(e,t){let n=tt(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Uo(t,e)))}function Uo(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Wo(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a,platformServices:o}=e,s=await Go(t,e.providerAppCatalog);if(s)return s;let c=await Xo({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`,platformServices:o});if(`response`in c)return c.response;let{device:l}=c,u=Ot(t.flags?.appsFilter),d=I(t.flags?.androidDeviceAllowlist),f=await Jo({device:l,inspectFacts:a,bindDevice:i,platformServices:o});if(`response`in f)return f.response;let p=f.runtime;return Yo(await Eo(p,await To(p,{serial:t.flags?.serial,androidSerialAllowlist:d?[...d].sort():void 0}),u))}async function Go(e,t){let n=Ko(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,tn(e.meta?.requestId))]}}}function Ko(e){let t=Hr(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 qo(e,t){if(t)try{return await t(e)}catch{return}}async function Jo(e){let t=await H(e.inspectFacts)(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);return n&&!n.available?{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}}:{runtime:await V(e.bindDevice)(e.device,at)}}function Yo(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Xo(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i,platformServices:a}=e,o=r.get(n),s=t.flags??{},c=G(t.command,o,s);return c?{response:c}:{device:await K({session:o,flags:s,platformServices:a,androidAvdSelection:i})}}function Zo({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:j({platform:r.platform,appleOs:n}),...M(r.platform)&&n?{appleOs:n}:{}}}function Qo(e,t){return _e(e,t)}function $o(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function es(e){return l(`INVALID_ARGS`,e)}function ts(e,t,n,i,a){try{return e.resolveRequestedOpenSurface({device:t,surfaceFlag:n,openTarget:i,existingSurface:a})}catch(e){return l(e instanceof r?e.code:`INVALID_ARGS`,String(e.message))}}async function ns(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i,platformServices:a}=e;if(!t)return null;let o=await a.validateOpenRelaunchTarget({target:n,platform:i.platform,surface:r});return o?es(o):null}async function rs(e){let{shouldRelaunch:t,openTarget:n,platform:r,platformServices:i}=e;if(!t)return null;let a=await i.validateOpenRelaunchTarget({target:n,platform:r});return a?es(a):null}function is(e){let t=$r(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:Gr(n),clearRemovedRuntimeHints:ei({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function as(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&&!y(a??``),execution:{startupDeadlineAtMs:ss(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:Fr(t)}});let{appBundleId:d,appName:f}=await os({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 Vr({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 os(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 ss(e){return $o(e.flags?.timeoutMs)}async function cs(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:l(`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:l(`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:l(`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 ls(e){let{req:t,ref:n,logPath:r,sessionStore:i,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let a=await ji({createCommandSurface:e.createCommandSurface,req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n.address,sessionRef:n,logPath:r,sessionStore:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return a.ok?{ok:!0,data:{...o.data,snapshot:a.data}}:us(o.data,a.error)}catch(e){return us(o.data,a(e))}}function us(e,t){return{ok:!0,data:{...e,warnings:[..._(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function ds(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:h,selection:g,launchConfirmation:_}=e,v={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:h,...fs(g)};return o&&(v.appName=o),s&&(v.appBundleId=s),l&&(v.startup=l),u&&(v.timing=u),_&&(v.launchConfirmation=_),f&&p(f)>0&&(v.runtime=f),d&&(v.platform=j(d),v.target=d.target??`mobile`,v.device=d.name,v.id=d.id,v.kind=d.kind,ge(d.platform)&&(v.serial=d.id)),d&&P(d)&&(v.device_udid=d.id,v.ios_simulator_device_set=d.simulatorSetPath??null),{...v,...m(`Opened: ${o??s??t}`)}}function fs(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function q(e,t,n){n?(e.assertAdmissionOpen(n.address),e.requireCurrent(n)):e.assertPublishable(t)}function ps(e){let{req:t,sessionStore:n,sessionName:r,existingRef:i,device:a,surface:o,appBundleId:s,appName:c,deviceClaim:l}=e;if(q(n,r,i),i){let e=n.update(i,{device:a,surface:o,appBundleId:s,appName:c});return e.lease=Kr({req:t,existingLease:e.lease}),l&&(e.deviceClaim=l),Ti(e),n.refresh(i)}return n.publish(r,{name:Yn(t),sessionScope:t.internal?.resolvedSessionScope??tr(t),device:a,surface:o,appBundleId:s,appName:c,createdAt:Date.now(),actions:[],lease:Kr({req:t}),deviceClaim:l})}function ms(e,t){e.warnings=[..._(e),t]}function hs(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Wn(t,{});return}er(n)&&(ni(t),ms(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 gs(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 _s(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function vs(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 ys(e,t){if(!t)return;let n=await hn(t);if(n.status!==`renewed`)return n.conflict?Jr(e,n.conflict):l(`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 bs(e){let{req:t,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingRef:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e;q(i,r,g);let b=g?i.requireCurrent(g):void 0,x=b?.snapshot,S=t.flags?.relaunch===!0,C=f,w=Date.now(),T=await xs({req:t,sessionName:r,sessionStore:i,device:o,surface:d,sessionAppBundleId:C,appName:u,existingRef:g});if(T.type===`response`)return T;let E=T.ref;q(i,r,E);let ee=E?i.requireCurrent(E):void 0,D=Date.now(),O=await m.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:C,surface:d,hasExistingSession:b!==void 0,relaunch:S,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:_s(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:wr(p),applyRuntimeHints:h,execution:ro(t,a,ee?.trace?.outPath)});C=O.appBundleId??C;let k={...O.timing},te=ri(y),ne=s?vs(D,s,C):void 0;if(Qt(t.meta?.requestId)){let e=n();return{type:`response`,response:l(e.code,e.message,e.details)}}q(i,r,E),g&&Zn({session:i.requireCurrent(g),command:`open`,positionals:[],flags:void 0,androidFreshnessBaseline:x});let re=i.ensureSessionDir(r),ie=jt(re,t.meta?.requestId??fe().requestId);k.totalDurationMs=Math.max(0,Date.now()-w),A({level:`info`,phase:`open_timing`,durationMs:k.totalDurationMs,data:k});let ae=ds({sessionName:ee?.name??Yn(t),sessionStateDir:re,runnerLogPath:Mt(re),requestLogPath:ie,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:C,surface:d,startup:ne,timing:k,device:o,runtime:p,runtimeHintCount:Mr,sessionReused:b!==void 0,selection:te,launchConfirmation:O.launchConfirmation});v&&ms(ae,gs(v));let oe=ps({req:t,sessionStore:i,sessionName:r,existingRef:E,device:o,surface:d,appBundleId:C,appName:u,deviceClaim:_}),se=i.requireCurrent(oe);return ir(se,k.postOpenObservation),t.runtime!==void 0&&Xr(i,r,p),hs({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 xs(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=ps({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}:(q(r,n,o),{type:`session`,ref:r.refresh(o)})}function Ss(e){return e.internal?.admittedLease?.backend===`macos-app`}function Cs(e){let{req:t,device:n,sessionStore:r}=e,i=Ss(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=cr(t);return fr(t,i.session)?vr(i,n,a):Un(i,n,a)}async function ws(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o,platformServices:s}=e;switch(Br(r,t.internal?.admittedLease)){case`none`:return{status:`not-required`};case`ordinary`:return await wn({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:s.deviceBootObservation})}}async function Ts(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,platformServices:m}=e;q(i,n,void 0);let h=Cs({req:t,device:a,sessionStore:i});if(h)return{type:`response`,response:h};let g=await ws({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f,platformServices:m});if(g.status===`conflict`)return{type:`response`,response:Jr(a,g.conflict)};let _=g.status===`acquired`?g.ownership:void 0,v=g.status===`acquired`?g.tookOver:void 0,y={mayHaveStarted:!1},b=async()=>await Es({ownership:_,effects:y,sessionName:n,sessionStore:i});try{q(i,n,void 0);let e=await as({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 b(),{type:`response`,response:e.response};let f=await ys(a,_);if(f)return{type:`response`,response:f};y.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,g=await bs({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:_,tookOverDeviceClaim:v,selection:p});return g.response.ok||await b(),g}catch(e){throw await b(),e}}async function Es(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await fn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await ln(t);A({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const Ds=new Map;async function Os(e){let t=Ve({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Ur({...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,Re)};case`open-apply-runtime-hints`:{let t=await r(e.device,Oe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,rt);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,Ce);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ks(e){let t=is(e);if(t.type===`response`)return t;let n=await Os({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function As(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.lookup(t),a=await cs({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(q(r,t,i),i){let a=r.requireCurrent(i);if(o.flags?.saveScript)return{type:`response`,response:l(`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],u=c??(s?a.appName:void 0),d=ts(e.platformServices,a.device,o.flags?.surface,u,a.surface);if(typeof d!=`string`)return{type:`response`,response:d};if(!u&&d===`app`)return{type:`response`,response:es(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 ns({shouldRelaunch:s,openTarget:u,surface:d,device:a.device,platformServices:e.platformServices});if(f)return{type:`response`,response:f};let p=r.requireCurrent(i),m=await ys(p.device,p.deviceClaim);if(m)return{type:`response`,response:m};let h=await zi(a.device,e.platformServices),g=ii(h);await o.internal?.retainDeviceExecutionLock?.(h.id);let _=await ks({req:o,sessionStore:r,sessionName:t,device:h,existingSession:a,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(_.type===`response`)return{type:`response`,response:_.response};let{admission:v,runtimeHintPlan:y}=_;q(r,t,i);let b=r.requireCurrent(i);z(b);let x=await as({req:o,logPath:n,surface:d,openTarget:u,existingSession:b,runtime:v.runtime,runtimeHintPlan:y,clearRuntimeHints:v.clearRuntimeHints,foreground:!1});if(x.type===`response`)return{type:`response`,response:x.response};q(r,t,i);let S=await ys(h,r.requireCurrent(i).deviceClaim);return S?{type:`response`,response:S}:await bs({req:o,sessionName:t,sessionStore:r,logPath:n,device:h,openTarget:u,openPositionals:c?o.positionals??[]:u?[u]:[],appBundleId:x.details.appBundleId,appName:x.details.appName,runtimeHints:x.details.runtime,lifecycle:v.runtime,applyRuntimeHints:v.applyRuntimeHints,surface:d,existingRef:i,selection:g})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return{type:`response`,response:es(`open --relaunch requires an app argument.`)};let u=await rs({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0,platformServices:e.platformServices});if(u)return{type:`response`,response:u};let d=await Gt(o.flags??{},qt(c)),f=d.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=ts(e.platformServices,f,o.flags?.surface,c);if(typeof p!=`string`)return{type:`response`,response:p};let m=await ns({shouldRelaunch:s,openTarget:c,surface:p,device:f,platformServices:e.platformServices});if(m)return{type:`response`,response:m};let h=await ks({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(h.type===`response`)return{type:`response`,response:h.response};let{admission:g,runtimeHintPlan:_}=h;return await Lt(Ds,f.id,async()=>await Ts({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,platformServices:e.platformServices,selection:d}))}async function js(e){let t=await As(e),n=t.response;return t.type!==`opened`||e.req.flags?.foreground!==!0?n:await ls({...e,inspectFacts:H(e.inspectFacts),bindDevice:V(e.bindDevice),openResponse:n,ref:t.ref})}const Ms=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Ns=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Ps(e){return t=>l(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 Fs(e){return e.available?null:l(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Is(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Ls(e,n){if(!n.appBundleId)return;let r=await R({command:`appstate`,device:n.device,use:Ge,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(r.type!==`response`)try{return(await r.runtime.operations.appState({appBundleId:n.appBundleId})).applicationState}catch(e){if(c(e))throw e;A({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:t(e).code,message:t(e).message}});return}}async function Rs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Ri(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 l(`SESSION_NOT_FOUND`,e)}let s=G(`appstate`,i,a);if(s)return s;let c=M(i?.device.platform)&&Bi(a,i),u=o===`ios`,d=o===`macos`;if(u&&!c)return l(`SESSION_NOT_FOUND`,Ms);if(d&&!c)return l(`SESSION_NOT_FOUND`,Ns);if(c&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(N(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=N(i.device)?`macOS`:`iOS`;return l(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await Ls(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`,...P(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let f=await K({session:i,flags:a,platformServices:e.platformServices});if(P(f))return l(`SESSION_NOT_FOUND`,Ms);if(N(f))return l(`SESSION_NOT_FOUND`,Ns);let p=await R({command:`appstate`,device:f,use:Ge,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,unavailableResponse:e=>l(`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:Bs(a.androidDeviceAllowlist)});let h=await m.operations.appState();return{ok:!0,data:{platform:j(f),package:h.package,activity:h.activity}}}async function zs(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command===`boot`){let a=i.get(r),o=n.flags??{},s=G(n.command,a,o);if(s)return s;let c=I(o.androidDeviceAllowlist),u=c?[...c].sort():void 0,d=Me({headless:o.headless===!0}),f;try{f=await K({session:a,flags:o,androidAvdSelection:`include-stopped`,platformServices:e.platformServices})}catch(e){let n=t(e);if(d.kind===`boot-target-headless`&&!Is(o.device,a?.device)&&n.code===`DEVICE_NOT_FOUND`)return l(`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 l(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${o.target}.`);let p=await Ur({command:`boot`,device:f,required:d.use.required,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,unavailableResponse:Ps(d.kind===`boot-target-headless`)});if(p.type===`response`)return p.response;let m={serial:o.serial,androidSerialAllowlist:u,deadlineAtMs:$o(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:j(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...M(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}}}if(n.command===`shutdown`){let t=i.get(r),a=n.flags??{},o=G(n.command,t,a);if(o)return o;let s=await K({flags:a,session:t,androidAvdSelection:`include-stopped`,platformServices:e.platformServices}),c=Fs((await H(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(t&&t.device.platform===s.platform&&t.device.id===s.id)return l(`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 u=await(await V(e.bindDevice)(s,ze)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u,...M(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:l(u.error?.code??`COMMAND_FAILED`,Vs(u),{platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u})}return n.command===`appstate`?await Rs({req:n,sessionName:r,sessionStore:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice}):null}function Bs(e){let t=I(e);return t?[...t].sort():void 0}function Vs(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Hs(e){return En.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Us(e){try{return await Ws(e)}catch(e){return{ok:!1,error:a(e)}}}async function Ws(e){let t=Gs(e);if(!t.ok)return t;let n=t.ref,r=e.sessionStore.requireCurrent(n),i=je(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 Ks(o,s);let l=Se({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 qs(e,n,i,l.use);case`capture-status`:return await Js(e,n);case`capture-stop`:return await Ys(e,n)}}function Gs(e){let t=e.sessionStore.lookup(e.sessionName);return t?{ok:!0,ref:t}:l(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Ks(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return l(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function qs(e,t,n,r){let i=e.sessionStore.requireCurrent(t),a=Rn(e.sessionStore,t);i.audioProbe&&(await Tn({intent:`disposal`,binding:a}),i=e.sessionStore.requireCurrent(t));let o=await e.bindDevice(i.device,r),s=pn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=pn.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:s,device:i.device}),l=W.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 un({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 Js(e,t){let n=Rn(e.sessionStore,t),r=n.read();if(!r)return{ok:!0,data:Xs()};let i=await r.handle.status();return i.state===`stopped`&&await Tn({intent:`disposal`,binding:n}),{ok:!0,data:i}}async function Ys(e,t){let n=Rn(e.sessionStore,t);return n.read()?{ok:!0,data:await Tn({intent:`capture`,binding:n})}:{ok:!0,data:Xs()}}function Xs(){return cn({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 Zs(e){let t=e.sessionStore.lookup(e.sessionName);if(!t)return l(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let n=e.sessionStore.requireCurrent(t),i={...e,ref:t};try{if(Et(e.req.positionals?.[0]))throw new r(`INVALID_ARGS`,Dt);_c(e.req);let t=vn({positionals:e.req.positionals,kind:yc(e.req.flags?.kind),outPath:yc(e.req.flags?.out)}),a=On(t);if(a.kind===`capture-stop`)return Qs(i,await nc(i,n,a.request));let o=await ki({device:n.device,plan:a,inspectFacts:e.inspectFacts});return o.admitted?Qs(i,await $s(i,n,o)):B(`perf`,o.fact)??l(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:a(e)}}}function Qs(e,t){return t.ok&&L(e.sessionStore,e.ref,e.req,`perf`,S(t.data)?{...t.data}:{}),t}async function $s(e,t,n){let{device:i,plan:a}=Oi(n),o=V(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:cc(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:pc(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:mc(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?F(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:W.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await ec(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=gc(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:F(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function ec(e,t,n,r){if(t.perfCapture)return l(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return l(`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=gc(e,r.outPath,i),o=dn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=dn.createNextFence({admissionLedger:tc(e),resourcePath:o,device:t.device}),c=zn(e.sessionStore,e.ref);c.assertAdoptable();let u=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 jn({admissionLedger:tc(e),binding:c,device:t.device,owner:n.owner,fence:s,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:u.response}}function tc(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 nc(e,t,n){let r=t.perfCapture;if(!r)return l(`INVALID_ARGS`,`no active native perf capture`);let i=sc(r.handle.inspect(),n);if(i)return l(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(F(n.outPath,e.req.meta?.cwd));let a=await gn({intent:`capture`,binding:zn(e.sessionStore,e.ref)});if(n.area===`cpu`){let t=rc(a);e.sessionStore.update(e.ref,{lastPerfProfile:t})}return{ok:!0,data:a}}function rc(e){if(ic(e)||ac(e))return e;throw new r(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function ic(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function ac(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&oc(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function oc(e,t){return t.every(t=>typeof e[t]==`string`)}function sc(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 cc(e,t){return{...hc(e),metrics:{fps:lc(t.metric,e)},sampling:{fps:t.sampling}}}function lc(e,t){if(!S(e)||e.available!==!0)return e;let n=uc(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function uc(e,t){let n=dc(t.windowStartedAt),r=dc(t.windowEndedAt)??dc(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:fc(e)})).slice(-12)}function dc(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function fc(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function pc(e,t){return{...hc(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function mc(e,t){return{...hc(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function hc(e){return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id}}function gc(e,t,n){return t?F(t,e.req.meta?.cwd):W.join(e.sessionStore.ensureSessionDir(e.sessionName),`${vc()}-${n}`)}function _c(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 vc(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function yc(e){return typeof e==`string`&&e.length>0?e:void 0}const bc=[`dump`,`log`],xc=`network requires ${bc.join(` or `)}`,Sc=`network include mode must be one of: ${s.join(`, `)}`,Cc=2048;async function wc(e){let t=e.sessionStore.get(e.sessionName);if(!t)return l(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=Tc(e.bindDevice),r=(await n(t.device,Ze)).facts.networkDump;if(!r.available)return Ac(r.hint);let i=Ec(e.req);if(!i.ok)return i;let a=Ae({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return jc(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:Cc,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:a(e)}}}function Tc(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Ec(e){let t=Dc(e);if(!t.ok)return t;let n=Oc(e);if(!n.ok)return n;let r=kc(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Dc(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return bc.includes(t)?{ok:!0,action:t}:l(`INVALID_ARGS`,xc)}function Oc(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?l(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function kc(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return l(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return s.includes(r)?{ok:!0,include:r}:l(`INVALID_ARGS`,Sc)}function Ac(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function jc(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:Cc,maxScanLines:e.entries.length},notes:e.notes}}}function Mc(e,t){let n=Dn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Nc(e.appLogFailure)]:Pc(n.state)}}function Nc(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Pc(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 Fc(e,t){return it([...e,...t.notes??[]])}async function Ic(e){let{req:t}=e;return t.command===`perf`?await Zs({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Rc(e):t.command===`events`?await Lc(e):t.command===`network`?await wc(e):t.command===`audio`?await Us(Xc(e)):null}async function Lc(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:a(e)}}}async function Rc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n);if(!i)return l(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=r.requireCurrent(i),a=Zc({...e,session:n,ref:i}),o=(await a.bindDevice(n.device,Te)).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=Vc(ke({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),n);return`ok`in s?s:await zc(a,s)}catch(e){return{ok:!1,error:a(e)}}}async function zc(e,t){switch(t.kind){case`path`:return Hc(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Uc(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Bc(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Jc(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Wc(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Gc(e)}}async function Bc(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await qc(e,t.appBundleId,n.owner,n.operations.appLogStart):await Kc(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Vc(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):l(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Hc(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=_n(a),s=Mc(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 Uc(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Mc(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:Fc(t.notes,o)}}}function Wc(e,t,n){let r=n.resolveAppLogPath(t);return Sn(r,e),{ok:!0,data:{path:r,marked:!0}}}function Gc(e){return{ok:!0,data:xn(e)}}async function Kc(e,t,n,r){let{session:i,sessionStore:a}=e;i.appLog&&await kn({intent:`disposal`,ref:e.ref,sessionStore:a});let o=xn(e),s=await Yc(e,t,r,n);return s.ok?{ok:!0,data:{...o,restarted:!0}}:s}async function qc(e,t,n,r){let{session:i}=e;return i.appLog?l(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Yc(e,t,r,n)}async function Jc(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return l(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await kn({intent:`capture`,ref:e.ref,sessionStore:r}),{ok:!0,data:{path:i,stopped:!0}}}async function Yc(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=An.resolvePath(o.resolveSessionDir(a));try{let l=Hs({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device});bn(o,e.ref).assertAdoptable();let u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await yn({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:Cn({ref:e.ref,sessionStore:o,error:t})}}}function Xc(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,platformServices:e.platformServices,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Zc(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,platformServices:e.platformServices,appLogAdmissionLedger:e.appLogAdmissionLedger}}const Qc=new WeakMap;function $c(e){return{store:t=>el(e,t),finalize:(t,n)=>tl({...e,evidence:t,projection:n})}}function el(e,t){let{sessionStore:n,ref:r}=e;if(!r)throw Error(`Internal observation session is no longer available.`);let i=n.requireCurrent(r);wi(i,t);let a=i.snapshotGeneration;if(a===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let o={};return Qc.set(o,{ref:r,snapshot:t,snapshotGeneration:a,runtimeRevision:Dr(i),refFrame:Wr(i)}),{evidence:o,refsGeneration:a}}function tl(e){let t=Qc.get(e.evidence);Qc.delete(e.evidence);let n=rl(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&&nl(e,t);return!t||!r?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!il(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Ci(r,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function nl(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&&Dr(n)===t.runtimeRevision&&Wr(n)===t.refFrame?n:void 0}function rl(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 il(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function al(e){let t=ol(e),n=We(t);return Mi(`sha256`).update(n,`utf8`).digest(`hex`)}function ol(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)=>sl(e,n[t]??null,r?.[t]??null))}}function sl(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 cl(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=ll({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function ll(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>ul({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>dl({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>fl(n,r)];for(let e of s){let t=e();if(t)return t}}function ul(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 dl(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 fl(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 pl(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=O(e),a=te(e),o=al({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??ae(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=>cl(e,s,o)}}function ml(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function hl(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ue(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function gl(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 _l(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=gl(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ie(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 vl(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ie(e,r),...we(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 yl(e,t,n,r,i,a){if(n.targetEvidences)return bl(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return J(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return J(e,n,r,i,a);if(s.kind===`post-resolution`){let c=ml({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return J(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return Sl(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=hl({recorded:o,token:s.token});if(c.kind===`skip`)return J(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,xl(u),a,t)};let{classification:d}=u;return d.verified?Sl(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 bl(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 J(e,n,r,i,a);let d=hl({recorded:o[c],token:u.token});if(d.kind===`skip`)return J(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,xl(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 Sl(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function xl(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 J(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 Sl(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=Cl(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=wl(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 Cl(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 wl(e,t,n){return n.status===`guard-mismatch`?_l(e,n.evidence,t):vl(e,n.evidence)}async function Tl(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=St(e.varSources),o=[],s=[],c=kl(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Ol(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Al(u,n.length,r,e))}let d=xt(r,a,Dl(e,u)),f=vt(a),p=t.diagnosticsMarker(),m=await yl(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:El(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 El(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Dl(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Ol(e){return!!(e&&e.command!==`replay`)}function kl(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Ol(n))return n.command===`close`?t:void 0}}function Al(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}async function jl(e){return await Ml({...e,snapshotDiagnostics:C(e.snapshotDiagnosticSamples)})}async function Ml(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 _=Nl(t.error.details?.replaySource),v=_i(t.error),y=await hi({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:tn(u.meta?.requestId)});return yi({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Nl(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}}async function Pl(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();fi(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:Kt(o)??[]});let g;try{g=await Il({req:t,sessionName:n,resolved:o,sourceAction:i,invoke:f,resolvedSessionScope:p,dependencies:m,readinessTimeoutMs:e.readinessTimeoutMs})}catch(e){if(!(e instanceof r))throw e;g={ok:!1,error:a(e)}}let _=Date.now();return fi(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?Rl(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Fl(g,u??s,c)}function Fl(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 Il(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Bl(t.flags,r.flags,r.command);e.readinessTimeoutMs!==void 0&&(c.readinessTimeoutMs=e.readinessTimeoutMs);let l=i.command===`fill`?Bn(Cr(i)):void 0;return l&&(c.recordAs=l),await a(Ll({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 Ll(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:E(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:de(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Rl(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 zl(e,t){let{readinessTimeoutMs:n}=Bl(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 Bl(e,t,n){let r=x(e,{...t??{}});return Ke(n)&&r.readinessTimeoutMs===void 0&&(r.readinessTimeoutMs=2e3),r}function Vl(e){return Jl(e.ok?Ul(e.data):Hl(e.error.details?.artifactPaths))}function Hl(e){return Array.isArray(e)?e.filter(ql):[]}function Ul(e){return e?[Kl(e.path),Kl(e.outPath),...Wl(e.artifacts)].filter(ql):[]}function Wl(e){return Array.isArray(e)?e.map(Gl).filter(ql):[]}function Gl(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Kl(t.localPath)??Kl(t.path)}function Kl(e){return typeof e==`string`?e:void 0}function ql(e){return typeof e==`string`}function Jl(e){return[...new Set(e.filter(Yl))]}function Yl(e){try{return U.statSync(e).isFile()}catch{return!1}}function Xl(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Zl({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Ct(r),u=ye(t),d=wt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>pt(r,e)===t.sibling),p=d.filter(e=>ft(dt(e,l),t.scrollRegion)),m=ut(p)[t.viewportOrder]?.ref,h=mt({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,...eu({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Zl(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Ql(n,t,i,a):$l(n,t,r,a,o)}function Ql(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),o=e(n),s=o?d(t,o):null;if(a(s))return{matchedNodes:[s],winnerRef:s.ref};let c=r?xi(t,r):null;return a(c)?{matchedNodes:[c],winnerRef:c.ref}:{matchedNodes:[],winnerRef:``}}function $l(e,t,n,r,i){let a=ot(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 eu(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?tu(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?tu(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?tu(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 tu(e,t,n){let r=ht(t),i=Tt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ie(e,r),...we(e.ancestry,i)].slice(0,5)}function nu(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=ie(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ue(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!se(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(iu(r)&&iu(n[1])))return r}function ru(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function iu(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function au(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=zt(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:hu(ye(n),h),...t.observed?{observed:hu(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>gu(e,h))},_=li({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=ui({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(k(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=bi({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}}),x={code:t.causeCode,message:t.causeMessage};return yi({error:x,action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function ou(e,t,n){let r=zt(e.scrubVars);return au(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:pi(n,r),publicationEvidence:uu(n),repairCapture:mi(n)})}async function su(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await vi({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function cu(e,t){return ou(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 su({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function lu(e,t,n){return ou(e,t,await su({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function uu(e){return e.state===`available`?e.evidence:void 0}function du(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?xe(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:$e(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:nu(n,i),platform:a.device.platform}:{kind:`inactive`}}function fu(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=ci(r),s=Xl({recorded:t,token:n,nodes:i,platform:a,refLabel:ru(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:ht(s.winnerNode),structural:De(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?ht(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function pu(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function mu(e){return!e.ok&&e.error.details?.reason===Si}function hu(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function gu(e,t){let n=i(e.type??`Element`),r=ue(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function _u(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 vu(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 yu(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 bu(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 xu(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:vu(e?.observed),expectedStructural:bu(e?.expectedStructural),observedStructural:bu(e?.observedStructural)}}function Su(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:vu(e?.observed),observedAncestry:yu(e?.observedAncestry)}}function Cu(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function wu(e,t,n){let r=Cu(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&pu(e)?{status:`guard-mismatch`,evidence:xu(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&mu(e)?{status:`landmark-mismatch`,evidence:Su(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function Tu(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,Cu(Eu(e),Vl(e))),d=async e=>{let n=t.observationStore.get();return n?await vi({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 du({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:fu({recorded:e.targetEvidence,token:n,action:e,nodes:[...r.nodes],platform:i.device.platform})}},i=n.startsWith(`@`)?void 0:await zl(t.replayReq.flags,e);if(!i)return await r();let{observeUntil:a}=await import(`./selector-pipeline-policy.js`).then(e=>e.b),o=await a({capture:r,verdict:e=>Mu(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-Nu(o)),readiness:{polls:o.polls.length,waitedMs:o.waitedMs,end:o.kind}},A({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 Pl({...c?{readinessTimeoutMs:c.remainingBudgetMs}:{},req:_u(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,Vl(u).forEach(e=>r.add(e));let d=[...r];return u.ok?{status:`ok`,artifactPaths:d}:wu(u,s,d)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await cu(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=ou(l(e,t,r,i),n,a);return u(n.kind===`selector-miss`&&c?Pu(o,c.readiness):o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await lu(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=Eu(o),l=await Du(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=>Ou(e),onStep:i,diagnosticsMarker:()=>Au(t.sessionStore),diagnosticsSince:e=>ju(t.sessionStore,e)},readLastResponse:()=>o}}function Eu(e){return e&&!e.ok?e:l(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Du(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return ku(i)?c(i):c(await jl({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 Ou(e){let t=e.positionals??[],n=Je(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function ku(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 Au(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function ju(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Mu(e){return e.state===`classified`&&!e.classification.verified&&e.classification.kind===`selector-miss`}function Nu(e){let t=e.polls[0];return t?e.waitedMs-(t.startedMs+t.durationMs):0}function Pu(e,t){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,readiness:t}}}}async function Fu(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i,o=ne(t,a.flags?.replayBackend);if(o!==`ad`)return n?l(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await(await si(o)).runReplay(i):l(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Iu(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=Lu(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=Ru(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=zu({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:Vu({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function Lu(e){let t=e.flags?.replayBackend;if(t&&!ee(t))return l(`INVALID_ARGS`,re(t))}function Ru(e,t,n){let r=pl(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:Bu({...e,flags:Yt(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function zu(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:l(`INVALID_ARGS`,a.message)}}function Bu(e,t){return!t.platform&&!t.target?e:{...e,flags:Hu(e.flags,t)}}function Vu(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:di({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:bt(yt(t.flags?.replayShellEnv)),cliEnv:_t(gt(t.flags?.replayEnv))}}function Hu(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 Uu={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function Wu(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=Gu({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Ju({req:t,coordinator:a}),qu({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function Gu(e){let t=Yu(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return o()}function Ku(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?l(`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.`):Xu({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function qu(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=Ku({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??Uu,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:Zu({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function Ju(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Yu(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return l(`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 Xu(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?F(t):a??gi(i);if(!(n||r&&o===a)&&U.existsSync(o))return l(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function Zu(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 Qu(e){let{request:t,session:{name:n,logPath:r,store:i,observationStore:o,coordinator:s},tracePath:c,onStep:u,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return l(`INVALID_ARGS`,Ut);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,le(h)&&t.flags?.replayBackend!==`maestro`)return l(`INVALID_ARGS`,ce(`replay`,h));let a=await Fu({resolved:h,keepSession:m,coordinator:s,command:e});if(a)return a;let _=Iu({req:t,sessionName:n,sessionStore:i,tracePath:c,resolved:h,script:Jt(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=Wu({req:t,entryIndex:C,sessionStore:i,sourcePath:h,coordinator:s});if(!E.ok)return E.response;let{runtime:ee,readLastResponse:D}=Tu({ctx:{replayReq:v,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:T,responseLevel:t.meta?.responseLevel,invoke:d,signal:tn(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:u,armSaveScript:E.armSaveScript}),O=await Tl({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},ee);return O.status===`failed`?D()??l(`COMMAND_FAILED`,`replay step failed with no recorded response`):$u({startedAt:p,sessionName:n,sessionStore:i,replayed:O.replayed,artifactPaths:O.artifactPaths,snapshotDiagnosticSamples:O.snapshotDiagnosticSamples,armSaveScript:E.armSaveScript,coordinator:s,keepSession:m})}catch(e){let t=a(e);return g.size===0?{ok:!1,error:t}:{ok:!1,error:{...t,details:{...t.details,artifactPaths:[...g]}}}}}function $u(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=td({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=C([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:ed(i,Date.now()-t)}}}function ed(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function td(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return l(`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 nd(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=W.resolve(n??`.`,t??`.agent-device/test-artifacts`);return W.join(i,r)}function rd(e,t){let n=t?W.relative(t,e):W.basename(e),r=n.length===0||n.startsWith(`..`)?W.basename(e):n;return et(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function id(e,t){U.mkdirSync(t,{recursive:!0}),sd(e,t)}function ad(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=W.join(o,`result.txt`),u=W.join(o,`failure.txt`),d=od([...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=>W.basename(e)).join(`, `)}`);let p=`${f.join(`
2
+ `)}\n`;U.writeFileSync(l,p),s||U.writeFileSync(u,p)}function od(e,t,n){let r=[],i=new Set(n.map(e=>W.basename(e).toLowerCase()));for(let n of e){if(!ld(n))continue;let e=W.basename(n);if(W.resolve(n)===W.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=cd(e,t,i),o=W.join(t,a);U.copyFileSync(n,o),r.push(o)}return r}function sd(e,t){let n=W.join(t,`replay.ad`);if(U.copyFileSync(e,n),W.extname(e).toLowerCase()===`.ad`)return;let r=W.join(t,W.basename(e));W.resolve(r)!==W.resolve(n)&&U.copyFileSync(e,r)}function cd(e,t,n){let r=W.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||U.existsSync(W.join(t,a));)a=`${i}-${o++}${r}`;return a}function ld(e){try{return U.statSync(e).isFile()}catch{return!1}}function ud(e){let{platformFilter:t,discoverSources:n}=e,i=n(),a=[],o={undeclared:0,declaredOther:0};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 s=r.device.platform;if(s.kind===`caller-bound`){a.push(i);continue}if(s.kind===`unspecified`){o.undeclared+=1,a.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}if(!bd(t,s.value)){o.declaredOther+=1;continue}a.push(i)}if(a.filter(e=>e.kind===`run`).length===0)throw new r(`INVALID_ARGS`,pd({platformFilter:t,...o}));return a}const dd={web:!0};function fd(e){return!Object.hasOwn(dd,e)}function pd(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(`, `)}. ${md(t,n)}`}function md(e,t){return fd(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 hd(e,t,n,r,i=0){let a=W.basename(n,W.extname(n)),o=et(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function gd(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return et(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function _d(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,W.basename(r),`attempt`,a+1].join(`:`)}function vd(e,t){return typeof e==`number`?e:t}function yd(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function bd(e,t){return e===`apple`?M(t):t===e}function Y(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const xd=2e3;async function Sd(e){let{filePath:t,sessionName:n,requestId:r,parentRequestId:i,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:r,parentAttemptId:i}),v=new Set,y,b=!1,x,S=Date.now(),C=kd({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:n,requestId:r,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:n,platform:s,target:c,requestId:r,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>X(C,e),shard:u,onStep:d}).catch(e=>Y({error:a(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Ad(o,[...v]))},o)})]):await w,X(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 wd(w)||(x=Dd(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:r,graceMs:xd}}),Td({replayPromise:w,cleanupSession:p,sessionName:n,requestId:r,emitDiagnostic:h})));let e=await Ed({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Od(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{X(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:n}),await p(n),X(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!0,durationMs:Date.now()-t})}catch(e){let r=a(e);X(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=Cd(x,r,v)}}return x??Y({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Cd(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:Y({error:t,artifactPaths:[...n],infrastructure:!0})}async function wd(e){return await Promise.race([e.then(()=>!0),Pi(xd).then(()=>!1)])}async function Td(e){let{replayPromise:t,cleanupSession:n,sessionName:r,requestId:i,emitDiagnostic:o}=e;try{await t}finally{try{await n(r)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:r,requestId:i,error:a(e).message}})}}}async function Ed(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();X(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:n});try{let e=await t({sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:o,appendTimingEvent:e=>X(o,e)});return X(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=a(e);return X(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}}),Y({error:t})}}function Dd(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Od(e,t){return{...e,warnings:[...e.warnings,t]}}function kd(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=W.join(t,`replay-timing.ndjson`);return U.mkdirSync(W.dirname(l),{recursive:!0}),U.writeFileSync(l,``),n.add(l),X(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function X(e,t){e&&U.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Ad(e,t=[]){return Y({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 jd(e){let t=Md(e),n=await Nd(e,t);return{result:zd(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Md(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:W.join(i,...a?[`shard-${a.shardIndex+1}`]:[],rd(t.path,n)),maxAttempts:r+1}}async function Nd(e,t){Fd(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Pd(e,t,r);if(Id(n,i),Ld(e,i.outcome,r))break;Rd(e,t,i)}return n}async function Pd(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=hd(i,a,r.path,o,n),h=W.join(t.testArtifactsDir,`attempt-${f}`);id(r.path,h);let g=_d({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,...Z(d)},v=await Sd({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 ad({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Fd(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:hd(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Z(c)})}function Id(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 Ld(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Rd(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,...Z(e.shard)})}function zd(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Bd(e,t,n,r):Vd(e,t,n,r)}function Bd(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,...Z(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}:{},...Ud(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Vd(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,...Z(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...Hd(c),...Ud(s)}}function Hd(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 Ud(e){return Z(e)}function Z(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Wd(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 Gd(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 Kd(n,u,d);Xd(t,o);let p=t.shardPlan?Zd({entries:t.entries,total:t.total,emitProgress:o}):[];return t.shardPlan?p.push(...await Qd({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 nf({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:of(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 Kd(e,t,n){let r=qd(e,t),i=Jd(r),a=r.length-i.length,o=gd(e.requestId),s=await Wd(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:Yd(e,o),total:s?.total??r.length}}function qd(e,t){return ud({platformFilter:e.platformFilter,discoverSources:t})}function Jd(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Yd(e,t){return nd({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Xd(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 Zd(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 Qd(e){return(await Promise.allSettled(e.shards.map(async t=>await ef({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[$d(r,e.sessionName,t.reason)]:[]})}function $d(e,t,n){let r=a(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:tf(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 ef(e){let{shard:t,sessionName:n}=e;return await rf({...e,entries:t.entries,sessionName:tf(n,t),shard:t})}function tf(e,t){return`${e}:shard-${t.shardIndex+1}`}async function nf(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 jd({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:yd(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:vd(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),af(t,o,p))break}return g}async function rf(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 jd({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:yd(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:vd(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),af(b,o,m))break}return _}function af(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function of(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=T(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}:{}}}async function sf(e,t){let n=ee(t)&&e.some(e=>ne(e.entry,t)!==`ad`)?await si(t):void 0;return()=>e.map(e=>cf(e,t,n))}function cf(e,t,n){let r=e.entry,i=Jt(e,r),a=ne(r,t)!==`ad`,o=te(i);return{path:r,manifest:{...a?{title:n?.inspectSource(i,r).title}:{},device:{platform:o.platform?{kind:`declared`,value:o.platform}:a?{kind:`caller-bound`}:{kind:`unspecified`},...o.target===void 0?{}:{target:o.target}},...o.timeoutMs!==void 0||o.retries!==void 0?{attemptDefaults:{...o.timeoutMs===void 0?{}:{timeoutMs:o.timeoutMs},...o.retries===void 0?{}:{retries:o.retries}}}:{}}}}function lf(e){return async t=>(await ff(e,t)).map(uf)}function uf(e){if(e.platform===`web`||!he(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 df(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 ff(e,t){let n=gf(e),i=mf(await Fn(pf(e)),n,e);if(i.length<t)throw new r(`DEVICE_NOT_FOUND`,`test sharding requires ${hf(t)}, but only ${i.length} matched`);return i.slice(0,t)}function pf(e){let t=I(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:me({simulatorSetPath:Mn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function mf(e,t,n){return t.length>0?_f(e,t,n):e.filter(e=>vf(e,n)).sort(xf)}function hf(e){return`${e} device${e===1?``:`s`}`}function gf(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function _f(e,t,n){return t.map(t=>{let i=bf(t),a=e.find(e=>yf(e,n)&&(e.id===t||bf(e.name)===i));if(!a)throw new r(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function vf(e,t){return!yf(e,t)||!he(e)?!1:e.booted!==!1}function yf(e,t){return!(!_e(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function bf(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function xf(e,t){return e.id.localeCompare(t.id)}function Sf(e){let t=Cf(e?.shardAll,`--shard-all`),n=Cf(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 Cf(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 wf=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 Tf(e){return wf.has(e.toUpperCase())}const Ef=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Df(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=Of(e);return t?kf(t.details)||Af(t.code,t.message):!1}function Of(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function kf(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||p(t)?!0:t?Tf(t):!1}function Af(e,t){let n=`${e}\n${t}`.toLowerCase();return Ef.some(e=>n.includes(e))}function jf(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Pf(e.error.details?.artifactPaths),warnings:_(e.error.details),infrastructure:Df(e),...Ff(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:_(t),artifactPaths:Pf(t?.artifactPaths),...Ff(t?.snapshotDiagnostics)}}function Mf(e){if(!e||e.ok)return;let t=jf(e);return t.status===`failed`?t:void 0}function Nf(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Pf(e){return[...new Set(Nf(e))]}function Ff(e){let t=w(e);return t?{snapshotDiagnostics:t}:{}}const If=1e3,Lf=3e3;function Rf(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await zf(e)}}async function zf(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=Pt(o.device.platform),c=i?W.join(i,`recording${s}`):Nt(o.device.platform);Q(a,{type:`video_recording_start`,session:n,videoPath:c}),A({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(Vf({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return Q(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await At(If),Q(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:If}),A({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:If}}),l}async function Bf(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;Q(a,{type:`video_tail_start`,session:n,requestedDurationMs:Lf});let o=Date.now();await At(Lf);let s=Date.now(),c=await e.video.record(Vf({req:t,sessionName:n,phase:`stop`}));return Vl(c).forEach(e=>i.add(e)),Q(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}),A({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function Q(e,t){e({...t,ts:new Date().toISOString()})}function Vf(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 Hf=[{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.`}],Uf=({attemptId:e,parentAttemptId:t})=>{en(e);let n=Wf(e,t);return{cancel:()=>Zt(e),release:()=>{n(),$t(e)}}};function Wf(e,t){if(!t||t===e)return()=>{};let n=tn(t);if(!n)return()=>{};let r=()=>{Zt(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function Gf(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=Kf(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:df({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function Kf(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 qf(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 l(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let u=n.flags??{};for(let e of Hf)if(e.requested(u))return l(`INVALID_ARGS`,e.message);let d,f;try{d=Xf(n,r),f=Yf(n)}catch(e){let n=t(e);return l(n.code,n.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await Gd({request:d,emitProgress:nn,isCanceled:()=>Qt(n.meta?.requestId),emitDiagnostic:A,bindAttemptCancellation:Uf,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&&Vl(e).forEach(e=>f.add(e)),e),y=Gf({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?Rf(x):void 0;return jf(await Qu({...Zf(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 zf(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 Mf(await Bf({req:n,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:t,video:c}))},discoverSources:await sf(f,n.flags?.replayBackend),resolveShardTargets:lf(n.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:Jf(m.data,n)}:l(m.error.code,m.error.message)}function Jf(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=W.join(n,W.basename(r)),a=e=>e===r||e.startsWith(r+W.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 U.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:W.basename(r)}]}:o}function Yf(e){let t=e.flags?.replayScriptSources;if(!t)throw new r(`INVALID_ARGS`,Ut);return t}function Xf(e,t){let n=e.flags??{},r=e.meta?.cwd,i=$f(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:F(i,r),failFast:n.failFast===!0,retries:Qf(n.retries),timeoutMs:Qf(n.timeoutMs),shard:Sf(n)}}function Zf(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 Qf(e){return typeof e==`number`?e:void 0}function $f(e){return typeof e==`string`?e:void 0}function ep(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 tp(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function np(e,t){let n=v({...e,...t});return Object.keys(n).length>0?n:void 0}function rp(e,t){return async({dispatch:n,...r})=>{let i=np(t.internal,n);return await e(i?{...r,internal:i}:r)}}function ip(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:sr(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:ap(e.scriptPublication??rr)}},armStep(e){n.update(t=>{Rr(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:gi(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){sr(r())!==void 0&&n.update(hr)},markCompleteIfArmed(){sr(r())!==void 0&&n.update(Xn)},markSessionHeldIfArmed(e){if(e.ok||!pr(r()))return e;let t=Rt(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&&sp(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{op({session:t,...e})})}}}}function ap(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:xr(e),targetForce:Sr(e)}}function op(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=cp({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function sp(e){e.pendingRecordAndHeal=void 0}function cp(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 lp(e){let{sessionStore:t,bindDevice:n,platformServices:r,bindExactDevice:i,screenRecordingAdmissionLedger:a,requestScope:o,retainDeviceExecutionLock:s,throwIfCanceled:c}=e;return!n||!i||!a||!o||!s||!c?void 0:{throwIfCanceled:c,record:async e=>await Di({req:up(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,platformServices:r,bindExactDevice:i,admissionLedger:a,requestScope:o,retainDeviceExecutionLock:s,throwIfCanceled:c})}}function up(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 dp={resolveSessionScope:tr},fp=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await Qu({...tp(e),session:mp(t,n,r),invoke:rp(a??i,e),dependencies:dp}),pp=async({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,platformServices:l,inspectFacts:u,bindExactDevice:d,screenRecordingAdmissionLedger:f,requestScope:p,retainDeviceExecutionLock:m,throwIfCanceled:h,platformResourceCleanup:g})=>{if(!g)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let _=lp({sessionStore:i,bindDevice:c,platformServices:l,bindExactDevice:d,screenRecordingAdmissionLedger:f,requestScope:p,retainDeviceExecutionLock:m,throwIfCanceled:h});return await qf({...tp(e),session:mp(t,n,i),createSession:(e,t)=>mp(e,t,i),invoke:rp(s??o,e),dependencies:dp,cleanupSession:async t=>await hp({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,inspectFacts:u,bindDevice:c,platformServices:l,platformResourceCleanup:g}),..._?{video:_}:{}})};function mp(e,t,n){let i=t=>{let r=n.get(e);return r?(t(r),!0):!1},a={get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)};return ep(e,t,a,{createCoordinator:()=>ip({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>n.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let r=n.lookup(e);r&&mr(r,t)},resolveOpenRuntimeHints:({request:t,device:r,platform:i})=>Pr({req:t,sessionStore:{getRuntimeHints:t=>t===e?n.getRuntimeHints(e):void 0},sessionName:e,device:r,platform:i}),bindAuthority:t=>{let i=n.lookup(e);return{...$c({sessionStore:n,ref:i,signal:t}),capture:async({flags:a,logPath:o})=>{let s=i?n.requireCurrent(i):void 0;if(!s)throw new r(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await Ei({device:s.device,session:s,flags:a,logPath:o,signal:t})}}}})}async function hp(e){let{req:t,sessionName:n,logPath:i,sessionStore:a}=e;if(!a.get(n))return;let o=await bo({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,platformServices:e.platformServices,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 gp(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command!==oe.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return bp(new r(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.lookup(n);if(!a)return bp(new r(`SESSION_NOT_FOUND`,`No active session "${n}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=i.requireCurrent(a),s=yp(o);if(s)return bp(s);let c=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!c)return bp(new r(`INVALID_ARGS`,`session save-script path cannot be empty.`));qr(o,{explicitPath:c,liveForce:t.flags?.force});let l=i.writeSessionLog(a,{force:yr(o,t.flags?.force),publication:`active`});return l.written?(Qn(o,l.path),{ok:!0,data:{session:o.name,savedScript:l.path,actionCount:l.actionCount,...m(`Published script: ${l.path}`)}}):bp(l.error??new r(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function _p(e){if(ur(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:er(e)?void 0:`not-armed`}const vp={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 yp(e){let t=_p(e);return t?vp[t]():void 0}function bp(e){return{ok:!1,error:a(e)}}function xp(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function Sp(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Er(e)}}async function Cp(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(Sp(t))}}async function wp(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={...Sp(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...m(`Clipboard updated`)}}async function Tp(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a,platformServices:o}=e;if(n===`read`){let e=await R({command:`clipboard`,device:t,use:nt,inspectFacts:i,bindDevice:a,platformServices:o,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>Cp(n,e,r)}}let s=await R({command:`clipboard`,device:t,use:Qe,inspectFacts:i,bindDevice:a,platformServices:o,readiness:!0});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>wp(c,e,r)}}async function Ep(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=i.lookup(n),u=c?.session,d=t.flags??{},f=G(D.clipboard,u,d);if(f)return f;let p=t.positionals??[],m=xp(p);if(!m)return l(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let h=await K({session:u,flags:d,platformServices:s});c&&i.requireCurrent(c);let g=await Tp({device:h,action:m,positionals:p,inspectFacts:a,bindDevice:o,platformServices:s});if(!g.ok)return g.response;let _=c?i.requireCurrent(c):void 0,v=await g.execute($n(r,t.flags,_?.appBundleId,_?.trace?.outPath));return L(i,c,t,t.command,v),{ok:!0,data:{platform:j(h),...v}}}function Dp(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Op(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function kp(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Ap(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),nn({type:`command`,status:`progress`,message:jp(t)})}function jp(e){return[oi(e),...ai(e)].join(`
3
+ `)}async function Mp(e,t){let{device:n,targetApp:r,session:i,listInstalledApps:o}=t;if(r)try{let t=o?Np(r,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:r,platform:j(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=a(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 ${j(n)} --all`,evidence:{code:r.code,message:r.message}})}}function Np(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 Pp(e,t,n){let r=Ip(t,n);try{let t=await Rp(r),n=Lp(t.devices,r);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Up(n,r,t.failures),hint:n.length===0?Kp(t.failures):void 0,command:n.length===0?Zp(r):void 0,evidence:Qp(n,t.failures)}),n.length>0&&Bp(e,t.failures),{devices:n,hostDevices:n.filter(e=>t.hostDevices.includes(e)),platform:r.platform,target:r.target}}catch(t){let n=a(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:r.platform,target:r.target}}}function Fp(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 Ip(e,t){let n=e.flags??{};return Xt({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 Lp(e,t){return e.filter(e=>pe(e,t,{includeExplicitSelectors:!0}))}async function Rp(e){if(e.platform)return{...zp([await Pn(e)]),failures:[]};let t=[],n=[];for(let r of f)try{t.push(await Pn({...e,platform:r}))}catch(e){n.push(Hp(r,e))}return{...zp(t),failures:n}}function zp(e){return{devices:e.flatMap(e=>e.devices),hostDevices:e.flatMap(e=>e.source===`local`?e.devices:[])}}function Bp(e,t){for(let n of t)$(e,Vp(n))}function Vp(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Yp(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Yp(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Hp(e,t){let n=a(t);return{platform:e,message:n.message,hint:n.hint,code:n.code}}function Up(e,t,n){if(e.length===0)return n.length>0?`No ${Wp(t)} devices found; ${Gp(n)}.`:`No ${Wp(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Wp(t)} ${Xp(e.length,`device`)} available; ${r} booted`,a=qp(e,t);return a?`${i} (${a}).`:`${i}.`}function Wp(e){let t=e.platform?Yp(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Gp(e){return e.slice(0,2).map(e=>`${Yp(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Kp(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function qp(e,t){if(t.platform||t.target)return;let n=h(e),r=Jp();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 Jp(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Yp(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 Xp(e,t){return e===1?t:`${t}s`}function Zp(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Qp(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 $p=1500;async function em(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 tm(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?nm(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 tm(e,t,n){try{return await(n.resolveProcessInfo??rm)(e,t)}catch{return}}function nm(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 rm(e,t){if(!im(e))return;let n=await am(t);if(n!==void 0)return{pid:n,cwd:await om(n)}}function im(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function am(e){let t=await kt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:$p});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 om(e){let t=await kt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:$p});if(t.exitCode===0)return t.stdout.split(`
5
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const sm=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],cm=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerDeviceType`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function lm(e,t){let n=It(e.meta?.cwd);return{targetApp:mm(e.flags?.targetApp)??t?.appBundleId,metroHost:mm(e.runtime?.metroHost)??`127.0.0.1`,metroPort:hm(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:fm(e,n)}}function um(e,t={}){let n=pm(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 dm(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 fm(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function pm(e){let t={...Object.fromEntries([...sm,...cm].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 mm(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function hm(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function gm(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==D.doctor)return null;let s=_m(e.hostDiagnostics),c=r.get(n),l=lm(t,c),u=bm(r,n),d=[];if(Ap(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Ft()} using ${u}`,evidence:{version:Ft(),stateDir:u}},...um(t,{required:l.remote}),...dm(r,n,c,{remote:l.remote})),l.remote)return Tm(d,l);let f=vm(l,u,i),p=await Pp(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await xm({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=c?.device??ym(p,h);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return Tm(d,l,{device:h,includeMetro:!0,inventory:p})}function _m(e){if(!e)throw new r(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function vm(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>rn(e),emitProgress:e=>nn({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await In(e),shouldPropagateInventoryProbeError:Nn,transportOverrides:Object.freeze({androidAdb:n})})}function ym(e,t){let n=e?.hostDevices??[];if(t)return n.includes(t)?t:void 0;let r=n.filter(e=>P(e)&&e.kind===`simulator`);return r.find(e=>e.booted===!0)??r[0]}function bm(e,t){let n=W.dirname(e.resolveSessionDir(t));return W.basename(n)===`sessions`?W.dirname(n):n}async function xm(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Fp(t,i,a.targetApp);return u&&await Sm(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await em(a.metroHost,a.metroPort,a.kind)),Ap(t,...await r.ambientChecks(n)),u}async function Sm(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await Cm({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await Mp(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),Ap(e,...await r.deviceChecks(i,n))}async function Cm(e){if(e.device.platform!==`harmonyos`)return wm(e)}async function wm(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,at),u=I(n.flags?.androidDeviceAllowlist),d=await To(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await Eo(l,d,e)}function Tm(e,t,n={}){let r=Dp(e);return{ok:!0,data:{status:r,summary:Op(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:kp(e)}}}async function Em(e){return await R({...e,command:`prepare`,use:Ee})}async function Dm(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return l(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=G(D.prepare,o,s);if(c)return c;let u=await K({session:o,flags:s,platformServices:e.platformServices}),d=await Em({device:u,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:Om(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:Fr(t)}});return{ok:!0,data:km(a,u,Math.max(0,Date.now()-f),p)}}function Om(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ye}function km(e,t,n,r){return{action:e,platform:j(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Am(n,r),message:`Prepared Apple runner: ${t.name}`}}function Am(e,t){let n=jm(t.buildMs),r=Mm(t.connectMs),i=Mm(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 jm(e){return e===void 0?void 0:Mm(e)}function Mm(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Nm=e=>Do(e),Pm=e=>js({req:e.req,createCommandSurface:e.createCommandSurface,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Fm=e=>bo({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Im=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a})=>await zs({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a}),Lm=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,platformServices:i,inspectFacts:a,appLogAdmissionLedger:o,audioProbeAdmissionLedger:s,perfCaptureAdmissionLedger:c,throwIfCanceled:l})=>await Ic({req:e,sessionName:t,sessionStore:n,bindDevice:r,platformServices:i,inspectFacts:a,appLogAdmissionLedger:o,audioProbeAdmissionLedger:s,perfCaptureAdmissionLedger:c,throwIfCanceled:l}),Rm={session_list:Nm,devices:Nm,capabilities:Nm,apps:Nm,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await gm({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Im,shutdown:Im,appstate:Im,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>gp({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await ia({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await Ep({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),keyboard:Fa,perf:Lm,logs:Lm,events:Lm,network:Lm,audio:Lm,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await Dm({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),install:Ya,reinstall:Ya,install_source:Ya,release_materialized_paths:async({req:e})=>await Hi({req:e}),push:Ya,"trigger-app-event":Ia,open:Pm,replay:fp,test:pp,batch:async({req:e,sessionName:t,invoke:n})=>await Xa(e,t,n),close:Fm};async function zm(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Tr,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,platformServices:p,bindExactDevice:m,appLogAdmissionLedger:h,audioProbeAdmissionLedger:g,perfCaptureAdmissionLedger:_,screenRecordingAdmissionLedger:v,hostDiagnostics:y,requestScope:b,retainDeviceExecutionLock:x,throwIfCanceled:S,reconcileOrphanedDeviceClaim:C,platformResourceCleanup:w}=e,T=Rm[t.command];return T?await T({req:t,createCommandSurface:e.createCommandSurface,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,platformServices:p,bindExactDevice:m,appLogAdmissionLedger:h,audioProbeAdmissionLedger:g,perfCaptureAdmissionLedger:_,screenRecordingAdmissionLedger:v,hostDiagnostics:y,requestScope:b,retainDeviceExecutionLock:x,throwIfCanceled:S,reconcileOrphanedDeviceClaim:C,platformResourceCleanup:w}):null}export{zm as handleSessionCommands};