agent-device 0.21.23 → 0.21.24

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 (258) 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.24.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.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.24.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.23.apk → agent-device-android-snapshot-helper-0.21.24.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.23.manifest.json → agent-device-android-snapshot-helper-0.21.24.manifest.json} +6 -6
  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/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +34 -10
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +3 -3
  20. package/dist/src/adapter.js +1 -1
  21. package/dist/src/adb.js +1 -1
  22. package/dist/src/agent-browser-lifecycle.js +1 -1
  23. package/dist/src/agent-browser-process-record.js +1 -1
  24. package/dist/src/agent-browser-provider.js +1 -1
  25. package/dist/src/agent-device-client.js +2 -2
  26. package/dist/src/alert-runtime.js +1 -1
  27. package/dist/src/alert.js +1 -1
  28. package/dist/src/android-adb.d.ts +3 -2
  29. package/dist/src/android-input-ownership.js +1 -1
  30. package/dist/src/app-backend.js +1 -1
  31. package/dist/src/app-inventory.d.ts +4 -0
  32. package/dist/src/app-launch.js +1 -1
  33. package/dist/src/app-lifecycle.js +1 -1
  34. package/dist/src/app-log-runtime2.js +3 -3
  35. package/dist/src/app-resolution.js +2 -2
  36. package/dist/src/app-state-runtime.d.ts +15 -0
  37. package/dist/src/apple-runner-platform.js +1 -1
  38. package/dist/src/application-lifecycle-interaction.js +1 -1
  39. package/dist/src/aws-device-farm-connection.js +1 -0
  40. package/dist/src/back-mode.js +1 -1
  41. package/dist/src/backend-snapshot-options.js +1 -1
  42. package/dist/src/browserstack-connection.js +1 -0
  43. package/dist/src/browserstack-device-features.js +1 -0
  44. package/dist/src/browserstack.js +1 -0
  45. package/dist/src/cache.js +1 -1
  46. package/dist/src/cli-config.js +1 -1
  47. package/dist/src/cli-help.js +35 -19
  48. package/dist/src/cli-runner.js +1 -1
  49. package/dist/src/cli.js +3 -4
  50. package/dist/src/client-companion-tunnel.js +1 -0
  51. package/dist/src/client-metro-companion.js +1 -1
  52. package/dist/src/client-metro.js +1 -1
  53. package/dist/src/client-types.d.ts +7 -5
  54. package/dist/src/cloud-artifacts.d.ts +3 -2
  55. package/dist/src/command-metadata.js +1 -1
  56. package/dist/src/command-schema.js +1 -1
  57. package/dist/src/command-tools.js +2 -2
  58. package/dist/src/connection-runtime.js +1 -1
  59. package/dist/src/connection-verification.js +1 -0
  60. package/dist/src/connection.js +5 -5
  61. package/dist/src/contracts.d.ts +1 -1
  62. package/dist/src/daemon-client-lease-beat.js +1 -1
  63. package/dist/src/daemon-client-lifecycle.js +1 -1
  64. package/dist/src/daemon-client-transport.js +1 -1
  65. package/dist/src/daemon-http.js +1 -1
  66. package/dist/src/daemon-policy-file.js +1 -1
  67. package/dist/src/daemon-registration-owner.js +1 -1
  68. package/dist/src/device-claim-inspection.js +1 -1
  69. package/dist/src/device-input-state.d.ts +2 -15
  70. package/dist/src/device-readiness-runtime.js +1 -1
  71. package/dist/src/device-selection-resolver.js +1 -1
  72. package/dist/src/device.js +1 -1
  73. package/dist/src/device2.js +1 -1
  74. package/dist/src/device3.js +1 -1
  75. package/dist/src/dispatch-resolve.js +3 -3
  76. package/dist/src/doctor-facade.js +1 -1
  77. package/dist/src/durable-capture-resource.js +1 -1
  78. package/dist/src/durable-resource.js +1 -1
  79. package/dist/src/exec.js +1 -1
  80. package/dist/src/file.js +1 -1
  81. package/dist/src/find.js +1 -1
  82. package/dist/src/finders.js +1 -1
  83. package/dist/src/format.js +2 -1
  84. package/dist/src/gesture-admission.js +1 -1
  85. package/dist/src/gesture-plan-types.d.ts +2 -5
  86. package/dist/src/gesture-runtime.js +1 -1
  87. package/dist/src/human-control.js +1 -1
  88. package/dist/src/ime-rebind.js +1 -1
  89. package/dist/src/ime-settings-record.js +1 -0
  90. package/dist/src/ime-state.js +1 -1
  91. package/dist/src/index.d.ts +3 -3
  92. package/dist/src/input-actions.js +1 -1
  93. package/dist/src/input-actions2.js +1 -1
  94. package/dist/src/install-source2.js +1 -1
  95. package/dist/src/interaction-positionals.js +1 -1
  96. package/dist/src/interaction-ref-policy.js +1 -1
  97. package/dist/src/interaction.js +1 -1
  98. package/dist/src/interaction2.js +1 -1
  99. package/dist/src/interactor.js +5 -5
  100. package/dist/src/interactors.js +1 -1
  101. package/dist/src/internal/bin.js +1 -1
  102. package/dist/src/internal/daemon.js +1 -1
  103. package/dist/src/inventory2.js +1 -1
  104. package/dist/src/ios-snapshot-acquisition.js +1 -1
  105. package/dist/src/ios-snapshot-engine.js +1 -1
  106. package/dist/src/ios-snapshot-runtime.js +1 -1
  107. package/dist/src/launch-confirmation.js +1 -1
  108. package/dist/src/lease-scope.js +1 -1
  109. package/dist/src/lease.js +1 -1
  110. package/dist/src/limrun.d.ts +4 -555
  111. package/dist/src/load.js +1 -1
  112. package/dist/src/local-interactor-operation-set.js +1 -1
  113. package/dist/src/managed-device-scope.js +1 -1
  114. package/dist/src/manifest.js +1 -0
  115. package/dist/src/mechanics.js +16 -16
  116. package/dist/src/mobile-snapshot-semantics.js +1 -1
  117. package/dist/src/observation.js +1 -2
  118. package/dist/src/overlay.js +3 -3
  119. package/dist/src/owner-identity.js +3 -3
  120. package/dist/src/perf-facade.js +1 -1
  121. package/dist/src/perf-runtime-plan.js +1 -1
  122. package/dist/src/perf-target.js +1 -1
  123. package/dist/src/physical-device-control.js +1 -1
  124. package/dist/src/platform-request-scope.js +1 -1
  125. package/dist/src/platform-runtime-open-target.js +1 -1
  126. package/dist/src/platform-runtime-operation-host.js +4 -4
  127. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  128. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  129. package/dist/src/platform-runtime-unavailable.js +1 -1
  130. package/dist/src/platform-runtime.js +1 -1
  131. package/dist/src/platform-runtime2.js +1 -1
  132. package/dist/src/plugin.js +1 -0
  133. package/dist/src/plugins/webdriver.d.ts +111 -0
  134. package/dist/src/plugins/webdriver.js +1 -0
  135. package/dist/src/plugins.d.ts +2 -1
  136. package/dist/src/plugins2.js +1 -1
  137. package/dist/src/process-exit.js +1 -1
  138. package/dist/src/process.js +1 -1
  139. package/dist/src/provider-credential-fingerprint.js +1 -1
  140. package/dist/src/provider-device-admission.js +1 -1
  141. package/dist/src/provider-device-runtime.d.ts +556 -0
  142. package/dist/src/provider-policy.js +1 -0
  143. package/dist/src/provider-profile-fields.js +1 -1
  144. package/dist/src/provider-webdriver.js +1 -2
  145. package/dist/src/providers.js +1 -1
  146. package/dist/src/react-devtools.js +2 -0
  147. package/dist/src/react-native.js +1 -1
  148. package/dist/src/record-runtime.js +1 -1
  149. package/dist/src/record-trace.js +1 -1
  150. package/dist/src/recording.js +1 -1
  151. package/dist/src/registry.js +24 -24
  152. package/dist/src/remote-bridge.js +1 -0
  153. package/dist/src/remote-config-core.js +1 -0
  154. package/dist/src/remote-config.js +1 -1
  155. package/dist/src/remote-config2.js +1 -1
  156. package/dist/src/remote-connection-state.js +1 -0
  157. package/dist/src/replay.js +2 -2
  158. package/dist/src/request-admission.js +1 -1
  159. package/dist/src/request-runtime-binding.js +1 -1
  160. package/dist/src/result-serialization.js +1 -1
  161. package/dist/src/retry.js +1 -1
  162. package/dist/src/retry2.js +1 -0
  163. package/dist/src/runner-artifact-manifest.js +1 -1
  164. package/dist/src/runner-cache-metadata.js +2 -3
  165. package/dist/src/runner-cache-retention.js +1 -0
  166. package/dist/src/runner-cache-trim.js +1 -0
  167. package/dist/src/runner-client.js +1 -1
  168. package/dist/src/runner-dev-tools-security.js +1 -1
  169. package/dist/src/runner-device-readiness.js +1 -1
  170. package/dist/src/runner-device-set.js +1 -0
  171. package/dist/src/runner-disposal.js +1 -1
  172. package/dist/src/runner-error-classification.js +1 -1
  173. package/dist/src/runner-exchange.js +1 -1
  174. package/dist/src/runner-lease.js +1 -0
  175. package/dist/src/runner-operations-facade.js +1 -1
  176. package/dist/src/runner-session-types.js +1 -1
  177. package/dist/src/runner-start-budget.js +1 -1
  178. package/dist/src/runner-toolchain-probe.js +2 -0
  179. package/dist/src/runner.js +1 -1
  180. package/dist/src/runtime-deployment.js +1 -0
  181. package/dist/src/runtime.js +1 -1
  182. package/dist/src/runtime10.js +1 -2
  183. package/dist/src/runtime11.js +2 -0
  184. package/dist/src/runtime2.js +2 -5
  185. package/dist/src/runtime3.js +5 -1
  186. package/dist/src/runtime4.js +1 -5
  187. package/dist/src/runtime5.js +5 -1
  188. package/dist/src/runtime6.js +1 -1
  189. package/dist/src/runtime7.js +1 -1
  190. package/dist/src/runtime8.js +1 -1
  191. package/dist/src/runtime9.js +1 -1
  192. package/dist/src/screen-recording-transport.js +1 -1
  193. package/dist/src/screenshot-density.js +1 -1
  194. package/dist/src/screenshot3.js +2 -2
  195. package/dist/src/script.js +1 -1
  196. package/dist/src/scroll-gesture.js +1 -1
  197. package/dist/src/sdk-batch.js +2 -2
  198. package/dist/src/sdk-contracts.d.ts +20 -29
  199. package/dist/src/sdk-contracts.js +2 -2
  200. package/dist/src/sdk-device.js +1 -1
  201. package/dist/src/sdk-finders.d.ts +1 -1
  202. package/dist/src/sdk-finders.js +1 -1
  203. package/dist/src/sdk-remote-config.d.ts +4 -0
  204. package/dist/src/sdk-remote-config.js +1 -1
  205. package/dist/src/sdk-selectors.d.ts +1 -1
  206. package/dist/src/sdk-selectors.js +1 -1
  207. package/dist/src/selection.js +0 -0
  208. package/dist/src/selector-pipeline-policy.js +1 -1
  209. package/dist/src/selector-runtime.js +1 -1
  210. package/dist/src/selectors.js +1 -1
  211. package/dist/src/server.js +2 -2
  212. package/dist/src/session-snapshot.js +1 -1
  213. package/dist/src/session2.js +5 -5
  214. package/dist/src/simctl.js +1 -1
  215. package/dist/src/simulator-boot.js +1 -1
  216. package/dist/src/simulator-state.js +1 -1
  217. package/dist/src/simulator.js +1 -1
  218. package/dist/src/snapshot-capture-annotations.js +1 -1
  219. package/dist/src/snapshot-desktop-projection.js +1 -1
  220. package/dist/src/snapshot-private-evidence.js +1 -0
  221. package/dist/src/snapshot-runtime-binding.js +1 -1
  222. package/dist/src/snapshot-runtime.js +1 -1
  223. package/dist/src/snapshot-state.js +1 -1
  224. package/dist/src/snapshot4.js +1 -1
  225. package/dist/src/src2.js +1 -1
  226. package/dist/src/src3.js +1 -1
  227. package/dist/src/src4.js +1 -1
  228. package/dist/src/src5.js +1 -1
  229. package/dist/src/src6.js +1 -1
  230. package/dist/src/src7.js +1 -1
  231. package/dist/src/src8.js +20 -20
  232. package/dist/src/store.js +1 -1
  233. package/dist/src/target-evidence.js +1 -1
  234. package/dist/src/text-entry-focus.js +1 -1
  235. package/dist/src/tool-provider2.js +1 -1
  236. package/dist/src/touch-runtime2.js +1 -1
  237. package/dist/src/tree.js +1 -1
  238. package/dist/src/type-text-runtime.js +1 -1
  239. package/dist/src/video.js +1 -1
  240. package/package.json +15 -10
  241. package/server.json +2 -2
  242. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  243. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  244. package/dist/src/capabilities.js +0 -1
  245. package/dist/src/compatibility-policy.js +0 -1
  246. package/dist/src/daemon-artifacts.js +0 -1
  247. package/dist/src/device-claim-rule.js +0 -1
  248. package/dist/src/human-control-contract.js +0 -1
  249. package/dist/src/prepare-kind.js +0 -1
  250. package/dist/src/provider-device-runtimes.js +0 -1
  251. package/dist/src/screen-recording-admission-ledger.js +0 -1
  252. package/dist/src/screenshot-runtime.js +0 -1
  253. package/dist/src/session-routing.js +0 -1
  254. package/dist/src/session-runtime-admission.js +0 -1
  255. package/dist/src/timeouts.js +0 -1
  256. package/dist/src/touch-reference-frame.js +0 -1
  257. package/dist/src/vars.js +0 -2
  258. package/dist/src/viewport.js +0 -1
