agent-device 0.21.16 → 0.21.17

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 (269) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.16.apk → agent-device-android-ime-helper-0.21.17.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.17.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.16.manifest.json → agent-device-android-ime-helper-0.21.17.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.16.apk → agent-device-android-snapshot-helper-0.21.17.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.17.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.16.manifest.json → agent-device-android-snapshot-helper-0.21.17.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +31 -0
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1 -1
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +9 -0
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +40 -6
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +4 -0
  13. package/dist/src/adapter.js +1 -1
  14. package/dist/src/adb-executor.js +1 -1
  15. package/dist/src/adb-failure.js +1 -1
  16. package/dist/src/adb-transport.js +1 -1
  17. package/dist/src/agent-browser-process-record.js +1 -1
  18. package/dist/src/agent-browser-provider.js +1 -1
  19. package/dist/src/agent-browser-tool.js +1 -1
  20. package/dist/src/agent-device-client.js +2 -2
  21. package/dist/src/ai-sdk.js +1 -1
  22. package/dist/src/alert-runtime.js +1 -1
  23. package/dist/src/app-catalog.js +1 -1
  24. package/dist/src/app-deployment-resolution.js +1 -1
  25. package/dist/src/app-inventory.js +1 -1
  26. package/dist/src/app-launch.js +1 -1
  27. package/dist/src/app-lifecycle.js +1 -1
  28. package/dist/src/app-lifecycle2.js +1 -1
  29. package/dist/src/app-log-files.js +1 -1
  30. package/dist/src/app-log-runtime2.js +1 -1
  31. package/dist/src/app-resolution.js +2 -2
  32. package/dist/src/apple-runner-platform.js +1 -1
  33. package/dist/src/application-lifecycle-interaction.js +1 -1
  34. package/dist/src/archive.js +1 -1
  35. package/dist/src/artifact-download.js +1 -1
  36. package/dist/src/auth-session.js +1 -1
  37. package/dist/src/auth.js +1 -1
  38. package/dist/src/back-mode.js +1 -1
  39. package/dist/src/backend-snapshot-options.js +1 -1
  40. package/dist/src/boot-diagnostics.js +1 -1
  41. package/dist/src/cache.js +1 -0
  42. package/dist/src/capture.js +1 -1
  43. package/dist/src/cli-config.js +1 -1
  44. package/dist/src/cli-help.js +6 -5
  45. package/dist/src/cli-runner.js +1 -1
  46. package/dist/src/cli.js +4 -4
  47. package/dist/src/click-button.js +1 -1
  48. package/dist/src/client-metro-companion.js +1 -1
  49. package/dist/src/client-metro.js +1 -1
  50. package/dist/src/client-types.d.ts +5 -5
  51. package/dist/src/clipboard-shell-response.js +1 -1
  52. package/dist/src/code-signature-cache.js +1 -1
  53. package/dist/src/command-schema.js +3 -3
  54. package/dist/src/command-tools.js +3 -3
  55. package/dist/src/connection-runtime.js +1 -1
  56. package/dist/src/connection.js +1 -1
  57. package/dist/src/contracts.js +1 -1
  58. package/dist/src/daemon-client-lease-beat.js +1 -1
  59. package/dist/src/daemon-client-lifecycle.js +1 -1
  60. package/dist/src/daemon-client-transport.js +1 -1
  61. package/dist/src/daemon-policy-file.js +1 -0
  62. package/dist/src/daemon-process.js +1 -1
  63. package/dist/src/daemon-registration.js +1 -1
  64. package/dist/src/daemon-shutdown-report.js +1 -1
  65. package/dist/src/daemon.js +1 -1
  66. package/dist/src/debug-symbols-facade.js +1 -1
  67. package/dist/src/device-claim-inspection.js +1 -1
  68. package/dist/src/device-claim-rule.js +1 -2
  69. package/dist/src/device-inventory-context.js +1 -1
  70. package/dist/src/{stop-sequence.js → device-readiness-runtime.js} +1 -1
  71. package/dist/src/device-rotation.js +1 -1
  72. package/dist/src/device-selection-resolver.js +1 -1
  73. package/dist/src/device-session.js +1 -1
  74. package/dist/src/device-shell.js +1 -1
  75. package/dist/src/device.js +1 -1
  76. package/dist/src/device2.js +1 -1
  77. package/dist/src/devicectl.js +1 -1
  78. package/dist/src/diagnostics.js +1 -1
  79. package/dist/src/dispatch-resolve.js +1 -1
  80. package/dist/src/doctor-facade.js +1 -1
  81. package/dist/src/doctor2.js +1 -1
  82. package/dist/src/durable-resource.js +1 -1
  83. package/dist/src/engine-eval-script.js +1 -1
  84. package/dist/src/error.js +1 -1
  85. package/dist/src/exec.js +1 -1
  86. package/dist/src/file.js +1 -1
  87. package/dist/src/find.js +1 -1
  88. package/dist/src/format.js +1 -2
  89. package/dist/src/gesture-admission.js +1 -1
  90. package/dist/src/gesture-plan.js +1 -1
  91. package/dist/src/gesture-runtime.js +1 -1
  92. package/dist/src/harmonyos.js +1 -1
  93. package/dist/src/helper.js +2 -2
  94. package/dist/src/host.js +1 -1
  95. package/dist/src/human-control-contract.js +1 -1
  96. package/dist/src/human-control.js +1 -1
  97. package/dist/src/index.d.ts +1 -1
  98. package/dist/src/index.js +1 -1
  99. package/dist/src/input-actions.js +1 -1
  100. package/dist/src/input-actions2.js +1 -1
  101. package/dist/src/install-artifact-facade.js +1 -1
  102. package/dist/src/install-source-network-transport.js +1 -1
  103. package/dist/src/install-source2.js +1 -1
  104. package/dist/src/interaction-positionals.js +1 -1
  105. package/dist/src/interaction-ref-policy.js +1 -1
  106. package/dist/src/interaction2.js +1 -1
  107. package/dist/src/interactor-operation-binding.js +1 -1
  108. package/dist/src/interactor.js +5 -5
  109. package/dist/src/interactor2.js +1 -1
  110. package/dist/src/interactors.js +1 -1
  111. package/dist/src/internal/bin.js +1 -1
  112. package/dist/src/internal/daemon.js +2 -2
  113. package/dist/src/internal/png-worker.js +1 -1
  114. package/dist/src/internal/run-script-http-child.js +1 -1
  115. package/dist/src/inventory.js +1 -1
  116. package/dist/src/inventory2.js +1 -1
  117. package/dist/src/inventory3.js +1 -1
  118. package/dist/src/inventory5.js +1 -1
  119. package/dist/src/ios-snapshot-runtime.js +1 -1
  120. package/dist/src/lease.js +1 -1
  121. package/dist/src/legacy-xctest-device-set.js +1 -0
  122. package/dist/src/limrun-download-file.js +1 -1
  123. package/dist/src/limrun-runtime-dependencies.js +1 -1
  124. package/dist/src/limrun.d.ts +1 -1
  125. package/dist/src/linux.js +1 -1
  126. package/dist/src/location-coordinates.js +1 -1
  127. package/dist/src/managed-device-scope.js +1 -1
  128. package/dist/src/mechanics.js +10 -10
  129. package/dist/src/multitouch-support.js +1 -1
  130. package/dist/src/observation.js +1 -1
  131. package/dist/src/overlay.js +3 -3
  132. package/dist/src/owner-identity.js +3 -3
  133. package/dist/src/parameterized-recorded-fill.js +1 -1
  134. package/dist/src/perf-facade.js +1 -1
  135. package/dist/src/perf-runtime-operation-builder.js +1 -1
  136. package/dist/src/perf-runtime-plan.js +1 -1
  137. package/dist/src/perf-target.js +1 -1
  138. package/dist/src/perf.js +1 -1
  139. package/dist/src/physical-device-control.js +1 -1
  140. package/dist/src/platform-request-scope.js +1 -1
  141. package/dist/src/platform-runtime-app-log-process.js +1 -1
  142. package/dist/src/platform-runtime-managed-owner.js +1 -1
  143. package/dist/src/platform-runtime-open-target.js +1 -1
  144. package/dist/src/platform-runtime-operation-host.js +2 -2
  145. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  146. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  147. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  148. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  149. package/dist/src/platform-runtime-unavailable.js +1 -1
  150. package/dist/src/platform-runtime.js +1 -1
  151. package/dist/src/platform-runtime2.js +1 -1
  152. package/dist/src/png-crop-bytes.js +1 -1
  153. package/dist/src/png-size.js +1 -1
  154. package/dist/src/png-worker-client.js +1 -1
  155. package/dist/src/png.js +1 -1
  156. package/dist/src/prepare-kind.js +1 -1
  157. package/dist/src/process.js +1 -1
  158. package/dist/src/provider-session-ownership.js +1 -1
  159. package/dist/src/provider-webdriver.js +1 -1
  160. package/dist/src/proxy.js +2 -2
  161. package/dist/src/quality-warnings.js +1 -1
  162. package/dist/src/react-native.js +1 -1
  163. package/dist/src/record-runtime.js +1 -1
  164. package/dist/src/recording.js +1 -1
  165. package/dist/src/register-builtins.js +1 -1
  166. package/dist/src/registry.js +36 -36
  167. package/dist/src/remote-config2.js +1 -1
  168. package/dist/src/replay-divergence.js +1 -1
  169. package/dist/src/replay.js +1 -1
  170. package/dist/src/reporting.js +1 -1
  171. package/dist/src/request-admission.js +1 -1
  172. package/dist/src/request-cancel.js +1 -1
  173. package/dist/src/request-runtime-binding.js +1 -1
  174. package/dist/src/result-serialization.js +1 -1
  175. package/dist/src/retry.js +1 -1
  176. package/dist/src/runner-cache-metadata.js +3 -3
  177. package/dist/src/runner-client.js +1 -1
  178. package/dist/src/runner-command-traits.js +1 -0
  179. package/dist/src/runner-dev-tools-security.js +1 -1
  180. package/dist/src/runner-device-readiness.js +1 -1
  181. package/dist/src/runner-disposal.js +1 -1
  182. package/dist/src/runner-error-classification.js +2 -2
  183. package/dist/src/runner-exchange.js +1 -0
  184. package/dist/src/runner-operations-facade.js +1 -1
  185. package/dist/src/runner-owner-facade.js +1 -1
  186. package/dist/src/runner-session-types.js +1 -0
  187. package/dist/src/runner-start-budget.js +1 -0
  188. package/dist/src/runner-startup-transport.js +1 -0
  189. package/dist/src/runner-xctestrun.js +1 -0
  190. package/dist/src/runner.js +1 -1
  191. package/dist/src/runtime-transport-hints.js +1 -1
  192. package/dist/src/runtime.js +1 -1
  193. package/dist/src/runtime10.js +2 -2
  194. package/dist/src/runtime2.js +3 -3
  195. package/dist/src/runtime3.js +1 -1
  196. package/dist/src/runtime4.js +5 -5
  197. package/dist/src/runtime5.js +1 -1
  198. package/dist/src/runtime6.js +1 -1
  199. package/dist/src/runtime7.js +1 -1
  200. package/dist/src/runtime8.js +1 -1
  201. package/dist/src/runtime9.js +1 -1
  202. package/dist/src/screen-recording-admission-ledger.js +1 -1
  203. package/dist/src/screen-recording-completion.js +1 -1
  204. package/dist/src/screen-recording-options.js +1 -1
  205. package/dist/src/screen-recording-resource-recovery.js +1 -1
  206. package/dist/src/screen-recording-transport.js +1 -1
  207. package/dist/src/screenshot-density.js +1 -1
  208. package/dist/src/screenshot-image.js +1 -1
  209. package/dist/src/screenshot-runtime.js +1 -1
  210. package/dist/src/screenshot.js +1 -1
  211. package/dist/src/screenshot3.js +1 -1
  212. package/dist/src/script.js +1 -1
  213. package/dist/src/scroll-command.d.ts +4 -1
  214. package/dist/src/scroll-command.js +1 -1
  215. package/dist/src/scroll-gesture.js +1 -1
  216. package/dist/src/sdk-batch-runner.js +1 -1
  217. package/dist/src/sdk-batch.js +2 -2
  218. package/dist/src/sdk-contracts.d.ts +10 -0
  219. package/dist/src/sdk-contracts.js +2 -2
  220. package/dist/src/sdk-device.js +1 -1
  221. package/dist/src/sdk-io.js +1 -1
  222. package/dist/src/sdk-remote-config.js +1 -1
  223. package/dist/src/selection.js +0 -0
  224. package/dist/src/selector-runtime.js +1 -1
  225. package/dist/src/server.js +1 -1
  226. package/dist/src/session-allocation.js +1 -1
  227. package/dist/src/session-routing.js +1 -1
  228. package/dist/src/session-runtime-admission.js +1 -1
  229. package/dist/src/session-snapshot.js +1 -1
  230. package/dist/src/session-store.js +1 -1
  231. package/dist/src/session2.js +5 -4
  232. package/dist/src/settings.js +1 -1
  233. package/dist/src/settings2.js +1 -1
  234. package/dist/src/simctl.js +1 -1
  235. package/dist/src/simulator-boot.js +1 -1
  236. package/dist/src/simulator.js +1 -1
  237. package/dist/src/snapshot-runtime-binding.js +1 -1
  238. package/dist/src/snapshot-runtime.js +1 -1
  239. package/dist/src/snapshot-state.js +1 -1
  240. package/dist/src/snapshot2.js +1 -1
  241. package/dist/src/snapshot3.js +1 -1
  242. package/dist/src/snapshot4.js +1 -1
  243. package/dist/src/src.js +1 -1
  244. package/dist/src/src7.js +1 -1
  245. package/dist/src/src8.js +2 -2
  246. package/dist/src/string-enum.js +1 -1
  247. package/dist/src/takeover.js +1 -1
  248. package/dist/src/target-evidence.js +1 -0
  249. package/dist/src/text-entry-focus.js +1 -1
  250. package/dist/src/tool-provider.js +1 -1
  251. package/dist/src/tool-provider2.js +1 -1
  252. package/dist/src/touch-runtime.js +1 -1
  253. package/dist/src/transport.js +2 -2
  254. package/dist/src/tv-remote.js +1 -1
  255. package/dist/src/type-text-runtime.js +1 -1
  256. package/dist/src/vars.js +2 -0
  257. package/dist/src/verified-file.js +1 -1
  258. package/dist/src/video.js +1 -1
  259. package/dist/src/viewport.js +1 -1
  260. package/dist/src/web.js +1 -1
  261. package/dist/src/web2.js +1 -1
  262. package/dist/src/webdriver-source.js +1 -1
  263. package/package.json +1 -1
  264. package/server.json +2 -2
  265. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.16.apk.sha256 +0 -1
  266. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.16.apk.sha256 +0 -1
  267. package/dist/src/capture-disclosure.js +0 -1
  268. package/dist/src/fold-runtime.js +0 -1
  269. package/dist/src/native-build-cache.js +0 -1