@@ -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,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 _,v}from"./sdk-batch-runner.js";import{a as y,n as b,t as x}from"./snapshot-diagnostics.js";import{r as S}from"./snapshot-private-evidence.js";import{a as C,o as w,r as T}from"./diagnostics.js";import"./diagnostics2.js";import{C as ee,E,O as D,_ as O,b as te,f as k,g as A,h as j,w as ne}from"./sdk-device.js";import{B as re,Ct as ie,E as ae,F as oe,G as se,Gn as ce,Hn as le,I as ue,J as de,K as fe,Kr as pe,L as me,M as he,Or as ge,P as _e,Pt as ve,Q as ye,Qr as be,R as xe,Tt as Se,V as Ce,W as we,Wn as Te,Wt as Ee,X as De,Xn as Oe,Xr as ke,Y as Ae,Z as je,_n as Me,at as Ne,bn as Pe,cn as Fe,cr as Ie,d as Le,f as Re,it as ze,j as Be,kr as Ve,lr as He,mt as Ue,on as We,p as Ge,pt as Ke,q as qe,qn as Je,sr as Ye,st as Xe,ti as Ze,vn as Qe,wt as $e,xn as et,y as tt,yn as nt,z as rt}from"./sdk-batch.js";import{u as it}from"./scroll-gesture.js";import{a as at,b as ot,f as st,g as ct,n as lt,p as ut,r as dt,w as ft,y as pt}from"./script.js";import{_ as mt,b as ht,f as gt,g as _t,h as vt,l as yt,m as bt,n as xt,p as St,r as Ct,t as wt,v as Tt,x as Et,y as Dt}from"./dispatch-resolve.js";import{a as Ot,d as kt,n as At,o as jt,r as Mt,t as Nt}from"./target-evidence.js";import{a as Pt,c as Ft,i as It,l as Lt,n as Rt,o as zt,r as Bt,s as Vt,t as Ht,u as Ut}from"./format.js";import{A as Wt,M as Gt,N as Kt,_ as qt,c as Jt,d as Yt,f as Xt,g as Zt,h as Qt,j as $t,m as en,n as tn,u as nn,v as rn}from"./provider-device-admission.js";import{H as an,M as on,U as sn,V as cn,_ as ln,c as un,h as dn}from"./runtime.js";import{n as fn,t as pn}from"./catalog.js";import{g as mn,i as hn}from"./observability.js";import{i as gn,n as _n,r as M}from"./success-text.js";import{o as vn,p as yn}from"./overlay.js";import{t as bn}from"./app-inventory.js";import{a as xn,r as Sn,t as Cn}from"./device.js";import{l as wn,m as Tn}from"./exec.js";import{i as En}from"./retry.js";import{n as Dn,r as On}from"./output-path.js";import"./command.js";import{t as N}from"./session-paths.js";import{o as kn,s as An}from"./session-artifact-paths.js";import{a as jn}from"./version.js";import"./retry2.js";import{t as Mn}from"./project-runtime.js";import{t as Nn}from"./keyed-lock.js";import{r as Pn}from"./rect-center.js";import{t as Fn}from"./android-snapshot-quality.js";import{a as In,i as Ln,n as Rn,t as zn}from"./replay-divergence.js";import{n as Bn,t as Vn}from"./deploy-result-target.js";import{t as Hn}from"./keyboard-actions.js";import{a as Un,i as Wn,n as Gn,o as Kn,r as qn}from"./request-cancel.js";import{t as Jn}from"./request.js";import{i as Yn,s as Xn}from"./provider-session-ownership.js";import{F as Zn,I as Qn,b as $n,g as er,h as tr,j as P,r as nr,s as rr,t as ir,u as ar,v as or}from"./session-snapshot.js";import{c as sr,i as cr,t as lr}from"./device-claim-inspection.js";import{t as ur}from"./audio-probe-result.js";import{_ as dr,a as fr,c as pr,f as mr,i as hr,l as gr,n as _r,o as vr,p as yr,r as br,s as xr,t as Sr,u as Cr}from"./perf-runtime-plan.js";import{i as wr,n as Tr}from"./lease-context.js";import{n as Er,r as Dr}from"./device-isolation.js";import{a as Or,i as kr,n as Ar,r as jr}from"./device-inventory-context.js";import{i as Mr,o as Nr}from"./durable-capture-resource.js";import{a as Pr,c as Fr,d as Ir,i as Lr,l as Rr,n as zr,o as Br,s as Vr,t as Hr,u as Ur}from"./app-log-session-resource.js";import{n as F,t as Wr}from"./runtime-admission.js";import{s as Gr}from"./quality-warnings.js";import{t as Kr}from"./png-worker-client.js";import{$ as qr,A as Jr,B as Yr,C as Xr,D as Zr,E as Qr,F as $r,G as ei,H as ti,I as ni,J as ri,K as ii,L as ai,M as oi,N as si,O as ci,P as li,R as ui,S as di,T as fi,V as pi,W as mi,X as hi,Y as gi,Z as _i,_ as vi,at as yi,b as bi,c as xi,ct as Si,g as Ci,h as wi,it as Ti,j as Ei,k as Di,l as I,lt as Oi,m as ki,o as Ai,ot as ji,p as Mi,q as Ni,rt as Pi,s as L,st as Fi,u as Ii,v as Li,w as Ri,x as zi,y as Bi,z as Vi}from"./internal/daemon.js";import{a as Hi}from"./ios-snapshot-engine.js";import{n as Ui,r as Wi}from"./device-selection-resolver.js";import{C as Gi,D as R,S as z,T as B,_ as Ki,a as qi,b as Ji,c as Yi,d as Xi,f as Zi,g as Qi,h as $i,i as ea,l as ta,m as na,n as ra,o as ia,p as aa,r as oa,s as sa,u as ca,v as la,w as ua}from"./src8.js";import{n as da,r as fa}from"./doctor-output.js";import{t as pa}from"./record-runtime.js";import{n as ma}from"./gesture-runtime.js";import{i as ha,n as ga,r as _a}from"./platform-runtime-open-target.js";import{t as va}from"./snapshot-runtime.js";import{createHash as ya}from"node:crypto";import V,{promises as ba}from"node:fs";import xa from"node:os";import H from"node:path";import{fileURLToPath as Sa}from"node:url";import{setTimeout as Ca}from"node:timers/promises";import wa from"node:vm";function U(e,t){return R({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function Ta(e){return R({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Ea(e,t){let n=Na(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},Ta(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:Da(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Da(e,t){let n=t.matched&&t.visible&&t.failureReason===void 0;return e.kind===`visible`?n:!n}async function Oa(e,t,n,r){let i=Na(await r.resolveTarget({selector:e,...t},U(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Ji(Aa(e,i),{selector:e,candidateCount:i.candidateCount,...i.failureReason?{targetFailureReason:i.failureReason}:{}});return{kind:`selector`,selector:e,query:{selector:e,...t},...i,rect:i.rect}}function ka(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 Aa(e,t){let n=ja(e);switch(t.failureReason){case`selector-did-not-match`:return`Maestro target ${n} did not match any element.`;case`no-visible-match`:return`Maestro target ${n} matched ${t.candidateCount} element(s), but none were visible.`;case`index-out-of-range`:return`Maestro target ${n} matched ${t.candidateCount} element(s); its index is out of range.`;case`no-usable-geometry`:return`Maestro target ${n} did not provide usable geometry.`;default:return`Maestro target did not resolve to a visible element.`}}function ja(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);return t.length===0?`selector`:t.map(([e,t])=>`"${e}":${JSON.stringify(t)}`).join(`, `)}function Ma(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 Na(e,t){return Pa(e,t),Fa(e),Ia(e),La(e),e}function Pa(e,t){if(e.generation!==t)throw new a(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Fa(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new a(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Ia(e){if(e.rect!==void 0&&!Ma(e.rect)||e.viewport!==void 0&&!Ma(e.viewport))throw new a(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function La(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new a(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ra(e,t,n,r,i,a={}){let o=za(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Wa(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function za(e,t,n,r,i){let a=n===`up`||n===`down`,o=qi(e,aa(e,r),i),s=o.visibility,c=Qi({visibility:s,matches:e.nodes.filter(e=>pe(e)),platform:r}),l=be(s.viewportRects)??Va(c);if(!l||!ke(l))return;let u=c.flatMap(e=>{if(!ke(e.rect))return[];let t=Ha(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=Ba(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(Ua)[0]?.viewport}function Ba(e,t){return pe(e)?e:Ve(e,t)}function Va(e){let t;for(let n of e)ke(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ha(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 Ua(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Wa(e,t){let n=W(e,.5,.5),r=z.scrollUntilVisibleSwipe.nearEdgeFraction,i=z.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 Ga(e,t,n){let r=B(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:qa(await Ka(e.start,t,n,i),await Ka(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}=Ja(i,e.direction,n.platform);return{authored:e,gesture:qa(a,o,r),viewport:i}}let i=await Oa(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs},t,n),o=i.viewport??await n.resolveGestureViewport(U(t,t.command)),{start:s,end:c}=Ya(i,e.direction,o);return{authored:e,gesture:qa(s,c,r),target:i,viewport:o}}async function Ka(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 qa(e,t,n){return{from:e,to:t,durationMs:n??z.command.swipeDurationMs}}function Ja(e,t,n){if(t===`left`||t===`right`){let n=it(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=z.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 Ya(e,t,n){let r=Pn(e.rect),i=n.x+Math.trunc(n.width*z.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*z.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*z.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*z.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 Xa={launchApp:to,stopApp:to,setPermissions:to,clearState:to,openLink:to,tapOn:io,doubleTapOn:io,longPressOn:io,swipe:lo,inputText:uo,eraseText:uo,scroll:fo,scrollUntilVisible:fo,hideKeyboard:fo,pressKey:fo,back:fo,waitForAnimationToEnd:fo,takeScreenshot:ho,runScript:ho,evalScript:_o,assertVisible:go,assertNotVisible:go,assertTrue:go,extendedWaitUntil:go},Za={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 Qa(e){return Za[e.kind]}async function $a(e,t){let n=e.command;return await eo(n,e,t,U(e,n))}function eo(e,t,n,r){let i=Xa[e.kind];return i(e,t,n,r)}async function to(e,t,n,r){switch(e.kind){case`launchApp`:return await G(n.launchApp,no(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:ro(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 no(e,t){return R({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?ro(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function ro(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function io(e,t,n,r){switch(e.kind){case`tapOn`:return await ao(e,t,n,r);case`doubleTapOn`:{let i=await To(e.target,{purpose:`doubleTap`,timeoutMs:so(e)},t,n),a=B(e.delay,`doubleTapOn.delay`)??z.command.repeatDelayMs;return await G(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?ka(i.resolution):void 0)}case`longPressOn`:{let i=await To(e.target,{purpose:`longPress`,timeoutMs:so(e)},t,n);return await G(n.longPressOn,{target:i},r,`invalidate`,i.resolution?ka(i.resolution):void 0)}}}async function ao(e,t,n,r){let i=await oo(e,t,n);return await G(n.tapOn,co(e,i),r,`invalidate`,i.resolution?ka(i.resolution):void 0)}async function oo(e,t,n){let r={purpose:`tap`,timeoutMs:so(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await To(e.target,r,t,n)}function so(e){return e.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs}function co(e,t){let n=B(e.repeat,`tapOn.repeat`),r=B(e.delay,`tapOn.delay`),i=n===void 0?r:r??z.command.repeatDelayMs;return R({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function lo(e,t,n,r){let i=await Ga(e.gesture,t,n);return await G(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?ka(i.target):void 0)}async function uo(e,t,n,r){switch(e.kind){case`inputText`:return await G(n.inputText,R({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await G(n.eraseText,R({charactersToErase:B(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function fo(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,po(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,mo(e),r,`preserve`)}}function po(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:B(e.timeout,`scrollUntilVisible.timeout`)??z.command.scrollUntilVisibleTimeoutMs,durationMs:ua(z.command.scrollUntilVisibleSpeed)}}function mo(e){return R({timeoutMs:B(e.timeout,`waitForAnimationToEnd.timeout`)})}async function ho(e,t,n,r){switch(e.kind){case`takeScreenshot`:return yo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await G(n.runScript,R({file:e.file,env:e.env}),r,`preserve`)}}async function go(e){throw new a(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function _o(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=vo(n,r);return yo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function vo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function yo(e,t,n,r){let i=e?.observation;return bo(i,r),{...xo(n??i),...So(e?.outputEnv),...Co(t,e?.artifactPaths),...wo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function bo(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 xo(e){return e?{observation:e}:{}}function So(e){return e?{outputEnv:{...e}}:{}}function Co(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function wo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function To(e,t,n,r){if(e.space===`target`){let i=await Oa(e.selector,t,n,r);return{authored:e,point:Pn(i.rect),resolution:i}}return{authored:e,point:await Ka(e,n,r)}}function Eo(e,t,n,r={}){let i=n===`ios`&&r.presentation?Oo(r.presentation):void 0,a=i?ko(e,t,i):sa(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,failureReason:`selector-did-not-match`,evidence:No(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?ca(s,t.selector.index):ta(s,t.selector.index)?.node,l=No(t,o,s,c);if(!c)return Ao(t,o,s,l);let u=i?ta(i.visibleForSource(c),void 0):null,d=Xi(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&&!Do(t.selector)&&i?jo(d,s,u):0,evidence:l}:{ok:!1,message:`Maestro target did not provide usable geometry.`,failureReason:`no-usable-geometry`,evidence:l}}const Do=$i;function Oo(e){let t=ge(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=>Ki(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function ko(e,t,n){let r=aa(e,`ios`),i=na(e,{},{orderUnindexed:e=>Zi(e,r)}),a=ia(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:Yi(o,t.selector,`ios`,i.visibility,r)}}function Ao(e,t,n,r){if(t.length>0&&n.length===0)return{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,failureReason:`no-visible-match`,evidence:r};let i=e.selector.index;return n.length>0?i!==void 0&&ca(n,i)===void 0?{ok:!1,message:`Maestro selector matched ${n.length} visible element(s); index ${i} is out of range.`,failureReason:`index-out-of-range`,evidence:r}:{ok:!1,message:`Maestro target did not provide usable geometry.`,failureReason:`no-usable-geometry`,evidence:r}:{ok:!1,message:`Maestro selector did not match.`,failureReason:`selector-did-not-match`,evidence:r}}function jo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&Mo(n.rect,e)?1:0:t.length}function Mo(e,t){let n=Pn(e),r=Pn(t);return n.x===r.x&&n.y===r.y}function No(e,t,n,r){return R({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const K={settleTimeoutMs:Gi,retryTapMaxAttempts:z.command.retryTapMaxAttempts,longPressDurationMs:z.command.longPressDurationMs,eraseTextMaxCharacters:z.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:z.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:z.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:z.command.waitForAnimationToEndDifferencePercent,observationPollMs:z.observation.pollIntervalMs};function Po(e,t={}){return{execute:async n=>{let r=U(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Qa(n.command)&&!i,visualStabilityBarrier:i});let a=await $a(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Ea(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Fo(e){throw new a(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Io(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:Fo(t)}}function Lo(e){let t=Io(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Xn(n,e.meta?.tenantId)},cleanup:()=>{Yn(n)}}}function q(e,t,n){return t||Ti(n)?null:d(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`,s())}function Ro(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function J(e){return yi(e.flags)||!e.session?await xt(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await zo(e.session.device)}async function zo(e){if(tn(e)||!j(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await er.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 xt(t)}catch(e){if(!(e instanceof a)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await xt({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Bo(e,t){return t?gi(t,e).length===0:!1}async function Vo(e){let{req:t,sessionName:n,sessionStore:i}=e,a=i.lookup(n),o=a?.session,s,c,l;try{s=Lo(t);let r=Go(t),u=await Uo(o,t.flags),d=await xi(e.inspectFacts)(u),f=I(`install_from_source`,d.operations.ensureReady)??I(`install_from_source`,d.operations.materializeAppSource)??I(`install_from_source`,d.operations.deployMaterializedApp);if(f)return f;let p=await L(e.bindDevice)(u,je);await p.operations.ensureReady({}),c=await p.operations.materializeAppSource({source:s.source}),l=await Ko({artifact:c,retention:r,req:t,session:o,sessionName:n}),a&&P(i.requireCurrent(a));let m=await p.operations.deployMaterializedApp({artifact:c}),h=qo(u,c,m,l),g=gn(h,`Installed: ${Bn(h)}`);return gt(i,a,t,`install_source`,g,{positionals:[]}),{ok:!0,data:g}}catch(e){return l&&await $r(l.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:r(e)}}finally{await c?.cleanup(),s?.cleanup()}}async function Ho(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 $r(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:r(e)}}}async function Uo(e,t){let n=Wo(t?.platform);if(e&&n&&!ne(e.device,n))throw new a(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${E(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 Wo(e){return e===`ios`||e===`android`?e:void 0}function Go(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 Ko(e){if(e.retention.enabled)return await ai({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 qo(e,t,n,r){return j(e)?Jo(t,n,r):Yo(t,n,r)}function Jo(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{...Zo(n),bundleId:r,...Xo(t,e),launchTarget:t.launchTarget??r}}function Yo(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{...Zo(n),packageName:r,...Xo(t,e),launchTarget:t.launchTarget??r}}function Xo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Zo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Qo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=$o(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 F({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:Ce});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 $o(e){let t=es(e);if(!t.ok)return t;let n=ts(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 es(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 ts(e){let t=ns(e.flags?.devicePort),n=ns(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 ns(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function rs(e){return await F({...e,command:`runtime clear`,use:xe})}async function is(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Qo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await as({...e,session:r.get(n)});if(!os(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 ss({sessionName:n,sessionStore:r,ref:a,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?cs(n,s):us({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function as(e){if(!e.session)return d(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ma({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=or(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 os(e){return e===`set`||e===`show`||e===`clear`}async function ss(e){let{sessionName:t,sessionStore:n,ref:r,current:i,inspectFacts:a,bindDevice:o}=e,s=r?n.requireCurrent(r):void 0;if(Bi(i)&&s?.appBundleId){let e=await rs({device:s.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;let t=n.requireCurrent(r);P(t),await e.runtime.operations.clearRuntimeHints({appId:t.appBundleId,values:Xr(i)})}let c=r?n.clearRuntimeHints(r):!!i;return r||n.setRuntimeHints(t,void 0),{ok:!0,data:{session:t,cleared:c}}}function cs(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function ls(e){return e?E(e.device):void 0}function us(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=ls(i),s=Qr(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=zi(a,vi(t.flags,s));return Li(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 ds=/^[A-Za-z0-9_.:-]{1,64}$/,fs=8192,ps=4096;function ms(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new a(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!ds.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:gs(n,t)}}function hs(e,t,n){let r=E(e),i=_s(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>ps)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:ps});return s}function gs(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`)>fs)throw new a(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${fs} bytes`);return n}catch(t){throw t instanceof a?t:new a(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function _s(e){return((j(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:A(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 vs(e,t,n,r){let{eventName:i,payload:a}=ms([...r]),o=hs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:tr(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...M(`Triggered app event: ${i}`)}}async function ys(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await F({command:`trigger-app-event`,device:t,use:ze,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=>vs(s,t,e,n)}}function bs(e){let t=(e[0]??`status`).toLowerCase();if(!Hn(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 xs(t)}function xs(e){return e===`get`?`status`:e===`return`?`enter`:e}const Ss={"ime-probe":`android`},Cs={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ws={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function Ts(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:tr(e)}}async function Es(e,t){let n=await F(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function Ds(e,t){return e.operations.keyboardStatus(Ts(t)).then(e=>({platform:Ss[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 Os(e,t){let n=await e.operations.keyboardDismiss(Ts(t)),r=Cs[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...M(js(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 ks(e,t){let n=await e.operations.keyboardEnter(Ts(t)),r=ws[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 As(e){let t=bs(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await Es({command:`keyboard status`,device:n,use:Se,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>Ds(e,t)):t===`dismiss`?await Es({command:`keyboard dismiss`,device:n,use:ie,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>Os(e,t)):await Es({command:`keyboard enter`,device:n,use:$e,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ks(e,t))}function js(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Ms(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&&Oi(t)===`may-invalidate`&&P(h);let g=await m.execute();return l&&(s&&await s(l,g),gt(r,l,t,i,g??{},{positionals:o??a})),{ok:!0,data:g??{}}}function Ns(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 Ps(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await Ms({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={...or(r,t.flags,u?.appBundleId,u?.trace?.outPath),surface:u?.surface};return{ok:!0,execute:()=>l.execute(d)}}})}async function Fs(e){return Ns(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Ps({...e,command:fn.keyboard,resolveRuntime:e=>As(e)})}async function Is(e){return await Ps({...e,command:fn.triggerAppEvent,resolveRuntime:e=>ys(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 _a(i.device,r,i.appBundleId);a!==void 0&&e.sessionStore.update(t,{appBundleId:a})}})}function Ls(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Rs(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(Ls(r))return{kind:`inline`,text:r};throw new a(`INVALID_ARGS`,`${n} file not found: ${i}`)}async function zs(e){let t=Rs(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Bs(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 Bs(e){try{return await ba.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 Vs(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=qs(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let r=u?Xn(u,t.meta?.tenantId):N(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 xi(e.inspectFacts)(c),p=I(n,f.operations.deployApp);if(p)return p;let m=await L(e.bindDevice)(c,De);a&&P(i.requireCurrent(a));let h=await m.operations.deployApp({app:l.app,appPath:r,replaceExisting:n===`reinstall`}),g=Us(c,l.app,r,h),_=gn(g,`Installed: ${g.appName??Vn(g)}`);return Ks(i,a,g),gt(i,a,t,n,_),{ok:!0,data:_}}finally{u&&Yn(u)}}async function Hs(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 zs(Js(l,t.meta?.cwd)),f=await J({session:a,flags:o}),p=await xi(e.inspectFacts)(f),m=I(`push`,p.operations.ensureReady)??I(`push`,p.operations.sendPushNotification);if(m)return m;let h=await L(e.bindDevice)(f,ye);await h.operations.ensureReady({}),i&&P(r.requireCurrent(i));let g=await h.operations.sendPushNotification({appId:c,payload:u}),_=j(f)?gn({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):gn({platform:E(f),package:c,action:g.action,extrasCount:g.extrasCount},`Pushed notification to ${c}`);return gt(r,i,t,`push`,_,{positionals:[c,l]}),{ok:!0,data:_}}function Us(e,t,n,r){return j(e)?Ws(t,n,r):Gs(e,t,n,r)}function Ws(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 Gs(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 Ks(e,t,n){!t||n.platform!==`harmonyos`||!n.appId||e.update(t,{appBundleId:n.appId,appName:n.appName??n.app})}function qs(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 Js(e,t){let n=Rs(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>N(e,t)});return n.kind===`file`?n.path:n.text}async function Ys(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Vs({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Vo({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await Hs({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Xs(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 Zs=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 Qs(e){return Zs.has(e)}const $s=new Map(Re.map(e=>[e.name,e]));function ec(e){let t=new Set;for(let n of e){let e=tc(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function tc(e){let t=$s.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(Qs)?n:void 0}function nc(e){if(e!==void 0&&e.remainingSteps.length!==0)return ec(e.remainingSteps)}function rc(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:wr(e),plannedOperations:nc(e.internal?.executionPlan)}}function ic(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 ac(e,t,n){let r=e.requireCurrent(t);if(!_t(r))return{kind:`not-armed`};let i=r.actions.length;ic(e,t,n);let a=en(r),o=e.writeSessionLog(t,{force:Yt(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`}:(St(r),{kind:`aborted`})}function oc(e,t){let n=r(t),i=$t(e.scriptPublication??rn);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function sc(e){let{req:t,ref:n,sessionStore:r,platformCloseError:i}=e,a=r.requireCurrent(n);i||ic(r,n,t);try{let e=r.writeSessionLog(n,{force:Yt(a,t.flags?.force)});e.written&&Zt(a,e.path);return}catch(e){return cc(e)}}function cc(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 lc(e){let t=e.clearRuntimeHints?re:rt,n=await Wr({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,rt)};let r=await n.bind(e.device,re);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function uc(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 dc(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&&Bi(h)&&await p(`runtime_hints`,async()=>{await o({appId:f.appBundleId,values:Xr(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`,()=>ni(d)),{platformCloseError:g,saveScriptError:v,shutdownResult:_?.shutdown}}async function dc(e,t,n,r){let i=t.resolveCurrent(e)??e.session;await n(`recording`,()=>Di({ref:e,sessionStore:t})),await n(`app_log`,()=>Ei({ref:e,sessionStore:t})),await n(`audio_probe`,()=>ci({ref:e,sessionStore:t})),await n(`perf_capture`,()=>oi({ref:e,sessionStore:t})),await n(`platform_snapshot_helper`,()=>si(i,r))}function fc(e,t){return Jr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function pc(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 mc=(e,t)=>(e.positionals?.length??0)>0||li(t);async function hc(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=i.requireCurrent(n),s=_t(o),c=JSON.stringify(t.positionals??[]);if(s&&!vt(o,c)){let e=await _c({req:t,session:o,logPath:r,lifecycle:a});if(e)return{response:oc(o,pc(e))};Dt(i.requireCurrent(n),c)}let l=ac(i,n,t);return l.kind===`failed`?{response:oc(o,l.error)}:{repairArmed:s,...l.kind===`committed`&&l.path?{healedScriptPath:l.path}:{},...l.kind===`aborted`?{aborted:!0}:{}}}async function gc(e){try{return{providerData:await ji(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 _c(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(mc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:rc(t,r,n.trace?.outPath)});return}catch(e){return e}}function vc(e,t){if(!e.flags?.saveScript||Xt(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new 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 yc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=i.lookup(n);if(!c)return await Cc({req:t,logPath:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});let l=i.requireCurrent(c);vc(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 lc({device:l.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!l.appBundleId&&Bi(i.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(p.type===`response`)return p.response;if(l=i.requireCurrent(c),P(l),t.internal?.closeAppOnly===!0&&u)return await Sc({req:t,session:l,logPath:r,lifecycle:p.runtime,app:u});let m=await hc({req:t,ref:c,logPath:r,sessionStore:i,lifecycle:p.runtime});if(`response`in m)return m.response;let h=await bc({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:xc({session:l,repair:m,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:h.shutdownResult,providerData:h.providerData})}async function bc(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 uc({req:t,ref:n,logPath:r,sessionStore:i,lifecycle:s,clearRuntimeHints:c,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:_c,finalizeOrdinaryCloseScript:sc,platformResourceCleanup:e.platformResourceCleanup}),m=i.requireCurrent(n),h=await gc({session:m,leaseRegistry:a,leaseLifecycleProvider:o});if(h.response)return{kind:`response`,response:h.response};m=i.resolveCurrent(n)??m;let g=fc(l,u),_=d??g;if(_?m.deviceClaim&&T({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:m.deviceClaim.deviceKey,session:l}}):await mr(m.deviceClaim),i.retire(n),_)throw _;if(f)throw f;return{kind:`closed`,providerData:h.providerData,shutdownResult:p}}function xc(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:gn({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...M(c),...o,...s}}}async function Sc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await _c({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...M(`Closed: ${a}`)}}}async function Cc(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 lc({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:rc(t,n)}),{ok:!0,data:{app:t.positionals[0],...M(`Closed: ${t.positionals[0]}`)}})}function wc(e,t){return e.operations.ensureReady(t)}function Tc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function Ec(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return Dc(t,r);case`devices`:return await kc(t);case`capabilities`:return await Lc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Uc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function Dc(e,t){let n=ii(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ni(e.session,n)).map(e=>Oc(e,t))}}}function Oc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:An(r),platform:E(t.device),...k(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,...k(t.device.platform)&&!A(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function kc(e){try{let t=Ac();return{ok:!0,data:{devices:(await Mc(e)).map(e=>({...Xc(e),...jc(e,t)}))}}}catch(e){let n=t(e);return{ok:!1,error:{code:n.code,message:n.message,...n.details?{details:n.details}:{}}}}}function Ac(){let e=new Map;for(let t of cr({})){let n=t.claim;!n||lr(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function jc(e,t){let n=t.get(sr(yr(e)));return n?{claimedBy:n}:{}}async function Mc(e){let t=e.flags?.platform;return Ic(await Ar(Nc(e,t)),e.flags?.platform,e.flags?.target)}function Nc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Pc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Fc(n?.androidDeviceAllowlist)}}function Pc(e,t,n){return D({simulatorSetPath:Dr(e),platform:t,target:n})}function Fc(e){let t=Er(e);return t?Array.from(t).sort():void 0}function Ic(e,t,n){let r=t?e.filter(e=>Zc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Lc(e){let t=await Yc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Rc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Kc(n,e.inspectFacts);return{ok:!0,data:{device:Xc(n),availableCommands:tt().filter(e=>e===`appstate`&&r?!0:Vc(e,i))}}}function Rc(e,t,n){return!t||!j(e)&&!A(e)||!Bo(n,t)?!1:zc(t)||Bc(e,t)}function zc(e){return!!(e.appName||e.appBundleId)}function Bc(e,t){return!!(A(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Vc(e,t){let n=Ge(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Hc(t,e)))}function Hc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Uc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Wc(t,e.providerAppCatalog);if(o)return o;let s=await Yc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=bn(t.flags?.appsFilter),u=Er(t.flags?.androidDeviceAllowlist),d=await qc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Jc(await Tc(f,await wc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Wc(e,t){let n=Gc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,qn(e.meta?.requestId))]}}}function Gc(e){let t=Tr(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 Kc(e,t){if(t)try{return await t(e)}catch{return}}async function qc(e){let t=await xi(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 L(e.bindDevice)(e.device,Xe)}}function Jc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Yc(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 Xc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...k(r.platform)&&n?{appleOs:n}:{}}}function Zc(e,t){return ne(e,t)}function Qc(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function $c(e){return d(`INVALID_ARGS`,e)}function el(e,t,n,r){try{return ga({device:e,surfaceFlag:t,openTarget:n,existingSurface:r})}catch(e){return d(e instanceof a?e.code:`INVALID_ARGS`,String(e.message))}}async function tl(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await ha({target:n,platform:i.platform,surface:r});return a?$c(a):null}async function nl(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await ha({target:n,platform:r});return i?$c(i):null}function rl(e){let t=Zr(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:Bi(n),clearRemovedRuntimeHints:fi({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function il(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:ol(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:wr(t)}});let{appBundleId:d,appName:f}=await al({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 bi({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 al(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 ol(e){return Qc(e.flags?.timeoutMs)}async function sl(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 cl(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 va({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}}:ll(o.data,r.error)}catch(e){return ll(o.data,r(e))}}function ll(e,t){return{ok:!0,data:{...e,warnings:[..._n(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function ul(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,...dl(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=E(d),_.target=d.target??`mobile`,_.device=d.name,_.id=d.id,_.kind=d.kind,te(d.platform)&&(_.serial=d.id)),d&&j(d)&&(_.device_udid=d.id,_.ios_simulator_device_set=d.simulatorSetPath??null),{..._,...M(`Opened: ${o??s??t}`)}}function dl(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 fl(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=Fi({req:t,existingLease:e.lease}),l&&(e.deviceClaim=l),ir(e),n.refresh(i)}return n.publish(r,{name:ei(t),sessionScope:t.internal?.resolvedSessionScope??ii(t),device:a,surface:o,appBundleId:s,appName:c,createdAt:Date.now(),actions:[],lease:Fi({req:t}),deviceClaim:l})}const pl=Object.freeze({async observeBootTimeMs(e){if(j(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 ml(e,t){e.warnings=[..._n(e),t]}function hl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){nn(t,{});return}Xt(n)&&(Jt(t),ml(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 gl(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 _l(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function vl(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 yl(e,t){if(!t)return;let n=await dr(t);if(n.status!==`renewed`)return n.conflict?wi(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 bl(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,S=t.flags?.relaunch===!0,w=f,ee=Date.now(),E=await xl({req:t,sessionName:r,sessionStore:i,device:o,surface:u,sessionAppBundleId:w,appName:l,existingRef:g});if(E.type===`response`)return E;let D=E.ref;Y(i,r,D);let O=D?i.requireCurrent(D):void 0,te=Date.now(),k=await m.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:w,surface:u,hasExistingSession:b!==void 0,relaunch:S,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:_l(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Xr(p),applyRuntimeHints:h,execution:rc(t,a,O?.trace?.outPath)});w=k.appBundleId??w;let A={...k.timing},j=Ui(y),ne=s?vl(te,s,w):void 0;if(Wn(t.meta?.requestId)){let e=n();return{type:`response`,response:d(e.code,e.message,e.details)}}Y(i,r,D),g&&$n({session:i.requireCurrent(g),command:`open`,positionals:[],flags:void 0,androidFreshnessBaseline:x});let re=i.ensureSessionDir(r),ie=kn(re,t.meta?.requestId??C().requestId);A.totalDurationMs=Math.max(0,Date.now()-ee),T({level:`info`,phase:`open_timing`,durationMs:A.totalDurationMs,data:A});let ae=ul({sessionName:O?.name??ei(t),sessionStateDir:re,runnerLogPath:An(re),requestLogPath:ie,eventLogPath:i.resolveEventLogPath(r),appName:l,appBundleId:w,surface:u,startup:ne,timing:A,device:o,runtime:p,runtimeHintCount:Li,sessionReused:b!==void 0,selection:j,launchConfirmation:k.launchConfirmation});v&&ml(ae,gl(v));let oe=fl({req:t,sessionStore:i,sessionName:r,existingRef:D,device:o,surface:u,appBundleId:w,appName:l,deviceClaim:_}),se=i.requireCurrent(oe);return t.runtime!==void 0&&Ri(i,r,p),hl({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 xl(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=fl({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 Sl(e){return e.internal?.admittedLease?.backend===`macos-app`}function Cl(e){let{req:t,device:n,sessionStore:r}=e,i=Sl(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=ui(t);return mi(t,i.session)?_i(i,n,a):hi(i,n,a)}async function wl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Mi(r,t.internal?.admittedLease)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=ki(n,r,Ci({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Cr({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:pl})}}async function Tl(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=Cl({req:t,device:a,sessionStore:i});if(m)return{type:`response`,response:m};let h=await wl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return{type:`response`,response:wi(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 El({ownership:g,effects:v,sessionName:n,sessionStore:i});try{Y(i,n,void 0);let e=await il({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 yl(a,g);if(f)return{type:`response`,response:f};v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await bl({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 El(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await mr(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await gr(t);T({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const Dl=new Map;async function Ol(e){let t=Ae({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Wr({...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,fe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,qe);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function kl(e){let t=rl(e);if(t.type===`response`)return t;let n=await Ol({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 Al(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.lookup(t),a=await sl({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=el(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:$c(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 tl({shouldRelaunch:s,openTarget:l,surface:u,device:a.device});if(f)return{type:`response`,response:f};let p=r.requireCurrent(i),m=await yl(p.device,p.deviceClaim);if(m)return{type:`response`,response:m};let h=await zo(a.device),g=Wi(h);await o.internal?.retainDeviceExecutionLock?.(h.id);let _=await kl({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);P(b);let x=await il({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 yl(h,r.requireCurrent(i).deviceClaim);return S?{type:`response`,response:S}:await bl({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:$c(`open --relaunch requires an app argument.`)};let l=await nl({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return{type:`response`,response:l};let u=await Ct(o.flags??{},Pi(c)),f=u.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=el(f,o.flags?.surface,c);if(typeof p!=`string`)return{type:`response`,response:p};let m=await tl({shouldRelaunch:s,openTarget:c,surface:p,device:f});if(m)return{type:`response`,response:m};let h=await kl({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 Nn(Dl,f.id,async()=>await Tl({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 jl(e){let t=await Al(e),n=t.response;return t.type!==`opened`||e.req.flags?.foreground!==!0?n:await cl({...e,inspectFacts:xi(e.inspectFacts),bindDevice:L(e.bindDevice),openResponse:n,ref:t.ref})}const Ml=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Nl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Pl(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 Fl(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 Il(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Ll(e,n){if(!n.appBundleId)return;let r=await F({command:`appstate`,device:n.device,use:Ne,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;T({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:t(e).code,message:t(e).message}});return}}async function Rl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Ro(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=k(i?.device.platform)&&Bo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return d(`SESSION_NOT_FOUND`,Ml);if(u&&!c)return d(`SESSION_NOT_FOUND`,Nl);if(c&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(A(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=A(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 Ll(e,i);return{ok:!0,data:{platform:E(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...j(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let f=await J({session:i,flags:a});if(j(f))return d(`SESSION_NOT_FOUND`,Ml);if(A(f))return d(`SESSION_NOT_FOUND`,Nl);let p=await F({command:`appstate`,device:f,use:Ne,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:Bl(a.androidDeviceAllowlist)});let h=await m.operations.appState();return{ok:!0,data:{platform:E(f),package:h.package,activity:h.activity}}}async function zl(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=Er(o.androidDeviceAllowlist),l=c?[...c].sort():void 0,u=ve({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`&&!Il(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 Wr({command:`boot`,device:f,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Pl(u.kind===`boot-target-headless`)});if(p.type===`response`)return p.response;let m={serial:o.serial,androidSerialAllowlist:l,deadlineAtMs:Qc(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:E(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...k(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=Fl((await xi(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:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await L(e.bindDevice)(s,Ee)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...k(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:d(l.error?.code??`COMMAND_FAILED`,Vl(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return n.command===`appstate`?await Rl({req:n,sessionName:r,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Bl(e){let t=Er(e);return t?[...t].sort():void 0}function Vl(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Hl(e){return zr.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Ul(e){try{return await Wl(e)}catch(e){return{ok:!1,error:r(e)}}}async function Wl(e){let t=Gl(e);if(!t.ok)return t;let n=t.ref,r=e.sessionStore.requireCurrent(n),i=_e(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 Kl(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 ql(e,n,i,l.use);case`capture-status`:return await Jl(e,n);case`capture-stop`:return await Yl(e,n)}}function Gl(e){let t=e.sessionStore.lookup(e.sessionName);return t?{ok:!0,ref:t}:d(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Kl(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 ql(e,t,n,r){let i=e.sessionStore.requireCurrent(t),a=Mr(e.sessionStore,t);i.audioProbe&&(await pr({intent:`disposal`,binding:a}),i=e.sessionStore.requireCurrent(t));let o=await e.bindDevice(i.device,r),s=xr.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=xr.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 vr({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 Jl(e,t){let n=Mr(e.sessionStore,t),r=n.read();if(!r)return{ok:!0,data:Xl()};let i=await r.handle.status();return i.state===`stopped`&&await pr({intent:`disposal`,binding:n}),{ok:!0,data:i}}async function Yl(e,t){let n=Mr(e.sessionStore,t);return n.read()?{ok:!0,data:await pr({intent:`capture`,binding:n})}:{ok:!0,data:Xl()}}function Xl(){return ur({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 Zl(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(mn(e.req.positionals?.[0]))throw new a(`INVALID_ARGS`,hn);_u(e.req);let t=Sr({positionals:e.req.positionals,kind:yu(e.req.flags?.kind),outPath:yu(e.req.flags?.out)}),r=_r(t);if(r.kind===`capture-stop`)return Ql(i,await nu(i,n,r.request));let o=await Ai({device:n.device,plan:r,inspectFacts:e.inspectFacts});return o.admitted?Ql(i,await $l(i,n,o)):I(`perf`,o.fact)??d(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:r(e)}}}function Ql(e,t){return t.ok&&gt(e.sessionStore,e.ref,e.req,`perf`,v(t.data)?{...t.data}:{}),t}async function $l(e,t,n){let{device:r,plan:i}=Ii(n),o=L(e.bindDevice);switch(i.kind){case`frames`:return{ok:!0,data:cu(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?N(i.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:H.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await eu(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:N(c,e.req.meta?.cwd),outPath:l,template:i.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function eu(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=fr.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=fr.createNextFence({admissionLedger:tu(e),resourcePath:o,device:t.device}),c=Nr(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 br({admissionLedger:tu(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 tu(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 nu(e,t,n){let r=t.perfCapture;if(!r)return d(`INVALID_ARGS`,`no active native perf capture`);let i=su(r.handle.inspect(),n);if(i)return d(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(N(n.outPath,e.req.meta?.cwd));let a=await hr({intent:`capture`,binding:Nr(e.sessionStore,e.ref)});if(n.area===`cpu`){let t=ru(a);e.sessionStore.update(e.ref,{lastPerfProfile:t})}return{ok:!0,data:a}}function ru(e){if(iu(e)||au(e))return e;throw new a(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function iu(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function au(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&ou(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function ou(e,t){return t.every(t=>typeof e[t]==`string`)}function su(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 cu(e,t){return{...hu(e),metrics:{fps:lu(t.metric,e)},sampling:{fps:t.sampling}}}function lu(e,t){if(!v(e)||e.available!==!0)return e;let n=uu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function uu(e,t){let n=du(t.windowStartedAt),r=du(t.windowEndedAt)??du(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:fu(e)})).slice(-12)}function du(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function fu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}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:E(e.device),device:e.device.name,deviceId:e.device.id}}function gu(e,t,n){return t?N(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,Be)).facts.networkDump;if(!r.available)return Au(r.hint);let i=Eu(e.req);if(!i.ok)return i;let a=he({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=Vr(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 He([...e,...t.notes??[]])}async function Iu(e){let{req:t}=e;return t.command===`perf`?await Zl({...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 Ul(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,ue)).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(me({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=Ur(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 Rr(r,e),{ok:!0,data:{path:r,marked:!0}}}function Gu(e){return{ok:!0,data:Pr(e)}}async function Ku(e,t,n,r){let{session:i,sessionStore:a}=e;i.appLog&&await Br({intent:`disposal`,ref:e.ref,sessionStore:a});let o=Pr(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 Br({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=Ir.resolvePath(o.resolveSessionDir(a));try{let l=Hl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device});Lr(o,e.ref).assertAdoptable();let u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await Hr({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:Fr({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);rr(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:Zn(i),refFrame:Qn(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`}:(nr(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&&Zn(n)===t.runtimeRevision&&Qn(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=Ye(t);return ya(`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=lt(e),i=dt(e),o=ad({actions:r.actions,actionLines:r.actionLines,actionSourcePaths:r.actionSourcePaths,metadata:{platform:t?.platform??at(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(`@`)&&nt(`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?ce(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?[...ce(e,r),...Te(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=It(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=Ut(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=nt(`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),ct(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=nt(`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 He(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=an(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=>jt(At(n,t),e))}function Gd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=cn(n,t,e.length);return!r.broken&&Je(r.chain,e)})}function Kd(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:i}=e,a,o,s=zn({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=Rn(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(st(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 En(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(Gr(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:Fn(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!!yn(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=on(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=yn(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 ct(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function mf(e){let t=ct(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=et(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=Me(t,r.device.platform,{action:i.command===`fill`?`fill`:ct(i.command)?`click`:`get`,nodes:n}),l=o(t.type??`Element`),u=yn(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:st(n),action:n.command,positionals:yt(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:In(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:In(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=>In(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:y(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:qn(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){T({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:yt(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`?Kt(Gt(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:ot(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ft(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 Le(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=an(r),u=le(t),d=sn(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Mt(r,e)===t.sibling),p=d.filter(e=>jt(At(e,l),t.scrollRegion)),m=Ot(p)[t.viewportOrder]?.ref,h=kt({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?ln(t,r):null;return a(c)?{matchedNodes:[c],winnerRef:c.ref}:{matchedNodes:[],winnerRef:``}}function Jf(e,t,n,r,i){let a=Pe(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=dn(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=Nt(t),i=cn(t,n,Math.max(e.ancestry.length,1)).chain;return[...ce(e,r),...Te(e.ancestry,i)].slice(0,5)}function Zf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=pt(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=nt(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!ct(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=Rn(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:up(le(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(st(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=Rn(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:Fe(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:Nt(s.winnerNode),structural:Oe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Nt(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===un}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=yn(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}},T({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=Qe(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{wa.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=Tn(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=Sa(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 ba.mkdtemp(H.join(xa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await ba.rm(n,{recursive:!0,force:!0})}catch{}}}async function Xp(e,t,n,r){try{let[i,a]=await Promise.all([ba.readFile(e),ba.readFile(t)]);tm(n);let o=await Kr(i,a,`Maestro screenshot`);return tm(n),Qp(o,r)}catch(e){em(e,n),T({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 ba.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){T({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=qr(e.snapshot),n=e.platform===`ios`?Hi(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:f(n.nodes)}:e.snapshot;return pm(Eo(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,Da(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,failureReason:e.failureReason,...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!ke(e)||!ke(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&&!Do(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=la(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 ya(`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=S(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,Pn(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){T({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===vn.selectorNotFound}async function mh(e,t,n){if(!t)throw new a(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);T({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)=>{w(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=Ra(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 Ji(`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 Po(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=qn(r.meta?.requestId),c=kh(t,r),l=vf(e.error),u=[...t.redactions],d=Rn(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(ra(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??``:ut(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 y(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`,pi);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 oa(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=>ti(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=ea(ti(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:qn(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 xt(t.flags??{},Vi(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 xt(e.req.flags??{},Vi(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{...zt(Lt(e.flags?.replayShellEnv)),...Vt(Ft(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 Ca(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:Yr(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:zt(Lt(t.flags?.replayShellEnv)),cliEnv:Vt(Ft(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`?N(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`,pi);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,Ht(h)&&t.flags?.replayBackend!==`maestro`)return d(`INVALID_ARGS`,Rt(`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:ti(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,ee=ug({req:t,entryIndex:C,sessionStore:a,sourcePath:h,coordinator:s});if(!ee.ok)return ee.response;let{runtime:E,readLastResponse:D}=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:qn(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:l,armSaveScript:ee.armSaveScript}),O=await Ed({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},E);return O.status===`failed`?D()??d(`COMMAND_FAILED`,`replay step failed with no recorded response`):yg({startedAt:p,sessionName:n,sessionStore:a,replayed:O.replayed,artifactPaths:O.artifactPaths,snapshotDiagnosticSamples:O.snapshotDiagnosticSamples,armSaveScript:ee.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=y([...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 Ie(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=Ie(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 Ie(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`?k(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),Ca(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=x(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=ti(e,n),i=Bt(n,t)===`maestro`,a=dt(r);return{path:n,manifest:{...i?{title:ea(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 Ar(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=Er(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:D({simulatorSetPath:Dr(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!(!ne(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`||xn(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:_n(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:_n(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=b(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=On(o.device.platform),c=i?H.join(i,`recording${s}`):Dn(o.device.platform);sv(a,{type:`video_recording_start`,session:n,videoPath:c}),T({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 En(nv),sv(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:nv}),T({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 En(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}),T({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})=>{Kn(e);let n=dv(e,t);return{cancel:()=>Un(e),release:()=>{n(),Gn(e)}}};function dv(e,t){if(!t||t===e)return()=>{};let n=qn(t);if(!n)return()=>{};let r=()=>{Un(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:Jn,isCanceled:()=>Wn(n.meta?.requestId),emitDiagnostic:T,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`,pi);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:N(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:ht(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Ev(e.scriptPublication??rn)}},armStep(e){n.update(t=>{bt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Id(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){ht(r())!==void 0&&n.update(Et)},markCompleteIfArmed(){ht(r())!==void 0&&n.update(Tt)},markSessionHeldIfArmed(e){if(e.ok||!mt(r()))return e;let t=Ln(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:$t(e),targetForce:Wt(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 pa({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:ii},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})=>di({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 ar({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 yc({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!==pn.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.`));qt(o,{explicitPath:c,liveForce:t.flags?.force});let l=r.writeSessionLog(i,{force:Yt(o,t.flags?.force),publication:`active`});return l.written?(Qt(o,l.path),{ok:!0,data:{session:o.name,savedScript:l.path,actionCount:l.actionCount,...M(`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(_t(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Xt(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:tr(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,...M(`Clipboard updated`)}}async function Kv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await F({command:`clipboard`,device:t,use:Ke,inspectFacts:i,bindDevice:a,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>Wv(n,e,r)}}let o=await F({command:`clipboard`,device:t,use:Ue,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>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(fn.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(or(r,t.flags,g?.appBundleId,g?.trace?.outPath));return gt(i,s,t,t.command,_),{ok:!0,data:{platform:E(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),Jn({type:`command`,status:`progress`,message:Qv(t)})}function Qv(e){return[fa(e),...da(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 ${E(n)}.`,evidence:{requested:i,platform:E(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 ${E(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:E(e),id:e.id,name:e.name}))}})}function ry(e,t){let n=e.flags??{};return wt({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=>ee(e,t,{includeExplicitSelectors:!0}))}async function ay(e){if(e.platform)return{...oy([await kr(e)]),failures:[]};let t=[],n=[];for(let r of Cn)try{t.push(await kr({...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=Sn(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=E(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 wn(`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 wn(`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`,`providerDeviceType`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Ay(e,t){let n=Mn(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 ${E(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!==fn.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 ${jn()} using ${u}`,evidence:{version:jn(),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=>tn(e),emitProgress:e=>Jn({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await jr(e),shouldPropagateInventoryProbeError:Or,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=>j(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,Xe),u=Er(n.flags?.androidDeviceAllowlist),d=await wc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await Tc(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?E(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 F({...e,command:`prepare`,use:de})}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(fn.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:wr(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:We}function Xy(e,t,n,r){return{action:e,platform:E(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=>Ec(e),tb=e=>jl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),nb=e=>yc({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 zl({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 is({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:Fs,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:Ys,reinstall:Ys,install_source:Ys,release_materialized_paths:async({req:e})=>await Ho({req:e}),push:Ys,"trigger-app-event":Is,open:tb,replay:Nv,test:Pv,batch:async({req:e,sessionName:t,invoke:n})=>await Xs(e,t,n),close:nb};async function ob(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Si,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};