@@ -1,4 +1,5 @@
1
- import{B as e,H as t,M as n,N as r,P as i,o as a,t as o}from"./sdk-contracts.js";import{i as s,k as c,n as l}from"./sdk-batch-runner.js";import{S as u,_ as d,b as f,f as p,p as m,u as h,w as g,y as _}from"./sdk-device.js";import{A as v,B as y,Ct as b,F as x,G as ee,I as S,J as C,K as te,L as ne,N as w,Nt as re,P as ie,R as T,St as E,U as ae,Ut as D,W as oe,X as se,Y as ce,Z as le,d as ue,f as de,ft as fe,in as pe,it as me,j as he,ot as ge,pt as _e,q as ve,rt as ye,sr as be,v as xe,wt as Se,z as Ce}from"./sdk-batch.js";import{_ as we,c as O,d as Te,f as Ee,g as De,h as Oe,l as ke,m as Ae,p as je,t as k,u as Me}from"./session-store.js";import{B as A,G as Ne,L as Pe,O as Fe,W as Ie,g as j,h as Le,i as Re,m as ze,n as Be,s as Ve,y as He}from"./session-snapshot.js";import{O as Ue,c as We,f as Ge,g as Ke,h as qe,k as Je,l as Ye,m as Xe,o as Ze,p as Qe,u as M}from"./parameterized-recorded-fill.js";import{n as N,t as $e}from"./catalog.js";import{g as et,i as tt}from"./observability.js";import{i as P,n as nt,r as F}from"./success-text.js";import{t as rt}from"./app-inventory.js";import{r as it,t as at}from"./device.js";import{a as ot,r as I}from"./diagnostics.js";import{a as st,i as ct,r as lt}from"./verified-file.js";import{c as ut}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import{i as dt}from"./replay-divergence.js";import{a as ft}from"./version.js";import{i as pt,r as mt}from"./session-artifact-paths.js";import{t as ht}from"./project-runtime.js";import{t as gt}from"./keyed-lock.js";import{n as _t,t as vt}from"./deploy-result-target.js";import{t as yt}from"./keyboard-actions.js";import{i as bt,r as xt}from"./request-cancel.js";import{t as St}from"./request.js";import{i as Ct,s as wt}from"./provider-session-ownership.js";import{A as Tt,B as Et,C as Dt,E as Ot,F as kt,G as At,K as jt,M as Mt,O as Nt,P as Pt,S as Ft,_ as It,b as Lt,c as Rt,d as zt,et as Bt,f as Vt,g as Ht,h as Ut,k as Wt,l as Gt,m as Kt,n as qt,p as Jt,q as Yt,r as Xt,rt as Zt,s as Qt,t as $t,tt as en,u as L,v as tn,w as nn,x as rn,y as an}from"./device-claim-rule.js";import{i as on}from"./request-runtime-binding.js";import{c as sn,i as cn,t as ln}from"./device-claim-inspection.js";import{t as un}from"./audio-probe-result.js";import{T as dn,_ as fn,a as pn,b as mn,c as hn,d as gn,f as _n,g as vn,h as yn,i as bn,l as xn,m as Sn,n as Cn,o as wn,r as Tn,s as En,t as Dn,u as On,v as kn,x as An}from"./perf-runtime-plan.js";import{i as jn,n as Mn}from"./lease-context.js";import{h as Nn}from"./screenshot-runtime.js";import{n as R,r as Pn}from"./device-isolation.js";import{a as Fn,n as In,r as Ln}from"./device-inventory-context.js";import{n as Rn,r as zn,t as Bn}from"./dispatch-resolve.js";import"./screen-recording-admission-ledger.js";import{a as Vn,d as Hn,i as Un,l as Wn,n as Gn,o as Kn,s as qn,u as Jn}from"./session-routing.js";import{a as Yn,i as z,n as B,r as V,t as Xn}from"./session-runtime-admission.js";import{n as Zn,r as Qn}from"./device-selection-resolver.js";import{n as $n,r as er}from"./doctor-output.js";import{t as tr}from"./record-runtime.js";import{n as nr}from"./gesture-runtime.js";import{i as rr,n as ir,r as ar}from"./platform-runtime-open-target.js";import{t as or}from"./snapshot-runtime.js";import{t as sr}from"./app-log-files.js";import H from"node:path";import U,{promises as cr}from"node:fs";function lr(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority,capture:r.capture},coordinator:r.createCoordinator()}}function ur(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function dr(e,t){let n=c({...e,...t});return Object.keys(n).length>0?n:void 0}function fr(e,t){return async({dispatch:n,...r})=>{let i=dr(t.internal,n);return await e(i?{...r,internal:i}:r)}}function pr(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function mr(e){let t=e.meta?.installSource;if(!t)throw new n(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new n(`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 n(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new n(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:pr(t)}}function hr(e){let t=mr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:wt(n,e.meta?.tenantId)},cleanup:()=>{Ct(n)}}}function W(e,t,n){return t||jt(n)?null:a(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function gr(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function G(e){return Yt(e.flags)||!e.session?await Rn(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await _r(e.session.device)}async function _r(e){if(on(e)||!p(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await He.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 Rn(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Rn({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function vr(e,t){return t?Wn(t,e).length===0:!1}async function yr(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=hr(n);let t=Cr(n),l=await xr(a,n.flags),u=await V(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await B(e.bindDevice)(l,se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await wr({artifact:s,retention:t,req:n,session:a,sessionName:r}),a&&A(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Tr(l,s,p,c),h=P(m,`Installed: ${_t(m)}`);return O(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Nt(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:t(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function br(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new n(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Nt(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:t(e)}}}async function xr(e,t){let r=Sr(t?.platform);if(e&&r&&!f(e.device,r))throw new n(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${u(e.device)}`);if(!e&&!r)throw new n(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await G({session:e,flags:t})}function Sr(e){return e===`ios`||e===`android`?e:void 0}function Cr(e){let t=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(r!==void 0&&r<=0)throw new n(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function wr(e){if(e.retention.enabled)return await Tt({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 Tr(e,t,n,r){return p(e)?Er(t,n,r):Dr(t,n,r)}function Er(e,t,r){let i=t.bundleId??e.bundleId;if(!i)throw new n(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...kr(r),bundleId:i,...Or(t,e),launchTarget:t.launchTarget??i}}function Dr(e,t,r){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new n(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...kr(r),packageName:i,...Or(t,e),launchTarget:t.launchTarget??i}}function Or(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function kr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Ar(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,o=jr(t);if(!o.ok)return o.response;let s=W(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await G({session:n,flags:t.flags}),l=await j({device:c,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:y});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==o.options.provider)return a(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:o.options.provider});let u=await l.runtime.operations.configureProviderPortReverse(o.options);return u?{ok:!0,data:{action:`port-reverse`,...u}}:a(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function jr(e){let t=Mr(e);if(!t.ok)return t;let n=Nr(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 Mr(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Nr(e){let t=Pr(e.flags?.devicePort),n=Pr(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Pr(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Fr(e){return await j({...e,command:`runtime clear`,use:ne})}async function Ir(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Ar({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Lr({...e,session:r.get(n)});if(!Rr(i))return a(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let o=r.get(n),s=r.getRuntimeHints(n);return i===`clear`?await zr({sessionName:n,sessionStore:r,session:o,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Br(n,s):Hr({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function Lr(e){if(!e.session)return a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await nr({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Pe(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 Rr(e){return e===`set`||e===`show`||e===`clear`}async function zr(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(L(i)&&r?.appBundleId){let e=await Fr({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;A(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Kt(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Br(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Vr(e){return e?u(e.device):void 0}function Hr(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:o}=e,s=Vr(i),c=It(t.flags?.platform??o?.platform??s);if(!c)return a(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(s!==void 0&&s!==c)return a(`INVALID_ARGS`,`runtime set targets ${c}, but session "${n}" is already bound to ${s}.`);let l=Vt(o,Rt(t.flags,c));return Gt(l)===0?a(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,l),{ok:!0,data:{session:n,configured:!0,runtime:l}})}const Ur=/^[A-Za-z0-9_.:-]{1,64}$/,Wr=8192,Gr=4096;function Kr(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new n(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Ur.test(t))throw new n(`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 n(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:Jr(r,t)}}function qr(e,t,r){let i=u(e),a=Yr(e);if(!a)throw new n(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>Gr)throw new n(`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:Gr});return s}function Jr(e,t){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new n(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>Wr)throw new n(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${Wr} bytes`);return r}catch(t){throw t instanceof n?t:new n(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function Yr(e){return((p(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:m(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 Xr(e,t,n,r){let{eventName:i,payload:a}=Kr([...r]),o=qr(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ze(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...F(`Triggered app event: ${i}`)}}async function Zr(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await j({command:`trigger-app-event`,device:t,use:ye,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=>Xr(s,t,e,n)}}function Qr(e){let t=(e[0]??`status`).toLowerCase();if(!yt(t))throw new n(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new n(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return $r(t)}function $r(e){return e===`get`?`status`:e===`return`?`enter`:e}const ei={"ime-probe":`android`},ti={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ni={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ri(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ii(e,t){let n=await j(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ai(e,t){return e.operations.keyboardStatus(ri(t)).then(e=>({platform:ei[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 oi(e,t){let n=await e.operations.keyboardDismiss(ri(t)),r=ti[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...F(li(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...F(`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 si(e,t){let n=await e.operations.keyboardEnter(ri(t)),r=ni[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...F(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...F(`Keyboard enter pressed`)}}async function ci(e){let t=Qr(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ii({command:`keyboard status`,device:n,use:Se,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ai(e,t)):t===`dismiss`?await ii({command:`keyboard dismiss`,device:n,use:E,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>oi(e,t)):await ii({command:`keyboard enter`,device:n,use:b,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>si(e,t))}function li(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ui(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=W(i,l,u);if(d)return d;let f=await G({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Nn(t)===`may-invalidate`&&A(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;O(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function di(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return a(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function fi(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ui({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Pe(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function pi(e){return di(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await fi({...e,command:N.keyboard,resolveRuntime:e=>ci(e)})}async function mi(e){return await fi({...e,command:N.triggerAppEvent,resolveRuntime:e=>Zr(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await ar(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function hi(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function gi(e,t){let r=t?.subject??`Payload`,i=e.trim();if(!i)throw new n(`INVALID_ARGS`,`${r} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!U.statSync(a).isFile())throw new n(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof n)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new n(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new n(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(hi(i))return{kind:`inline`,text:i};throw new n(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function _i(e){let t=gi(e,{subject:`Push payload`}),r=t.kind===`inline`?t.text:await vi(t.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof n?t:new n(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function vi(e){try{return await cr.readFile(e,`utf8`)}catch(t){let r=t.code;throw r===`ENOENT`?new n(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new n(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new n(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new n(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function yi(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,o=i.get(r),s=t.flags??{},c=W(n,o,s);if(c)return c;let l=Ti(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let c=u?wt(u,t.meta?.tenantId):k.expandHome(l.appPathInput);if(!U.existsSync(c))return a(`INVALID_ARGS`,`App binary not found: ${c}`);let d=await G({session:o,flags:s}),f=await V(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await B(e.bindDevice)(d,ce);o&&A(o);let h=await m.operations.deployApp({app:l.app,appPath:c,replaceExisting:n===`reinstall`}),g=xi(d,l.app,c,h),_=P(g,`Installed: ${g.appName??vt(g)}`),v=wi(o,g);return v&&v!==o&&i.set(r,v),O(i,v,t,n,_),{ok:!0,data:_}}finally{u&&Ct(u)}}async function bi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=W(`push`,i,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return a(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let d=await _i(Ei(l,t.meta?.cwd)),f=await G({session:i,flags:o}),m=await V(e.inspectFacts)(f),h=z(`push`,m.operations.ensureReady)??z(`push`,m.operations.sendPushNotification);if(h)return h;let g=await B(e.bindDevice)(f,le);await g.operations.ensureReady({}),i&&A(i);let _=await g.operations.sendPushNotification({appId:c,payload:d}),v=p(f)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:u(f),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return O(r,i,t,`push`,v,{positionals:[c,l]}),{ok:!0,data:v}}function xi(e,t,n,r){return p(e)?Si(t,n,r):Ci(e,t,n,r)}function Si(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 Ci(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 wi(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ti(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:a(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:a(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ei(e,t){let n=gi(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>k.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function K(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await yi({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await yr({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await bi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Di(e,t,n){return await l(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Oi=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 ki(e){return Oi.has(e)}const Ai=new Map(ue.map(e=>[e.name,e]));function ji(e){let t=new Set;for(let n of e){let e=Mi(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Mi(e){let t=Ai.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(ki)?n:void 0}function Ni(e){if(e!==void 0&&e.remainingSteps.length!==0)return ji(e.remainingSteps)}function Pi(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:jn(e),plannedOperations:Ni(e.internal?.executionPlan)}}function Fi(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...F(`Closed: ${t.name}`)}})}function Ii(e,t,n){if(!Ee(t))return{kind:`not-armed`};let r=t.actions.length;Fi(e,t,n);let i=Ge(t),a=e.writeSessionLog(t,{force:Ye(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(ke(t),{kind:`aborted`})}function Li(e,n){let r=t(n),i=Je(e.scriptPublication??Ke);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ri(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Fi(r,n,t);try{let e=r.writeSessionLog(n,{force:Ye(n,t.flags?.force)});e.written&&Xe(n,e.path);return}catch(e){return zi(e)}}function zi(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof n?new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${t(e).message}`,r)}async function Bi(e){let t=e.clearRuntimeHints?Ce:T,n=await Le({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,T)};let r=await n.bind(e.device,Ce);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Vi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await Hi({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&L(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Kt(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>Wt(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Hi(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>Lt({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>Ft({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>an({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Dt({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>nn(a,r))}function Ui(e,t){return rn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Wi(e){if(e instanceof n)return e;let t=e instanceof Error?e.message:String(e);return new n(`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 Gi=(e,t)=>(e.positionals?.length??0)>0||Ot(t);async function Ki(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=Ee(n),s=JSON.stringify(t.positionals??[]);if(o&&!Te(n,s)){let e=await Ji({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Li(n,Wi(e))};Oe(n,s)}let c=Ii(i,n,t);return c.kind===`failed`?{response:Li(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function qi(e){try{return{providerData:await Bt(e)}}catch(n){let r=t(n);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function Ji(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Gi(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Pi(t,r,n.trace?.outPath)});return}catch(e){return e}}function Yi(e,t){if(!e.flags?.saveScript||M(t))return;let r=t.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new n(`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 n(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function Xi(e){let{req:t,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c}=e,l=o.get(r);if(!l)return await ea({req:t,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});Yi(t,l);let u=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!u)return a(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=e.platformResourceCleanup,f=await Bi({device:l.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!l.appBundleId&&L(o.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(f.type===`response`)return f.response;if(A(l),t.internal?.closeAppOnly===!0&&u)return await $i({req:t,session:l,logPath:i,lifecycle:f.runtime,app:u});let p=await Ki({req:t,session:l,logPath:i,sessionStore:o,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await Zi({req:t,session:l,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:Qi({session:l,repair:p,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function Zi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Vi({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Ji,finalizeOrdinaryCloseScript:Ri,platformResourceCleanup:e.platformResourceCleanup}),m=await qi({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Ui(r,u),g=d??h;if(g?n.deviceClaim&&I({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await mn(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function Qi(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:P({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...F(c),...o,...s}}}async function $i(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await Ji({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...F(`Closed: ${a}`)}}}async function ea(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return a(`SESSION_NOT_FOUND`,`No active session`);let o=await Bi({device:await G({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Pi(t,n)}),{ok:!0,data:{app:t.positionals[0],...F(`Closed: ${t.positionals[0]}`)}})}function ta(e,t){return e.operations.ensureReady(t)}function na(e,t,n){return e.operations.listApps({device:t,filter:n})}async function ra(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return ia(t,r);case`devices`:return await oa(t);case`capabilities`:return await ma({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await ba({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function ia(e,t){let n=Vn(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Kn(e.session,n)).map(e=>aa(e,t))}}}function aa({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:pt(r),platform:u(t.device),...h(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,...h(t.device.platform)&&!m(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function oa(e){try{let t=sa();return{ok:!0,data:{devices:(await la(e)).map(e=>({...Da(e),...ca(e,t)}))}}}catch(e){let t=r(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function sa(){let e=new Map;for(let t of cn({})){let n=t.claim;!n||ln(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function ca(e,t){let n=t.get(sn(An(e)));return n?{claimedBy:n}:{}}async function la(e){let t=e.flags?.platform;return pa(await In(ua(e,t)),e.flags?.platform,e.flags?.target)}function ua(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:da(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:fa(n?.androidDeviceAllowlist)}}function da(e,t,n){return g({simulatorSetPath:Pn(e),platform:t,target:n})}function fa(e){let t=R(e);return t?Array.from(t).sort():void 0}function pa(e,t,n){let r=t?e.filter(e=>Oa(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function ma(e){let t=await Ea({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=ha(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Ca(n,e.inspectFacts);return{ok:!0,data:{device:Da(n),availableCommands:xe().filter(e=>e===`appstate`&&r?!0:va(e,i))}}}function ha(e,t,n){return!t||!p(e)&&!m(e)||!vr(n,t)?!1:ga(t)||_a(e,t)}function ga(e){return!!(e.appName||e.appBundleId)}function _a(e,t){return!!(m(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function va(e,t){let n=de(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>ya(t,e)))}function ya(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function ba(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await xa(t,e.providerAppCatalog);if(o)return o;let s=await Ea({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=rt(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await wa({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ta(await na(f,await ta(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function xa(e,t){let n=Sa(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,xt(e.meta?.requestId))]}}}function Sa(e){let t=Mn(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 Ca(e,t){if(t)try{return await t(e)}catch{return}}async function wa(e){if(!e.inspectFacts)throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),r=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,ge)}}function Ta(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Ea(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=W(t.command,a,o);return s?{response:s}:{device:await G({session:a,flags:o,androidAvdSelection:i})}}function Da({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:u({platform:r.platform,appleOs:n}),...h(r.platform)&&n?{appleOs:n}:{}}}function Oa(e,t){return f(e,t)}function q(e){return a(`INVALID_ARGS`,e)}function ka(e,t,r,i){try{return ir({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return a(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}async function Aa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await rr({target:n,platform:i.platform,surface:r});return a?q(a):null}async function ja(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await rr({target:n,platform:r});return i?q(i):null}function Ma(e){let t=tn(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:L(n),clearRemovedRuntimeHints:Ht({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Na(e){let{req:t,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:c,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=e;await c.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!s(a??``),execution:{startupDeadlineAtMs:Fa(t),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:jn(t)}});let{appBundleId:f,appName:p}=await Pa({runtime:c,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:d});if(l.clearRemovedRuntimeHints){if(!u)throw new n(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await zt({replacedStoredRuntime:l.replacedStoredRuntime,previousRuntime:l.previousRuntime,runtime:l.runtime,session:o,clearRuntimeHints:u})}return{type:`details`,details:{appBundleId:f,appName:p,runtime:l.runtime}}}async function Pa(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 Fa(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Ia(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:a(`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:a(`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:a(`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 La(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||n.flags?.foreground!==!0)return o;try{let t=await or({req:{...n,command:`snapshot`,positionals:[],flags:{...n.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return t.ok?{ok:!0,data:{...o.data,snapshot:t.data}}:Ra(o.data,t.error)}catch(e){return Ra(o.data,t(e))}}function Ra(e,t){return{ok:!0,data:{...e,warnings:[...nt(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function za(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:f,device:m,runtime:h,runtimeHintCount:g,sessionReused:_,selection:v}=e,y={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:_,...Ba(v)};return o&&(y.appName=o),s&&(y.appBundleId=s),l&&(y.startup=l),f&&(y.timing=f),h&&g(h)>0&&(y.runtime=h),m&&(y.platform=u(m),y.target=m.target??`mobile`,y.device=m.name,y.id=m.id,y.kind=m.kind,d(m.platform)&&(y.serial=m.id)),m&&p(m)&&(y.device_udid=m.id,y.ios_simulator_device_set=m.simulatorSetPath??null),{...y,...F(`Opened: ${o??s??t}`)}}function Ba(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function Va(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const Ha=Object.freeze({async observeBootTimeMs(e){if(p(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 Ua(e,t){e.warnings=[...nt(e),t]}function Wa(e){return e.internal?.resolvedSessionScope??Vn(e)}function Ga(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){We(t,{});return}M(n)&&(Ze(t),Ua(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 Ka(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 qa(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ja(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 Ya(e,t){if(!t)return;let n=await dn(t);if(n.status!==`renewed`)return n.conflict?Xt(e,n.conflict):a(`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 Xa(e){let{req:t,sessionName:n,sessionStore:r,logPath:o,device:s,openTarget:c,openPositionals:l,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=t.flags?.relaunch===!0,x=f,ee=Date.now(),S=await Za({req:t,sessionName:n,sessionStore:r,device:s,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(S.type===`response`)return S.response;let C=S.session??g,te=Date.now(),ne=await m.operations.openApplication({target:c,positionals:l,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:qa(s,t),stateDir:r.resolveDaemonStateDir(),runtimeHints:Kt(p),applyRuntimeHints:h,execution:Pi(t,o,g?.trace?.outPath)});x=ne.appBundleId??x;let w={...ne.timing},re=Zn(y),ie=c?Ja(te,c,x):void 0;if(bt(t.meta?.requestId)){let e=i();return a(e.code,e.message,e.details)}g&&Fe({session:g,command:`open`,positionals:[],flags:void 0});let T=Va({existingSession:C,sessionName:g?.name??Un(t),sessionScope:g?.sessionScope??Wa(t),device:s,surface:d,appBundleId:x,appName:u});T.lease=en({req:t,existingLease:g?.lease}),_&&(T.deviceClaim=_),t.runtime!==void 0&&Ut(r,n,p);let E=r.ensureSessionDir(n),ae=mt(E,t.meta?.requestId??ot().requestId);w.totalDurationMs=Math.max(0,Date.now()-ee),I({level:`info`,phase:`open_timing`,durationMs:w.totalDurationMs,data:w});let D=za({sessionName:T.name,sessionStateDir:E,runnerLogPath:pt(E),requestLogPath:ae,eventLogPath:r.resolveEventLogPath(n),appName:u,appBundleId:x,surface:d,startup:ie,timing:w,device:s,runtime:p,runtimeHintCount:Gt,sessionReused:g!==void 0,selection:re});return v&&Ua(D,Ka(v)),Ga({session:T,existingSession:g,saveScriptRequested:!!t.flags?.saveScript,responseData:D}),r.set(n,T),r.recordAction(T,{command:`open`,positionals:l,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:D}),{ok:!0,data:D}}async function Za(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=Qa(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function Qa(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=Va({existingSession:o,sessionName:o?.name??Un(t),sessionScope:o?.sessionScope??Wa(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=en({req:t,existingLease:o?.lease}),s}function $a(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=Mt(t);return Gn(t,i.session)?Hn(i,n,a):Jn(i,n,a)}async function eo(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch($t(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=qt(n,r,Qt({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await kn({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:Ha})}}async function to(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=$a({req:t,device:a,sessionStore:i});if(m)return m;let h=await eo({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Xt(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await no({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Na({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await Ya(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await Xa({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function no(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await mn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await fn(t);I({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const ro=new Map;async function io(e){let t=C({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Le({...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,ae)};case`open-apply-runtime-hints`:{let t=await r(e.device,ee);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,te);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,oe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ao(e){let t=Ma(e);if(t.type===`response`)return t;let n=await io({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 oo(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),o=await Ia({req:e.req,hasExistingSession:!!i});if(o.type===`response`)return o.response;let s=o.type===`resolved`?o.req:e.req;if(i){if(s.flags?.saveScript)return a(`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 o=s.flags?.relaunch===!0,c=s.positionals?.[0],l=c??(o?i.appName:void 0),u=ka(i.device,s.flags?.surface,l,i.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return q(o?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let d=await Aa({shouldRelaunch:o,openTarget:l,surface:u,device:i.device});if(d)return d;let f=await Ya(i.device,i.deviceClaim);if(f)return f;let p=await _r(i.device),m=Qn(p);await s.internal?.retainDeviceExecutionLock?.(p.id);let h=await ao({req:s,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;A(i);let v=await Na({req:s,logPath:n,surface:u,openTarget:l,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await Ya(p,i.deviceClaim)||await Xa({req:s,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:l,openPositionals:c?s.positionals??[]:l?[l]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:u,existingSession:i,selection:m})}let c=s.flags?.relaunch===!0,l=s.positionals?.[0];if(c&&!l)return q(`open --relaunch requires an app argument.`);let u=await ja({shouldRelaunch:c,openTarget:l,platform:s.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await zn(s.flags??{},At(l)),f=d.device;await s.internal?.retainDeviceExecutionLock?.(f.id);let p=ka(f,s.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Aa({shouldRelaunch:c,openTarget:l,surface:p,device:f});if(m)return m;let h=await ao({req:s,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await gt(ro,f.id,async()=>await to({req:s,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:l,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:d}))}async function so(e){let t=await oo(e);return!t.ok||e.req.flags?.foreground!==!0?t:await La({...e,inspectFacts:V(e.inspectFacts),bindDevice:B(e.bindDevice),openResponse:t})}const co=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,lo=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function uo(e){return t=>a(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 fo(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function po(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function mo(e){return e.available?null:a(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function ho(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function go(t,n){if(!n.appBundleId)return;let i=await j({command:`appstate`,device:n.device,use:me,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(i.type!==`response`)try{return(await i.runtime.operations.appState({appBundleId:n.appBundleId})).applicationState}catch(t){if(e(t))throw t;I({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:r(t).code,message:r(t).message}});return}}async function _o(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=o.platform;if(!i&&gr(o)){let e=s===`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 a(`SESSION_NOT_FOUND`,e)}let c=W(`appstate`,i,o);if(c)return c;let l=h(i?.device.platform)&&vr(o,i),d=s===`ios`,f=s===`macos`;if(d&&!l)return a(`SESSION_NOT_FOUND`,co);if(f&&!l)return a(`SESSION_NOT_FOUND`,lo);if(l&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(m(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:u(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=m(i.device)?`macOS`:`iOS`;return a(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await go(e,i);return{ok:!0,data:{platform:u(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...p(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let g=await G({session:i,flags:o});if(p(g))return a(`SESSION_NOT_FOUND`,co);if(m(g))return a(`SESSION_NOT_FOUND`,lo);let _=await j({command:`appstate`,device:g,use:me,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>a(`UNSUPPORTED_OPERATION`,g.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(_.type===`response`)return _.response;let v=_.runtime;await v.operations.ensureReady({serial:o.serial,androidSerialAllowlist:yo(o.androidDeviceAllowlist)});let y=await v.operations.appState();return{ok:!0,data:{platform:u(g),package:y.package,activity:y.activity}}}async function vo(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command===`boot`){let o=i.get(n),s=t.flags??{},c=W(t.command,o,s);if(c)return c;let l=R(s.androidDeviceAllowlist),d=l?[...l].sort():void 0,f=re({headless:s.headless===!0}),p;try{p=await G({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=r(e);if(f.kind===`boot-target-headless`&&!ho(s.device,o?.device)&&t.code===`DEVICE_NOT_FOUND`)return a(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(s.target&&(p.target??`mobile`)!==s.target)return a(`DEVICE_NOT_FOUND`,`No ${p.platform} device found matching --target ${s.target}.`);let m=await Le({command:`boot`,device:p,required:f.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:uo(f.kind===`boot-target-headless`)});if(m.type===`response`)return m.response;let g={serial:s.serial,androidSerialAllowlist:d};return p=f.kind===`boot-target-headless`?await(await m.bind(p,f.use)).operations.bootTargetHeadless(g):await(await m.bind(p,f.use)).operations.bootTarget(g),{ok:!0,data:{platform:u(p),target:p.target??`mobile`,device:p.name,id:p.id,kind:p.kind,booted:!0,...h(p.platform)&&p.appleOs?{appleOs:p.appleOs}:{}}}}if(t.command===`shutdown`){let r=i.get(n),o=t.flags??{},s=W(t.command,r,o);if(s)return s;let c=await G({flags:o,session:r,androidAvdSelection:`include-stopped`}),l=mo((await fo(e.inspectFacts)(c)).operations.shutdownTarget);if(l)return l;if(r&&r.device.platform===c.platform&&r.device.id===c.id)return a(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let d=await(await po(e.bindDevice)(c,D)).operations.shutdownTarget();return d.success?{ok:!0,data:{platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:d,...h(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:a(d.error?.code??`COMMAND_FAILED`,bo(d),{platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:d})}return t.command===`appstate`?await _o({req:t,sessionName:n,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function yo(e){let t=R(e);return t?[...t].sort():void 0}function bo(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function xo(e){let t=ct(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=U.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{U.closeSync(t)}}function So(e,t){sr(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=lt(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function Co(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=st(e);try{U.fsyncSync(r)}finally{U.closeSync(r)}let i=0;for(let e of U.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{U.unlinkSync(H.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function wo(e){return On.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function To(e){try{return await Eo(e)}catch(e){return{ok:!1,error:t(e)}}}async function Eo(e){let t=Do(e);if(!t.ok)return t;let n=t.session,r=w(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Oo(a,o);let c=ie({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await ko(e,n,r,c.use);case`capture-status`:return await Ao(e,n);case`capture-stop`:return await jo(e,n)}}function Do(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:a(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Oo(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return a(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function ko(e,t,n,r){if(t.audioProbe){await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),o=En.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=En.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:o,device:t.device}),c=H.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:c,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:s});await wn({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:s,...l,throwIfCanceled:e.throwIfCanceled});let u=e.sessionStore.get(e.sessionName)?.audioProbe;if(!u)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await u.handle.status()}}async function Ao(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Mo()};let r=await n.handle.status();return r.state===`stopped`&&await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function jo(e,t){return t.audioProbe?{ok:!0,data:await hn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Mo()}}function Mo(){return un({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 No(e){let r=e.sessionStore.get(e.sessionName);if(!r)return a(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(et(e.req.positionals?.[0]))throw new n(`INVALID_ARGS`,tt);es(e.req);let t=Dn({positionals:e.req.positionals,kind:ns(e.req.flags?.kind),outPath:ns(e.req.flags?.out)}),i=Cn(t);if(i.kind===`capture-stop`)return Po(e,await Ro(e,r,i.request));let o=await Xn({device:r.device,plan:i,inspectFacts:e.inspectFacts});return o.admitted?Po(e,await Fo(e,r,o)):z(`perf`,o.fact)??a(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:t(e)}}}function Po(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return O(e.sessionStore,n,e.req,`perf`,Yo(t.data)?{...t.data}:{}),t}async function Fo(e,t,r){let{device:i,plan:a}=Yn(r),o=B(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:Wo(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:Xo(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Zo(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?k.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:H.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Io(e,t,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new n(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new n(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=$o(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:k.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Io(e,t,n,r){if(t.perfCapture)return a(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return a(`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`,o=$o(e,r.outPath,i),s=pn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=pn.createNextFence({admissionLedger:Lo(e),resourcePath:s,device:t.device}),l=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:o,fence:c});return await Tn({admissionLedger:Lo(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:c,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function Lo(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new n(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Ro(e,t,n){let r=t.perfCapture;if(!r)return a(`INVALID_ARGS`,`no active native perf capture`);let i=Uo(r.handle.inspect(),n);if(i)return a(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(k.expandHome(n.outPath,e.req.meta?.cwd));let o=await bn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=zo(o),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:o}}function zo(e){if(Bo(e)||Vo(e))return e;throw new n(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Bo(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Vo(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ho(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ho(e,t){return t.every(t=>typeof e[t]==`string`)}function Uo(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 Wo(e,t){return{...Qo(e),metrics:{fps:Go(t.metric,e)},sampling:{fps:t.sampling}}}function Go(e,t){if(!Yo(e)||e.available!==!0)return e;let n=Ko(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Ko(e,t){let n=qo(t.windowStartedAt),r=qo(t.windowEndedAt)??qo(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:Jo(e)})).slice(-12)}function qo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Jo(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Yo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Xo(e,t){return{...Qo(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Zo(e,t){return{...Qo(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Qo(e){return{session:e.name,platform:u(e.device),device:e.device.name,deviceId:e.device.id}}function $o(e,t,n){return t?k.expandHome(t,e.req.meta?.cwd):H.join(e.sessionStore.ensureSessionDir(e.sessionName),`${ts()}-${n}`)}function es(e){let t=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||r!==`snapshot`))throw new n(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function ts(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function ns(e){return typeof e==`string`&&e.length>0?e:void 0}const rs=[`dump`,`log`],is=`network requires ${rs.join(` or `)}`,as=`network include mode must be one of: ${o.join(`, `)}`,os=2048;async function ss(e){let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=cs(e.bindDevice),r=(await t(n.device,v)).facts.networkDump;if(!r.available)return ps(r.hint);let i=ls(e.req);if(!i.ok)return i;let a=he({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return ms(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:n.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:os,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function cs(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function ls(e){let t=us(e);if(!t.ok)return t;let n=ds(e);if(!n.ok)return n;let r=fs(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function us(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return rs.includes(t)?{ok:!0,action:t}:a(`INVALID_ARGS`,is)}function ds(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?a(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function fs(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return a(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return o.includes(r)?{ok:!0,include:r}:a(`INVALID_ARGS`,as)}function ps(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ms(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:os,maxScanLines:e.entries.length},notes:e.notes}}}function hs(e,t){let n=Sn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[gs(e.appLogFailure)]:_s(n.state)}}function gs(e){return e.hint?`${e.message} ${e.hint}`:e.message}function _s(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 vs(e,t){return be([...e,...t.notes??[]])}async function ys(e){let{req:t}=e;return t.command===`perf`?await No({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?xs(e):t.command===`events`?await bs(e):t.command===`network`?await ss(e):t.command===`audio`?await To(Ns(e)):null}async function bs(e){let{req:n,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(e){return{ok:!1,error:t(e)}}}async function xs(e){let{req:n,sessionName:r,sessionStore:i}=e,o=i.get(r);if(!o)return a(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=Ps({...e,session:o}),r=(await t.bindDevice(o.device,x)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=ws(S({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),o);return`ok`in i?i:await Ss(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function Ss(e,t){switch(t.kind){case`path`:return Ts(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Es(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Cs(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await js(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Ds(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Os(e)}}async function Cs(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await As(e,t.appBundleId,n.owner,n.operations.appLogStart):await ks(e,t.appBundleId,n.owner,n.operations.appLogStart)}function ws(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):a(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ts(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=xo(a),s=hs(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 Es(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=hs(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:vs(t.notes,o)}}}function Ds(e,t,n){let r=n.resolveAppLogPath(t);return So(r,e),{ok:!0,data:{path:r,marked:!0}}}function Os(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return a(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Co(r.resolveAppLogPath(n));return gn({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function ks(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await _n({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:vn.resolvePath(o.resolveSessionDir(a))});let s=Co(o.resolveAppLogPath(a)),c=await Ms(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function As(e,t,n,r){let{session:i}=e;return i.appLog?a(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Ms(e,t,r,n)}async function js(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return a(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await _n({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:vn.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Ms(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=vn.resolvePath(o.resolveSessionDir(a));try{let l=wo({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await xn({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:yn({session:i,sessionName:a,sessionStore:o,error:e})}}}function Ns(e){if(!e.bindDevice||!e.inspectFacts)throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new n(`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 Ps(e){if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new n(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}const J=new WeakMap;function Fs(e){return{store:t=>Is(e,t),finalize:(t,n)=>Ls({...e,evidence:t,projection:n})}}function Is(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Re(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return J.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ie(a),refFrame:Ne(a)}),{evidence:s,refsGeneration:o}}function Ls(e){let t=J.get(e.evidence);J.delete(e.evidence);let n=zs(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Rs(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Bs(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Be(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Rs(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Ie(n)===t.runtimeRevision&&Ne(n)===t.refFrame}function zs(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 Bs(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Vs(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:De(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Hs(e.scriptPublication??Ke)}},armStep(e){n.update(t=>{Me(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Et(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){De(r())!==void 0&&n.update(we)},markCompleteIfArmed(){De(r())!==void 0&&n.update(Ae)},markSessionHeldIfArmed(e){if(e.ok||!je(r()))return e;let t=dt(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&&Ws(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Us({session:t,...e})})}}}}function Hs(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Je(e),targetForce:Ue(e)}}function Us(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Gs({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Ws(e){e.pendingRecordAndHeal=void 0}function Gs(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 Ks(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 tr({req:qs(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function qs(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 Js={resolveSessionScope:Vn},Ys=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await kt({...ur(e),session:Zs(t,n,r),invoke:fr(a??i,e),dependencies:Js}),Xs=async({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Ks({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await Pt({...ur(e),session:Zs(t,r,i),createSession:(e,t)=>Zs(e,t,i),invoke:fr(s??o,e),dependencies:Js,cleanupSession:async t=>await Qs({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Zs(e,t,r){let i=t=>{let n=r.get(e);return n?(t(n),r.set(e,n),!0):!1},a={get:()=>r.get(e),lookup:()=>r.lookup(e),getRuntimeHints:()=>r.getRuntimeHints(e),ensureSessionDir:()=>r.ensureSessionDir(e)};return lr(e,t,a,{createCoordinator:()=>Vs({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let n=r.lookup(e);n&&qn(n,t)},resolveOpenRuntimeHints:({request:t,device:n,platform:i})=>Jt({req:t,sessionStore:{getRuntimeHints:t=>t===e?r.getRuntimeHints(e):void 0},sessionName:e,device:n,platform:i}),bindAuthority:t=>Fs({sessionStore:{get:()=>r.get(e),update:i},sessionName:e,...t?{signal:t}:{}}),capture:async({flags:t,logPath:i})=>{let a=r.get(e);if(!a)throw new n(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await Ve({device:a.device,session:a,flags:t,logPath:i})}})}async function Qs(e){let{req:t,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await Xi({req:{token:t.token,session:r,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new n(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function $s(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==$e.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return Y(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return Y(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=nc(a);if(o)return Y(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return Y(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));qe(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:Ye(a,t.flags?.force),publication:`active`});return c.written?(Qe(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...F(`Published script: ${c.path}`)}}):Y(c.error??new n(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function ec(e){if(Ee(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:M(e)?void 0:`not-armed`}const tc={repair:()=>new n(`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 n(`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 n(`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 n(`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 nc(e){let t=ec(e);return t?tc[t]():void 0}function Y(e){return{ok:!1,error:t(e)}}function rc(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function ic(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ac(e,t,r){if(r.length!==1)throw new n(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(ic(t))}}async function oc(e,t,r){if(r.length<2)throw new n(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...ic(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...F(`Clipboard updated`)}}async function sc(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await j({command:`clipboard`,device:t,use:fe,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=>ac(n,e,r)}}let o=await j({command:`clipboard`,device:t,use:_e,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=>oc(s,e,r)}}async function cc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:o,bindDevice:s}=e,c=i.get(n),l=t.flags??{},d=W(N.clipboard,c,l);if(d)return d;let f=t.positionals??[],p=rc(f);if(!p)return a(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let m=await G({session:c,flags:l}),h=await sc({device:m,action:p,positionals:f,inspectFacts:o,bindDevice:s});if(!h.ok)return h.response;let g=await h.execute(Pe(r,t.flags,c?.appBundleId,c?.trace?.outPath));return O(i,c,t,t.command,g),{ok:!0,data:{platform:u(m),...g}}}function lc(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function uc(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function dc(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function fc(e,...t){for(let n of t)X(e,n)}function X(e,t){e.push(t),St({type:`command`,status:`progress`,message:pc(t)})}function pc(e){return[er(e),...$n(e)].join(`
2
- `)}async function mc(e,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let t=o?hc(i,await o(`all`))?.id:void 0;if(!t){X(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${u(r)}.`,evidence:{requested:i,platform:u(r)}});return}X(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(n){let i=t(n);X(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 ${u(r)} --all`,evidence:{code:i.code,message:i.message}})}}function hc(e,t){let r=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new n(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new n(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function gc(e,n,r){let i=vc(n,r);try{let t=await bc(i),n=yc(t.devices,i);return X(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:wc(n,i,t.failures),hint:n.length===0?Dc(t.failures):void 0,command:n.length===0?jc(i):void 0,evidence:Mc(n,t.failures)}),n.length>0&&xc(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=t(n);return X(e,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function _c(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];X(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:u(e),id:e.id,name:e.name}))}})}function vc(e,t){let n=e.flags??{};return Bn({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 yc(e,t){return e.filter(e=>_(e,t,{includeExplicitSelectors:!0}))}async function bc(e){if(e.platform)return{devices:await In(e),failures:[]};let t=[],n=[];for(let r of at)try{t.push(...await In({...e,platform:r}))}catch(e){n.push(Cc(r,e))}return{devices:t,failures:n}}function xc(e,t){for(let n of t)X(e,Sc(n))}function Sc(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Z(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Z(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Cc(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function wc(e,t,n){if(e.length===0)return n.length>0?`No ${Tc(t)} devices found; ${Ec(n)}.`:`No ${Tc(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Tc(t)} ${Ac(e.length,`device`)} available; ${r} booted`,a=Oc(e,t);return a?`${i} (${a}).`:`${i}.`}function Tc(e){let t=e.platform?Z(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Ec(e){return e.slice(0,2).map(e=>`${Z(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Dc(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Oc(e,t){if(t.platform||t.target)return;let n=it(e),r=kc();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 kc(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Z(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 Ac(e,t){return e===1?t:`${t}s`}function jc(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Mc(e,t){let n=new Map;for(let t of e){let e=u(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 Nc=1500;async function Pc(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 Fc(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Ic(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 Fc(e,t,n){try{return await(n.resolveProcessInfo??Lc)(e,t)}catch{return}}function Ic(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 Lc(e,t){if(!Rc(e))return;let n=await zc(t);if(n!==void 0)return{pid:n,cwd:await Bc(n)}}function Rc(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function zc(e){let t=await ut(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Nc});if(t.exitCode===0)return t.stdout.split(`
3
- `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Bc(e){let t=await ut(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Nc});if(t.exitCode===0)return t.stdout.split(`
4
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Vc=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Hc=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Uc(e,t){let n=ht(e.meta?.cwd);return{targetApp:Jc(e.flags?.targetApp)??t?.appBundleId,metroHost:Jc(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Yc(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Kc(e,n)}}function Wc(e,t={}){let n=qc(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 Gc(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 ${u(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 Kc(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function qc(e){let t={...Object.fromEntries([...Vc,...Hc].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 Jc(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Yc(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Xc(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=Zc(e.hostDiagnostics),c=r.get(n),l=Uc(t,c),u=el(r,n),d=[];if(fc(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${ft()} using ${u}`,evidence:{version:ft(),stateDir:u}},...Wc(t,{required:l.remote}),...Gc(r,n,c,{remote:l.remote})),l.remote)return al(d,l);let f=Qc(l,u,i),p=await gc(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&X(d,m);let h=await tl({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??$c(p);if(g){let e=await s.warmupCheck(g,f);e&&X(d,e)}return al(d,l,{device:h,includeMetro:!0,inventory:p})}function Zc(e){if(!e)throw new n(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function Qc(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>on(e),emitProgress:e=>St({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ln(e),shouldPropagateInventoryProbeError:Fn,transportOverrides:Object.freeze({androidAdb:n})})}function $c(e){let t=(e?.devices??[]).filter(e=>p(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function el(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function tl(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??_c(t,i,a.targetApp);return u&&await nl(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&X(t,await Pc(a.metroHost,a.metroPort,a.kind)),fc(t,...await r.ambientChecks(n)),u}async function nl(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await rl({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await mc(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),fc(e,...await r.deviceChecks(i,n))}async function rl(e){if(e.device.platform!==`harmonyos`)return il(e)}async function il(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,ge),u=R(n.flags?.androidDeviceAllowlist),d=await ta(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await na(l,d,e)}function al(e,t,n={}){let r=lc(e);return{ok:!0,data:{status:r,summary:uc(r),kind:t.kind,platform:n.device?u(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:dc(e)}}}async function ol(e){return await j({...e,command:`prepare`,use:ve})}async function sl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return a(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=i.get(n),c=t.flags??{},l=W(N.prepare,s,c);if(l)return l;let u=await G({session:s,flags:c}),d=await ol({device:u,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:cl(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:s?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:jn(t)}});return{ok:!0,data:ll(o,u,Math.max(0,Date.now()-f),p)}}function cl(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:pe}function ll(e,t,n,r){return{action:e,platform:u(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:ul(n,r),message:`Prepared Apple runner: ${t.name}`}}function ul(e,t){let n=dl(t.buildMs),r=fl(t.connectMs),i=fl(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 dl(e){return e===void 0?void 0:fl(e)}function fl(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Q=e=>ra(e),pl=e=>so({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),ml=e=>Xi({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}),hl=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await vo({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),$=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ys({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),gl={session_list:Q,devices:Q,capabilities:Q,apps:Q,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Xc({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:hl,shutdown:hl,appstate:hl,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>$s({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ir({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 cc({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:pi,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await sl({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:K,reinstall:K,install_source:K,release_materialized_paths:async({req:e})=>await br({req:e}),push:K,"trigger-app-event":mi,open:pl,replay:Ys,test:Xs,batch:async({req:e,sessionName:t,invoke:n})=>await Di(e,t,n),close:ml};async function _l(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Zt,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:ee,platformResourceCleanup:S}=e,C=gl[t.command];return C?await C({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:ee,platformResourceCleanup:S}):null}export{_l as handleSessionCommands};
1
+ import{E as e,F as t,N as n,P as r,U as i,V as a,Z as o,_ as s,b as c,d as l,o as u,t as d,x as f}from"./sdk-contracts.js";import"./capture.js";import{i as p,k as m,n as h,t as g}from"./sdk-batch-runner.js";import{a as _,n as v,t as y}from"./snapshot-diagnostics.js";import{f as b}from"./android-input-ownership.js";import{C as x,T as S,b as C,d as w,h as ee,m as T,p as E,v as te,x as D}from"./sdk-device.js";import{A as O,B as ne,Bn as re,Ct as ie,Dr as ae,Er as oe,F as se,G as ce,Gn as le,Hn as ue,I as de,J as fe,Jn as pe,Jr as me,K as he,L as ge,N as _e,Nt as ve,P as ye,Qr as be,R as xe,St as Se,T as Ce,U as we,Un as Te,Ut as Ee,W as De,Wr as Oe,X as ke,Xr as Ae,Y as je,Z as Me,_n as Ne,ar as Pe,d as Fe,f as Ie,ft as Le,gn as Re,hn as ze,in as Be,it as Ve,j as He,on as Ue,or as We,ot as Ge,pt as Ke,q as qe,rt as Je,sr as Ye,v as Xe,vn as Ze,wt as Qe,yn as $e,z as et}from"./sdk-batch.js";import{u as tt}from"./scroll-gesture.js";import{a as nt,b as rt,f as it,g as at,n as ot,p as st,r as ct,w as lt,y as ut}from"./script.js";import{_ as dt,a as ft,c as k,d as pt,f as mt,g as ht,h as gt,l as _t,m as vt,p as yt,t as bt,u as xt}from"./session-store.js";import{a as St,d as Ct,n as wt,o as Tt,r as Et,t as Dt}from"./target-evidence.js";import{a as Ot,i as kt,n as At,o as jt,r as Mt,s as Nt,t as Pt}from"./vars.js";import{n as Ft,r as It,t as Lt}from"./format.js";import{A as Rt,O as zt,c as Bt,f as Vt,g as Ht,h as Ut,j as Wt,k as Gt,l as Kt,m as qt,o as Jt,p as Yt,u as Xt}from"./parameterized-recorded-fill.js";import{F as Zt,I as Qt,N as $t,P as en,c as tn,f as nn,v as rn}from"./runtime.js";import{n as an,t as on}from"./catalog.js";import{g as sn,i as cn}from"./observability.js";import{i as ln,n as un,r as A}from"./success-text.js";import{o as dn,p as fn}from"./overlay.js";import{t as pn}from"./app-inventory.js";import{a as mn,r as hn,t as gn}from"./device.js";import{a as _n,o as vn,r as j}from"./diagnostics.js";import{a as yn,i as bn,r as xn}from"./verified-file.js";import{c as Sn,p as Cn}from"./exec.js";import{t as wn}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Tn,r as En}from"./output-path.js";import"./command.js";import{a as Dn,i as On,n as kn,t as An}from"./replay-divergence.js";import"./retry.js";import{a as jn}from"./version.js";import{t as Mn}from"./session-paths.js";import{i as Nn,r as Pn}from"./session-artifact-paths.js";import{t as Fn}from"./project-runtime.js";import{r as In}from"./rect-center.js";import{t as Ln}from"./android-snapshot-quality.js";import{t as Rn}from"./keyed-lock.js";import{n as zn,t as Bn}from"./deploy-result-target.js";import{t as Vn}from"./keyboard-actions.js";import{a as Hn,i as Un,n as Wn,o as Gn,r as M}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,c as br,ct as xr,d as Sr,et as Cr,f as wr,g as Tr,gt as Er,h as Dr,it as N,k as Or,l as kr,lt as Ar,m as jr,n as Mr,nt as Nr,p as Pr,q as Fr,r as Ir,rt as Lr,s as Rr,st as zr,t as Br,tt as Vr,u as Hr,v as Ur,w as Wr,x as Gr,y as Kr,yt as qr,z as Jr}from"./device-claim-rule.js";import{i as Yr}from"./request-runtime-binding.js";import{P,R as Xr,S as Zr,g as F,h as Qr,i as $r,j as ei,m as ti,n as ni,s as ri,y as ii,z as ai}from"./session-snapshot.js";import{c as oi,i as si,t as ci}from"./device-claim-inspection.js";import{t as li}from"./audio-probe-result.js";import{T as ui,_ as di,a as fi,b as pi,c as mi,d as hi,f as gi,g as _i,h as vi,i as yi,l as bi,m as xi,n as Si,o as Ci,r as wi,s as Ti,t as Ei,u as Di,v as Oi,x as ki}from"./perf-runtime-plan.js";import{i as Ai,n as ji}from"./lease-context.js";import{h as Mi}from"./screenshot-runtime.js";import{n as I,r as Ni}from"./device-isolation.js";import{a as Pi,n as Fi,r as Ii}from"./device-inventory-context.js";import{n as Li,r as Ri,t as zi}from"./dispatch-resolve.js";import{t as Bi}from"./touch-reference-frame.js";import"./screen-recording-admission-ledger.js";import{a as Vi,d as Hi,i as Ui,l as Wi,n as Gi,o as Ki,s as qi,u as Ji}from"./session-routing.js";import{d as L}from"./src8.js";import{i as Yi,n as R,r as Xi}from"./compatibility-policy.js";import{s as Zi}from"./quality-warnings.js";import{t as Qi}from"./png-worker-client.js";import{a as $i,i as z,n as ea,r as ta,t as na}from"./session-runtime-admission.js";import{a as ra}from"./ios-snapshot-engine.js";import{n as ia,r as aa}from"./device-selection-resolver.js";import{n as oa,r as sa}from"./doctor-output.js";import{t as ca}from"./record-runtime.js";import{n as la}from"./gesture-runtime.js";import{i as ua,n as da,r as fa}from"./platform-runtime-open-target.js";import{t as pa}from"./snapshot-runtime.js";import{t as ma}from"./app-log-files.js";import B from"node:path";import V,{promises as H}from"node:fs";import{createHash as ha}from"node:crypto";import ga from"node:os";import{fileURLToPath as _a}from"node:url";import{setTimeout as va}from"node:timers/promises";import ya 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 ba(e){return L({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function xa(e,t){let n=Ea(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},ba(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:Sa(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Sa(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function Ca(e,t,n,r){let i=Ea(await r.resolveTarget({selector:e,...t},U(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Lr(`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 wa(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 Ta(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 Ea(e,t){return Da(e,t),Oa(e),ka(e),Aa(e),e}function Da(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Oa(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function ka(e){if(e.rect!==void 0&&!Ta(e.rect)||e.viewport!==void 0&&!Ta(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Aa(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function ja(e,t,n,r,i,a={}){let o=Ma(e,t,n,i,a);if(!o)return;let{start:s,end:c}=La(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Ma(e,t,n,r,i){let a=n===`up`||n===`down`,o=dr(e,gr(e,r),i),s=o.visibility,c=Cr({visibility:s,matches:e.nodes.filter(e=>Oe(e)),platform:r}),l=Ae(s.viewportRects)??Pa(c);if(!l||!me(l))return;let u=c.flatMap(e=>{if(!me(e.rect))return[];let t=Fa(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=Na(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(Ia)[0]?.viewport}function Na(e,t){return Oe(e)?e:ae(e,t)}function Pa(e){let t;for(let n of e)me(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Fa(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 Ia(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function La(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 Ra(e,t,r){let i=N(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new n(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(U(t,t.command)):void 0;return{authored:e,gesture:Ba(await za(e.start,t,r,a),await za(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(U(t,t.command)),{start:a,end:o}=Va(n,e.direction,r.platform);return{authored:e,gesture:Ba(a,o,i),viewport:n}}let a=await Ca(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?R.command.optionalTargetLookupTimeoutMs:R.command.targetLookupTimeoutMs},t,r),o=a.viewport??await r.resolveGestureViewport(U(t,t.command)),{start:s,end:c}=Ha(a,e.direction,o);return{authored:e,gesture:Ba(s,c,i),target:a,viewport:o}}async function za(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 Ba(e,t,n){return{from:e,to:t,durationMs:n??R.command.swipeDurationMs}}function Va(e,t,n){if(t===`left`||t===`right`){let n=tt(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 Ha(e,t,n){let r=In(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 Ua={launchApp:Ja,stopApp:Ja,setPermissions:Ja,clearState:Ja,openLink:Ja,tapOn:Za,doubleTapOn:Za,longPressOn:Za,swipe:no,inputText:ro,eraseText:ro,scroll:G,scrollUntilVisible:G,hideKeyboard:G,pressKey:G,back:G,waitForAnimationToEnd:G,takeScreenshot:oo,runScript:oo,evalScript:co,assertVisible:so,assertNotVisible:so,assertTrue:so,extendedWaitUntil:so},Wa={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 Ga(e){return Wa[e.kind]}async function Ka(e,t){let n=e.command;return await qa(n,e,t,U(e,n))}function qa(e,t,n,r){let i=Ua[e.kind];return i(e,t,n,r)}async function Ja(e,t,n,r){switch(e.kind){case`launchApp`:return await K(n.launchApp,Ya(e,t),r,`invalidate`);case`stopApp`:return await K(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`setPermissions`:return await K(n.setPermissions,{appId:e.appId??t.appId,permissions:Xa(e.permissions)},r,`invalidate`);case`clearState`:return await K(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await K(n.openLink,{link:e.link},r,`invalidate`)}}function Ya(e,t){return L({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?Xa(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function Xa(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function Za(e,t,n,r){switch(e.kind){case`tapOn`:return await Qa(e,t,n,r);case`doubleTapOn`:{let i=await _o(e.target,{purpose:`doubleTap`,timeoutMs:eo(e)},t,n),a=N(e.delay,`doubleTapOn.delay`)??R.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?wa(i.resolution):void 0)}case`longPressOn`:{let i=await _o(e.target,{purpose:`longPress`,timeoutMs:eo(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?wa(i.resolution):void 0)}}}async function Qa(e,t,n,r){let i=await $a(e,t,n);return await K(n.tapOn,to(e,i),r,`invalidate`,i.resolution?wa(i.resolution):void 0)}async function $a(e,t,n){let r={purpose:`tap`,timeoutMs:eo(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await _o(e.target,r,t,n)}function eo(e){return e.optional===!0?R.command.optionalTargetLookupTimeoutMs:R.command.targetLookupTimeoutMs}function to(e,t){let n=N(e.repeat,`tapOn.repeat`),r=N(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 no(e,t,n,r){let i=await Ra(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?wa(i.target):void 0)}async function ro(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,L({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,L({charactersToErase:N(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function G(e,t,n,r){switch(e.kind){case`scroll`:return await K(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await K(n.scrollUntilVisible,io(e),r,`invalidate`);case`hideKeyboard`:return await K(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await K(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await K(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await K(n.waitForAnimationToEnd,ao(e),r,`preserve`)}}function io(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:N(e.timeout,`scrollUntilVisible.timeout`)??R.command.scrollUntilVisibleTimeoutMs,durationMs:Yi(R.command.scrollUntilVisibleSpeed)}}function ao(e){return L({timeoutMs:N(e.timeout,`waitForAnimationToEnd.timeout`)})}async function oo(e,t,n,r){switch(e.kind){case`takeScreenshot`:return uo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,L({file:e.file,env:e.env}),r,`preserve`)}}async function so(e){throw new n(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function co(e){throw new n(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function K(e,t,n,r,i){let a=lo(n,r);return uo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function lo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function uo(e,t,n,r){let i=e?.observation;return fo(i,r),{...po(n??i),...mo(e?.outputEnv),...ho(t,e?.artifactPaths),...go(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function fo(e,t){if(!(!e||t===void 0||e.generation===t))throw new n(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function po(e){return e?{observation:e}:{}}function mo(e){return e?{outputEnv:{...e}}:{}}function ho(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function go(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function _o(e,t,n,r){if(e.space===`target`){let i=await Ca(e.selector,t,n,r);return{authored:e,point:In(i.rect),resolution:i}}return{authored:e,point:await za(e,n,r)}}function vo(e,t,n,r={}){let i=n===`ios`&&r.presentation?bo(r.presentation):void 0,a=i?xo(e,t,i):tr(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:To(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?ir(s,t.selector.index):Fr(s,t.selector.index)?.node,l=To(t,o,s,c);if(!c)return So(t,o,s,l);let u=i?Fr(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&&!yo(t.selector)&&i?Co(d,s,u):0,evidence:l}:So(t,o,s,l)}const yo=Yn;function bo(e){let t=oe(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=>Vr(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function xo(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 So(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 Co(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&wo(n.rect,e)?1:0:t.length}function wo(e,t){let n=In(e),r=In(t);return n.x===r.x&&n.y===r.y}function To(e,t,n,r){return L({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:Xi,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 Eo(e,t={}){return{execute:async n=>{let r=U(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ga(n.command)&&!i,visualStabilityBarrier:i});let a=await Ka(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await xa(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Do(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Oo(e){let t=e.meta?.installSource;if(!t)throw new n(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new n(`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 n(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new n(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Do(t)}}function ko(e){let t=Oo(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 J(e,t,n){return t||xr(n)?null:u(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function Ao(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function Y(e){return Ar(e.flags)||!e.session?await Li(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await jo(e.session.device)}async function jo(e){if(Yr(e)||!E(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ii.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Li(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Li({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Mo(e,t){return t?Wi(t,e).length===0:!1}async function No(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n),o,s,c;try{o=ko(t);let i=Lo(t),l=await Fo(a,t.flags),u=await ta(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await ea(e.bindDevice)(l,ke);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Ro({artifact:s,retention:i,req:t,session:a,sessionName:n}),a&&P(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=zo(l,s,p,c),h=ln(m,`Installed: ${zn(m)}`);return k(r,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await sr(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:i(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function Po(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new n(`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:i(e)}}}async function Fo(e,t){let r=Io(t?.platform);if(e&&r&&!D(e.device,r))throw new n(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${x(e.device)}`);if(!e&&!r)throw new n(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await Y({session:e,flags:t})}function Io(e){return e===`ios`||e===`android`?e:void 0}function Lo(e){let t=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(r!==void 0&&r<=0)throw new n(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Ro(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 zo(e,t,n,r){return E(e)?Bo(t,n,r):Vo(t,n,r)}function Bo(e,t,r){let i=t.bundleId??e.bundleId;if(!i)throw new n(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Uo(r),bundleId:i,...Ho(t,e),launchTarget:t.launchTarget??i}}function Vo(e,t,r){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new n(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Uo(r),packageName:i,...Ho(t,e),launchTarget:t.launchTarget??i}}function Ho(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Uo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Wo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Go(t);if(!a.ok)return a.response;let o=J(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await Y({session:n,flags:t.flags}),c=await F({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:ne});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return u(`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}}:u(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Go(e){let t=Ko(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 Ko(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:u(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:u(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function qo(e){let t=Jo(e.flags?.devicePort),n=Jo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:u(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Jo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Yo(e){return await F({...e,command:`runtime clear`,use:ge})}async function Xo(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Wo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Zo({...e,session:r.get(n)});if(!Qo(i))return u(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await $o({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?es(n,o):ns({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Zo(e){if(!e.session)return u(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await la({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=ei(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 Qo(e){return e===`set`||e===`show`||e===`clear`}async function $o(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(Hr(i)&&r?.appBundleId){let e=await Yo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;P(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:jr(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function es(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function ts(e){return e?x(e.device):void 0}function ns(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=ts(i),s=_r(t.flags?.platform??a?.platform??o);if(!s)return u(`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 u(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=wr(a,br(t.flags,s));return kr(c)===0?u(`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 rs=/^[A-Za-z0-9_.:-]{1,64}$/,is=8192,as=4096;function os(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new n(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!rs.test(t))throw new n(`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 n(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:cs(r,t)}}function ss(e,t,r){let i=x(e),a=ls(e);if(!a)throw new n(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>as)throw new n(`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:as});return s}function cs(e,t){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new n(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>is)throw new n(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${is} bytes`);return r}catch(t){throw t instanceof n?t:new n(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function ls(e){return((E(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function us(e,t,n,r){let{eventName:i,payload:a}=os([...r]),o=ss(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`,...A(`Triggered app event: ${i}`)}}async function ds(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await F({command:`trigger-app-event`,device:t,use:Je,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=>us(s,t,e,n)}}function fs(e){let t=(e[0]??`status`).toLowerCase();if(!Vn(t))throw new n(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new n(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return ps(t)}function ps(e){return e===`get`?`status`:e===`return`?`enter`:e}const ms={"ime-probe":`android`},hs={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},gs={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function _s(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ti(e)}}async function vs(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 ys(e,t){return e.operations.keyboardStatus(_s(t)).then(e=>({platform:ms[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 bs(e,t){let n=await e.operations.keyboardDismiss(_s(t)),r=hs[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...A(Cs(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...A(`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 xs(e,t){let n=await e.operations.keyboardEnter(_s(t)),r=gs[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...A(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...A(`Keyboard enter pressed`)}}async function Ss(e){let t=fs(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await vs({command:`keyboard status`,device:n,use:Qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ys(e,t)):t===`dismiss`?await vs({command:`keyboard dismiss`,device:n,use:Se,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>bs(e,t)):await vs({command:`keyboard enter`,device:n,use:ie,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>xs(e,t))}function Cs(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ws(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=J(i,l,u);if(d)return d;let f=await Y({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Mi(t)===`may-invalidate`&&P(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function Ts(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return u(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Es(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ws({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...ei(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Ds(e){return Ts(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Es({...e,command:an.keyboard,resolveRuntime:e=>Ss(e)})}async function Os(e){return await Es({...e,command:an.triggerAppEvent,resolveRuntime:e=>ds(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await fa(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function ks(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function As(e,t){let r=t?.subject??`Payload`,i=e.trim();if(!i)throw new n(`INVALID_ARGS`,`${r} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!V.statSync(a).isFile())throw new n(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof n)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new n(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new n(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(ks(i))return{kind:`inline`,text:i};throw new n(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function js(e){let t=As(e,{subject:`Push payload`}),r=t.kind===`inline`?t.text:await Ms(t.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof n?t:new n(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ms(e){try{return await H.readFile(e,`utf8`)}catch(t){let r=t.code;throw r===`ENOENT`?new n(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new n(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new n(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new n(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Ns(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=J(n,a,o);if(s)return s;let c=zs(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Jn(l,t.meta?.tenantId):bt.expandHome(c.appPathInput);if(!V.existsSync(s))return u(`INVALID_ARGS`,`App binary not found: ${s}`);let d=await Y({session:a,flags:o}),f=await ta(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await ea(e.bindDevice)(d,je);a&&P(a);let h=await m.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),g=Fs(d,c.app,s,h),_=ln(g,`Installed: ${g.appName??Bn(g)}`),v=Rs(a,g);return v&&v!==a&&i.set(r,v),k(i,v,t,n,_),{ok:!0,data:_}}finally{l&&qn(l)}}async function Ps(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=J(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return u(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await js(Bs(c,t.meta?.cwd)),d=await Y({session:i,flags:a}),f=await ta(e.inspectFacts)(d),p=z(`push`,f.operations.ensureReady)??z(`push`,f.operations.sendPushNotification);if(p)return p;let m=await ea(e.bindDevice)(d,Me);await m.operations.ensureReady({}),i&&P(i);let h=await m.operations.sendPushNotification({appId:s,payload:l}),g=E(d)?ln({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):ln({platform:x(d),package:s,action:h.action,extrasCount:h.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,g,{positionals:[s,c]}),{ok:!0,data:g}}function Fs(e,t,n,r){return E(e)?Is(t,n,r):Ls(e,t,n,r)}function Is(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 Ls(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 Rs(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function zs(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:u(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:u(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Bs(e,t){let n=As(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>bt.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Vs(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Ns({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await No({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await Ps({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Hs(e,t,n){return await h(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Us=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 Ws(e){return Us.has(e)}const Gs=new Map(Fe.map(e=>[e.name,e]));function Ks(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=Gs.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(Ws)?n:void 0}function Js(e){if(e!==void 0&&e.remainingSteps.length!==0)return Ks(e.remainingSteps)}function Ys(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(e),plannedOperations:Js(e.internal?.executionPlan)}}function Xs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...A(`Closed: ${t.name}`)}})}function Zs(e,t,n){if(!mt(t))return{kind:`not-armed`};let r=t.actions.length;Xs(e,t,n);let i=Vt(t),a=e.writeSessionLog(t,{force:Kt(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(_t(t),{kind:`aborted`})}function Qs(e,t){let n=i(t),r=Gt(e.scriptPublication??Ht);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...r?{savedScript:r}:{}},retriable:!0}}}function $s(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Xs(r,n,t);try{let e=r.writeSessionLog(n,{force:Kt(n,t.flags?.force)});e.written&&qt(n,e.path);return}catch(e){return ec(e)}}function ec(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof n?new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${i(e).message}`,t)}async function tc(e){let t=e.clearRuntimeHints?et:xe,n=await Qr({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,xe)};let r=await n.bind(e.device,et);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function nc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await rc({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&Hr(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:jr(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>Or(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function rc(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>yr({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>ur({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>Kr({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Qn({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Wr(a,r))}function ic(e,t){return Gr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function ac(e){if(e instanceof n)return e;let t=e instanceof Error?e.message:String(e);return new n(`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 oc=(e,t)=>(e.positionals?.length??0)>0||$n(t);async function sc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=mt(n),s=JSON.stringify(t.positionals??[]);if(o&&!pt(n,s)){let e=await lc({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Qs(n,ac(e))};gt(n,s)}let c=Zs(i,n,t);return c.kind===`failed`?{response:Qs(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function cc(e){try{return{providerData:await Er(e)}}catch(t){let n=i(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 lc(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(oc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Ys(t,r,n.trace?.outPath)});return}catch(e){return e}}function uc(e,t){if(!e.flags?.saveScript||Xt(t))return;let r=t.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new n(`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 n(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function dc(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.get(r);if(!c)return await hc({req:t,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});uc(t,c);let l=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!l)return u(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=e.platformResourceCleanup,f=await tc({device:c.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!c.appBundleId&&Hr(a.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(f.type===`response`)return f.response;if(P(c),t.internal?.closeAppOnly===!0&&l)return await mc({req:t,session:c,logPath:i,lifecycle:f.runtime,app:l});let p=await sc({req:t,session:c,logPath:i,sessionStore:a,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await fc({req:t,session:c,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:pc({session:c,repair:p,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function fc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await nc({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:lc,finalizeOrdinaryCloseScript:$s,platformResourceCleanup:e.platformResourceCleanup}),m=await cc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ic(r,u),g=d??h;if(g?n.deviceClaim&&j({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await pi(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function pc(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:ln({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...A(c),...o,...s}}}async function mc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await lc({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...A(`Closed: ${a}`)}}}async function hc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return u(`SESSION_NOT_FOUND`,`No active session`);let a=await tc({device:await Y({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Ys(t,n)}),{ok:!0,data:{app:t.positionals[0],...A(`Closed: ${t.positionals[0]}`)}})}function gc(e,t){return e.operations.ensureReady(t)}function _c(e,t,n){return e.operations.listApps({device:t,filter:n})}async function vc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return yc(t,r);case`devices`:return await xc(t);case`capabilities`:return await kc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Fc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function yc(e,t){let n=Vi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ki(e.session,n)).map(e=>bc(e,t))}}}function bc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Nn(r),platform:x(t.device),...w(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...w(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function xc(e){try{let t=Sc();return{ok:!0,data:{devices:(await wc(e)).map(e=>({...Hc(e),...Cc(e,t)}))}}}catch(e){let t=r(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function Sc(){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 Cc(e,t){let n=t.get(oi(ki(e)));return n?{claimedBy:n}:{}}async function wc(e){let t=e.flags?.platform;return Oc(await Fi(Tc(e,t)),e.flags?.platform,e.flags?.target)}function Tc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Ec(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Dc(n?.androidDeviceAllowlist)}}function Ec(e,t,n){return S({simulatorSetPath:Ni(e),platform:t,target:n})}function Dc(e){let t=I(e);return t?Array.from(t).sort():void 0}function Oc(e,t,n){let r=t?e.filter(e=>Uc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function kc(e){let t=await Vc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Ac(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Rc(n,e.inspectFacts);return{ok:!0,data:{device:Hc(n),availableCommands:Xe().filter(e=>e===`appstate`&&r?!0:Nc(e,i))}}}function Ac(e,t,n){return!t||!E(e)&&!T(e)||!Mo(n,t)?!1:jc(t)||Mc(e,t)}function jc(e){return!!(e.appName||e.appBundleId)}function Mc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Nc(e,t){let n=Ie(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Pc(t,e)))}function Pc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Fc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Ic(t,e.providerAppCatalog);if(o)return o;let s=await Vc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=pn(t.flags?.appsFilter),u=I(t.flags?.androidDeviceAllowlist),d=await zc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Bc(await _c(f,await gc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Ic(e,t){let n=Lc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,M(e.meta?.requestId))]}}}function Lc(e){let t=ji(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Rc(e,t){if(t)try{return await t(e)}catch{return}}async function zc(e){if(!e.inspectFacts)throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),r=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Ge)}}function Bc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Vc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=J(t.command,a,o);return s?{response:s}:{device:await Y({session:a,flags:o,androidAvdSelection:i})}}function Hc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:x({platform:r.platform,appleOs:n}),...w(r.platform)&&n?{appleOs:n}:{}}}function Uc(e,t){return D(e,t)}function Wc(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function Gc(e){return u(`INVALID_ARGS`,e)}function Kc(e,t,r,i){try{return da({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return u(e instanceof n?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 ua({target:n,platform:i.platform,surface:r});return a?Gc(a):null}async function Jc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await ua({target:n,platform:r});return i?Gc(i):null}function Yc(e){let t=Ur(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:Hr(n),clearRemovedRuntimeHints:Tr({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Xc(e){let{req:t,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!p(a??``),execution:{startupDeadlineAtMs:Qc(t),requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(t)}});let{appBundleId:d,appName:f}=await Zc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new n(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Sr({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 Zc(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 Qc(e){return Wc(e.flags?.timeoutMs)}async function $c(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:u(`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:u(`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:u(`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 el(e){let{req:t,sessionName:n,logPath:r,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let i=await pa({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n,logPath:r,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?{ok:!0,data:{...o.data,snapshot:i.data}}:tl(o.data,i.error)}catch(e){return tl(o.data,i(e))}}function tl(e,t){return{ok:!0,data:{...e,warnings:[...un(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function nl(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...rl(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=x(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,te(d.platform)&&(g.serial=d.id)),d&&E(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...A(`Opened: ${o??s??t}`)}}function rl(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function il(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const al=Object.freeze({async observeBootTimeMs(e){if(E(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function ol(e,t){e.warnings=[...un(e),t]}function sl(e){return e.internal?.resolvedSessionScope??Vi(e)}function cl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Bt(t,{});return}Xt(n)&&(Jt(t),ol(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 ll(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 ul(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function dl(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 fl(e,t){if(!t)return;let n=await ui(t);if(n.status!==`renewed`)return n.conflict?Ir(e,n.conflict):u(`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 pl(e){let{req:n,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=n.flags?.relaunch===!0,x=f,S=Date.now(),C=await ml({req:n,sessionName:r,sessionStore:i,device:o,surface:d,sessionAppBundleId:x,appName:l,existingSession:g});if(C.type===`response`)return C.response;let w=C.session??g,ee=Date.now(),T=await m.operations.openApplication({target:s,positionals:c,outPath:n.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:n.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:ul(o,n),stateDir:i.resolveDaemonStateDir(),runtimeHints:jr(p),applyRuntimeHints:h,execution:Ys(n,a,g?.trace?.outPath)});x=T.appBundleId??x;let E={...T.timing},te=ia(y),D=s?dl(ee,s,x):void 0;if(Un(n.meta?.requestId)){let e=t();return u(e.code,e.message,e.details)}g&&Zr({session:g,command:`open`,positionals:[],flags:void 0});let O=il({existingSession:w,sessionName:g?.name??Ui(n),sessionScope:g?.sessionScope??sl(n),device:o,surface:d,appBundleId:x,appName:l});O.lease=vr({req:n,existingLease:g?.lease}),_&&(O.deviceClaim=_),n.runtime!==void 0&&Dr(i,r,p);let ne=i.ensureSessionDir(r),re=Pn(ne,n.meta?.requestId??_n().requestId);E.totalDurationMs=Math.max(0,Date.now()-S),j({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let ie=nl({sessionName:O.name,sessionStateDir:ne,runnerLogPath:Nn(ne),requestLogPath:re,eventLogPath:i.resolveEventLogPath(r),appName:l,appBundleId:x,surface:d,startup:D,timing:E,device:o,runtime:p,runtimeHintCount:kr,sessionReused:g!==void 0,selection:te});return v&&ol(ie,ll(v)),cl({session:O,existingSession:g,saveScriptRequested:!!n.flags?.saveScript,responseData:ie}),i.set(r,O),i.recordAction(O,{command:`open`,positionals:c,flags:n.flags??{},runtime:n.runtime===void 0?void 0:p,result:ie}),{ok:!0,data:ie}}async function ml(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=hl(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function hl(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=il({existingSession:o,sessionName:o?.name??Ui(t),sessionScope:o?.sessionScope??sl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=vr({req:t,existingLease:o?.lease}),s}function gl(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=or(t);return Gi(t,i.session)?Hi(i,n,a):Ji(i,n,a)}async function _l(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Br(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Mr(n,r,Rr({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Oi({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:al})}}async function vl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=gl({req:t,device:a,sessionStore:i});if(m)return m;let h=await _l({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Ir(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await yl({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Xc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await fl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await pl({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function yl(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pi(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await di(t);j({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const bl=new Map;async function xl(e){let t=fe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Qr({...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,ce);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,he);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,De);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function Sl(e){let t=Yc(e);if(t.type===`response`)return t;let n=await xl({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 Cl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await $c({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return u(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Kc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return Gc(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let d=await qc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(d)return d;let f=await fl(i.device,i.deviceClaim);if(f)return f;let p=await jo(i.device),m=aa(p);await o.internal?.retainDeviceExecutionLock?.(p.id);let h=await Sl({req:o,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;P(i);let v=await Xc({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await fl(p,i.deviceClaim)||await pl({req:o,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:l,existingSession:i,selection:m})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return Gc(`open --relaunch requires an app argument.`);let l=await Jc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let d=await Ri(o.flags??{},zr(c)),f=d.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=Kc(f,o.flags?.surface,c);if(typeof p!=`string`)return p;let m=await qc({shouldRelaunch:s,openTarget:c,surface:p,device:f});if(m)return m;let h=await Sl({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await Rn(bl,f.id,async()=>await vl({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:d}))}async function wl(e){let t=await Cl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await el({...e,inspectFacts:ta(e.inspectFacts),bindDevice:ea(e.bindDevice),openResponse:t})}const Tl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,El=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Dl(e){return t=>u(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 Ol(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function kl(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Al(e){return e.available?null:u(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function jl(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Ml(e,t){if(!t.appBundleId)return;let n=await F({command:`appstate`,device:t.device,use:Ve,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(n.type!==`response`)try{return(await n.runtime.operations.appState({appBundleId:t.appBundleId})).applicationState}catch(e){if(a(e))throw e;j({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:r(e).code,message:r(e).message}});return}}async function Nl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Ao(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 u(`SESSION_NOT_FOUND`,e)}let s=J(`appstate`,i,a);if(s)return s;let c=w(i?.device.platform)&&Mo(a,i),l=o===`ios`,d=o===`macos`;if(l&&!c)return u(`SESSION_NOT_FOUND`,Tl);if(d&&!c)return u(`SESSION_NOT_FOUND`,El);if(c&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:x(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return u(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await Ml(e,i);return{ok:!0,data:{platform:x(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...E(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let f=await Y({session:i,flags:a});if(E(f))return u(`SESSION_NOT_FOUND`,Tl);if(T(f))return u(`SESSION_NOT_FOUND`,El);let p=await F({command:`appstate`,device:f,use:Ve,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>u(`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:Fl(a.androidDeviceAllowlist)});let h=await m.operations.appState();return{ok:!0,data:{platform:x(f),package:h.package,activity:h.activity}}}async function Pl(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command===`boot`){let a=i.get(n),o=t.flags??{},s=J(t.command,a,o);if(s)return s;let c=I(o.androidDeviceAllowlist),l=c?[...c].sort():void 0,d=ve({headless:o.headless===!0}),f;try{f=await Y({session:a,flags:o,androidAvdSelection:`include-stopped`})}catch(e){let t=r(e);if(d.kind===`boot-target-headless`&&!jl(o.device,a?.device)&&t.code===`DEVICE_NOT_FOUND`)return u(`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 u(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${o.target}.`);let p=await Qr({command:`boot`,device:f,required:d.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Dl(d.kind===`boot-target-headless`)});if(p.type===`response`)return p.response;let m={serial:o.serial,androidSerialAllowlist:l,deadlineAtMs:Wc(o.timeoutMs)};return f=d.kind===`boot-target-headless`?await(await p.bind(f,d.use)).operations.bootTargetHeadless(m):await(await p.bind(f,d.use)).operations.bootTarget(m),{ok:!0,data:{platform:x(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...w(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}}}if(t.command===`shutdown`){let r=i.get(n),a=t.flags??{},o=J(t.command,r,a);if(o)return o;let s=await Y({flags:a,session:r,androidAvdSelection:`include-stopped`}),c=Al((await Ol(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(r&&r.device.platform===s.platform&&r.device.id===s.id)return u(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await kl(e.bindDevice)(s,Ee)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...w(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:u(l.error?.code??`COMMAND_FAILED`,Il(l),{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Nl({req:t,sessionName:n,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Fl(e){let t=I(e);return t?[...t].sort():void 0}function Il(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Ll(e){let t=bn(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=V.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{V.closeSync(t)}}function Rl(e,t){ma(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=xn(e);try{V.writeFileSync(r,n,`utf8`)}finally{V.closeSync(r)}}function zl(e){let t=B.dirname(e),n=B.basename(e);V.existsSync(t)||V.mkdirSync(t,{recursive:!0});let r=yn(e);try{V.fsyncSync(r)}finally{V.closeSync(r)}let i=0;for(let e of V.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{V.unlinkSync(B.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Bl(e){return Di.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Vl(e){try{return await Hl(e)}catch(e){return{ok:!1,error:i(e)}}}async function Hl(e){let t=Ul(e);if(!t.ok)return t;let n=t.session,r=_e(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Wl(a,o);let c=ye({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await Gl(e,n,r,c.use);case`capture-status`:return await Kl(e,n);case`capture-stop`:return await ql(e,n)}}function Ul(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:u(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Wl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return u(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Gl(e,t,n,r){if(t.audioProbe){await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return u(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=Ti.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=Ti.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=B.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),c=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await Ci({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...c,throwIfCanceled:e.throwIfCanceled});let l=e.sessionStore.get(e.sessionName)?.audioProbe;if(!l)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await l.handle.status()}}async function Kl(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Jl()};let r=await n.handle.status();return r.state===`stopped`&&await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function ql(e,t){return t.audioProbe?{ok:!0,data:await mi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Jl()}}function Jl(){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 Yl(e){let t=e.sessionStore.get(e.sessionName);if(!t)return u(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(sn(e.req.positionals?.[0]))throw new n(`INVALID_ARGS`,cn);gu(e.req);let r=Ei({positionals:e.req.positionals,kind:vu(e.req.flags?.kind),outPath:vu(e.req.flags?.out)}),i=Si(r);if(i.kind===`capture-stop`)return Xl(e,await eu(e,t,i.request));let a=await na({device:t.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Xl(e,await Zl(e,t,a)):z(`perf`,a.fact)??u(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:i(e)}}}function Xl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,du(t.data)?{...t.data}:{}),t}async function Zl(e,t,r){let{device:i,plan:a}=$i(r),o=ea(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:ou(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:fu(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:pu(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?bt.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:B.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Ql(e,t,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new n(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new n(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=hu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:bt.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Ql(e,t,n,r){if(t.perfCapture)return u(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return u(`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=hu(e,r.outPath,i),o=fi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=fi.createNextFence({admissionLedger:$l(e),resourcePath:o,device:t.device}),c=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await wi({admissionLedger:$l(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:c.pendingHandle,envelope:c.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:c.response}}function $l(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new n(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function eu(e,t,n){let r=t.perfCapture;if(!r)return u(`INVALID_ARGS`,`no active native perf capture`);let i=au(r.handle.inspect(),n);if(i)return u(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(bt.expandHome(n.outPath,e.req.meta?.cwd));let a=await yi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=tu(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function tu(e){if(nu(e)||ru(e))return e;throw new n(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function nu(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function ru(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&iu(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function iu(e,t){return t.every(t=>typeof e[t]==`string`)}function au(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 ou(e,t){return{...mu(e),metrics:{fps:su(t.metric,e)},sampling:{fps:t.sampling}}}function su(e,t){if(!du(e)||e.available!==!0)return e;let n=cu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function cu(e,t){let n=lu(t.windowStartedAt),r=lu(t.windowEndedAt)??lu(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:uu(e)})).slice(-12)}function lu(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function uu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function du(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function fu(e,t){return{...mu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function pu(e,t){return{...mu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function mu(e){return{session:e.name,platform:x(e.device),device:e.device.name,deviceId:e.device.id}}function hu(e,t,n){return t?bt.expandHome(t,e.req.meta?.cwd):B.join(e.sessionStore.ensureSessionDir(e.sessionName),`${_u()}-${n}`)}function gu(e){let t=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||r!==`snapshot`))throw new n(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function _u(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function vu(e){return typeof e==`string`&&e.length>0?e:void 0}const yu=[`dump`,`log`],bu=`network requires ${yu.join(` or `)}`,xu=`network include mode must be one of: ${d.join(`, `)}`,Su=2048;async function Cu(e){let t=e.sessionStore.get(e.sessionName);if(!t)return u(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=wu(e.bindDevice),r=(await n(t.device,O)).facts.networkDump;if(!r.available)return ku(r.hint);let i=Tu(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 Au(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:Su,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:i(e)}}}function wu(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Tu(e){let t=Eu(e);if(!t.ok)return t;let n=Du(e);if(!n.ok)return n;let r=Ou(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Eu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return yu.includes(t)?{ok:!0,action:t}:u(`INVALID_ARGS`,bu)}function Du(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?u(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Ou(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return u(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return d.includes(r)?{ok:!0,include:r}:u(`INVALID_ARGS`,xu)}function ku(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function Au(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:Su,maxScanLines:e.entries.length},notes:e.notes}}}function ju(e,t){let n=xi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Mu(e.appLogFailure)]:Nu(n.state)}}function Mu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Nu(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 Pu(e,t){return Ye([...e,...t.notes??[]])}async function Fu(e){let{req:t}=e;return t.command===`perf`?await Yl({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Lu(e):t.command===`events`?await Iu(e):t.command===`network`?await Cu(e):t.command===`audio`?await Vl(Yu(e)):null}async function Iu(e){let{req:t,sessionName:n,sessionStore:r}=e;try{return await r.flushEvents(n),{ok:!0,data:r.readEvents(n,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:i(e)}}}async function Lu(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n);if(!a)return u(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Xu({...e,session:a}),r=(await n.bindDevice(a.device,se)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=Bu(de({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Ru(n,i)}catch(e){return{ok:!1,error:i(e)}}}async function Ru(e,t){switch(t.kind){case`path`:return Vu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Hu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await zu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await qu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Uu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Wu(e)}}async function zu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Ku(e,t.appBundleId,n.owner,n.operations.appLogStart):await Gu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Bu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):u(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Vu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Ll(a),s=ju(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 Hu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=ju(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:Pu(t.notes,o)}}}function Uu(e,t,n){let r=n.resolveAppLogPath(t);return Rl(r,e),{ok:!0,data:{path:r,marked:!0}}}function Wu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return u(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=zl(r.resolveAppLogPath(n));return hi({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Gu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await gi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:_i.resolvePath(o.resolveSessionDir(a))});let s=zl(o.resolveAppLogPath(a)),c=await Ju(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Ku(e,t,n,r){let{session:i}=e;return i.appLog?u(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Ju(e,t,r,n)}async function qu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return u(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await gi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:_i.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Ju(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=_i.resolvePath(o.resolveSessionDir(a));try{let l=Bl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await bi({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:vi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Yu(e){if(!e.bindDevice||!e.inspectFacts)throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new n(`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 Xu(e){if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new n(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}const Zu=new WeakMap;function Qu(e){return{store:t=>$u(e,t),finalize:(t,n)=>ed({...e,evidence:t,projection:n})}}function $u(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{$r(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Zu.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Xr(a),refFrame:ai(a)}),{evidence:s,refsGeneration:o}}function ed(e){let t=Zu.get(e.evidence);Zu.delete(e.evidence);let n=nd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!td(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!rd(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ni(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function td(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Xr(n)===t.runtimeRevision&&ai(n)===t.refFrame}function nd(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 rd(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function id(e){let t=ad(e),n=Pe(t);return ha(`sha256`).update(n,`utf8`).digest(`hex`)}function ad(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)=>od(e,n[t]??null,r?.[t]??null))}}function od(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 sd(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=cd({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function cd(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>ld({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>ud({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>dd(n,r)];for(let e of s){let t=e();if(t)return t}}function ld(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 ud(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 dd(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 fd(e,t){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new n(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=ot(e),a=ct(e),o=id({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??nt(i.actions)??a.platform,target:t?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>sd(e,s,o)}}function pd(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function md(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ne(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function hd(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 gd(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=hd(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 _d(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Te(e,r),...ue(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 vd(e,t,n,r,i,a){if(n.targetEvidences)return yd(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return xd(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return xd(e,n,r,i,a);if(s.kind===`post-resolution`){let c=pd({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return xd(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return Sd(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=md({recorded:o,token:s.token});if(c.kind===`skip`)return xd(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.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,bd(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?Sd(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function yd(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 xd(e,n,r,i,a);let d=md({recorded:o[c],token:u.token});if(d.kind===`skip`)return xd(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.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,bd(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return Sd(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function bd(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 xd(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function Sd(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=Cd(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=wd(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function Cd(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function wd(e,t,n){return n.status===`guard-mismatch`?gd(e,n.evidence,t):_d(e,n.evidence)}async function Td(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Pt(e.varSources),o=[],s=[],c=kd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Od(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Ad(u,n.length,r,e))}let d=Nt(r,a,Dd(e,u)),f=At(a),p=t.diagnosticsMarker(),m=await vd(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:Ed(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function Ed(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Dd(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Od(e){return!!(e&&e.command!==`replay`)}function kd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Od(n))return n.command===`close`?t:void 0}}function Ad(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function jd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Ne(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function Md(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),at(e.command)){let n=Nd(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Ne(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=jd([...e.positionals]);n&&t.push(n)}return Ye(t).filter(e=>e.trim().length>0)}function Nd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Pd(n)?t.slice(0,-1):t}function Pd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Fd(e){let t=B.dirname(e),n=B.basename(e,B.extname(e));return B.join(t,`${n}.healed.ad`)}function Id(e){let t=Ld({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Ld(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Rd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Rd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function zd(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Bd(n))return`manual`;let i=Vd(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Bd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Hd(e.scrollRegion)}function Vd(e,t){let n=Zt(t),r=Wd(e.ancestry,n,t),i=e.scrollRegion;return i&&Hd(i)?r&&Ud(i,n,t):r}function Hd(e){return e.id!==void 0||e.label!==void 0}function Ud(e,t,n){return n.some(n=>Tt(wt(n,t),e))}function Wd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=en(n,t,e.length);return!r.broken&&le(r.chain,e)})}function Gd(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:i}=e,a,s,c=An({divergence:r,level:i,writeOverflowArtifact:e=>{let n=o(e),r=Jd(t,n);return`artifactPath`in r&&(a=n,s=r.artifactPath),r}}),l=(a??c).screen;if(l.state!==`available`||l.refs.length===0)return e.evidence&&n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:l.state===`available`?l.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return qd(s),Kd(c,`missing-evidence`);let u=n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:l.refsGeneration,refs:l.refs.map(e=>e.ref)});return u.published===!0?c:(qd(s),Kd(c,u.reason))}function Kd(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function qd(e){if(e)try{V.unlinkSync(e)}catch{}}function Jd(e,t){try{let n=B.join(e.ensureSessionDir(),`replay-divergence`);V.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=B.join(n,r);return V.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const Yd={id:0,"role-label":1,label:2,other:3};function Xd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Zd(n.basis)<Zd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Zd(e.basis)-Zd(t.basis)||e.nodeIndex-t.nodeIndex)}function Zd(e){return Yd[e]}async function Qd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionStore:s,observationStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=kn(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await tf({session:o,observationStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=of(v,g),b=v.state===`available`&&o?df({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=zd({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:$d(v)}),S=Id({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Gd({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(it(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function $d(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const ef=[300,500,800,1200,2e3,3e3,4e3];async function tf(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=rf(i),s=Date.now()+12e3,c=await nf({session:t,observationStore:n,logPath:r,flags:o});if(!a)return c.observation;for(let e of ef){if(c.observation.state===`available`||!c.retryable)break;let i=s-Date.now();if(i<=0)break;await wn(Math.min(e,i)),c=await nf({session:t,observationStore:n,logPath:r,flags:o})}return c.observation}async function nf(e){let{session:t,observationStore:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).snapshot;if(Zi(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let a=n.bindAuthority().store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:a.refsGeneration,evidence:a.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:Ln(e)}}}function rf(e){return{snapshotInteractiveOnly:af(e)}}function af(e){return!ff(e.command)||pf(e).requiresRect}function of(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=uf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function sf(e){return!!fn(e,f(e.type??`Element`))||e.hittable===!0}function cf(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function lf(e,t){let n=$t(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&sf(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>cf(e,t)),...o.filter(e=>!cf(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function uf(e,t,n){let{nodes:r,truncated:i}=lf(e,n);return{refs:r.map(e=>{let n=f(e.type??`Element`),r=fn(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function df(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!ff(t.command))return[];let a=Md(t);return a.length===0?[]:mf({candidates:a,nodes:r,session:n,action:t,matching:pf(t),sanitize:i})}function ff(e){return at(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function pf(e){let t=at(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function mf(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=hf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Xd(s).map(e=>e.suggestion)}function hf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=$e(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:gf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function gf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=ze(t,r.device.platform,{action:i.command===`fill`?`fill`:at(i.command)?`click`:`get`,nodes:n}),c=f(t.type??`Element`),l=fn(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function _f(e){return{...e,hint:e.hint??bf(e.details,`hint`),diagnosticId:e.diagnosticId??bf(e.details,`diagnosticId`),logPath:e.logPath??bf(e.details,`logPath`)}}function vf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return yf({error:t,actionLabel:it(n),action:n.command,positionals:ft(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function yf(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Dn(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Dn(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Sf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>Dn(e,u))}:{},divergence:l}}}}function bf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const xf=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function Sf(e){if(!e)return{};let t={};for(let n of xf)e[n]!==void 0&&(t[n]=e[n]);return t}async function Cf(e){return await wf({...e,snapshotDiagnostics:_(e.snapshotDiagnosticSamples)})}async function wf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Tf(t.error.details?.replaySource),v=_f(t.error),y=await Qd({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:M(u.meta?.requestId)});return vf({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Tf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(n!==void 0||r!==void 0)return{path:n,line:r}}function Ef(e,t){if(e)try{V.appendFileSync(e,`${JSON.stringify(o(t))}\n`)}catch(t){j({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Df(e){let{req:t,sessionName:r,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();Ef(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:ft(o)??[]});let g;try{g=await kf({req:t,sessionName:r,resolved:o,sourceAction:a,invoke:f,resolvedSessionScope:p,dependencies:m})}catch(e){if(!(e instanceof n))throw e;g={ok:!1,error:i(e)}}let _=Date.now();return Ef(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?jf(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Of(g,u??s,c)}function Of(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function kf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Mf(t.flags,r.flags),l=i.command===`fill`?Wt(Rt(i)):void 0;return l&&(c.recordAs=l),await a(Af({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Af(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:rt(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:lt(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function jf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function Mf(e,t){return g(e,{...t??{}})}function Nf(e){return Bf(e.ok?Ff(e.data):Pf(e.error.details?.artifactPaths))}function Pf(e){return Array.isArray(e)?e.filter(zf):[]}function Ff(e){return e?[Rf(e.path),Rf(e.outPath),...If(e.artifacts)].filter(zf):[]}function If(e){return Array.isArray(e)?e.map(Lf).filter(zf):[]}function Lf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Rf(t.localPath)??Rf(t.path)}function Rf(e){return typeof e==`string`?e:void 0}function zf(e){return typeof e==`string`}function Bf(e){return[...new Set(e.filter(Vf))]}function Vf(e){try{return V.statSync(e).isFile()}catch{return!1}}function Hf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Uf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Zt(r),u=re(t),d=Qt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Et(r,e)===t.sibling),p=d.filter(e=>Tt(wt(e,l),t.scrollRegion)),m=St(p)[t.viewportOrder]?.ref,h=Ct({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Kf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Uf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Wf(n,t,i,a):Gf(n,t,r,a,o)}function Wf(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),o=e(n),s=o?c(t,o):null;if(a(s))return{matchedNodes:[s],winnerRef:s.ref};let l=r?nn(t,r):null;return a(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Gf(e,t,n,r,i){let a=Ze(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=rn(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Kf(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?qf(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?qf(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?qf(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 qf(e,t,n){let r=Dt(t),i=en(t,n,Math.max(e.ancestry.length,1)).chain;return[...Te(e,r),...ue(e.ancestry,i)].slice(0,5)}function Jf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=ut(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ne(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!at(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Xf(r)&&Xf(n[1])))return r}function Yf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Xf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Zf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=kn(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:sp(re(n),h),...t.observed?{observed:sp(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>cp(e,h))},_=zd({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Id({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(it(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=Gd({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return vf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function Qf(e,t,n){let r=kn(e.scrubVars);return Zf(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:of(n,r),publicationEvidence:np(n),repairCapture:$d(n)})}async function $f(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await tf({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function ep(e,t){return Qf(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 $f({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function tp(e,t,n){return Qf(e,t,await $f({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function np(e){return e.state===`available`?e.evidence:void 0}function rp(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?Ce(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Ue(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Jf(n,i),platform:a.device.platform}:{kind:`inactive`}}function ip(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=pf(r),s=Hf({recorded:t,token:n,nodes:i,platform:a,refLabel:Yf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Dt(s.winnerNode),structural:pe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Dt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function ap(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function op(e){return!e.ok&&e.error.details?.reason===tn}function sp(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function cp(e,t){let n=f(e.type??`Element`),r=fn(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function lp(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 up(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 dp(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 fp(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 pp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:up(e?.observed),expectedStructural:fp(e?.expectedStructural),observedStructural:fp(e?.observedStructural)}}function mp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:up(e?.observed),observedAncestry:dp(e?.observedAncestry)}}function hp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function gp(e,t,n){let r=hp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&ap(e)?{status:`guard-mismatch`,evidence:pp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&op(e)?{status:`landmark-mismatch`,evidence:mp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function _p(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(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}),l=e=>(o=e,hp(vp(e),Nf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return rp({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await tf({session:i,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return ip({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Df({req:lp(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=l,Nf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:gp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await ep(c(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return l(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=Qf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await tp(c(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=vp(o),u=await yp(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>bp(e),onStep:i,diagnosticsMarker:()=>Sp(t.sessionStore),diagnosticsSince:e=>Cp(t.sessionStore,e)},readLastResponse:()=>o}}function vp(e){return e&&!e.ok?e:u(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function yp(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return xp(i)?c(i):c(await Cf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function bp(e){let t=e.positionals??[],n=Re(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function xp(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 Sp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function Cp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function wp(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Tp(t,i)};return Dp(o,`AD_PLATFORM`,a.platform??r.platform),Dp(o,`AD_TARGET`,a.target??r.target),Dp(o,`AD_DEVICE`,a.device),Dp(o,`AD_DEVICE_ID`,Ep(a)),Op(o,`AD_SHARD_INDEX`,a.shardIndex),Op(o,`AD_SHARD_COUNT`,a.shardCount),Dp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Tp(e,t){let n=e.meta?.cwd??process.cwd();return B.relative(n,t)||t}function Ep(e){return typeof e.serial==`string`?e.serial:e.udid}function Dp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Op(e,t,n){typeof n==`number`&&(e[t]=String(n))}const kp=3e4,Ap=1e3;function jp(e){let{scriptPath:t,env:r,publicNetworkOnly:a}=e,o=V.readFileSync(t,`utf8`),s=Object.create(null);try{ya.runInNewContext(o,Mp(r,s,a),{filename:t,timeout:kp})}catch(e){let r=i(e);throw new n(r.code,`Maestro runScript failed: ${r.message}`,m({...r.details??{},hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,retriable:r.retriable,supportedOn:r.supportedOn,scriptPath:t}),e instanceof Error?e:void 0)}return zp(s,t),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Bp(t)]))}function Mp(e,t,n){return{...e,output:t,json:Np,http:{post:(e,t)=>Fp(`POST`,e,n,t)}}}function Np(e){if(typeof e!=`string`)throw new n(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new n(`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,Pp)}catch(t){throw new n(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Ap)},t instanceof Error?t:void 0)}}function Pp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Fp(e,t,r,i){let a=Cn(process.execPath,Ip(),{stdin:JSON.stringify(Rp(e,t,i,r)),timeoutMs:kp,allowFailure:!0});if(a.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Vp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:a.stdout.slice(0,Ap),stderr:a.stderr.slice(0,Ap)},r instanceof Error?r:void 0)}}function Ip(){let e=Lp(import.meta.url);if(!e)throw new n(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Lp(e){try{let t=_a(e),n=B.extname(t)||`.js`;return[B.join(B.dirname(t),`run-script-http-child`+n),B.join(B.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>V.existsSync(e))??null}catch{return null}}function Rp(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function zp(e,t){for(let r of Object.keys(e))if(r.includes(`.`))throw new n(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:t,key:r})}function Bp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Vp(e){let t=e.trim();return t.length>0?t.slice(0,Ap):`request process exited without stderr`}async function Hp(e){return await Up(`tap`,async t=>{let n=B.join(t,`before.png`),r=B.join(t,`after.png`),i=await Gp(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Gp(e,r)))return await Wp(n,r,e.signal,`tap`)}})})}async function Up(e,t){let n=await H.mkdtemp(B.join(ga.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await H.rm(n,{recursive:!0,force:!0})}catch{}}}async function Wp(e,t,n,r){try{let[i,a]=await Promise.all([H.readFile(e),H.readFile(t)]);Yp(n);let o=await Qi(i,a,`Maestro screenshot`);return Yp(n),Kp(o,r)}catch(e){Jp(e,n),j({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Gp(e,t){try{return await H.rm(t,{force:!0}),Yp(e.signal),await e.capture(t),Yp(e.signal),!0}catch(t){return Jp(t,e.signal),!1}}function Kp(e,t){if(e.status!==`compared`)return qp(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return qp(t,n?`stable`:`changed`,e),n}function qp(e,t,n){j({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Jp(e,n){if(n?.aborted||a(e))throw t()}function Yp(e){if(e?.aborted)throw t()}async function Xp(e){Qp(e.timeoutMs),Yp(e.signal);let t=e.now()+e.timeoutMs;return await Up(`animation`,async n=>{let r=B.join(n,`first.png`),i=B.join(n,`second.png`);for(;;){if(Yp(e.signal),await Zp(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Zp(e,t,n){let r=[await Gp(e,t),await Gp(e,n)];return!r[0]||!r[1]?!1:await Wp(t,n,e.signal,`animation`)===!0}function Qp(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const $p=q.observationPollMs;async function em(e,t){for(;;){X(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!gm(n)||(X(e.context.signal),!await mm(e.dependencies,t,$p,e.context.signal)))throw n}}}function tm(e){return nm({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function nm(e){let t=Bi(e.snapshot),n=e.platform===`ios`?ra(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:s(n.nodes)}:e.snapshot;return sm(vo(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 rm(e){hm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){X(e.context.signal);let r=await em(e,n),i=nm({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Sa(e.condition,i))return i;if(e.dependencies.now()>=n)break;await mm(e.dependencies,n,$p,e.context.signal)}return X(e.context.signal),ym(t)}async function im(e){hm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){X(e.context.signal);let i=r??await em(e,t);if(r=void 0,n=nm({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===q.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return X(e.context.signal),ym(n)}async function am(e){hm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await em(e,t),r=_m(n);for(;;){X(e.context.signal),await mm(e.dependencies,t,$p,e.context.signal);let i=await em(e,t),a=_m(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 om(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function sm(e,t,n,r,i,a,o){if(!e.ok){let t=om(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=lm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=om(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:cm(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:_m(t)}:{}}}function cm(e,t){return!me(e)||!me(t)?0:be(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 lm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!um(t,n,r)||i!==1))return dm(t.selector)}function um(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!yo(e.selector)}function dm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!fm(n)||typeof r!=`string`)return;let i=Nr(r)?.trim();return i?{key:n,value:i}:void 0}function fm(e){return e===`id`||e===`label`||e===`text`}async function pm(e,n,r){try{await e.sleep(n,r)}catch(e){throw r?.aborted?t():e}X(r)}async function mm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await pm(e,Math.min(n,i),r),!0)}function X(e){if(e?.aborted)throw t()}function hm(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function gm(e){return e instanceof n&&e.details?.retriable===!0}function _m(e){return ha(`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:vm(e.rect)})))).digest(`hex`)}function vm(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 ym(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function bm(e){return e.kind===`clearState`?Tm(e):xm(e)?Sm(e):Bm(e)?Vm(e):e.kind===`settingsPermission`?Nm(e):Pm(e)}function xm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Sm(e){switch(e.kind){case`launchApp`:return Cm(e);case`stopApp`:return wm(e);case`openLink`:return Em(e)}}function Cm(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 wm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function Tm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Em(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const Dm={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`},Om={allow:`grant`,deny:`deny`,unset:`reset`},km={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 Am(e){let t=Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]);if(t.length===0)throw new n(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...t.filter(([e])=>e===`all`),...t.filter(([e])=>e!==`all`)].map(([e,t])=>jm(e,t))}function jm(e,t){let r=e===`all`?`all`:Mm(Dm,e);if(r===void 0)throw new n(`UNSUPPORTED_OPERATION`,`Maestro permission "${e}" is not supported.`,{hint:`Supported: all, ${Object.keys(Dm).join(`, `)}.`});let i=km[e],a=i?Mm(i,t):void 0;if(a)return a;let o=Mm(Om,t);if(o)return{state:o,permission:r};throw new n(`INVALID_ARGS`,`Maestro permission "${e}" does not accept "${t}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(i??{})].join(`|`)}.`})}function Mm(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function Nm(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Pm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Fm(e);case`clickPoint`:return Im(e);case`swipe`:return Lm(e);case`scroll`:return Rm(e);case`pressKey`:return zm(e)}}function Fm(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Im(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Lm(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 Rm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function zm(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Bm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Vm(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 Hm(e,t){let r=bm(t),i=await e.invoke(m({...r,flags:Um(e.flags,r.flags??{})}));if(!i.ok)throw Ym(i);if(t.kind===`gestureViewport`){let e=i.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new n(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function Um(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 Wm(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 Gm(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 Km(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 qm(e,t,r){if(B.isAbsolute(e))return e;let i=t.source?.path??r;if(!i)throw new n(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return B.resolve(B.dirname(i),e)}function Jm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Ym(e){let t=e.error,r=m({...t.details??{},hint:t.hint??Xm(t.details,`hint`),diagnosticId:t.diagnosticId??Xm(t.details,`diagnosticId`),logPath:t.logPath??Xm(t.details,`logPath`),retriable:t.retriable??Zm(t.details,`retriable`),supportedOn:t.supportedOn??Xm(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function Xm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Zm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Qm(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Hm(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new n(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=b(i,i);return t={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let n=r.snapshot;return r=void 0,t={generation:e.generation,snapshot:n},n}return r=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await am({timeoutMs:q.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function $m(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 em({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=tm({query:t,context:n,snapshot:o,platform:i.platform});if(ah(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await mm(i.dependencies,a,$p,n.signal)}}}async function eh(e,t,n,r,i,a){let o=async()=>await rh(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Hp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Hm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await th(e,t,n,r,i,a.click,o)});return}await th(e,t,n,r,i,a.click)}async function th(e,t,n,r,i,a,o){let s=async()=>await rh(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:_m(await t.capture(i))),l=async()=>{let r=await am({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await nh({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 nh(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<q.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function rh(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await oh(e,o,n.point,i);return}catch(n){if(!sh(n))throw n;let o=await $m({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!ih(o))throw n;t.invalidate(r.generation),await ch(e,In(o.rect),i);return}}t.invalidate(r.generation),await ch(e,n.point,i)}function ih(e){return e.matched&&e.visible&&e.rect!==void 0}function ah(e,t){return ih(e)?!t||e.dispatchSelector!==void 0:!1}async function oh(e,t,n,r){j({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Hm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function sh(e){let t=r(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===dn.selectorNotFound}async function ch(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);j({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Hm(e,{kind:`clickPoint`,point:t,options:r})}function lh(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function uh(e){let t=Qm(e),r={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},i=e=>{e.settled?r.settleLatches+=1:r.settleTimeouts+=1},a=e.platform,o=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),Hm(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,r)=>{let i=[];for(let a of t){try{await c({kind:`settingsPermission`,...e?{appId:e}:{},state:a.state,permission:a.permission,...a.mode?{mode:a.mode}:{}},r)}catch(e){throw e instanceof n?new n(e.code,e.message,{...e.details,appliedPermissionMutations:i,failedPermissionMutation:lh(a)}):e}i.push(lh(a))}},u=async(n,r)=>{vn(n),await c({kind:`typeText`,text:n},r);let a=await am({timeoutMs:q.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});i(a),t.prime(r.generation,a.snapshot)};return{operations:{platform:a,resolveTarget:async(n,r)=>await $m({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await rm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a}),resolveGestureViewport:async()=>await o({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Wm(e.arguments),...Wm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Am(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,Am(e.permissions),t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await c({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:a===`ios`},t,`deferred`)},tapOn:async(n,i)=>await eh(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await s(()=>ch(e,t.target.point,m({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await s(()=>ch(e,t.target.point,{holdMs:q.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await c({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await u(e.text,t),eraseText:async(e,t)=>await u(`\b`.repeat(e.charactersToErase??q.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await c({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let i=await im({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a,scroll:async(i,o)=>{let s=ja(o,n.selector,n.direction,n.durationMs,a);return await c(s?{kind:`swipe`,...s}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await am({timeoutMs:Math.min(q.settleTimeoutMs,i),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(i.visiblePercentage!==q.scrollUntilVisiblePercentage)throw Lr(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Gm(n.selector,i))}},pressKey:async(e,t)=>{await c({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await c({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await c({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await Xp({timeoutMs:t.timeoutMs??q.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await o({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Km(await o({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:jp({scriptPath:qm(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?Jm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r}),recordSettle:i}}function dh(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=uh(e);return Eo(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 fh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),ph(()=>gh(r,e)),ph(()=>_h(n,t,e))},actionCompleted:e=>{let r=mh(i,e.stepIndex);ph(()=>vh(n,t,hh(r,e),!0))},actionFailed:e=>{let r=mh(i,e.stepIndex);ph(()=>vh(n,t,hh(r,e),!1))}}}function ph(e){try{e()}catch{}}function mh(e,t){let n=e.get(t);return e.delete(t),n}function hh(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 gh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function _h(e,t,n){Ef(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function vh(e,t,r,i){let a=yh(r);Ef(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:t,...r.source.path&&r.source.path!==t?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof n?{errorCode:r.error.code}:{}})}function yh(e){let t=`data`in e?e.data:void 0,n=bh(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 bh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function xh(e,t){let n=m({...e.dispatch,...Sh(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 Sh(e){return m({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function Ch(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:Dh(e.action),positionals:Oh(e.action,e.value),flags:t.flags??{}}}}async function wh(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=M(r.meta?.requestId),c=Ch(t,r),l=_f(e.error),u=[...t.redactions],d=kn(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await tf({session:p,observationStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?Th({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Eh(t.value)].filter(Boolean).join(` `),_=Gd({sessionStore:i,observationStore:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:of(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:zd({kind:`action-failure`,targetEvidence:void 0,capture:$d(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return yf({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u,warnings:t.warnings})}function Th(e){let t={createdAt:Date.now(),nodes:e.nodes};return Xd(Zn(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>gf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Eh(e){return!e||e===`<text>`?e??``:st(e)}function Dh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Oh(e,t){return!t||e===`inputText`?[]:[t]}function kh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=jh(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:Mh(c,Date.now()-r)}}}async function Ah(e){let{command:t,replayPath:n,state:r,outcome:a}=e,{request:o,session:{store:s,observationStore:c,logPath:l}}=t,{failure:u}=a,d=i(a.error);return u?await wh({error:d,failure:u,replayPath:n,req:o,sessionStore:s,observationStore:c,logPath:l,snapshotDiagnostics:jh(s,r.snapshotStart)}):{ok:!1,error:d}}function jh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return _(n)}function Mh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Nh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return u(`INVALID_ARGS`,lr);if(t.flags?.saveScript!==void 0)return u(`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 Ph({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Ah({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Ph(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await Fh({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Hh({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:fh({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?kh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Ah({command:t,replayPath:n.entry,state:i,outcome:f})}async function Fh(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 Ih({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Bh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Vh(r),signal:M(r.meta?.requestId)}}async function Ih(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await Li(t.flags??{},er(a.appTarget,o))),c=qh(t,s),l=Rh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Lh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Jh(t,s),runtimeHints:l,flow:a})}async function Lh(e){if(e.device||!zh(e.runtimeHints))return e;let t=await Li(e.req.flags??{},er(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Jh(e.req,t),runtimeHints:Rh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Rh(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function zh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Bh(e){return{...wp({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Vh(e){return{...Mt(jt(e.flags?.replayShellEnv)),...kt(Ot(e.flags?.replayEnv))}}function Hh(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 dh({invoke:e=>c(xh(l,e)),flags:Uh(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await va(e,void 0,{signal:t})}}})}function Uh(e,t,n){if(!e)return Wh(t,n);let r={platform:t,target:e.target,noRecord:!0};return t===`android`?{...r,serial:e.id}:{...r,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}}}function Wh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Gh(n,t):Kh(n,t)}function Gh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Kh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function qh(e,t){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new n(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Jh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function Yh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(It(t,a.flags?.replayBackend)===`maestro`)return n?u(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Nh(i):u(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Xh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=Zh(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=Qh(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=$h({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:tg({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function Zh(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return u(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Qh(e,t,n){let r=fd(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:eg({...e,flags:rr(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function $h(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:u(`INVALID_ARGS`,a.message)}}function eg(e,t){return!t.platform&&!t.target?e:{...e,flags:ng(e.flags,t)}}function tg(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:wp({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Mt(jt(t.flags?.replayShellEnv)),cliEnv:kt(Ot(t.flags?.replayEnv))}}function ng(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 rg={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function ig(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=ag({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(cg({req:t,coordinator:a}),sg({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function ag(e){let t=lg(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return l()}function og(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?u(`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.`):ug({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function sg(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=og({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??rg,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:dg({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function cg(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function lg(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return u(`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 ug(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Mn(t):a??Fd(i);if(!(n||r&&o===a)&&V.existsSync(o))return u(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function dg(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 fg(e){let{request:t,session:{name:n,logPath:i,store:a,observationStore:o,coordinator:s},tracePath:c,onStep:l,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return u(`INVALID_ARGS`,lr);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,Lt(h)&&t.flags?.replayBackend!==`maestro`)return u(`INVALID_ARGS`,Ft(`replay`,h));let r=await Yh({resolved:h,keepSession:m,coordinator:s,command:e});if(r)return r;let _=Xh({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:ee}=_.value,T=ig({req:t,entryIndex:C,sessionStore:a,sourcePath:h,coordinator:s});if(!T.ok)return T.response;let{runtime:E,readLastResponse:te}=_p({ctx:{replayReq:v,sessionName:n,sessionStore:a,observationStore:o,logPath:i,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:ee,responseLevel:t.meta?.responseLevel,invoke:d,signal:M(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:l,armSaveScript:T.armSaveScript}),D=await Td({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},E);return D.status===`failed`?te()??u(`COMMAND_FAILED`,`replay step failed with no recorded response`):pg({startedAt:p,sessionName:n,sessionStore:a,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:s,keepSession:m})}catch(e){let t=r(e);return u(t.code,t.message,g.size>0?{artifactPaths:[...g]}:void 0)}}function pg(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=hg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=_([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:mg(i,Date.now()-t)}}}function mg(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function hg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return u(`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 gg(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=B.resolve(n??`.`,t??`.agent-device/test-artifacts`);return B.join(i,r)}function _g(e,t){let n=t?B.relative(t,e):B.basename(e),r=n.length===0||n.startsWith(`..`)?B.basename(e):n;return We(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function vg(e,t){V.mkdirSync(t,{recursive:!0}),xg(e,t)}function yg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=B.join(o,`result.txt`),u=B.join(o,`failure.txt`),d=bg([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>B.basename(e)).join(`, `)}`);let p=`${f.join(`
2
+ `)}\n`;V.writeFileSync(l,p),s||V.writeFileSync(u,p)}function bg(e,t,n){let r=[],i=new Set(n.map(e=>B.basename(e).toLowerCase()));for(let n of e){if(!Cg(n))continue;let e=B.basename(n);if(B.resolve(n)===B.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=Sg(e,t,i),o=B.join(t,a);V.copyFileSync(n,o),r.push(o)}return r}function xg(e,t){let n=B.join(t,`replay.ad`);if(V.copyFileSync(e,n),B.extname(e).toLowerCase()===`.ad`)return;let r=B.join(t,B.basename(e));B.resolve(r)!==B.resolve(n)&&V.copyFileSync(e,r)}function Sg(e,t,n){let r=B.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||V.existsSync(B.join(t,a));)a=`${i}-${o++}${r}`;return a}function Cg(e){try{return V.statSync(e).isFile()}catch{return!1}}function wg(e){let{platformFilter:t,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:n,manifest:r}=e,i={kind:`run`,path:n,title:r.title,manifest:r};if(!t){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}Ag(t,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=t?` for --platform ${t}`:``;throw new n(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function Tg(e,t,n,r,i=0){let a=B.basename(n,B.extname(n)),o=We(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Eg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return We(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function Dg(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,B.basename(r),`attempt`,a+1].join(`:`)}function Og(e,t){return typeof e==`number`?e:t}function kg(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Ag(e,t){return e===`apple`?w(t):t===e}function jg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Mg=2e3;async function Ng(e){let{filePath:t,sessionName:n,requestId:r,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:r,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=Bg({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:n,requestId:r,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:n,platform:s,target:c,requestId:r,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Z(C,e),shard:u,onStep:d}).catch(e=>jg({error:i(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Vg(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 Fg(w)||(x=Rg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:r,graceMs:Mg}}),Ig({replayPromise:w,cleanupSession:p,sessionName:n,requestId:r,emitDiagnostic:h})));let e=await Lg({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=zg(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 r=i(e);Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-t,errorCode:r.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:n,error:r.message}}),x=Pg(x,r,v)}}return x??jg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Pg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:jg({error:t,artifactPaths:[...n],infrastructure:!0})}async function Fg(e){return await Promise.race([e.then(()=>!0),va(Mg).then(()=>!1)])}async function Ig(e){let{replayPromise:t,cleanupSession:n,sessionName:r,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await n(r)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:r,requestId:a,error:i(e).message}})}}}async function Lg(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:r,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:r,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=i(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}}),jg({error:t})}}function Rg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function zg(e,t){return{...e,warnings:[...e.warnings,t]}}function Bg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=B.join(t,`replay-timing.ndjson`);return V.mkdirSync(B.dirname(l),{recursive:!0}),V.writeFileSync(l,``),n.add(l),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 Vg(e,t=[]){return jg({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 Hg(e){let t=Ug(e),n=await Wg(e,t);return{result:Xg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Ug(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:B.join(i,...a?[`shard-${a.shardIndex+1}`]:[],_g(t.path,n)),maxAttempts:r+1}}async function Wg(e,t){Kg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Gg(e,t,r);if(qg(n,i),Jg(e,i.outcome,r))break;Yg(e,t,i)}return n}async function Gg(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=Tg(i,a,r.path,o,n),h=B.join(t.testArtifactsDir,`attempt-${f}`);vg(r.path,h);let g=Dg({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 Ng({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 yg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Kg(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:Tg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Q(c)})}function qg(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 Jg(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Yg(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 Xg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Zg(e,t,n,r):Qg(e,t,n,r)}function Zg(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}:{},...e_(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Qg(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,...$g(c),...e_(s)}}function $g(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 e_(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 t_(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 n_(e){let{request:t,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),r=await r_(t,u,d);s_(r,o);let p=r.shardPlan?c_({entries:r.entries,total:r.total,emitProgress:o}):[];return r.shardPlan?p.push(...await l_({shards:r.shardPlan.shards,sessionName:f,suiteInvocationId:r.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:r.suiteArtifactsDir,suiteTotal:r.total,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await p_({discoveryEntries:r.entries,sessionName:f,suiteInvocationId:r.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:r.suiteArtifactsDir,suiteTotal:r.total,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:g_(r.total,p,Date.now()-e,r.suiteArtifactsDir)}}catch(e){let t=r(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function r_(e,t,n){let r=i_(e,t),i=a_(r),a=r.length-i.length,o=Eg(e.requestId),s=await t_(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:o_(e,o),total:s?.total??r.length}}function i_(e,t){return wg({platformFilter:e.platformFilter,discoverSources:t})}function a_(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function o_(e,t){return gg({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function s_(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 c_(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 l_(e){return(await Promise.allSettled(e.shards.map(async t=>await d_({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[u_(r,e.sessionName,t.reason)]:[]})}function u_(e,t,n){let r=i(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:f_(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:r.code,message:r.message,hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,details:r.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function d_(e){let{shard:t,sessionName:n}=e;return await m_({...e,entries:t.entries,sessionName:f_(n,t),shard:t})}function f_(e,t){return`${e}:shard-${t.shardIndex+1}`}async function p_(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 Hg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:kg(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Og(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),h_(t,o,p))break}return g}async function m_(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 Hg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:kg(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Og(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),h_(b,o,m))break}return _}function h_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function g_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=y(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function __(e,t){return()=>e.map(e=>v_(e,t))}function v_(e,t){let n=e.entry,r=Jr(e,n),i=It(n,t)===`maestro`,a=ct(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 y_(e){return async t=>(await S_(e,t)).map(b_)}function b_(e){if(e.platform===`web`||!ee(e))throw new n(`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 x_(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 S_(e,t){let r=E_(e),i=w_(await Fi(C_(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${T_(t)}, but only ${i.length} matched`);return i.slice(0,t)}function C_(e){let t=I(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:S({simulatorSetPath:Ni(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function w_(e,t,n){return t.length>0?D_(e,t,n):e.filter(e=>O_(e,n)).sort(j_)}function T_(e){return`${e} device${e===1?``:`s`}`}function E_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function D_(e,t,r){return t.map(t=>{let i=A_(t),a=e.find(e=>k_(e,r)&&(e.id===t||A_(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function O_(e,t){return!k_(e,t)||!ee(e)?!1:e.booted!==!1}function k_(e,t){return!(!D(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function A_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function j_(e,t){return e.id.localeCompare(t.id)}function M_(e){let t=N_(e?.shardAll,`--shard-all`),r=N_(e?.shardSplit,`--shard-split`);if(t!==void 0&&r!==void 0)throw new n(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(r!==void 0)return{mode:`split`,count:r}}function N_(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new n(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const P_=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 F_(e){return P_.has(e.toUpperCase())}const I_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function L_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=R_(e);return t?z_(t.details)||B_(t.code,t.message):!1}function R_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function z_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||mn(t)?!0:t?F_(t):!1}function B_(e,t){let n=`${e}\n${t}`.toLowerCase();return I_.some(e=>n.includes(e))}function V_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:W_(e.error.details?.artifactPaths),warnings:un(e.error.details),infrastructure:L_(e),...G_(e.error.details?.snapshotDiagnostics)};let t=e.data;return{status:`passed`,replayed:typeof t?.replayed==`number`?t.replayed:0,healed:typeof t?.healed==`number`?t.healed:0,warnings:un(t),artifactPaths:W_(t?.artifactPaths),...G_(t?.snapshotDiagnostics)}}function H_(e){if(!e||e.ok)return;let t=V_(e);return t.status===`failed`?t:void 0}function U_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function W_(e){return[...new Set(U_(e))]}function G_(e){let t=v(e);return t?{snapshotDiagnostics:t}:{}}const K_=1e3,q_=3e3;function J_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Y_(e)}}async function Y_(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=En(o.device.platform),c=i?B.join(i,`recording${s}`):Tn(o.device.platform);Z_(a,{type:`video_recording_start`,session:n,videoPath:c}),j({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(Q_({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return Z_(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await wn(K_),Z_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:K_}),j({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:K_}}),l}async function X_(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;Z_(a,{type:`video_tail_start`,session:n,requestedDurationMs:q_});let o=Date.now();await wn(q_);let s=Date.now(),c=await e.video.record(Q_({req:t,sessionName:n,phase:`stop`}));return Nf(c).forEach(e=>i.add(e)),Z_(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}),j({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function Z_(e,t){e({...t,ts:new Date().toISOString()})}function Q_(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 $_=[{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.`}],ev=({attemptId:e,parentAttemptId:t})=>{Gn(e);let n=tv(e,t);return{cancel:()=>Hn(e),release:()=>{n(),Wn(e)}}};function tv(e,t){if(!t||t===e)return()=>{};let n=M(t);if(!n)return()=>{};let r=()=>{Hn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function nv(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=rv(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:x_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function rv(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 iv(e){let{request:t,session:{name:n,logPath:i},createSession:a,invoke:o,cleanupSession:s,video:c}=e;if(t.flags?.recordVideo===!0&&c===void 0)return u(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of $_)if(e.requested(l))return u(`INVALID_ARGS`,e.message);let d,f;try{d=sv(t,n),f=ov(t)}catch(e){let t=r(e);return u(t.code,t.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await n_({request:d,emitProgress:Kn,isCanceled:()=>Un(t.meta?.requestId),emitDiagnostic:j,bindAttemptCancellation:ev,runReplay:async({filePath:n,sessionName:r,platform:s,target:l,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&Nf(e).forEach(e=>f.add(e)),e),y=nv({parentFlags:t.flags,platform:s,target:l,artifactsDir:d,shard:g,sourceBundle:p.get(n)}),b=a(r,i),x=c?{req:t,sessionName:r,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:c}:void 0,S=x?J_(x):void 0;return V_(await fg({...cv(e,{request:{...t,command:`replay`,session:r,positionals:[n],flags:y,meta:{...t.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await Y_(x):void 0;return t&&!t.ok?t:v(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:r,appendTimingEvent:o})=>{if(c)return H_(await X_({req:t,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:n,video:c}))},discoverSources:__(f,t.flags?.replayBackend),resolveShardTargets:y_(t.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:av(m.data,t)}:u(m.error.code,m.error.message)}function av(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=B.join(n,B.basename(r)),a=e=>e===r||e.startsWith(r+B.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return V.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:B.basename(r)}]}:o}function ov(e){let t=e.flags?.replayScriptSources;if(!t)throw new n(`INVALID_ARGS`,lr);return t}function sv(e,t){let n=e.flags??{},r=e.meta?.cwd,i=uv(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:Mn(i,r),failFast:n.failFast===!0,retries:lv(n.retries),timeoutMs:lv(n.timeoutMs),shard:M_(n)}}function cv(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 lv(e){return typeof e==`number`?e:void 0}function uv(e){return typeof e==`string`?e:void 0}function dv(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority,capture:r.capture},coordinator:r.createCoordinator()}}function fv(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function pv(e,t){let n=m({...e,...t});return Object.keys(n).length>0?n:void 0}function mv(e,t){return async({dispatch:n,...r})=>{let i=pv(t.internal,n);return await e(i?{...r,internal:i}:r)}}function hv(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:gv(e.scriptPublication??Ht)}},armStep(e){n.update(t=>{xt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Fd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){ht(r())!==void 0&&n.update(dt)},markCompleteIfArmed(){ht(r())!==void 0&&n.update(vt)},markSessionHeldIfArmed(e){if(e.ok||!yt(r()))return e;let t=On(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&vv(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{_v({session:t,...e})})}}}}function gv(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Gt(e),targetForce:zt(e)}}function _v(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=yv({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function vv(e){e.pendingRecordAndHeal=void 0}function yv(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 bv(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 ca({req:xv(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function xv(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 Sv={resolveSessionScope:Vi},Cv=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await fg({...fv(e),session:Tv(t,n,r),invoke:mv(a??i,e),dependencies:Sv}),wv=async({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=bv({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await iv({...fv(e),session:Tv(t,r,i),createSession:(e,t)=>Tv(e,t,i),invoke:mv(s??o,e),dependencies:Sv,cleanupSession:async t=>await Ev({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Tv(e,t,r){let i=t=>{let n=r.get(e);return n?(t(n),r.set(e,n),!0):!1},a={get:()=>r.get(e),lookup:()=>r.lookup(e),getRuntimeHints:()=>r.getRuntimeHints(e),ensureSessionDir:()=>r.ensureSessionDir(e)};return dv(e,t,a,{createCoordinator:()=>hv({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let n=r.lookup(e);n&&qi(n,t)},resolveOpenRuntimeHints:({request:t,device:n,platform:i})=>Pr({req:t,sessionStore:{getRuntimeHints:t=>t===e?r.getRuntimeHints(e):void 0},sessionName:e,device:n,platform:i}),bindAuthority:t=>Qu({sessionStore:{get:()=>r.get(e),update:i},sessionName:e,...t?{signal:t}:{}}),capture:async({flags:t,logPath:i})=>{let a=r.get(e);if(!a)throw new n(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await ri({device:a.device,session:a,flags:t,logPath:i})}})}async function Ev(e){let{req:t,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await dc({req:{token:t.token,session:r,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new n(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function Dv(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==on.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return jv(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return jv(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=Av(a);if(o)return jv(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return jv(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));Ut(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:Kt(a,t.flags?.force),publication:`active`});return c.written?(Yt(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...A(`Published script: ${c.path}`)}}):jv(c.error??new n(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Ov(e){if(mt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Xt(e)?void 0:`not-armed`}const kv={repair:()=>new n(`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 n(`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 n(`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 n(`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 Av(e){let t=Ov(e);return t?kv[t]():void 0}function jv(e){return{ok:!1,error:i(e)}}function Mv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function Nv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ti(e)}}async function Pv(e,t,r){if(r.length!==1)throw new n(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(Nv(t))}}async function Fv(e,t,r){if(r.length<2)throw new n(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...Nv(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...A(`Clipboard updated`)}}async function Iv(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:Le,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=>Pv(n,e,r)}}let o=await F({command:`clipboard`,device:t,use:Ke,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=>Fv(s,e,r)}}async function Lv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=J(an.clipboard,s,c);if(l)return l;let d=t.positionals??[],f=Mv(d);if(!f)return u(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let p=await Y({session:s,flags:c}),m=await Iv({device:p,action:f,positionals:d,inspectFacts:a,bindDevice:o});if(!m.ok)return m.response;let h=await m.execute(ei(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,h),{ok:!0,data:{platform:x(p),...h}}}function Rv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function zv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Bv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Vv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Kn({type:`command`,status:`progress`,message:Hv(t)})}function Hv(e){return[sa(e),...oa(e)].join(`
3
+ `)}async function Uv(e,t){let{device:n,targetApp:r,session:a,listInstalledApps:o}=t;if(r)try{let t=o?Wv(r,await o(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${x(n)}.`,evidence:{requested:r,platform:x(n)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:r,resolved:t,sessionApp:a?.appBundleId}})}catch(t){let r=i(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${r.message}`,hint:r.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${x(n)} --all`,evidence:{code:r.code,message:r.message}})}}function Wv(e,t){let r=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new n(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new n(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Gv(e,t,n){let r=qv(t,n);try{let t=await Yv(r),n=Jv(t.devices,r);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:$v(n,r,t.failures),hint:n.length===0?ny(t.failures):void 0,command:n.length===0?sy(r):void 0,evidence:cy(n,t.failures)}),n.length>0&&Xv(e,t.failures),{devices:n,platform:r.platform,target:r.target}}catch(t){let n=i(t);return $(e,{id:`device`,status:`fail`,summary:n.message,hint:n.hint,command:`agent-device devices`,evidence:{code:n.code,details:n.details}}),{devices:[],platform:r.platform,target:r.target}}}function Kv(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:x(e),id:e.id,name:e.name}))}})}function qv(e,t){let n=e.flags??{};return zi({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function Jv(e,t){return e.filter(e=>C(e,t,{includeExplicitSelectors:!0}))}async function Yv(e){if(e.platform)return{devices:await Fi(e),failures:[]};let t=[],n=[];for(let r of gn)try{t.push(...await Fi({...e,platform:r}))}catch(e){n.push(Qv(r,e))}return{devices:t,failures:n}}function Xv(e,t){for(let n of t)$(e,Zv(n))}function Zv(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${ay(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${ay(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Qv(e,t){let n=i(t);return{platform:e,message:n.message,hint:n.hint,code:n.code}}function $v(e,t,n){if(e.length===0)return n.length>0?`No ${ey(t)} devices found; ${ty(n)}.`:`No ${ey(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${ey(t)} ${oy(e.length,`device`)} available; ${r} booted`,a=ry(e,t);return a?`${i} (${a}).`:`${i}.`}function ey(e){let t=e.platform?ay(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function ty(e){return e.slice(0,2).map(e=>`${ay(e.platform)} inventory failed: ${e.message}`).join(`; `)}function ny(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function ry(e,t){if(t.platform||t.target)return;let n=hn(e),r=iy();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 iy(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function ay(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 oy(e,t){return e===1?t:`${t}s`}function sy(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function cy(e,t){let n=new Map;for(let t of e){let e=x(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const ly=1500;async function uy(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 dy(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?fy(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 dy(e,t,n){try{return await(n.resolveProcessInfo??py)(e,t)}catch{return}}function fy(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 py(e,t){if(!my(e))return;let n=await hy(t);if(n!==void 0)return{pid:n,cwd:await gy(n)}}function my(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function hy(e){let t=await Sn(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:ly});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 gy(e){let t=await Sn(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:ly});if(t.exitCode===0)return t.stdout.split(`
5
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const _y=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],vy=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function yy(e,t){let n=Fn(e.meta?.cwd);return{targetApp:wy(e.flags?.targetApp)??t?.appBundleId,metroHost:wy(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Ty(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Sy(e,n)}}function by(e,t={}){let n=Cy(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 xy(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${x(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Sy(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Cy(e){let t={...Object.fromEntries([..._y,...vy].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 wy(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Ty(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Ey(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==an.doctor)return null;let s=Dy(e.hostDiagnostics),c=r.get(n),l=yy(t,c),u=Ay(r,n),d=[];if(Vv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${jn()} using ${u}`,evidence:{version:jn(),stateDir:u}},...by(t,{required:l.remote}),...xy(r,n,c,{remote:l.remote})),l.remote)return Fy(d,l);let f=Oy(l,u,i),p=await Gv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await jy({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??ky(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return Fy(d,l,{device:h,includeMetro:!0,inventory:p})}function Dy(e){if(!e)throw new n(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function Oy(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>Yr(e),emitProgress:e=>Kn({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ii(e),shouldPropagateInventoryProbeError:Pi,transportOverrides:Object.freeze({androidAdb:n})})}function ky(e){let t=(e?.devices??[]).filter(e=>E(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function Ay(e,t){let n=B.dirname(e.resolveSessionDir(t));return B.basename(n)===`sessions`?B.dirname(n):n}async function jy(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Kv(t,i,a.targetApp);return u&&await My(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await uy(a.metroHost,a.metroPort,a.kind)),Vv(t,...await r.ambientChecks(n)),u}async function My(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await Ny({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await Uv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),Vv(e,...await r.deviceChecks(i,n))}async function Ny(e){if(e.device.platform!==`harmonyos`)return Py(e)}async function Py(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,Ge),u=I(n.flags?.androidDeviceAllowlist),d=await gc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await _c(l,d,e)}function Fy(e,t,n={}){let r=Rv(e);return{ok:!0,data:{status:r,summary:zv(r),kind:t.kind,platform:n.device?x(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:Bv(e)}}}async function Iy(e){return await F({...e,command:`prepare`,use:qe})}async function Ly(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return u(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=J(an.prepare,o,s);if(c)return c;let l=await Y({session:o,flags:s}),d=await Iy({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:Ry(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(t)}});return{ok:!0,data:zy(a,l,Math.max(0,Date.now()-f),p)}}function Ry(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Be}function zy(e,t,n,r){return{action:e,platform:x(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:By(n,r),message:`Prepared Apple runner: ${t.name}`}}function By(e,t){let n=Vy(t.buildMs),r=Hy(t.connectMs),i=Hy(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 Vy(e){return e===void 0?void 0:Hy(e)}function Hy(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Uy=e=>vc(e),Wy=e=>wl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Gy=e=>dc({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}),Ky=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Pl({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),qy=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await Fu({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),Jy={session_list:Uy,devices:Uy,capabilities:Uy,apps:Uy,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Ey({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Ky,shutdown:Ky,appstate:Ky,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Dv({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Xo({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 Lv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Ds,perf:qy,logs:qy,events:qy,network:qy,audio:qy,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ly({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Vs,reinstall:Vs,install_source:Vs,release_materialized_paths:async({req:e})=>await Po({req:e}),push:Vs,"trigger-app-event":Os,open:Wy,replay:Cv,test:wv,batch:async({req:e,sessionName:t,invoke:n})=>await Hs(e,t,n),close:Gy};async function Yy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new qr,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=Jy[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{Yy as handleSessionCommands};