agent-device 0.20.8 → 0.20.9

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 (199) hide show
  1. package/README.md +94 -31
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.apk → agent-device-android-ime-helper-0.20.9.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.9.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.manifest.json → agent-device-android-ime-helper-0.20.9.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.apk → agent-device-android-snapshot-helper-0.20.9.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.manifest.json → agent-device-android-snapshot-helper-0.20.9.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +3 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +13 -7
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +4 -112
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +9 -1
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +90 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +46 -10
  14. package/dist/src/agent-browser-tool.js +1 -1
  15. package/dist/src/agent-device-client.js +2 -2
  16. package/dist/src/android-adb.d.ts +5 -5
  17. package/dist/src/android-adb.js +1 -1
  18. package/dist/src/android.js +1 -1
  19. package/dist/src/app-helpers.js +1 -1
  20. package/dist/src/app-lifecycle.js +6 -7
  21. package/dist/src/app-lifecycle2.js +2 -2
  22. package/dist/src/app-log-reconnect.js +1 -1
  23. package/dist/src/app-log-runtime.js +3 -3
  24. package/dist/src/app-resolution.js +2 -2
  25. package/dist/src/app-state.js +2 -0
  26. package/dist/src/appearance.js +1 -0
  27. package/dist/src/apps.js +5 -5
  28. package/dist/src/artifacts.d.ts +1 -1
  29. package/dist/src/audio-probe.js +1 -1
  30. package/dist/src/auth-session.js +1 -1
  31. package/dist/src/backend-snapshot-options.js +1 -0
  32. package/dist/src/boot-diagnostics.js +2 -2
  33. package/dist/src/bounds.js +1 -0
  34. package/dist/src/byte-limit-stream.js +1 -0
  35. package/dist/src/cancel.js +1 -0
  36. package/dist/src/cli-config.js +1 -1
  37. package/dist/src/cli-help.js +25 -20
  38. package/dist/src/cli.js +6 -6
  39. package/dist/src/client-metro.js +1 -1
  40. package/dist/src/command-catalog.js +1 -0
  41. package/dist/src/command-metadata.js +1 -1
  42. package/dist/src/command-schema.js +1 -1
  43. package/dist/src/command-surface.js +1 -1
  44. package/dist/src/config.js +1 -0
  45. package/dist/src/connection-runtime.js +1 -1
  46. package/dist/src/connection.js +3 -3
  47. package/dist/src/contracts.js +1 -1
  48. package/dist/src/debug-symbols.js +3 -3
  49. package/dist/src/device-claim-inspection.js +1 -1
  50. package/dist/src/device-input-state.js +1 -1
  51. package/dist/src/device-ready.js +1 -1
  52. package/dist/src/device2.js +2 -2
  53. package/dist/src/dispatch.js +1 -1
  54. package/dist/src/entities.js +1 -1
  55. package/dist/src/find.js +1 -1
  56. package/dist/src/finders.js +1 -1
  57. package/dist/src/generic-settle.js +1 -1
  58. package/dist/src/generic.js +1 -1
  59. package/dist/src/harmonyos.js +1 -1
  60. package/dist/src/hdc.js +1 -1
  61. package/dist/src/helper-package-install.js +1 -0
  62. package/dist/src/helper.js +2 -2
  63. package/dist/src/host-process.js +1 -1
  64. package/dist/src/ime-lifecycle.js +2 -9
  65. package/dist/src/ime-recovery-marker.js +1 -0
  66. package/dist/src/index.d.ts +24 -15
  67. package/dist/src/index.js +1 -1
  68. package/dist/src/input-actions.js +4 -4
  69. package/dist/src/input-actions2.js +1 -1
  70. package/dist/src/input-actions3.js +1 -1
  71. package/dist/src/install-artifact.js +1 -1
  72. package/dist/src/install-artifact2.js +1 -1
  73. package/dist/src/install-source2.js +1 -1
  74. package/dist/src/interaction-common.js +1 -0
  75. package/dist/src/interaction-runtime.js +1 -1
  76. package/dist/src/interaction-snapshot.js +1 -1
  77. package/dist/src/interaction.js +1 -1
  78. package/dist/src/interaction2.js +1 -0
  79. package/dist/src/interactor.js +2 -2
  80. package/dist/src/interactor2.js +1 -1
  81. package/dist/src/interactors.js +1 -0
  82. package/dist/src/internal/bin.js +1 -1
  83. package/dist/src/internal/daemon.js +4 -7
  84. package/dist/src/internal/png-worker.js +1 -1
  85. package/dist/src/inventory.js +1 -1
  86. package/dist/src/keyed-lock.js +1 -0
  87. package/dist/src/lease-context.js +1 -1
  88. package/dist/src/lease.js +1 -1
  89. package/dist/src/limrun-runtime-dependencies.js +1 -1
  90. package/dist/src/limrun.d.ts +3 -1
  91. package/dist/src/limrun.js +1 -1
  92. package/dist/src/linux.js +1 -1
  93. package/dist/src/location-coordinates.js +1 -0
  94. package/dist/src/logcat.js +1 -1
  95. package/dist/src/manifest.js +1 -1
  96. package/dist/src/observability.js +1 -0
  97. package/dist/src/owner-identity.js +1 -1
  98. package/dist/src/perf.js +4 -0
  99. package/dist/src/physical-device-control.js +1 -1
  100. package/dist/src/platform-runtime-app-log-process.js +1 -1
  101. package/dist/src/platform-runtime-host.js +1 -1
  102. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  103. package/dist/src/platform-runtime-open-target.js +1 -0
  104. package/dist/src/platform-runtime-operation-host.js +4 -4
  105. package/dist/src/platform-runtime-runtime-hints.js +2 -0
  106. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  107. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  108. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  109. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  110. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  111. package/dist/src/platform-runtime.js +1 -1
  112. package/dist/src/platform-runtime2.js +1 -0
  113. package/dist/src/plist.js +1 -1
  114. package/dist/src/png-resize.js +1 -0
  115. package/dist/src/png-worker-contract.js +1 -1
  116. package/dist/src/prepare-kind.js +13 -13
  117. package/dist/src/process-lock.js +1 -1
  118. package/dist/src/project-runtime.js +1 -0
  119. package/dist/src/provider-webdriver.js +1 -1
  120. package/dist/src/provider.js +1 -0
  121. package/dist/src/proxy.js +1 -1
  122. package/dist/src/react-native.js +1 -1
  123. package/dist/src/record-runtime.js +1 -1
  124. package/dist/src/record-trace.js +1 -1
  125. package/dist/src/recording-export-quality.js +1 -0
  126. package/dist/src/registry.js +29 -26
  127. package/dist/src/remote-config2.js +1 -1
  128. package/dist/src/replay.js +1 -1
  129. package/dist/src/reporting.js +3 -3
  130. package/dist/src/rolldown-runtime.js +1 -0
  131. package/dist/src/runner-client.js +1 -0
  132. package/dist/src/runner-disposal.js +1 -1
  133. package/dist/src/runner-lease.js +1 -1
  134. package/dist/src/runner-sequence.js +1 -1
  135. package/dist/src/runtime-transport.js +1 -1
  136. package/dist/src/runtime.js +3 -3
  137. package/dist/src/runtime2.js +4 -3
  138. package/dist/src/runtime3.js +1 -3
  139. package/dist/src/runtime4.js +3 -1
  140. package/dist/src/runtime5.js +1 -1
  141. package/dist/src/runtime6.js +1 -1
  142. package/dist/src/runtime7.js +1 -1
  143. package/dist/src/runtime8.js +1 -0
  144. package/dist/src/runtime9.js +1 -0
  145. package/dist/src/scoped-provider.js +1 -0
  146. package/dist/src/screenshot-density.js +1 -0
  147. package/dist/src/screenshot-geometry.js +1 -0
  148. package/dist/src/screenshot-result.js +4 -4
  149. package/dist/src/screenshot.js +1 -1
  150. package/dist/src/sdk-android-adb.d.ts +20 -2
  151. package/dist/src/sdk-android-adb.js +3 -3
  152. package/dist/src/sdk-batch-runner.js +3 -3
  153. package/dist/src/sdk-contracts.d.ts +3 -3
  154. package/dist/src/sdk-contracts.js +2 -2
  155. package/dist/src/sdk-device.js +1 -1
  156. package/dist/src/sdk-finders.js +1 -1
  157. package/dist/src/sdk-io.js +1 -1
  158. package/dist/src/sdk-remote-config.js +1 -1
  159. package/dist/src/sdk-selectors.d.ts +19 -19
  160. package/dist/src/sdk-selectors.js +1 -1
  161. package/dist/src/sdk.js +1 -0
  162. package/dist/src/selector-runtime.js +1 -1
  163. package/dist/src/selectors.d.ts +1 -1
  164. package/dist/src/selectors.js +1 -1
  165. package/dist/src/server.js +2 -2
  166. package/dist/src/session-target-evidence.js +1 -1
  167. package/dist/src/session.js +1 -30
  168. package/dist/src/session2.js +28 -0
  169. package/dist/src/setting-state.js +1 -1
  170. package/dist/src/shared.js +1 -1
  171. package/dist/src/simctl.js +1 -0
  172. package/dist/src/simulator-state.js +1 -0
  173. package/dist/src/simulator.js +1 -1
  174. package/dist/src/snapshot-runtime.js +1 -1
  175. package/dist/src/snapshot-session.js +1 -1
  176. package/dist/src/snapshot.js +8 -1
  177. package/dist/src/snapshot2.js +1 -1
  178. package/dist/src/snapshot3.js +1 -0
  179. package/dist/src/src.js +1 -1
  180. package/dist/src/src2.js +1 -2
  181. package/dist/src/src3.js +2 -1
  182. package/dist/src/string-enum.js +1 -0
  183. package/dist/src/tool-provider.js +3 -3
  184. package/dist/src/tool-provider2.js +1 -1
  185. package/dist/src/update-check.js +1 -1
  186. package/dist/src/verdict.js +1 -0
  187. package/dist/src/verified-file.js +1 -0
  188. package/dist/src/version.js +1 -1
  189. package/dist/src/video.js +1 -1
  190. package/dist/src/web.js +1 -1
  191. package/package.json +8 -4
  192. package/server.json +3 -3
  193. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.8.apk.sha256 +0 -1
  194. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.8.apk.sha256 +0 -1
  195. package/dist/src/interaction-touch-reference-frame.js +0 -1
  196. package/dist/src/notifications.js +0 -1
  197. package/dist/src/platform-runtime-toolchain-host.js +0 -1
  198. package/dist/src/text-surface.js +0 -1
  199. package/dist/src/tool-provider3.js +0 -1
@@ -1,30 +1 @@
1
- import{E as e,S as t,_ as n,c as r,d as i,p as a,t as o,v as s}from"./sdk-contracts.js";import{J as c,U as l,W as u,_t as d,it as f,n as p,vt as m,xt as h}from"./version.js";import{A as g,Cn as _,D as v,Dt as y,Et as b,Gn as x,K as ee,M as S,Mt as C,O as te,On as ne,Pn as w,Rn as re,T as ie,Vn as ae,_t as oe,bt as se,c as ce,ct as le,k as ue,kt as de,l as fe,n as T,nr as E,s as D,st as pe,t as me,vt as he,wt as ge,xt as _e,yt as ve}from"./sdk-batch-runner.js";import{_ as O,c as k,g as ye,h as be,l as A,p as xe,s as j,u as Se,y as Ce}from"./sdk-device.js";import{$ as we,At as Te,B as Ee,Bt as De,Dt as Oe,Ht as ke,It as Ae,Jt as je,Lt as Me,M as Ne,Mt as Pe,Pt as Fe,S as Ie,St as Le,Tt as Re,Ut as ze,Vt as Be,X as Ve,Xt as M,Yt as He,_n as Ue,a as We,et as Ge,gn as Ke,o as qe,on as Je,rt as Ye,sn as Xe,tt as Ze,wt as Qe,xt as $e,z as et,zt as tt}from"./prepare-kind.js";import{$ as nt,B as rt,C as it,G as at,H as ot,I as st,J as ct,K as lt,L as ut,N as dt,O as ft,Q as pt,R as mt,U as ht,V as gt,W as _t,Y as vt,Z as yt,_t as bt,at as xt,bt as St,et as Ct,gt as wt,ht as Tt,it as Et,q as Dt,rt as Ot,tt as kt,vt as At,w as jt,x as N,xt as Mt,yt as Nt,z as Pt}from"./screenshot-result.js";import{a as Ft,n as It,o as Lt,r as Rt,s as zt,t as Bt}from"./session-target-evidence.js";import{c as Vt,f as Ht,o as Ut}from"./device.js";import{s as Wt}from"./runtime.js";import{C as Gt,N as Kt,P as qt,f as Jt,j as P,o as Yt,v as Xt}from"./sdk-android-adb.js";import{n as Zt,r as Qt}from"./output-path.js";import{t as $t}from"./timeouts.js";import{n as en,r as tn,t as nn}from"./runtime-transport.js";import{f as rn,p as an,s as on}from"./app-lifecycle.js";import{i as sn}from"./install-artifact.js";import{i as cn,r as ln}from"./boot-diagnostics.js";import{n as un}from"./entities.js";import{a as dn,l as fn,n as pn,r as mn,t as hn}from"./ime-lifecycle.js";import{D as gn,F as _n,I as vn,L as yn,M as bn,N as xn,O as Sn,P as Cn,j as wn,u as Tn}from"./runner-disposal.js";import{E as F,S as En,T as Dn,b as On,c as I,g as kn,h as An,i as jn,l as Mn,m as Nn,o as L,p as Pn,r as Fn,s as In,t as Ln,u as Rn,v as zn,w as Bn,y as Vn}from"./dispatch.js";import{H as Hn,R as Un,U as Wn}from"./physical-device-control.js";import{a as Gn}from"./tool-provider.js";import{n as Kn,s as qn}from"./agent-browser-tool.js";import{r as Jn}from"./helper.js";import{a as R,o as Yn,s as Xn}from"./selector-vocabulary.js";import{$ as Zn,A as Qn,At as z,B as $n,C as er,Cn as tr,Ct as nr,D as rr,Dt as ir,E as ar,En as or,Et as sr,F as cr,Ft as lr,G as ur,H as dr,I as fr,It as pr,J as mr,K as hr,L as gr,Lt as _r,M as vr,N as yr,Nt as br,O as xr,Ot as B,P as Sr,Pt as Cr,Q as wr,R as Tr,Rt as Er,S as Dr,Sn as Or,St as kr,T as Ar,Tt as jr,U as Mr,Ut as Nr,V as Pr,W as Fr,X as Ir,Y as Lr,Yt as Rr,Z as zr,Zt as Br,_ as Vr,_n as Hr,_t as Ur,a as Wr,an as Gr,at as Kr,b as qr,bn as Jr,bt as Yr,c as Xr,dt as Zr,et as Qr,fn as V,ft as $r,g as ei,gn as ti,gt as ni,h as ri,ht as ii,i as ai,it as oi,j as si,jt as ci,k as li,kt as ui,m as di,mn as fi,mt as pi,n as mi,nn as hi,nt as gi,o as _i,ot as vi,p as yi,pt as bi,q as xi,r as Si,rt as Ci,s as wi,sn as Ti,st as Ei,t as Di,tn as Oi,tt as ki,un as Ai,v as ji,vn as Mi,vt as Ni,w as Pi,wn as Fi,wt as Ii,x as Li,xn as Ri,xt as zi,y as Bi,yn as Vi,yt as Hi,z as Ui,zt as Wi}from"./internal/daemon.js";import{n as Gi}from"./hdc.js";import{r as Ki}from"./app-lifecycle2.js";import{a as qi,c as Ji,o as Yi,s as Xi}from"./snapshot-session.js";import"./apps.js";import{i as Zi,n as Qi}from"./simulator.js";import{a as $i}from"./app-resolution.js";import{t as ea}from"./device-ready.js";import{t as ta}from"./handler-utils.js";import{t as na}from"./record-runtime.js";import{a as H,i as ra,n as ia,r as aa}from"./snapshot-runtime.js";import{t as oa}from"./app-log-files.js";import U from"node:path";import{createHash as sa}from"node:crypto";import W,{promises as ca}from"node:fs";import la from"node:os";import{access as ua}from"node:fs/promises";import{setTimeout as da}from"node:timers/promises";import fa from"node:vm";function pa(e){return e.startsWith(`AD_`)}function ma(e){return new n(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${e} to avoid the AD_ prefix.`)}function ha(e){let t={};if(e.builtins)for(let[n,r]of Object.entries(e.builtins))t[n]=r;let n=[e.fileEnv,e.shellEnv,e.cliEnv];for(let e of n)if(e)for(let[n,r]of Object.entries(e)){if(pa(n))throw ma(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function ga(e){let t={};for(let[n,r]of Object.entries(e)){if(typeof r!=`string`||!n.startsWith(`AD_VAR_`))continue;let e=n.slice(7);e.length!==0&&Tt.test(e)&&(pa(e)||(t[e]=r))}return t}function _a(e){let t={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new n(`INVALID_ARGS`,`Invalid -e entry "${r}": expected KEY=VALUE.`);let i=r.slice(0,e);if(!Tt.test(i))throw new n(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(pa(i))throw ma(i);t[i]=r.slice(e+1)}return t}function va(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ya(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}return process.env}function ba(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function xa(e){return ba(e)||e>=`0`&&e<=`9`||e===`.`}function Sa(e){return e===`
2
- `||e===`\r`||e===`\u2028`||e===`\u2029`}function Ca(e,t){let n=t+2;if(n>=e.length||!ba(e[n]))return null;for(n+=1;n<e.length&&xa(e[n]);)n+=1;let r=e.slice(t+2,n);if(e[n]===`}`)return{key:r,fallback:void 0,end:n+1};if(e[n]!==`:`||e[n+1]!==`-`)return null;n+=2;let i=``;for(;n<e.length;){let t=e[n];if(t===`}`)return{key:r,fallback:i,end:n+1};if(t===`\\`){let t=e[n+1];if(t===void 0)return{abortEnd:e.length};if(Sa(t))return{abortEnd:n+2};i+=t,n+=2;continue}i+=t,n+=1}return{abortEnd:e.length}}function wa(e,t,r){let i=``,a=0;for(;a<e.length;){let o=e[a];if(o===`\\`&&e.startsWith("${",a+1)){i+="${",a+=3;continue}if(o===`$`&&e[a+1]===`{`){let o=Ca(e,a);if(o!==null&&`abortEnd`in o){i+=e.slice(a,o.abortEnd),a=o.abortEnd;continue}if(o!==null){let{key:e,fallback:s}=o;if(Object.prototype.hasOwnProperty.call(t.values,e))pa(e)&&(t.expandedBuiltinNames??=new Set).add(e),i+=String(t.values[e]);else if(s!==void 0)i+=s;else throw new n(`INVALID_ARGS`,`Unresolved variable \${${e}} at ${r.file}:${r.line}.`);a=o.end;continue}}i+=o,a+=1}return i}function Ta(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>wa(e,t,n)),flags:Ea(e.flags,t,n)??{},runtime:Ea(e.runtime,t,n)}}function Ea(e,t,n){return e&&Da(e,t,n)}function Da(e,t,n){return typeof e==`string`?wa(e,t,n):Array.isArray(e)?e.map(e=>Da(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,Da(r,t,n)])):e}function Oa(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!pa(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function ka(e,t){return z({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function Aa(e){return z({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function ja(e,t){let n=Ia(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},Aa(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{},...e.condition.childOf?{childOf:e.condition.childOf}:{}};return{generation:e.generation,matched:Ma(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Ma(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function Na(e,t,n,r){let i=Ia(await r.resolveTarget({selector:e,...t},ka(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw ir(`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 Pa(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{},...e.query.childOf?{childOf:e.query.childOf}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function Fa(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 Ia(e,t){return La(e,t),Ra(e),za(e),Ba(e),e}function La(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Ra(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function za(e){if(e.rect!==void 0&&!Fa(e.rect)||e.viewport!==void 0&&!Fa(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Ba(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Va(e,t,n,r,i){let a=Ha(e,t,n,i);if(!a)return;let{start:o,end:s}=Ja(a,n);return{gesture:{from:o,to:s,durationMs:r},viewport:a}}function Ha(e,t,n,r){let i=n===`up`||n===`down`,a=Ii({nodes:e.nodes,matches:e.nodes.filter(e=>ae(e)),platform:r}),o=Wa(e.nodes)??Ga(a);if(!o||!w(o))return;let s=a.flatMap(e=>{if(!w(e.rect))return[];let t=Ka(e.rect,o);return!t||(i?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),c=new Map(e.nodes.map(e=>[e.index,e])),l=new Map(s.map(e=>[e.node.index,e]));for(let n of e.nodes.filter(e=>jr(e,t))){let e=Ua(n,c),t=e?l.get(e.index):void 0;if(t)return t.viewport}return s.sort(qa)[0]?.viewport}function Ua(e,t){return ae(e)?e:_(e,t)}function Wa(e){return e.filter(e=>w(e.rect)&&ne(e)).sort((e,t)=>t.rect.width*t.rect.height-e.rect.width*e.rect.height)[0]?.rect}function Ga(e){let t;for(let n of e)w(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ka(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 qa(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ja(e,t){let n=G(e,.5,.5),r=R.scrollUntilVisibleSwipe.nearEdgeFraction,i=R.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:G(e,.5,i)};case`down`:return{start:n,end:G(e,.5,r)};case`left`:return{start:n,end:G(e,i,.5)};case`right`:return{start:n,end:G(e,r,.5)}}}async function Ya(e,t,r){let i=B(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(ka(t,t.command)):void 0;return{authored:e,gesture:Za(await Xa(e.start,t,r,a),await Xa(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(ka(t,t.command)),{start:a,end:o}=Qa(n,e.direction,r.platform);return{authored:e,gesture:Za(a,o,i),viewport:n}}let a=await Na(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(ka(t,t.command)),{start:s,end:c}=$a(a,e.direction,o);return{authored:e,gesture:Za(s,c,i),target:a,viewport:o}}async function Xa(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(ka(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 Za(e,t,n){return{from:e,to:t,durationMs:n??R.command.swipeDurationMs}}function Qa(e,t,n){if(t===`left`||t===`right`){let n=f(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=G(e,r.centerFraction,r.nearEdgeFraction),a=G(e,r.centerFraction,r.farEdgeFraction),o=G(e,r.centerFraction,r.downStartFraction),s=G(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function G(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function $a(e,t,n){let r=ui(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 eo={launchApp:ao,stopApp:ao,openLink:ao,tapOn:so,doubleTapOn:so,longPressOn:so,swipe:po,inputText:mo,eraseText:mo,scroll:ho,scrollUntilVisible:ho,hideKeyboard:ho,pressKey:ho,back:ho,waitForAnimationToEnd:ho,takeScreenshot:vo,runScript:vo,assertVisible:yo,assertNotVisible:yo,extendedWaitUntil:yo},to={launchApp:!0,stopApp:!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,assertVisible:!1,assertNotVisible:!1,extendedWaitUntil:!1};function no(e){return to[e.kind]}async function ro(e,t){let n=e.command;return await io(n,e,t,ka(e,n))}function io(e,t,n,r){let i=eo[e.kind];return i(e,t,n,r)}async function ao(e,t,n,r){switch(e.kind){case`launchApp`:return await K(n.launchApp,oo(e,t),r,`invalidate`);case`stopApp`:return await K(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await K(n.openLink,{link:e.link},r,`invalidate`)}}function oo(e,t){return z({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function so(e,t,n,r){switch(e.kind){case`tapOn`:return await co(e,t,n,r);case`doubleTapOn`:{let i=await Do(e.target,{purpose:`doubleTap`,timeoutMs:uo(e)},t,n),a=B(e.delay,`doubleTapOn.delay`)??R.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?Pa(i.resolution):void 0)}case`longPressOn`:{let i=await Do(e.target,{purpose:`longPress`,timeoutMs:uo(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?Pa(i.resolution):void 0)}}}async function co(e,t,n,r){let i=await lo(e,t,n);return await K(n.tapOn,fo(e,i),r,`invalidate`,i.resolution?Pa(i.resolution):void 0)}async function lo(e,t,n){let r={purpose:`tap`,timeoutMs:uo(e),index:B(e.index,`tapOn.index`),childOf:e.childOf,allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await Do(e.target,r,t,n)}function uo(e){return e.optional===!0?R.command.optionalTargetLookupTimeoutMs:R.command.targetLookupTimeoutMs}function fo(e,t){let n=B(e.repeat,`tapOn.repeat`),r=B(e.delay,`tapOn.delay`),i=n===void 0?r:r??R.command.repeatDelayMs;return z({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function po(e,t,n,r){let i=await Ya(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?Pa(i.target):void 0)}async function mo(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,z({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,z({charactersToErase:B(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function ho(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,go(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,_o(e),r,`preserve`)}}function go(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:B(e.timeout,`scrollUntilVisible.timeout`)??R.command.scrollUntilVisibleTimeoutMs,durationMs:Xn(R.command.scrollUntilVisibleSpeed)}}function _o(e){return z({timeoutMs:B(e.timeout,`waitForAnimationToEnd.timeout`)})}async function vo(e,t,n,r){switch(e.kind){case`takeScreenshot`:return xo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,z({file:e.file,env:e.env}),r,`preserve`)}}async function yo(e){throw new n(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}async function K(e,t,n,r,i){let a=bo(n,r);return xo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function bo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function xo(e,t,n,r){let i=e?.observation;return So(i,r),{...Co(n??i),...wo(e?.outputEnv),...To(t,e?.artifactPaths),...Eo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function So(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 Co(e){return e?{observation:e}:{}}function wo(e){return e?{outputEnv:{...e}}:{}}function To(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function Eo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function Do(e,t,n,r){if(e.space===`target`){let i=await Na(e.selector,t,n,r);return{authored:e,point:ui(i.rect),resolution:i}}return{authored:e,point:await Xa(e,n,r)}}function Oo(e,t,n,r={}){let i=kr(e,t.selector,n,t.childOf);if(!i.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Mo(t,i.matches,[],void 0)};let{matches:a,ranked:o}=i,s=nr(o,t.index),c=Mo(t,a,o,s?.node);if(!s)return ko(t,a,o,c);let l=r.interactiveBounds===!0?r.interactiveRects?.get(s.node.index)??s.rect:s.rect;return{ok:!0,node:s.node,rect:l,matches:o.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!t.childOf?Ao(t,{...s,rect:l},r.canonicalSnapshot):0,evidence:c}}function ko(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.index===void 0?``:` index ${e.index}`}.`,evidence:r}}function Ao(e,t,n){if(!n)return 0;let r=kr(n,e.selector,`ios`).ranked;if(r.length!==1)return r.length;let i=nr(r,void 0);return i&&i.node.hittable!==!1&&jo(i.rect,t.rect)?1:0}function jo(e,t){let n=ui(e),r=ui(t);return n.x===r.x&&n.y===r.y}function Mo(e,t,n,r){return z({selector:e.selector,childOf:e.childOf,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:Yn,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 No(e,t={}){return{execute:async n=>{let r=ka(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:no(n.command)&&!i,visualStabilityBarrier:i});let a=await ro(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await ja(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Po(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Fo(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:Po(t)}}function Io(e){let t=Fo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:or(n,e.meta?.tenantId)},cleanup:()=>{Fi(n)}}}function Lo(e){return e===`ios`||e===`android`?e:void 0}function Ro(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,ttlMs:r}}async function zo(e){let t=Lo(e.flags?.platform);if(e.session){if(t&&e.session.device.platform!==t)throw new n(`INVALID_ARGS`,`install_from_source requested platform ${t}, but session is bound to ${e.session.device.platform}`);return await ea(e.session.device),e.session.device}if(!t)throw new n(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);let r=await kn(e.flags??{});return await ea(r),r}async function Bo(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await rr({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function Vo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Ho(e){let{session:t,sessionStore:n,req:r,data:i}=e;ta(n,t,r,`install_source`,i,{positionals:[]})}async function Uo(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);try{let e=Io(n),t=Ro(n),o=await zo({session:a,flags:n.flags}),s=I(`install`,o,{message:`install_from_source is not supported on this device`});if(s)return s;let c=xn(n.meta?.requestId);if(k(o)){let{prepareIosInstallArtifact:s}=await import(`./install-artifact2.js`).then(e=>e.t),l=await s(e.source,{signal:c});return await Wo({prepared:l,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Go(o,l,e)})}let{prepareAndroidInstallArtifact:l}=await import(`./install-artifact.js`).then(e=>e.t),u=await l(e.source,{signal:c});return await Wo({prepared:u,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Ko(o,u,e)})}catch(e){return{ok:!1,error:t(e)}}}async function Wo(e){let t;try{t=await Bo(e);let n=await e.buildResult(t),r=Ue(n,Zo(n));return Ho({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await Ar(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function Go(e,t,n){let r=await Dn(e,t.installablePath,{appIdentifierHint:t.bundleId});if(!r){let{installIosInstallablePath:n}=await import(`./apps.js`).then(e=>e.t);await n(e,t.installablePath)}return qo(t,r,n)}async function Ko(e,t,n){let r=await Dn(e,t.installablePath,{packageNameHint:t.packageName}),i=await Xo(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...Vo(n),packageName:i,...Yo(r?.appName??o),launchTarget:r?.launchTarget??i}}function qo(e,t,n){let r=Jo(e,t),i=t?.appName??e.appName;return{...Vo(n),bundleId:r,...Yo(i),launchTarget:t?.launchTarget??r}}function Jo(e,t){let r=t?.bundleId??e.bundleId;if(r)return r;throw new n(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`)}function Yo(e){return e?{appName:e}:{}}async function Xo(e,t,r){let i=r?.packageName??r?.launchTarget;if(i)return i;let{installAndroidInstallablePathAndResolvePackageName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=await a(e,t.installablePath,t.packageName);if(!o)throw new n(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return o}function Zo(e){return`Installed: ${Xe(e)}`}async function Qo(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 Ar(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:t(e)}}}function J(e,t,n){return t||fi(n)?null:L(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function $o(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function es(e,t){F(e)||!H(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function Y(e){let t=fi(e.flags)||!e.session?await kn(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await ts(e.session.device);return e.ensureReady!==!1&&await ea(t),t}async function ts(e){if(F(e)||!k(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(Zr(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 kn(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await kn({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function ns(e){let t=e.flags?.device?.trim();if(t)return t;if(e.resolvedDevice?.platform===`android`&&e.resolvedDevice.kind===`emulator`)return e.resolvedDevice.name;if(e.sessionDevice?.platform===`android`&&e.sessionDevice.kind===`emulator`)return e.sessionDevice.name}function rs(e,t){return t?Er(t,e).length===0:!1}const is=`debug_http_host`,as=`dev_server_https`,os=`RCT_jsLocation`,ss=`RCT_packager_scheme`,cs=`React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.`,ls=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
3
- `);function us(e){return nn(e)!==void 0}async function ds(e){let{device:t,appId:n,runtime:r}=e;if(F(t)||!n)return;let i=nn(r);if(i){if(t.platform===`android`){await ms(t,n,i);return}k(t)&&t.kind===`simulator`&&await Ss(t,n,i)}}async function fs(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await hs(t,n);return}k(t)&&t.kind===`simulator`&&await Cs(t,n)}}function ps(e){return[`shared_prefs/${e}_preferences.xml`,`shared_prefs/ReactNativeDevPrefs.xml`]}async function ms(e,t,n){ks(t);let r=[];for(let i of ps(t)){let a=Ts(await gs(e,t,i),is,`${n.host}:${n.port}`);a=Es(a,as,n.scheme===`https`),r.push({path:i,xml:a})}await _s(e,t,r)}async function hs(e,t){ks(t);let n=[];for(let r of ps(t)){let i=await gs(e,t,r),a=Os(Os(i,is),as);a!==i&&n.push({path:r,xml:a})}n.length!==0&&await _s(e,t,n)}async function gs(e,t,n){let r=await sn(e,[`shell`,`run-as`,t,`cat`,n],{allowFailure:!0});return r.exitCode===0?ws(r.stdout):ls}async function _s(e,t,n){await vs(e,t);try{await bs(e,t,n)}catch(e){throw xs(e,t)}}async function vs(e,t){let n=[`shell`,`run-as`,t,`id`],r=await sn(e,n,{allowFailure:!0});if(r.exitCode!==0)throw ys(r,t,n)}function ys(e,t,r){let i=js(e.stdout,e.stderr);return new n(`COMMAND_FAILED`,i?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,Jt(e,{package:t,cmd:`adb`,args:r,hint:i?cs:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}async function bs(e,t,n){await sn(e,[`shell`,`run-as`,t,`mkdir`,`-p`,`shared_prefs`]);for(let r of n)await sn(e,[`shell`,`run-as`,t,`tee`,r.path],{stdin:r.xml.trimEnd()})}function xs(e,t){let r=s(e);if(r.code===`TOOL_MISSING`)return r;let i=js(typeof r.details?.stdout==`string`?r.details.stdout:``,typeof r.details?.stderr==`string`?r.details.stderr:``);return new n(`COMMAND_FAILED`,i?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...r.details??{},package:t,cmd:`adb`,phase:`write-runtime-hints`,hint:i?cs:`adb run-as succeeded, but writing React Native dev-server preferences failed. Inspect stderr/details for the failing shell command.`},r)}async function Ss(e,t,n){await Gn(Un(e,[`spawn`,e.id,`defaults`,`write`,t,os,`-string`,`${n.host}:${n.port}`])),await Gn(Un(e,[`spawn`,e.id,`defaults`,`write`,t,ss,`-string`,n.scheme]))}async function Cs(e,t){await Gn(Un(e,[`spawn`,e.id,`defaults`,`delete`,t,os]),{allowFailure:!0}),await Gn(Un(e,[`spawn`,e.id,`defaults`,`delete`,t,ss]),{allowFailure:!0})}function ws(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?ls:`${t}\n`}function Ts(e,t,n){let r=` <string name="${un(t)}">${un(n)}</string>`;return Ds(Os(e,t),r)}function Es(e,t,n){let r=` <boolean name="${un(t)}" value="${n?`true`:`false`}" />`;return Ds(Os(e,t),r)}function Ds(e,t){return ws(e).replace(`</map>`,`${t}\n</map>`)}function Os(e,t){let n=As(t);return ws(e).replace(RegExp(`^\\s*<string name="${n}">[\\s\\S]*?<\\/string>\\n?`,`m`),``).replace(RegExp(`^\\s*<boolean name="${n}" value="(?:true|false)"\\s*\\/?>\\n?`,`m`),``)}function ks(e){if(rn(e)!==`binary`)return;let t=an(e);throw new n(`INVALID_ARGS`,t,{package:e,hint:t})}function As(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function js(e,t){let n=`${e}\n${t}`.toLowerCase();return[`run-as: package not debuggable`,`run-as: permission denied`,`run-as: package is unknown`,`run-as: unknown package`,`is unknown`,`is not an application`,`could not set capabilities`].some(e=>n.includes(e))}const Ms=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Ns(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Ps(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return en(e)}}function Fs(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new n(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Is(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Fs(e)}}function Ls(e,t,r){if(e===void 0)return r;if(e!==`ios`&&e!==`android`)throw new n(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios" or "android".`);if(r&&e!==r)throw new n(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${r}.`);return e}function Rs(e){if(e===`ios`||e===`android`)return e}function zs(e,t){return{platform:t,metroHost:en(e?.metroHost),metroPort:Fs(e?.metroPort),bundleUrl:en(e?.bundleUrl),launchUrl:en(e?.launchUrl)}}function Bs(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Vs(e){if(ra(e))return`10.0.2.2`;if(H(e))return`127.0.0.1`}function Hs(e,t){if(!e||en(e.metroHost)||en(e.bundleUrl)||e.metroPort===void 0)return e;let n=Vs(t);return n?{...e,metroHost:n}:e}function Us(e){let{runtime:t,sessionName:r,platform:i}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new n(`INVALID_ARGS`,`open runtime must be an object.`);let a=t,o=Object.keys(a).find(e=>!Ms.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Ms.join(`, `)}.`);return{platform:Ls(a.platform,r,i),metroHost:Ps(a.metroHost,`metroHost`),metroPort:Is(a.metroPort),bundleUrl:Ps(a.bundleUrl,`bundleUrl`),launchUrl:Ps(a.launchUrl,`launchUrl`)}}function Ws(e,t,n){if(n){if(Ns(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function Gs(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?O(r):void 0,s=Rs(o)??i;if(a.platform&&r&&!s)throw new n(`INVALID_ARGS`,`Session runtime hints are only supported on iOS and Android sessions, but session "${t}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new n(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Ks(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Rs(O(i)):e.platform,o=n.getRuntimeHints(r),s=Us({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Gs(n,r,i,a);return{runtime:i?Hs(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Ns(s)>0?s:void 0;return{runtime:i?Hs(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function qs(e){return Ks(e).runtime}function Js(e){try{return{ok:!0,data:Ks(e)}}catch(e){let t=s(e);return L(t.code,t.message,t.details)}}async function Ys(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!us(n)||us(r)||await fs({device:i.device,appId:i.appBundleId})}async function Xs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await nc(t);if(!Zs(i))return L(`INVALID_ARGS`,`runtime requires set, show, clear, or port-reverse`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Qs(n,r,a,o):i===`show`?$s(n,o):tc({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function Zs(e){return e===`set`||e===`show`||e===`clear`}async function Qs(e,t,n,r){return us(r)&&n?.appBundleId&&await fs({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function $s(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function ec(e){return e?O(e.device):void 0}function tc(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=ec(i),s=Rs(t.flags?.platform??a?.platform??o);if(!s)return L(`INVALID_ARGS`,`runtime set only supports iOS and Android sessions. Pass --platform ios|android or open an iOS/Android session first.`);if(o!==void 0&&o!==s)return L(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Bs(a,zs(t.flags,s));return Ns(c)===0?L(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}async function nc(e){let t=rc(e);if(!t.ok)return t.response;let n=await En(t.options);return n?{ok:!0,data:{action:`port-reverse`,...n}}:L(`UNSUPPORTED_OPERATION`,`No active provider device runtime supports port reverse for this lease.`)}function rc(e){let t=ic(e);if(!t.ok)return t;let n=ac(e);if(!n.ok)return n;let r=e.flags?.portReverseName?.trim()||`runtime`;return{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:r}}}function ic(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:L(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:L(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function ac(e){let t=oc(e.flags?.devicePort),n=oc(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:L(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function oc(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const sc=`open-command-roundtrip`,cc=`Not implemented for this platform in this release.`;function lc(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}=e,h={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m};return o&&(h.appName=o),s&&(h.appBundleId=s),l&&(h.startup=l),u&&(h.timing=u),f&&p(f)>0&&(h.runtime=f),d&&(h.platform=O(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,xe(d.platform)&&(h.serial=d.id)),d&&k(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...Ke(`Opened: ${o??s??t}`)}}function uc(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 dc=new Set([`app`,`desktop`,`frontmost-app`]);function fc(e,t,r){if(e.platform===`linux`){if(!t)return`app`;let e=je(t);if(!dc.has(e))throw new n(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${t}")`);if(e!==`app`&&r)throw new n(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`);return e}if(!A(e)){if(t)throw new n(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}let i=t?je(t):`app`;if(i!==`app`&&i!==`menubar`&&r)throw new n(`INVALID_ARGS`,`open --surface ${i} does not accept an app target`);return i}function pc(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(A(t)||t.platform===`linux`)&&!n?i??`app`:fc(t,n,r)}async function mc(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Jn();return{appBundleId:t.bundleId,appName:t.appName}}async function hc(e,t,n){if(!(!j(e.platform)||!t))return D(t)?A(e)?void 0:e.kind===`device`?fe(n,t):ce(t)?void 0:n??await gc(e,t):await _c(e,t)}async function gc(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function _c(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function vc(e,t){if(!(e.platform!==`android`||!t||D(t)))try{let{resolveAndroidApp:n}=await import(`./app-lifecycle.js`).then(e=>e.t),r=await n(e,t);return r.type===`package`?r.value:void 0}catch{return}}async function yc(e,t,n){if(n||e.platform!==`android`||!t||!D(t))return n;try{let{getAndroidAppState:t}=await import(`./app-lifecycle.js`).then(e=>e.t);return(await t(e)).package?.trim()||n}catch{return n}}function bc(e,t){return e.platform===`android`&&!!(t&&D(t))}function xc(e){let t=e?.trim();if(!(!t||D(t)||!t.includes(`.`)))return t}async function Sc(e,t,n,r){return k(e)&&F(e)||e.platform===`harmonyos`?xc(t)??n:await hc(e,t,n)??await r(e,t)??(bc(e,t)?n:void 0)}function Cc(e){let{openPositionals:t,runtime:n,flags:r,foldRuntimeLaunchUrl:i}=e,a=n?.launchUrl;if(!a||t.length!==1)return{openPositionals:t};let o=t[0]?.trim();if(!o||D(o))return{openPositionals:t};let s=r?.clearAppState===!0||!!r?.launchConsole?.trim()||!!r?.launchArgs?.length;return i&&!s?{openPositionals:[o,a]}:{openPositionals:t,followUpLaunchUrl:a}}async function wc(e){let{launchUrl:t,device:n,req:r,logPath:i,appBundleId:a,traceLogPath:o}=e,s=V(i,r.flags?{...r.flags,clearAppState:void 0,launchConsole:void 0,launchArgs:void 0}:void 0,a,o);await Ln(n,`open`,[t],r.flags?.out,s)}function Tc(e){return L(`INVALID_ARGS`,e)}function Ec(e,t,r,i){try{return pc({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return L(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}function Dc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&D(n)?Tc(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&rn(n)===`binary`?Tc(an(n)):null:Tc(`open --relaunch is supported only for app surfaces.`):null}function Oc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&D(n)?Tc(`open --relaunch does not support URL targets.`):r===`android`&&n&&rn(n)===`binary`?Tc(an(n)):null:null}async function kc(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await ea(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await Ac({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=Js({req:t,sessionStore:r,sessionName:n,device:i});if(!d.ok)return{type:`response`,response:d};if(s){let{runtime:e,previousRuntime:t,replacedStoredRuntime:n}=d.data;await Ys({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function Ac(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await mc(n);return{appBundleId:a.appBundleId??await Sc(t,r,i,vc),appName:a.appName??r}}async function jc(e){let{req:t,hasExistingSession:n}=e;if(t.flags?.foreground!==!0)return{type:`not-requested`};if(t.positionals?.[0])return{type:`resolved`,req:t};if(n)return{type:`response`,response:L(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)};if(t.flags?.udid!==void 0||t.flags?.device!==void 0)return{type:`response`,response:L(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)};if(t.flags?.platform!==void 0&&t.flags.platform!==`ios`)return{type:`response`,response:L(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)};let r=await aa({simulatorSetPath:t.flags?.iosSimulatorDeviceSet});return r?{type:`resolved`,req:{...t,positionals:[r.app.bundleId],flags:{...t.flags,udid:r.device.id,platform:`ios`}}}:{type:`response`,response:L(`AMBIGUOUS_MATCH`,`open --foreground requires an unambiguous environment: exactly one booted iOS simulator with exactly one app running.`,{reason:`foreground_app_ambiguous`,hint:`Pass an explicit app instead: agent-device open <app> --platform ios.`})}}async function Mc(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||n.flags?.foreground!==!0)return o;try{let e=await ia({req:{...n,command:`snapshot`,positionals:[],flags:{...n.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a});return e.ok?{ok:!0,data:{...o.data,snapshot:e.data}}:Nc(o.data,e.error)}catch(e){return Nc(o.data,t(e))}}function Nc(e,t){return{ok:!0,data:{...e,warnings:[...Pc(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Pc(e){return!e||!Array.isArray(e.warnings)?[]:e.warnings.filter(e=>typeof e==`string`)}const Fc=new Map;function Ic(e){return e.internal?.resolvedSessionScope??Cr(e)}function Lc(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Dt(t,{});return}vt(n)&&(lt(t),i.warnings=[...Array.isArray(i.warnings)?i.warnings.filter(e=>typeof e==`string`):[],`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`])}async function Rc(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;j(t.platform)&&!H(t)&&await bi(t.id),await Ln(t,`close`,[n],r,i),await es(t,300)}function zc(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}async function Bc(e,t,n){if(zc(e,t))try{await pn(e,{stateDir:n})}catch(t){P({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,error:t instanceof Error?t.message:String(t)}})}}function Vc(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:sc,appTarget:t,appBundleId:n}}function Hc(e){return!(!e.shouldRelaunch||!e.openTarget||e.collapseSimulatorRelaunch||!e.existingSession&&F(e.device))}async function Uc(e){let{req:t,sessionName:n,sessionStore:r,logPath:i,device:a,openTarget:o,openPositionals:s,appName:c,surface:l,appBundleId:u,runtime:d,existingSession:f,deviceClaim:p}=e,m=t.flags?.relaunch===!0,h=f?.trace?.outPath,g=u,_=Date.now(),v={},y=H(a)&&!F(a),b=k(a)&&!F(a)&&l===`app`&&s.length>0&&!!g,x=Yi({req:t,logPath:i,appBundleId:g,traceLogPath:h}),ee=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,S,C=!1,te=!1,ne=(e=x)=>{C=!0,v.runnerPrewarmKind=`session`,v.runnerPrewarmScheduled=!0,S=Ei(a,e)},w=async()=>{if(!S||te)return;te=!0;let e=Date.now();await S,v.runnerPrewarmWaited=!0,v.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};b&&y&&!ee&&ne();let re=Cc({openPositionals:s,runtime:d,flags:t.flags,foldRuntimeLaunchUrl:y}),ie=m&&y&&t.flags?.clearAppState!==!0;if(Hc({shouldRelaunch:m,openTarget:o,collapseSimulatorRelaunch:ie,device:a,existingSession:f})&&o){f&&Oi(f);let e=g??o,n=Date.now();await Rc({device:a,closeTarget:e,outFlag:t.flags?.out,context:{...V(i,t.flags,g??f?.appBundleId,h)}}),v.relaunchCloseDurationMs=Math.max(0,Date.now()-n)}let ae=Date.now();await ds({device:a,appId:g,runtime:d}),v.runtimeHintsDurationMs=Math.max(0,Date.now()-ae),b&&ee&&(ne({...x,propagateError:!0}),await w());let oe=te,se=Date.now(),ce=await Wc({req:t,sessionName:n,sessionStore:r,device:a,surface:l,sessionAppBundleId:g,appName:c,existingSession:f});if(ce.type===`response`)return ce.response;let le=ce.session??f;le&&Oi(le),await Ln(a,`open`,re.openPositionals,t.flags?.out,{...V(i,t.flags,g),...ie?{terminateRunningApp:!0}:{}}),v.openDispatchDurationMs=Math.max(0,Date.now()-se),await Bc(a,t,r.resolveDaemonStateDir());let ue=Date.now();re.followUpLaunchUrl&&await wc({launchUrl:re.followUpLaunchUrl,device:a,req:t,logPath:i,appBundleId:g,traceLogPath:h}),v.launchUrlDurationMs=Math.max(0,Date.now()-ue),b&&!C&&ne(),m?await w():S&&!te&&(v.runnerPrewarmWaited=!1),y&&(m||oe)&&await oi(a,x),g=await yc(a,o,g),a.platform===`android`&&g&&await dr(a,g);let de=o?Vc(se,o,g):void 0,fe=Date.now();if(await es(a,300),v.postOpenSettleDurationMs=Math.max(0,Date.now()-fe),Cn(t.meta?.requestId)){let e=bn();return L(e.code,e.message,e.details)}f&&Ai({session:f,command:`open`,positionals:[],flags:void 0});let T=uc({existingSession:le,sessionName:f?.name??lr(t),sessionScope:f?.sessionScope??Ic(t),device:a,surface:l,appBundleId:g,appName:c});T.lease=Mi({req:t,existingLease:f?.lease}),p&&(T.deviceClaim=p),t.runtime!==void 0&&Ws(r,n,d);let E=r.ensureSessionDir(n),D=it(E,t.meta?.requestId??Kt().requestId);v.totalDurationMs=Math.max(0,Date.now()-_),P({level:`info`,phase:`open_timing`,durationMs:v.totalDurationMs,data:v});let pe=lc({sessionName:T.name,sessionStateDir:E,runnerLogPath:jt(E),requestLogPath:D,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:g,surface:l,startup:de,timing:v,device:a,runtime:d,runtimeHintCount:Ns,sessionReused:f!==void 0});return Lc({session:T,existingSession:f,saveScriptRequested:!!t.flags?.saveScript,responseData:pe}),r.set(n,T),r.recordAction(T,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:d,result:pe}),{ok:!0,data:pe}}async function Wc(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,sessionAppBundleId:o,appName:s,existingSession:c}=e,l=t.internal?.openLifecycle?.beforeDispatch;if(!l)return{type:`session`,session:c};let u=uc({existingSession:c,sessionName:c?.name??lr(t),sessionScope:c?.sessionScope??Ic(t),device:i,surface:a,appBundleId:o,appName:s});u.lease=Mi({req:t,existingLease:c?.lease}),r.set(n,u);let d=await l(u);return d&&!d.ok?{type:`response`,response:d}:{type:`session`,session:r.get(n)??u}}function Gc(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return br(t,i)?L(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):Kc(i,n)}function Kc(e,t){return L(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:t.id,deviceName:t.name,hint:Wi(e,`device-in-use`)})}async function qc(e){let{req:t,device:n,sessionName:r,logPath:i}=e;return Or(t.meta,F(n))?await Jr({device:n,session:r,workspace:t.meta?.cwd??process.cwd(),stateDir:U.dirname(i)}):{}}async function Jc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s}=e,c=Gc({req:t,device:a,sessionStore:i});if(c)return c;let l=await qc({req:t,device:a,sessionName:n,logPath:r}),u={mayHaveStarted:!1};try{let e=await kc({req:t,sessionName:n,sessionStore:i,device:a,surface:o,openTarget:s,onIosSimulatorColdBootStart:Xi({req:t,logPath:r,device:a,surface:o,openTarget:s})});if(e.type===`response`)return await Yc(l.ownership,u),e.response;u.mayHaveStarted=!0;let c=await Uc({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:s,openPositionals:t.positionals??[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtime:e.details.runtime,surface:o,deviceClaim:l.ownership});return c.ok||await Yc(l.ownership,u),c}catch(e){throw await Yc(l.ownership,u),e}}async function Yc(e,t){if(e){if(t.mayHaveStarted){P({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await Ri(e)}}async function Xc(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await jc({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 L(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let e=o.flags?.relaunch===!0,a=o.positionals?.[0],s=a??(e?i.appName:void 0),c=Ec(i.device,o.flags?.surface,s,i.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return Tc(e?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let l=Dc({shouldRelaunch:e,openTarget:s,surface:c,device:i.device});if(l)return l;let u=await ts(i.device);await o.internal?.retainDeviceExecutionLock?.(u.id);let d=await kc({req:o,sessionName:t,sessionStore:r,device:u,surface:c,openTarget:s,existingSession:i,onIosSimulatorColdBootStart:Xi({req:o,logPath:n,device:u,surface:c,openTarget:s,traceLogPath:i.trace?.outPath})});return d.type===`response`?d.response:await Uc({req:o,sessionName:t,sessionStore:r,logPath:n,device:u,openTarget:s,openPositionals:a?o.positionals??[]:s?[s]:[],appBundleId:d.details.appBundleId,appName:d.details.appName,runtime:d.details.runtime,surface:c,existingSession:i})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return Tc(`open --relaunch requires an app argument.`);let l=Oc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await kn(o.flags??{},ci(c));await o.internal?.retainDeviceExecutionLock?.(u.id);let d=Ec(u,o.flags?.surface,c);return typeof d==`string`?Dc({shouldRelaunch:s,openTarget:c,surface:d,device:u})||await gn(Fc,u.id,async()=>await Jc({req:o,sessionName:t,logPath:n,sessionStore:r,device:u,surface:d,openTarget:c})):d}function Zc(e){return H(e)||ra(e)}async function Qc(e){if(e.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return H(e)?await $c(e):await tl(e)}catch(e){let n=t(e);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function $c(e){let t=await Zi(e);return t.success?t:await el(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function el(e){try{return await Qi(e)}catch{return null}}async function tl(e){let t=await sn(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}function nl(e,t,n){if(!rt(t))return{kind:`not-armed`};let r=t.actions.length;ta(e,t,n,`close`,{session:t.name,...Ke(`Closed: ${t.name}`)});let i=yt(t),a=e.writeSessionLog(t,{force:ct(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`}:(ut(t),{kind:`aborted`})}function rl(e,n){let r=t(n),i=xt(e.scriptPublication??Ot);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function il(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||ta(r,n,t,`close`,{session:n.name,...Ke(`Closed: ${n.name}`)});try{let e=r.writeSessionLog(n,{force:ct(n,t.flags?.force)});e.written&&nt(n,e.path);return}catch(e){return al(e)}}function al(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 ol(e){let{device:t,shutdownRequested:n}=e;if(n&&!F(t)&&Zc(t))return await Qc(t)}function sl(e,t){return H(t.device)&&!e.flags?.shutdown&&!t.screenRecording&&!t.lease&&!t.device.simulatorSetPath}function cl(e){return j(e.device.platform)&&!H(e.device)}function ll(e){return e instanceof n?e:new n(`COMMAND_FAILED`,`The platform close failed: ${e instanceof Error?e.message:String(e)}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}async function ul(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,cleanupFailures:o,repairArmed:s}=e,c=async(e,t)=>{try{await t()}catch(t){o.push({step:e,error:t})}},l=sl(t,n);await dl(n,a,c);let u=s?void 0:await hl({req:t,session:n,logPath:i});await _l(l,n,c),await gl(n,a,r);let d=s?void 0:il({req:t,session:n,sessionStore:a,platformCloseError:u});return await c(`materialized_paths`,()=>ar(r)),{platformCloseError:u,saveScriptError:d}}async function dl(e,t,n){let r=t.get(e.name)??e;r.screenRecording&&await n(`recording`,()=>Di({session:r,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>wi({session:e,sessionStore:t})),await n(`audio_probe`,async()=>{await Pi(e,`session-close`)}),await n(`apple_perf`,()=>Xr(e)),await n(`android_native_perf`,()=>Wr(e)),await n(`android_snapshot_helper`,()=>_i(e)),await n(`android_ime`,()=>Si(e,t.resolveDaemonStateDir()))}function fl(e){return JSON.stringify(e.positionals??[])}async function pl(e){let{req:t,session:n,logPath:r,sessionStore:i}=e,a=rt(n),o=fl(t);if(a&&!Pt(n,o)){let e=await hl({req:t,session:n,logPath:r});if(e)return{response:rl(n,ll(e))};ht(n,o)}let s=nl(i,n,t);return s.kind===`failed`?{response:rl(n,s.error)}:{repairArmed:a,...s.kind===`committed`&&s.path?{healedScriptPath:s.path}:{},...s.kind===`aborted`?{aborted:!0}:{}}}async function ml(e){try{return{providerData:await Hr(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 hl(e){let{req:t,session:n,logPath:r}=e;if(Cl(t,n)){if(cl(n))try{await ai(n)}catch(e){return e}try{Oi(n),await Ln(n.device,`close`,t.positionals??[],t.flags?.out,{...V(r,t.flags,n.appBundleId,n.trace?.outPath)}),await es(n.device,300);return}catch(e){return e}}}async function gl(e,t,n){!us(t.getRuntimeHints(n))||!e.appBundleId||await fs({device:e.device,appId:e.appBundleId}).catch(()=>{})}async function _l(e,t,n){if(j(t.device.platform)){if(!e){await n(`apple_runner`,()=>ai(t));return}P({level:`debug`,phase:`ios_runner_retained_after_close`,data:{session:t.name,deviceId:t.device.id}}),$r(t.device.id)}}function vl(e,t){if(!e.flags?.saveScript||vt(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 yl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await Tl(t,r);if(vl(t,s),t.internal?.closeAppOnly===!0)return await Sl({req:t,session:s,logPath:r});let c=await pl({req:t,session:s,logPath:r,sessionStore:i});if(`response`in c)return c.response;let l=await bl({req:t,session:s,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,repairArmed:c.repairArmed});if(l.kind===`response`)return l.response;let u=await ol({device:s.device,shutdownRequested:t.flags?.shutdown});return xl({session:s,repair:c,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:u,providerData:l.providerData})}async function bl(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=[],{platformCloseError:l,saveScriptError:u}=await ul({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,cleanupFailures:c,repairArmed:e.repairArmed}),d=await ml({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(d.response)return{kind:`response`,response:d.response};let f=mi({sessionName:r,phase:`session_close_cleanup_failed`,failures:c}),p=l??f;if(p?n.deviceClaim&&P({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await Ri(n.deviceClaim),a.delete(r),p)throw p;if(u)throw u;return{kind:`closed`,providerData:d.providerData}}function xl(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:Ue({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...Ke(c),...o,...s}}}async function Sl(e){let{req:t,session:n,logPath:r}=e,i=t.positionals?.[0];if(!i)return L(`INVALID_ARGS`,`App-only close requires an app target`);let a=await hl({req:t,session:n,logPath:r});if(a)throw a;return{ok:!0,data:{app:i,...Ke(`Closed: ${i}`)}}}function Cl(e,t){return wl(e)||t.device.platform===`web`}function wl(e){return(e.positionals?.length??0)>0}async function Tl(e,t){if(!e.positionals||e.positionals.length===0)return L(`SESSION_NOT_FOUND`,`No active session`);let n=await Y({session:void 0,flags:e.flags,ensureReady:!0});return await Ln(n,`close`,e.positionals,e.flags?.out,{...V(t,e.flags)}),await es(n,300),{ok:!0,data:{app:e.positionals[0],...Ke(`Closed: ${e.positionals[0]}`)}}}const El={ios:async(e,t,n)=>{let r=await Bn(e,t,n,{relaunch:!0,appIdentifierHint:t});if(r)return{bundleId:r.bundleId??r.launchTarget??t};let{reinstallIosApp:i}=await import(`./apps.js`).then(e=>e.t);return await i(e,t,n)},android:async(e,t,n)=>{let r=await Bn(e,t,n,{relaunch:!0,packageNameHint:t});if(r)return{package:r.packageName??r.launchTarget??t};let{reinstallAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t);return await i(e,t,n)},harmonyos:async(e,t,n)=>{let{installHarmonyApp:r}=await import(`./app-lifecycle2.js`).then(e=>e.t);return await r(e,n,{bundleIdHint:t,relaunch:!0})}},Dl={ios:async(e,t,n)=>{let r=await Bn(e,t,n,{appIdentifierHint:t});if(r)return{bundleId:r.bundleId,appName:r.appName,launchTarget:r.launchTarget};let{installIosApp:i}=await import(`./apps.js`).then(e=>e.t),a=await i(e,n,{appIdentifierHint:t});return{bundleId:a.bundleId,appName:a.appName,launchTarget:a.launchTarget}},android:async(e,t,n)=>{let r=await Bn(e,t,n,{packageNameHint:t});if(r)return{package:r.packageName,appName:r.appName,launchTarget:r.launchTarget};let{installAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t),a=await i(e,n);return{package:a.packageName,appName:a.appName,launchTarget:a.launchTarget}},harmonyos:async(e,t,n)=>{let{installHarmonyApp:r}=await import(`./app-lifecycle2.js`).then(e=>e.t);return await r(e,n,{bundleIdHint:t})}};async function Ol(e){let{req:t,command:n,sessionName:r,sessionStore:i,deployOps:a}=e,o=i.get(r),s=t.flags??{},c=J(n,o,s);if(c)return c;let l=Pl(n,t.positionals??[]);if(!l.ok)return l.response;let{app:u,appPathInput:d}=l,f=t.meta?.uploadedArtifactId;try{let e=f?or(f,t.meta?.tenantId):N.expandHome(d);if(!W.existsSync(e))return L(`INVALID_ARGS`,`App binary not found: ${e}`);let c=await Y({session:o,flags:s,ensureReady:!1}),l=I(n,c);if(l)return l;o&&Oi(o);let p=k(c)?jl(u,e,await a.ios(c,u,e)):c.platform===`harmonyos`?Nl(u,e,await a.harmonyos(c,u,e)):Ml(u,e,await a.android(c,u,e)),m=Ue(p,Al(p)),h=kl(o,p);return h&&h!==o&&i.set(r,h),ta(i,h,t,n,m),{ok:!0,data:m}}finally{f&&Fi(f)}}function kl(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Al(e){return`Installed: ${e.appName??Je(e)}`}function jl(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 Ml(e,t,n){let r=n.package;return{app:e||r||n.launchTarget||t,appPath:t,platform:`android`,...r?{appId:r,package:r,packageName:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Nl(e,t,n){let r=n.package;return{app:e||r||n.launchTarget||t,appPath:t,platform:`harmonyos`,...r?{appId:r,package:r,packageName:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Pl(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:L(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:L(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}async function Fl(e,t,n){return await T(e,t,n)}async function Il(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return Ll(t,r);case`devices`:return await zl(t);case`capabilities`:return await Gl({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice});case`apps`:return await Kl({req:t,sessionName:n,sessionStore:r});default:return null}}function Ll(e,t){let n=Cr(e);return{ok:!0,data:{sessions:t.toArray().filter(e=>pr(e,n)).map(e=>Rl(e,t))}}}function Rl(e,t){let n=t.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:n,runnerLogPath:jt(n),platform:O(e.device),...j(e.device.platform)&&e.device.appleOs?{appleOs:e.device.appleOs}:{},target:e.device.target??`mobile`,surface:e.surface??`app`,device:e.device.name,id:e.device.id,device_id:e.device.id,createdAt:e.createdAt,...j(e.device.platform)&&!A(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}}async function zl(e){try{return{ok:!0,data:{devices:(await Bl(e)).map(Yl)}}}catch(e){let t=s(e);return L(t.code,t.message,t.details)}}async function Bl(e){let t=e.flags?.platform;return Wl(await zn(Vl(e,t)),e.flags?.platform,e.flags?.target)}function Vl(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Hl(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Ul(n?.androidDeviceAllowlist)}}function Hl(e,t,n){return Ce({simulatorSetPath:Wn(e),platform:t,target:n})}function Ul(e){let t=Hn(e);return t?Array.from(t).sort():void 0}function Wl(e,t,n){let r=t?e.filter(e=>Xl(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Gl(e){let t=await Jl({...e,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0});if(`response`in t)return t.response;let{device:n}=t,[r,i,a]=e.bindDevice?await Promise.all([e.bindDevice(n,v).then(e=>e.facts.appLogInspect.available),e.bindDevice(n,ue).then(e=>e.facts.networkDump.available),e.bindDevice(n,S).then(e=>e.facts.screenRecordingStart.available)]):[!1,!1,!1];return{ok:!0,data:{device:Yl(n),availableCommands:Rn().filter(e=>e===`logs`?r:e===`network`?i:e===`record`?a:Mn(e,n))}}}async function Kl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=await Jl({req:t,sessionName:n,sessionStore:r,ensureReady:!0});if(`response`in i)return i.response;let{device:a}=i,o=I(`apps`,a);if(o)return o;let s=Ht(t.flags?.appsFilter);return j(a.platform)?ql((await $i(a,s)).map(e=>({id:e.bundleId,name:e.name}))):a.platform===`harmonyos`?ql((await Ki(a,s,{signal:xn(t.meta?.requestId)})).map(e=>({id:e.package,name:e.name}))):ql((await on(a,s)).map(e=>({id:e.package,name:e.name})))}function ql(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Jl(e){let{req:t,sessionName:n,sessionStore:r,ensureReady:i,allowStoppedAndroidAvdPlaceholders:a}=e,o=r.get(n),s=t.flags??{},c=J(t.command,o,s);return c?{response:c}:{device:await Y({session:o,flags:s,ensureReady:i,allowStoppedAndroidAvdPlaceholders:a})}}function Yl({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:O({platform:r.platform,appleOs:n}),...j(r.platform)&&n?{appleOs:n}:{}}}function Xl(e,t){return ye(e,t)}async function Zl(e){let{ensureAndroidEmulatorBooted:t}=await import(`./install-artifact.js`).then(e=>e.a);return await t(e,{discoverLocal:Vn,androidSerialAllowlist:e.androidSerialAllowlist})}const Ql=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,$l=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function eu(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&$o(a))return L(`SESSION_NOT_FOUND`,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.`);let s=J(`appstate`,i,a);if(s)return s;let c=j(i?.device.platform)&&rs(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return L(`SESSION_NOT_FOUND`,Ql);if(u&&!c)return L(`SESSION_NOT_FOUND`,$l);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?A(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:O(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:L(`COMMAND_FAILED`,`No foreground app is tracked for this ${A(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:O(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...k(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await Y({session:i,flags:a,ensureReady:!0});if(k(d))return L(`SESSION_NOT_FOUND`,Ql);if(A(d))return L(`SESSION_NOT_FOUND`,$l);if(d.platform===`web`)return L(`UNSUPPORTED_OPERATION`,`appstate is not supported on web.`);if(d.platform===`harmonyos`){let{getHarmonyAppState:e}=await import(`./app-lifecycle2.js`).then(e=>e.t),t=await e(d);return{ok:!0,data:{platform:`harmonyos`,package:t.package,activity:t.activity}}}let{getAndroidAppState:f}=await import(`./app-lifecycle.js`).then(e=>e.t),p=await f(d);return{ok:!0,data:{platform:`android`,package:p.package,activity:p.activity}}}async function tu(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;if(t.command===`boot`){let e=i.get(n),a=t.flags??{},o=J(t.command,e,a);if(o)return o;let c=(a.platform??e?.device.platform)===`android`,l=Hn(a.androidDeviceAllowlist),u=l?[...l].sort():void 0,d=a.headless===!0;if(d&&!c)return L(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);let f=ns({flags:a,sessionDevice:e?.device}),p=c&&!!f,m,h=!1;try{m=await Y({session:e,flags:a,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(e){let t=s(e);if(c&&d&&!f&&t.code===`DEVICE_NOT_FOUND`)return L(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);if(!p||t.code!==`DEVICE_NOT_FOUND`||!f)throw e;m=await Zl({avdName:f,serial:a.serial,headless:d,androidSerialAllowlist:u}),h=!0}if(a.target&&(m.target??`mobile`)!==a.target)return L(`DEVICE_NOT_FOUND`,`No ${m.platform} device found matching --target ${a.target}.`);if(c&&d){if(m.platform!==`android`||m.kind!==`emulator`)return L(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);if(!h){let t=ns({flags:a,sessionDevice:e?.device,resolvedDevice:m});if(!t)return L(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);m=await Zl({avdName:t,serial:a.serial,headless:!0,androidSerialAllowlist:u})}await ea(m)}else m.platform===`android`&&m.kind===`emulator`&&m.booted!==!0?(m=await Zl({avdName:m.name,serial:a.serial,headless:!1,androidSerialAllowlist:u}),await ea(m)):(m.platform!==`android`||m.booted!==!0)&&await ea(m,{onIosSimulatorColdBootStart:Ji({req:t,logPath:r,device:m,enabled:!0})});return I(`boot`,m)||(k(m)&&m.kind===`simulator`&&vi(m,{}),{ok:!0,data:{platform:O(m),target:m.target??`mobile`,device:m.name,id:m.id,kind:m.kind,booted:!0,...j(m.platform)&&m.appleOs?{appleOs:m.appleOs}:{}}})}if(t.command===`shutdown`){let e=i.get(n),r=t.flags??{},a=J(t.command,e,r);if(a)return a;let o=await Y({ensureReady:!1,flags:r,session:e}),s=I(`shutdown`,o,{message:`shutdown is supported only for Apple simulators and Android emulators.`});if(s)return s;if(e&&e.device.platform===o.platform&&e.device.id===o.id)return L(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:O(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind});let c=await Qc(o);return c.success?{ok:!0,data:{platform:O(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c,...j(o.platform)&&o.appleOs?{appleOs:o.appleOs}:{}}}:L(c.error?.code??`COMMAND_FAILED`,nu(c),{platform:O(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c})}return t.command===`appstate`?await eu({req:t,sessionName:n,sessionStore:i}):null}function nu(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function ru(e){let t=Li(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=W.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{W.closeSync(t)}}function iu(e,t){oa(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=qr(e);try{W.writeFileSync(r,n,`utf8`)}finally{W.closeSync(r)}}function au(e){let t=U.dirname(e),n=U.basename(e);W.existsSync(t)||W.mkdirSync(t,{recursive:!0});let r=Dr(e);try{W.fsyncSync(r)}finally{W.closeSync(r)}let i=0;for(let e of W.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{W.unlinkSync(U.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function ou(e){return di.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function su(e){if(!ee(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const cu=[`probe`],lu=[`start`,`status`,`stop`],uu=`audio probe requires ${lu.join(`, `)}`;async function du(e){let n=fu(e);if(!n.ok)return n;let r=await su(n.session.device);if(r)return await mu(e,n,r);let i=ti();if(!i.probeAudio)return L(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);try{return{ok:!0,data:await i.probeAudio({action:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(e){return{ok:!1,error:t(e)}}}function fu(e){let t=pu(e);if(!t.ok)return t;let n=hu(e.req);if(!n.ok)return n;let r=gu(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function pu(e){let t=e.sessionStore.get(e.sessionName);return t?Mn(`audio`,t.device)?{ok:!0,session:t}:L(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):L(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function mu(e,n,r){try{return{ok:!0,data:await er({session:n.session,sessionName:e.sessionName,sessionStore:e.sessionStore,backend:r,probeAction:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(e){return{ok:!1,error:t(e)}}}function hu(e){if(!_u(e.positionals?.[0]))return L(`INVALID_ARGS`,`audio requires probe`);let t=vu(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:L(`INVALID_ARGS`,uu)}function gu(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return L(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=yu(e.positionals?.[2],{defaultValue:1e4,min:100,max:12e4,message:`audio probe duration must be an integer in range 100..120000 ms`});if(n instanceof Error)return L(`INVALID_ARGS`,n.message);let r=yu(e.positionals?.[3],{defaultValue:1e3,min:100,max:1e4,message:`audio probe bucket must be an integer in range 100..10000 ms`});return r instanceof Error?L(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function _u(e){let t=(e??`probe`).toLowerCase();return cu.includes(t)?`probe`:void 0}function vu(e){let t=(e??`status`).toLowerCase();return lu.includes(t)?t:void 0}function yu(e,t){if(e===void 0)return t.defaultValue;let n=Number.parseInt(e,10);return!Number.isInteger(n)||String(n)!==e||n<t.min||n>t.max?Error(t.message):n}async function bu(e){let n=xu(e.req,e.area);if(!n.ok)return n;let{session:r}=e;if(r.device.platform!==`android`)return L(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return L(`COMMAND_FAILED`,`No Android app package is associated with this session.`,{hint:`Run open <app> first so perf can resolve the package and process identity.`});try{return{ok:!0,data:n.area===`cpu`?await Au(e,r,r.appBundleId,n):await ju(e,r,r.appBundleId,n)}}catch(e){return{ok:!1,error:t(e)}}}function xu(e,t){let n=ku(e,t);return t===`cpu`?Su(e,n):Cu(e,n)}function Su(e,t){let n=wu(e,1),r=wu(e,2),i=wu(e,3);return ze(n)?Tu(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:L(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):L(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):L(`INVALID_ARGS`,Me)}function Cu(e,t){let n=wu(e,1),r=wu(e,2);return Eu(n)?Be(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:L(`INVALID_ARGS`,`perf trace requires --kind perfetto`):L(`INVALID_ARGS`,Fe):L(`INVALID_ARGS`,`perf trace action must be start or stop`)}function wu(e,t){return(e.positionals?.[t]??``).toLowerCase()}function Tu(e){return e===`start`||e===`stop`||e===`report`}function Eu(e){return e===`start`||e===`stop`}function Du(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),Iu(t)}function Ou(e,t,n){return t?N.expandHome(t,e.req.meta?.cwd):Fu(e.sessionStore,e.sessionName,n)}function ku(e,t){return typeof e.flags?.out==`string`&&e.flags.out.length>0?e.flags.out:(e.positionals??[])[t===`cpu`?5:4]||void 0}async function Au(e,t,n,r){if(r.action===`start`){Nu(t);let i=Ou(e,r.outPath,`cpu.perf.data`);return Du(e,await gr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Lu(t,`cpu-profile`,r.kind);if(r.action===`report`){await Mu(i);let n=Ou(e,r.outPath,`cpu-report.json`);return await Ui(t.device,i,n,{adb:e.androidAdbExecutor})}let a=Pu(e,r.outPath,i);return Du(e,await Tr(t.device,i,a,{adb:e.androidAdbExecutor}))}async function ju(e,t,n,r){if(r.action===`start`){Nu(t);let i=Ou(e,r.outPath,`app.perfetto-trace`);return Du(e,await $n(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Lu(t,`trace`,r.kind),a=Pu(e,r.outPath,i);return Du(e,await Pr(t.device,i,a,{adb:e.androidAdbExecutor}))}function Mu(e){if(e.state===`running`)throw new n(`COMMAND_FAILED`,`Stop the Android Simpleperf CPU profile before generating a report.`,{hint:`Run perf cpu profile stop --kind simpleperf, then retry perf cpu profile report --kind simpleperf.`})}function Nu(e){let t=e.nativePerf?.android;if(t?.state===`running`)throw new n(`COMMAND_FAILED`,`Android ${t.kind} ${t.type} is already running for this session.`,{hint:t.type===`cpu-profile`?`Run perf cpu profile stop --kind simpleperf before starting another Android native perf capture.`:`Run perf trace stop --kind perfetto before starting another Android native perf capture.`})}function Pu(e,t,n){return t?Ou(e,t,n.outPath):n.outPath}function Fu(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return U.join(e.ensureSessionDir(t),`${r}-${n}`)}function Iu(e){return{action:e.action,platform:`android`,type:e.type,kind:e.kind,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,durationMs:e.durationMs,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,summary:e.summary,message:e.message}}function Lu(e,t,r){let i=e.nativePerf?.android;if(i?.type===t&&i.kind===r)return i;throw new n(`COMMAND_FAILED`,`No Android ${r} ${t} is active for this session.`,{hint:t===`cpu-profile`?`Run perf cpu profile start --kind simpleperf first, then stop or report in the same session.`:`Run perf trace start --kind perfetto first, then stop in the same session.`})}async function Ru(e,n){let r=zu(e.req);if(!r.ok)return r;if(n.device.platform===`android`)return L(`UNSUPPORTED_OPERATION`,`Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.`);if(!j(n.device.platform))return L(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return L(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await Wu(e,n,r):r.action===`stop`?await Gu(e,n,r):await Xu(e,n,r)}catch(e){return{ok:!1,error:t(e)}}}function zu(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Bu(t):n===`trace`?Vu(t):L(`INVALID_ARGS`,Pe)}function Bu(e){if(e[1]?.toLowerCase()!==`profile`)return L(`INVALID_ARGS`,`perf cpu requires profile`);let t=Hu(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=Uu(e[3]);return n.ok?{ok:!0,area:`cpu`,mode:`cpu-profile`,action:t.value,kind:`xctrace`,template:e[4]||void 0,outPath:e[5]||void 0,tracePath:e[6]||void 0}:n}function Vu(e){let t=Hu(e[1],`perf trace`,!1);if(!t.ok)return t;let n=Uu(e[2]);return n.ok?{ok:!0,area:`trace`,mode:`trace`,action:t.value,kind:`xctrace`,template:e[3]||void 0,outPath:e[4]||void 0,tracePath:e[5]||void 0}:n}function Hu(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:L(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function Uu(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:L(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function Wu(e,t,n){if(t.applePerf?.active)return L(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??ed(n.mode),i=$u(e,n),a=await hr({device:t.device,appBundleId:t.appBundleId,mode:n.mode,template:r,outPath:i});t.applePerf={...t.applePerf??{},active:a},e.sessionStore.set(e.sessionName,t);let o=td(`started`,a);return Qu(e,t,o),{ok:!0,data:o}}async function Gu(e,t,n){let r=t.applePerf?.active;if(!r)return L(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?N.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await xi(r,i)}catch(n){throw qu(n)&&Ku(e,t),n}Ju(e,t,a);let o=td(`stopped`,a);return Qu(e,t,o),{ok:!0,data:o}}function Ku(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function qu(e){return s(e).details?.captureCleanedUp===!0}function Ju(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...Yu(n)},e.sessionStore.set(e.sessionName,t)}function Yu(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function Xu(e,t,n){if(n.mode!==`cpu-profile`)return L(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return L(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=$u(e,n),i=Zu(t,n);if(!i.ok)return i;let a={perf:`reported`,...await mr({tracePath:N.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return Qu(e,t,a),{ok:!0,data:a}}function Zu(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:L(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function Qu(e,t,n){ta(e.sessionStore,t,e.req,`perf`,n)}function $u(e,t){if(t.outPath)return N.expandHome(t.outPath,e.req.meta?.cwd);let n=e.sessionStore.ensureSessionDir(e.sessionName),r=new Date().toISOString().replace(/[:.]/g,`-`),i=t.action===`report`?`json`:`trace`;return`${n}/perf-${t.mode}-${r}.${i}`}function ed(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function td(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}const nd=`hdc-shell-top`,rd=`hdc-shell-proc-status`,id=`Resident memory snapshot from HarmonyOS /proc/<pid>/status. Values are reported in kilobytes.`;function ad(e){let t=e.trim().split(/\s+/)[0];if(!t||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return n>0?n:void 0}function od(e,t){for(let n of e.split(`
4
- `)){let e=n.trim().split(/\s+/);if(e[0]!==String(t)||e.length<10)continue;let r=Number.parseFloat(e[8]??``);if(Number.isFinite(r)&&r>=0)return r}}function sd(e){let t=dd(e,`VmRSS`);if(t===void 0)return;let n=dd(e,`VmHWM`);return{totalRssKb:t,...n===void 0?{}:{peakRssKb:n}}}async function cd(e,t){let r=await ud(e,t),i=od((await Gi(e,[`shell`,`top`,`-b`,`-n`,`1`],{timeoutMs:15e3})).stdout,r);if(i===void 0)throw new n(`COMMAND_FAILED`,`Could not read CPU usage for ${t}`,{hint:`Verify the app is still running, then retry perf metrics.`,details:{bundleName:t,pid:r}});return{usagePercent:i,measuredAt:new Date().toISOString(),method:nd,matchedProcesses:[t],pid:r}}async function ld(e,t){let r=await ud(e,t),i=sd((await Gi(e,[`shell`,`cat`,`/proc/${r}/status`],{timeoutMs:15e3})).stdout);if(!i)throw new n(`COMMAND_FAILED`,`Could not read resident memory for ${t}`,{hint:`Verify the app is still running, then retry perf memory sample.`,details:{bundleName:t,pid:r}});return{...i,measuredAt:new Date().toISOString(),method:rd,pid:r}}async function ud(e,t){let r=await Gi(e,[`shell`,`pidof`,t],{allowFailure:!0,timeoutMs:15e3}),i=r.exitCode===0?ad(r.stdout):void 0;if(i!==void 0)return i;throw new n(`COMMAND_FAILED`,`Could not find a running process for ${t}`,{hint:`Open the app in this session, then retry perf metrics.`,details:{bundleName:t}})}function dd(e,t){let n=e.match(RegExp(`^${t}:\\s+(\\d+)\\s+kB$`,`m`));if(!n?.[1])return;let r=Number.parseInt(n[1],10);return Number.isFinite(r)?r:void 0}Pn();function fd(e){let t=[];for(let n of e){if(n.command!==`open`)continue;let e=n.result?.startup;if(!e||typeof e!=`object`)continue;let r=e;typeof r.durationMs!=`number`||!Number.isFinite(r.durationMs)||typeof r.measuredAt!=`string`||r.measuredAt.trim().length===0||r.method!==`open-command-roundtrip`||t.push({durationMs:Math.max(0,Math.round(r.durationMs)),measuredAt:r.measuredAt,method:sc,appTarget:typeof r.appTarget==`string`&&r.appTarget.length>0?r.appTarget:void 0,appBundleId:typeof r.appBundleId==`string`&&r.appBundleId.length>0?r.appBundleId:void 0})}return t.slice(-20)}async function pd(e,t={}){let n=_d(e);if(!Td(e))return n;if(!e.appBundleId)return Sd(n,e),n;let r=md(e.device);return r&&Cd(n,e,await r(e,e.appBundleId,t)),n}function md(e){let t=Nn(e.platform)?.perf?.metricsSamplerTag(e);return t?Pd[t]:void 0}async function hd(e,t={}){let n=bd(e);return Td(e)?e.appBundleId?(await wd(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:Ed(e)},n):n}async function gd(e,t){let n=xd(e);return Td(e)?t.action===`sample`?(n.metrics={memory:await Fd(e,t)},n):(n.artifact=await Ld(e,t),n.support=Ud(n.artifact.support)??Hd(e),n):t.action===`snapshot`?(n.artifact=Bd(e,Rd(e,t.kind)),n.support=Ud(n.artifact.support)??Hd(e),n):(n.metrics={memory:{available:!1,reason:cc}},n)}function _d(e){let t=fd(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:sc,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:sc};return{session:e.name,platform:O(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,...vd()},sampling:{startup:{method:sc,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Dd(e)}}}function vd(){return{fps:yd(),memory:{available:!1,reason:cc},cpu:{available:!1,reason:cc}}}function yd(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function bd(e){return{session:e.name,platform:O(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:yd()},sampling:{fps:Ad(e)}}}function xd(e){return{session:e.name,platform:O(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:Od(e),snapshot:kd(e)}}}function Sd(e,t){let n=Ed(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}function Cd(e,t,n){e.metrics.memory=Wd(n.memory),e.metrics.cpu=Wd(n.cpu),e.metrics.fps=Gd(Wd(n.fps),t)}async function wd(e,t,n,r){if(t.device.platform===`harmonyos`)return;let i=t.device.platform===`android`?await X(Mr(t.device,n,{adb:r.androidAdb})):await X(ki(t.device,n));e.metrics.fps=Gd(Wd(i),t)}function Td(e){return Nn(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function Ed(e){return e.device.platform===`android`?`No Android app package is associated with this session. Run open <app> first.`:e.device.platform===`harmonyos`?`No HarmonyOS app bundle is associated with this session. Run open <app> first.`:`No Apple app bundle ID is associated with this session. Run open <app> first.`}function Dd(e){return e.device.platform===`android`?{memory:{method:yr,description:vr,unit:`kB`},cpu:{method:li,description:xr,unit:`percent`},fps:{method:ur,description:Fr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:e.device.platform===`harmonyos`?{memory:{method:rd,description:id,unit:`kB`},cpu:{method:nd,description:`Instantaneous process CPU usage from HarmonyOS shell top.`,unit:`percent`},fps:yd()}:Zn(e.device)}function Od(e){return e.device.platform===`android`?{method:yr,description:vr,unit:`kB`,topConsumerLimit:5}:e.device.platform===`harmonyos`?{method:rd,description:id,unit:`kB`,topConsumerLimit:1}:Zn(e.device).memory}function kd(e){return e.device.platform===`android`?{method:si,description:Qn,defaultKind:`android-hprof`,artifactOnly:!0}:e.device.platform===`harmonyos`?{method:`unsupported`,description:`HarmonyOS memory snapshot capture is not available through HDC.`,artifactOnly:!0}:{method:Ir,description:Lr,defaultKind:`memgraph`,artifactOnly:!0}}function Ad(e){return e.device.platform===`android`?{method:ur,description:Fr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:e.device.platform===`harmonyos`?yd():zr(e.device)}async function jd(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([fr(e.device,t,r),cr(e.device,t,r),Mr(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function Md(e,t){let n=await X(ki(e.device,t)),r=await X(gi(e.device,t));if(r.status===`fulfilled`){let e=r.value;return{memory:{status:`fulfilled`,value:e.memory},cpu:{status:`fulfilled`,value:e.cpu},fps:n}}return{memory:{status:`rejected`,reason:r.reason},cpu:{status:`rejected`,reason:r.reason},fps:n}}async function Nd(e,t){let r=Promise.reject(new n(`UNSUPPORTED_OPERATION`,`HarmonyOS frame sampling is not available through the current HDC toolchain.`)),[i,a,o]=await Promise.allSettled([ld(e.device,t),cd(e.device,t),r]);return{memory:i,cpu:a,fps:o}}const Pd={android:jd,apple:Md,harmonyos:Nd};async function Fd(e,t){return e.appBundleId?Wd(e.device.platform===`android`?await X(fr(e.device,e.appBundleId,{adb:t.androidAdb})):e.device.platform===`harmonyos`?await X(ld(e.device,e.appBundleId)):await X(Id(e))):{available:!1,reason:Ed(e)}}async function Id(e){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Ed(e));return(await gi(e.device,e.appBundleId)).memory}async function Ld(e,t){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Ed(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Rd(e,t.kind),i=zd(t,r);return e.device.platform===`android`?r===`android-hprof`?await Sr(e.device,e.appBundleId,i,{adb:t.androidAdb}):Bd(e,r):e.device.platform===`harmonyos`||r!==`memgraph`?Bd(e,r):await Qr(e.device,e.appBundleId,i)}function Rd(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function zd(e,t){if(e.out)return N.expandHome(e.out,e.cwd);let n=t===`android-hprof`?`hprof`:t===`memgraph`?`memgraph`:`artifact`,r=new Date().toISOString().replace(/[:.]/g,`-`),i=e.sessionStore.ensureSessionDir(e.sessionName);return U.join(i,`artifacts`,`memory-${t}-${r}.${n}`)}function Bd(e,t){let n=Hd(e),r=Vd(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Vd(e,t){return e.device.platform===`android`?{reason:`Android perf memory snapshot supports android-hprof, not ${t}.`,hint:`Use perf memory snapshot --kind android-hprof for Android Java heap artifacts.`}:j(e.device.platform)?{reason:`Apple perf memory snapshot supports memgraph, not ${t}.`,hint:`Use perf memory snapshot --kind memgraph for supported Apple app sessions.`}:{reason:`Memory snapshot artifacts are not supported on ${e.device.platform}.`,hint:`Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS.`}}function Hd(e){return e.device.platform===`android`?{platform:e.device.platform,defaultKind:`android-hprof`,androidHprof:!0,memgraph:!1,heapprofd:!1,heapprofdDecision:`Deferred until Android Perfetto/heapprofd plumbing is available in the perf trace slice.`}:j(e.device.platform)?{...wr(e.device),androidHprof:!1,heapprofd:!1,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}:{platform:e.device.platform,defaultKind:`memgraph`,androidHprof:!1,memgraph:!1,heapprofd:!1,reason:`Memory snapshot artifacts are available only on Android, iOS simulator, and macOS.`,hint:`Use perf memory sample where supported, or switch to a platform with memory artifact support.`,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}}function Ud(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function X(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Wd(e){if(e.status===`fulfilled`)return{available:!0,...e.value};let n=t(e.reason);return{available:!1,reason:n.message,error:n}}function Gd(e,t){if(e.available!==!0)return e;let n=Kd(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Kd(e,t){let n=qd(t.windowStartedAt),r=qd(t.windowEndedAt)??qd(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(e=>e.ts>=n&&e.ts<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:Jd(e)})).slice(-12)}function qd(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Jd(e){let t=e.result;if(t)for(let e of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}}const Yd=[`dump`,`log`],Xd=`network requires ${Yd.join(` or `)}`,Zd=`network include mode must be one of: ${o.join(`, `)}`,Qd=2048;async function $d(e){let n=e.sessionStore.get(e.sessionName);if(!n)return L(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=ef(e.bindDevice),r=(await t(n.device,ue)).facts.networkDump;if(!r.available)return of(r.hint);let i=tf(e.req);if(!i.ok)return i;let a=g({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return sf(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:Qd,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function ef(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function tf(e){let t=nf(e);if(!t.ok)return t;let n=rf(e);if(!n.ok)return n;let r=af(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function nf(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return Yd.includes(t)?{ok:!0,action:t}:L(`INVALID_ARGS`,Xd)}function rf(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?L(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function af(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return L(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return o.includes(r)?{ok:!0,include:r}:L(`INVALID_ARGS`,Zd)}function of(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function sf(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:Qd,maxScanLines:e.entries.length},notes:e.notes}}}function cf(e,t){let n=Vr(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[lf(e.appLogFailure)]:uf(n.state)}}function lf(e){return e.hint?`${e.message} ${e.hint}`:e.message}function uf(e){if(e===`failed`)return[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`];if(e===`ended`)return[`The app log stream process ended. Run logs clear --restart before the next capture window.`]}function df(e,t){return Ci([...e,...t.notes??[]])}async function ff(e){let{req:t}=e;return t.command===`perf`?mf(e):t.command===`logs`?Of(e):t.command===`events`?await pf(e):t.command===`network`?await $d(e):t.command===`audio`?await du(e):null}async function pf(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 mf(e){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=e,o=i.get(r);if(!o)return L(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=(n.positionals?.[0]??`metrics`).toLowerCase();if(hf(s))return o.device.platform===`android`?await bu({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await Ru(e,o);let c=gf(n);if(!c.ok)return c;if(c.native)return await Ru(e,o);try{return{ok:!0,data:await _f(e,o,c)}}catch(e){return{ok:!1,error:t(e)}}}function hf(e){return e===`cpu`||e===`trace`}function gf(e){let r=vf(e.positionals?.[0]);if(!r)return L(`INVALID_ARGS`,Pe);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=yf(e.positionals?.[1]);if(!i)return L(`INVALID_ARGS`,Te);let a=bf(e.flags?.kind);return a instanceof n?{ok:!1,error:t(a)}:(xf(r,i)??wf(e,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:Df(e.flags?.out)}}async function _f(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await gd(t,{action:Cf(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await hd(t,{androidAdb:a}):await pd(t,{androidAdb:a})}function vf(e){let t=(e??`metrics`).toString().toLowerCase();return De(t)?t:void 0}function yf(e){let t=(e??`sample`).toString().toLowerCase();return tt(t)?t:void 0}function bf(e){if(e!==void 0)return typeof e!=`string`||!Be(e)?new n(`INVALID_ARGS`,Fe):e}function xf(e,t){if(e===`memory`)return Sf(t)?void 0:L(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return L(`INVALID_ARGS`,`perf metrics and perf frames only support sample`)}function Sf(e){return e===`sample`||e===`snapshot`}function Cf(e){if(Sf(e))return e;throw new n(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function wf(e,t,n,r){return Tf(e.flags?.out,t,n)??Ef(r,t,n)}function Tf(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return L(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function Ef(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return L(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!ke(e))return L(`INVALID_ARGS`,Ae)}}function Df(e){return typeof e==`string`&&e.length>0?e:void 0}async function Of(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return L(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=Bf({...e,session:a}),r=(await t.bindDevice(a.device,v)).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=jf(te({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await kf(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function kf(e,t){switch(t.kind){case`path`:return Mf(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Nf(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Af(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Rf(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Pf(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ff(e)}}async function Af(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Lf(e,t.appBundleId,n.owner,n.operations.appLogStart):await If(e,t.appBundleId,n.owner,n.operations.appLogStart)}function jf(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):L(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Mf(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=ru(a),s=cf(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??`Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>`,notes:s.notes}}}async function Nf(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=cf(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:df(t.notes,o)}}}function Pf(e,t,n){let r=n.resolveAppLogPath(t);return iu(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ff(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return L(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=au(r.resolveAppLogPath(n));return ri({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function If(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await ei({session:i,sessionName:a,sessionStore:o,resourcePath:Bi(o.resolveSessionDir(a))});let s=au(o.resolveAppLogPath(a)),c=await zf(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Lf(e,t,n,r){let{session:i}=e;return i.appLog?L(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await zf(e,t,r,n)}async function Rf(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return L(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await ei({session:t,sessionName:n,sessionStore:r,resourcePath:Bi(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function zf(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=Bi(o.resolveSessionDir(a));try{let l=ou({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 yi({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:ji({session:i,sessionName:a,sessionStore:o,error:e})}}}function Bf(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}}function Vf(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=U.resolve(n??`.`,t??`.agent-device/test-artifacts`);return U.join(i,r)}function Hf(e,t){let n=t?U.relative(t,e):U.basename(e);return Yf((n.length===0||n.startsWith(`..`)?U.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`))||`test`}function Uf(e,t){W.mkdirSync(t,{recursive:!0}),Kf(e,t)}function Wf(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.push(t.error.logPath);let l=Gf(c,o),u=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?u.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(u.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&u.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&u.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&u.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&u.push(`timeoutMode: cooperative`)),l.length>0&&u.push(`copiedArtifacts: ${l.map(e=>U.basename(e)).join(`, `)}`);let d=U.join(o,`result.txt`),f=`${u.join(`
5
- `)}\n`;W.writeFileSync(d,f),s||W.writeFileSync(U.join(o,`failure.txt`),f)}function Gf(e,t){let n=[],r=new Map;for(let i of e){if(!Jf(i))continue;let e=qf(U.basename(i),r),a=U.join(t,e);U.resolve(i)!==U.resolve(a)&&W.copyFileSync(i,a),n.push(a)}return n}function Kf(e,t){let n=U.join(t,`replay.ad`);if(W.copyFileSync(e,n),U.extname(e).toLowerCase()===`.ad`)return;let r=U.join(t,U.basename(e));U.resolve(r)!==U.resolve(n)&&W.copyFileSync(e,r)}function qf(e,t){let n=U.extname(e),r=n?e.slice(0,-n.length):e,i=t.get(e)??0;return t.set(e,i+1),i===0?e:`${r}-${i+1}${n}`}function Jf(e){try{return W.statSync(e).isFile()}catch{return!1}}function Yf(e){let t=0,n=e.length;for(;t<n&&e[t]===`-`;)t+=1;for(;n>t&&e[n-1]===`-`;)--n;return e.slice(t,n)}function Xf(e){let{inputs:t,cwd:r,platformFilter:i,discoverSources:a}=e,o=a({inputs:t,cwd:r}),s=[];for(let e of o){let{path:t,manifest:n}=e,r={kind:`run`,path:t,title:n.title,manifest:n};if(!i){s.push(r);continue}let a=n.device.platform;if(a.kind===`caller-bound`){s.push(r);continue}if(a.kind===`unspecified`){s.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${i}`});continue}np(i,a.value)&&s.push(r)}if(s.filter(e=>e.kind===`run`).length===0)throw new n(`INVALID_ARGS`,`No replay tests matched${i?` for --platform ${i}`:``}.`);return s}function Zf(e,t,n,r,i=0){let a=Yf(U.basename(n,U.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function Qf(e){return Yf((e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`))||`suite`}function $f(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,U.basename(r),`attempt`,a+1].join(`:`)}function ep(e,t){return typeof e==`number`?e:t}function tp(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function np(e,t){return e===`apple`?j(t):t===e}function rp(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const ip=2e3;async function ap(e){let{filePath:n,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,ee=Date.now(),S=dp({artifactsDir:l,artifactPaths:v,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),C=f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:S,appendTimingEvent:e=>Z(S,e),shard:u,onStep:d}).catch(e=>rp({error:t(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([C,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(fp(o,[...v]))},o)})]):await C,Z(S,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-ee,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await op(C)||(x=lp(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:ip}}),sp({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await cp({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:S,emitDiagnostic:h});x?.status===`passed`&&e&&(x=up(x,`Replay test finalization failed: ${e.error.message}`));let n=Date.now();try{Z(S,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Z(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(e){let i=t(e);Z(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-n,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}})}}return x??rp({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}async function op(e){return await Promise.race([e.then(()=>!0),da(ip).then(()=>!1)])}async function sp(e){let{replayPromise:n,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await n}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:t(e).message}})}}}async function cp(e){let{finalizeAttempt:n,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!n)return;let c=Date.now();Z(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await n({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Z(o,e)});return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let n=t(e);return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:n.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:n.message}}),rp({error:n})}}function lp(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function up(e,t){return{...e,warnings:[...e.warnings,t]}}function dp(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=U.join(t,`replay-timing.ndjson`);return W.mkdirSync(U.dirname(l),{recursive:!0}),W.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&&W.appendFileSync(e,`${JSON.stringify(t)}\n`)}function fp(e,t=[]){return rp({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 pp(e){let t=mp(e),n=await hp(e,t);return{result:xp(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function mp(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:U.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Hf(t.path,n)),maxAttempts:r+1}}async function hp(e,t){_p(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await gp(e,t,r);if(vp(n,i),yp(e,i.outcome,r))break;bp(e,t,i)}return n}async function gp(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=Zf(i,a,r.path,o,n),h=U.join(t.testArtifactsDir,`attempt-${f}`);Uf(r.path,h);let g=$f({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,...Tp(d)},v=await ap({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 Wf({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function _p(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:Zf(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Tp(c)})}function vp(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 yp(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function bp(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,...Tp(e.shard)})}function xp(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Sp(e,t,n,r):Cp(e,t,n,r)}function Sp(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,...Tp(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}:{},...wp(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Cp(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,...Tp(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...c?.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...wp(s)}}function wp(e){return Tp(e)}function Tp(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Ep(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 Dp(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,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(),s=await Op(t,u,d);Mp(s,a);let p=s.shardPlan?Np({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await Pp({shards:s.shardPlan.shards,sessionName:f,suiteInvocationId:s.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:s.suiteArtifactsDir,suiteTotal:s.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await Rp({discoveryEntries:s.entries,sessionName:f,suiteInvocationId:s.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:s.suiteArtifactsDir,suiteTotal:s.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:Vp(s.total,p,Date.now()-e)}}catch(e){let t=s(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Op(e,t,n){let r=kp(e,t),i=Ap(r),a=r.length-i.length,o=Qf(e.requestId),s=await Ep(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:jp(e,o),total:s?.total??r.length}}function kp(e,t){return Xf({inputs:[...e.inputs],cwd:e.cwd,platformFilter:e.platformFilter,discoverSources:t})}function Ap(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function jp(e,t){return Vf({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Mp(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 Np(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 Pp(e){return(await Promise.allSettled(e.shards.map(async t=>await Ip({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Fp(r,e.sessionName,t.reason)]:[]})}function Fp(e,n,r){let i=t(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:Lp(n,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function Ip(e){let{shard:t,sessionName:n}=e;return await zp({...e,entries:t.entries,sessionName:Lp(n,t),shard:t})}function Lp(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Rp(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 pp({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:tp(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:ep(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),Bp(t,o,p))break}return g}async function zp(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 pp({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:tp(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:ep(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),Bp(b,o,m))break}return _}function Bp(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Vp(e,t,n){let r=t.filter(e=>e.status===`passed`).length,i=t.filter(e=>e.status===`failed`),a=i.length,o=t.filter(e=>e.status===`skipped`).length,s=r+a,c=d(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:s,passed:r,failed:a,skipped:o,notRun:Math.max(0,e-s-o),durationMs:n,failures:i,tests:t,...c?{snapshotDiagnostics:c}:{}}}function Hp(e){return JSON.stringify(Up(e))}function Up(e){if(Array.isArray(e))return e.map(Up);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,Up(t[e])]))}function Wp(e){let t=Hp(Gp(e));return sa(`sha256`).update(t,`utf8`).digest(`hex`)}function Gp(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)=>Kp(e,n[t]??null,r?.[t]??null))}}function Kp(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 qp(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=Jp({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Jp(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Yp({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Xp({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Zp(n,r)];for(let e of s){let t=e();if(t)return t}}function Yp(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 Xp(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 Zp(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 Qp(e,t){let r=W.readFileSync(e,`utf8`),i=r.trimStart()[0];if(i===`{`||i===`[`)throw new n(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let a=wt(r),o=bt(r),s=Wp({actions:a.actions,actionLines:a.actionLines,actionSourcePaths:a.actionSourcePaths,metadata:{platform:t?.platform??At(a.actions)??o.platform,target:t?.target??o.target}}),c=a.actions.length;return{actions:a.actions,actionLines:a.actionLines,actionSourcePaths:a.actionSourcePaths,metadata:o,planDigest:s,resolveEntryIndex:e=>qp(e,c,s)}}function $p(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function em(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&ve(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function tm(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 nm(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=tm(i,a);return{matchCount:n,observed:r,mismatches:[...r?y(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 rm(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...y(e,r),...b(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 im(e,t,n,r,i,a){if(n.targetEvidences)return am(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return sm(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return sm(e,n,r,i,a);if(s.kind===`post-resolution`){let c=$p({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return sm(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return cm(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=em({recorded:o,token:s.token});if(c.kind===`skip`)return sm(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,om(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?cm(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 am(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 sm(e,n,r,i,a);let d=em({recorded:o[c],token:u.token});if(d.kind===`skip`)return sm(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,om(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 cm(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function om(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 sm(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 cm(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=lm(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=um(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 lm(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 um(e,t,n){return n.status===`guard-mismatch`?nm(e,n.evidence,t):rm(e,n.evidence)}async function dm(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=ha(e.varSources),o=[],s=[],c=hm(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!mm(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(gm(u,n.length,r,e))}let d=Ta(r,a,pm(e,u)),f=Oa(a),p=t.diagnosticsMarker(),m=await im(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:fm(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 fm(e,t){return t.length===0?e:[...new Set([...e,...t])]}function pm(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function mm(e){return!!(e&&e.command!==`replay`)}function hm(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(mm(n))return n.command===`close`?t:void 0}}function gm(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function _m(e){let{sessionStore:t,sessionName:n}=e,r=()=>t.get(n);return{view(){let e=r();if(e)return{repairBoundary:_t(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){let i=r();i&&(mt(i,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:vm(e.sourcePath),firstArm:e.firstArm}),t.set(n,i))},demoteForRerunIfArmed(){let e=r();!e||_t(e)===void 0||at(e)},markCompleteIfArmed(){let e=r();!e||_t(e)===void 0||(ot(e),t.set(n,e))},markSessionHeldIfArmed(e){if(e.ok||!gt(r()))return e;let t=ym(e);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){t.clearRepairTombstone(n)},clearCorrectiveWatermarkIfExpected(e){let i=r();!i||i.pendingRecordAndHeal?.expectedFrom!==e||(Sm(i),t.set(n,i))},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){let i=r();i&&(xm({session:i,...e}),t.set(n,i))}}}}function vm(e){let t=U.dirname(e),n=U.basename(e,U.extname(e));return U.join(t,`${n}.healed.ad`)}function ym(e){let t=e.error.details?.divergence;if(!(!x(t)||!bm(t.resume)))return t.resume}function bm(e){return!x(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function xm(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Cm({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Sm(e){e.pendingRecordAndHeal=void 0}function Cm(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 wm(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e[e.length-1],n=t!==void 0&&/^\d+$/.test(t)?t:null,r=ve(`positional`,n===null?e.slice():e.slice(0,-1));return r.kind!==`expression`||r.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:r.expression,selectorTimeout:n}}function Tm(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),Mt(e.command)){let n=Em(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=ve(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=wm([...e.positionals]);n&&t.push(n)}return Ci(t).filter(e=>e.trim().length>0)}function Em(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Dm(n)?t.slice(0,-1):t}function Dm(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Om(e){let t=km({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 km(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Am({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Am(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 jm(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Mm(n))return`manual`;let i=Nm(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Mm(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&Pm(e.scrollRegion)}function Nm(e,t){let n=Ge(t),r=Im(e.ancestry,n,t),i=e.scrollRegion;return i&&Pm(i)?r&&Fm(i,n,t):r}function Pm(e){return e.id!==void 0||e.label!==void 0}function Fm(e,t,n){return n.some(n=>Lt(It(n,t),e))}function Im(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=we(n,t,e.length);return!r.broken&&de(r.chain,e)})}const Lm=new WeakMap;function Rm(e){return{store:t=>zm(e,t),finalize:(t,n)=>Bm({...e,evidence:t,projection:n})}}function zm(e,t){let{sessionStore:n,sessionName:r}=e,i=n.get(r);if(!i)throw Error(`Internal observation session is no longer available.`);Br(i,t),n.set(r,i);let a=i.snapshotGeneration;if(a===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let o={};return Lm.set(o,{sessionName:r,session:i,sessionCreatedAt:i.createdAt,snapshot:t,snapshotGeneration:a,runtimeRevision:hi(i),refFrame:Hm(i)}),{evidence:o,refsGeneration:a}}function Bm(e){let t=Lm.get(e.evidence);Lm.delete(e.evidence);let n=Wm(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Vm(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Gm(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Rr(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Vm(e,t){let n=e.sessionStore.get(e.sessionName);return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&hi(n)===t.runtimeRevision&&Um(Hm(n),t.refFrame)}function Hm(e){return{state:e.refFrameState,scope:e.refFrameScope,tree:e.refFrameTree,generation:e.refFrameGeneration}}function Um(e,t){return e.state===t.state&&e.scope===t.scope&&e.tree===t.tree&&e.generation===t.generation}function Wm(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 Gm(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Km(t){let{sessionStore:n,sessionName:r,divergence:i,responseLevel:a}=t,o,s,c=Qe({divergence:i,level:a,writeOverflowArtifact:t=>{let i=e(t),a=Ym(n,r,i);return`artifactPath`in a&&(o=i,s=a.artifactPath),a}}),l=(o??c).screen;if(l.state!==`available`||l.refs.length===0)return t.evidence&&Rm({sessionStore:n,sessionName:r,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:l.state===`available`?l.refsGeneration:void 0,refs:[]}),c;if(!t.evidence)return Jm(s),qm(c,`missing-evidence`);let u=Rm({sessionStore:n,sessionName:r,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:l.refsGeneration,refs:l.refs.map(e=>e.ref)});return u.published===!0?c:(Jm(s),qm(c,u.reason))}function qm(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 Jm(e){if(e)try{W.unlinkSync(e)}catch{}}function Ym(e,t,n){try{let r=U.join(e.ensureSessionDir(t),`replay-divergence`);W.mkdirSync(r,{recursive:!0});let i=`${Date.now()}-step${n.step.index}.json`,a=U.join(r,i);return W.writeFileSync(a,`${JSON.stringify(n,null,2)}\n`),{artifactPath:a}}catch{return{artifactUnavailable:!0}}}const Xm={id:0,"role-label":1,label:2,other:3};function Zm(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Qm(n.basis)<Qm(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Qm(e.basis)-Qm(t.basis)||e.nodeIndex-t.nodeIndex)}function Qm(e){return Xm[e]}async function $m(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=Re(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await nh({session:o,sessionName:s,sessionStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=oh(v,g),b=v.state===`available`&&o?dh({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=jm({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:eh(v)}),ee=Om({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Km({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Nt(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:ee,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function eh(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const th=[300,500,800,1200,2e3,3e3,4e3];async function nh(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=ih(a),c=Date.now()+12e3,l=await rh({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of th){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await $t(Math.min(e,a)),l=await rh({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s})}return l.observation}async function rh(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,flags:a}=e;try{let e=(await Gr({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(et(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 o=Rm({sessionStore:r,sessionName:n}).store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:o.refsGeneration,evidence:o.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:Ee(e)}}}function ih(e){return{snapshotInteractiveOnly:ah(e)}}function ah(e){return fh(e.command)?ph(e).requiresRect:!0}function oh(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=uh(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function sh(e){return!!$e(e,Le(e.type??`Element`))||e.hittable===!0}function ch(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function lh(e,t){let n=Ie(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&sh(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=>ch(e,t)),...o.filter(e=>!ch(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function uh(e,t,n){let{nodes:r,truncated:i}=lh(e,n);return{refs:r.map(e=>{let n=Le(e.type??`Element`),r=$e(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function dh(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!fh(t.command))return[];let a=Tm(t);return a.length===0?[]:mh({candidates:a,nodes:r,session:n,action:t,matching:ph(t),sanitize:i})}function fh(e){return Mt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function ph(e){let t=Mt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function mh(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=hh({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Zm(s).map(e=>e.suggestion)}function hh(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:gh({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function gh(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=oe(t,r.device.platform,{action:i.command===`fill`?`fill`:Mt(i.command)?`click`:`get`,nodes:n}),c=Le(t.type??`Element`),l=$e(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function _h(e){return{...e,hint:e.hint??bh(e.details,`hint`),diagnosticId:e.diagnosticId??bh(e.details,`diagnosticId`),logPath:e.logPath??bh(e.details,`logPath`)}}function vh(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return yh({error:t,actionLabel:Nt(n),action:n.command,positionals:ft(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function yh(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Oe(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Oe(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Sh(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function bh(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const xh=[`reason`,`retriable`,`supportedOn`];function Sh(e){if(!e)return{};let t={};for(let n of xh)e[n]!==void 0&&(t[n]=e[n]);return t}async function Ch(e){return await wh({...e,snapshotDiagnostics:h(e.snapshotDiagnosticSamples)})}async function wh(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionName:d,sessionStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Th(t.error.details?.replaySource),v=_h(t.error),y=await $m({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(d),sessionName:d,sessionStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:xn(u.meta?.requestId)});return vh({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Th(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 Eh(t,n){if(t)try{W.appendFileSync(t,`${JSON.stringify(e(n))}\n`)}catch(e){P({level:`warn`,phase:`replay_trace_write_failed`,data:{path:t,error:e instanceof Error?e.message:String(e)}})}}async function Dh(e){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=e,p=Date.now();Eh(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:ft(o)??[]});let m;try{m=await kh({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(e){if(!(e instanceof n))throw e;m={ok:!1,error:t(e)}}let h=Date.now();return Eh(d,{type:`replay_action_stop`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:m.ok,durationMs:h-p,resultTiming:m.ok?jh(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Oh(m,u??s,c)}function Oh(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 kh(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Mh(t.flags,r.flags),s=i.command===`fill`?dt(st(i)):void 0;return s&&(o.recordAs=s),await a(Ah({token:t.token,session:n,flags:o,runtime:r.runtime,meta:t.meta,internal:{...t.internal,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:t.internal?.resolvedSessionScope??Cr(t)}:{}}},r))}function Ah(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:u(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:c(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function jh(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 Mh(e,t){return me(e,{...t??{}})}function Nh(e){return Bh(e.ok?Fh(e.data):Ph(e.error.details?.artifactPaths))}function Ph(e){return Array.isArray(e)?e.filter(zh):[]}function Fh(e){return e?[Rh(e.path),Rh(e.outPath),...Ih(e.artifacts)].filter(zh):[]}function Ih(e){return Array.isArray(e)?e.map(Lh).filter(zh):[]}function Lh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Rh(t.localPath)??Rh(t.path)}function Rh(e){return typeof e==`string`?e:void 0}function zh(e){return typeof e==`string`}function Bh(e){return[...new Set(e.filter(Vh))]}function Vh(e){try{return W.statSync(e).isFile()}catch{return!1}}function Hh(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Uh({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Ge(r),u=ge(t),d=Ze(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Rt(r,e)===t.sibling),p=d.filter(e=>Lt(It(e,l),t.scrollRegion)),m=Ft(p)[t.viewportOrder]?.ref,h=zt({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,...Kh({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Uh(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Wh(n,t,i,a):Gh(n,t,r,a,o)}function Wh(e,t,n,r){let o=e=>e!==null&&(!r||!!e.rect),s=a(t),c=s?i(e,s):null;if(o(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Ve(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Gh(e,t,n,r,i){let a=se(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return a.kind===`resolved`?{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref}:{matchedNodes:[...a.matchedNodes],winnerRef:``}}function Kh(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?qh(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?qh(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?qh(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 qh(e,t,n){let r=Bt(t),i=we(t,n,Math.max(e.ancestry.length,1)).chain;return[...y(e,r),...b(e.ancestry,i)].slice(0,5)}function Jh(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=l(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=ve(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!Mt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Xh(r)&&Xh(n[1])))return r}function Yh(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Xh(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Zh(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionName:l,sessionStore:u,resumeStamper:d,responseLevel:f,scrubVars:p,planActions:m,planDigest:h}=e,g=Re(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:sg(ge(n),g),...t.observed?{observed:sg(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>cg(e,g))},v=jm({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Om({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b=Km({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(Nt(r)),cause:{code:t.causeCode,message:g(t.causeMessage),...t.causeHint?{hint:g(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:y,repairHint:v,targetBinding:_},responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return vh({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:p})}function Qh(e,t,n){let r=Re(e.scrubVars);return Zh(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:oh(n,r),publicationEvidence:ng(n),repairCapture:eh(n)})}async function $h(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await nh({session:t,sessionName:n,sessionStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function eg(e,t){return Qh(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 $h({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function tg(e,t,n){return Qh(e,t,await $h({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ng(e){return e.state===`available`?e.evidence:void 0}function rg(e){let{action:t,resolvedAction:n,sessionName:r,sessionStore:i,targetRole:a}=e,o=i.get(r);return o?ie(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:le(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Jh(n,a),platform:o.device.platform}:{kind:`inactive`}}function ig(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=ph(r),s=Hh({recorded:t,token:n,nodes:i,platform:a,refLabel:Yh(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Bt(s.winnerNode),structural:C(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Bt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function ag(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function og(e){return!e.ok&&e.error.details?.reason===Ne}function sg(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function cg(e,t){let n=Le(e.type??`Element`),r=$e(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function lg(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,internal:{...e.internal,...n}}:e}function ug(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 dg(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 fg(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 pg(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:ug(e?.observed),expectedStructural:fg(e?.expectedStructural),observedStructural:fg(e?.observedStructural)}}function mg(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:ug(e?.observed),observedAncestry:dg(e?.observedAncestry)}}function hg(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function gg(e,t,n){let r=hg(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&ag(e)?{status:`guard-mismatch`,evidence:pg(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&og(e)?{status:`landmark-mismatch`,evidence:mg(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function _g(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],sessionName:t.sessionName,sessionStore:t.sessionStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,hg(vg(e),Nh(e)));return{runtime:{beginTargetVerification(e,n,r,i){return rg({action:e,resolvedAction:n,sessionName:t.sessionName,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.sessionStore.get(t.sessionName),a=i?await nh({session:i,sessionName:t.sessionName,sessionStore:t.sessionStore,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(t.sessionName);return ig({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 Dh({req:lg(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});o=l,Nh(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:gg(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await eg(c(e,n,r,i),{session:t.sessionStore.get(t.sessionName),sessionName:t.sessionName,sessionStore:t.sessionStore,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=Qh(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await tg(c(e,n,i,a),r,{session:t.sessionStore.get(t.sessionName),sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=vg(o),u=await yg(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=>bg(e),onStep:i,diagnosticsMarker:()=>Sg(t.sessionStore,t.sessionName),diagnosticsSince:e=>Cg(t.sessionStore,t.sessionName,e)},readLastResponse:()=>o}}function vg(e){return e&&!e.ok?e:L(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function yg(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return xg(i)?c(i):c(await Ch({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,sessionName:e.sessionName,sessionStore:e.sessionStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function bg(e){let t=e.positionals??[],n=he(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function xg(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 Sg(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function Cg(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function wg(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Tg(t,i)};return Dg(o,`AD_PLATFORM`,a.platform??r.platform),Dg(o,`AD_TARGET`,a.target??r.target),Dg(o,`AD_DEVICE`,a.device),Dg(o,`AD_DEVICE_ID`,Eg(a)),Og(o,`AD_SHARD_INDEX`,a.shardIndex),Og(o,`AD_SHARD_COUNT`,a.shardCount),Dg(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Tg(e,t){let n=e.meta?.cwd??process.cwd();return U.relative(n,t)||t}function Eg(e){return typeof e.serial==`string`?e.serial:e.udid}function Dg(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Og(e,t,n){typeof n==`number`&&(e[t]=String(n))}const kg=3e4,Ag=1e3;function jg(e){let{scriptPath:r,env:i}=e,a=W.readFileSync(r,`utf8`),o=Object.create(null);try{fa.runInNewContext(a,Mg(i,o),{filename:r,timeout:kg})}catch(e){let i=t(e);throw new n(i.code,`Maestro runScript failed: ${i.message}`,E({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),e instanceof Error?e:void 0)}return Ig(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Lg(t)]))}function Mg(e,t){return{...e,output:t,json:Ng,http:{post:(e,t)=>Fg(`POST`,e,t)}}}function Ng(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,Pg)}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,Ag)},t instanceof Error?t:void 0)}}function Pg(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Fg(e,t,r){let i=Gt(process.execPath,[`-e`,`
6
- const fs = require('node:fs');
7
- const input = JSON.parse(fs.readFileSync(0, 'utf8'));
8
- if (typeof fetch !== 'function') {
9
- console.error('global fetch is required for Maestro runScript http helpers');
10
- process.exit(1);
11
- }
12
- fetch(input.url, {
13
- method: input.method,
14
- headers: input.headers,
15
- body: input.body,
16
- }).then(async response => {
17
- process.stdout.write(JSON.stringify({
18
- status: response.status,
19
- body: await response.text(),
20
- headers: Object.fromEntries(response.headers.entries()),
21
- }));
22
- }).catch(error => {
23
- console.error(error && error.stack ? error.stack : String(error));
24
- process.exit(1);
25
- });
26
- `],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??``}),timeoutMs:kg,allowFailure:!0});if(i.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Rg(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(r){throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:i.stdout.slice(0,Ag),stderr:i.stderr.slice(0,Ag)},r instanceof Error?r:void 0)}}function Ig(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 Lg(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Rg(e){let t=e.trim();return t.length>0?t.slice(0,Ag):`request process exited without stderr`}async function zg(e){return await Bg(`tap`,async t=>{let n=U.join(t,`before.png`),r=U.join(t,`after.png`),i=await Hg(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Hg(e,r)))return await Vg(n,r,e.signal,`tap`)}})})}async function Bg(e,t){let n=await ca.mkdtemp(U.join(la.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await ca.rm(n,{recursive:!0,force:!0})}catch{}}}async function Vg(e,t,n,r){try{let[i,a]=await Promise.all([ca.readFile(e),ca.readFile(t)]);Kg(n);let o=await Wt(i,a,`Maestro screenshot`);return Kg(n),Ug(o,r)}catch(e){Gg(e,n),P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Hg(e,t){try{return await ca.rm(t,{force:!0}),Kg(e.signal),await e.capture(t),Kg(e.signal),!0}catch(t){return Gg(t,e.signal),!1}}function Ug(e,t){if(e.status!==`compared`)return Wg(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return Wg(t,n?`stable`:`changed`,e),n}function Wg(e,t,n){P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Gg(e,t){if(t?.aborted||_n(e))throw bn()}function Kg(e){if(e?.aborted)throw bn()}async function qg(e){Yg(e.timeoutMs),Kg(e.signal);let t=e.now()+e.timeoutMs;return await Bg(`animation`,async n=>{let r=U.join(n,`first.png`),i=U.join(n,`second.png`);for(;;){if(Kg(e.signal),await Jg(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Jg(e,t,n){let r=[await Hg(e,t),await Hg(e,n)];return!r[0]||!r[1]?!1:await Vg(t,n,e.signal,`animation`)===!0}function Yg(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Xg=q.observationPollMs;async function Zg(e,t){for(;;){Q(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!p_(n)||(Q(e.context.signal),!await d_(e.dependencies,t,Xg,e.context.signal)))throw n}}}function Qg(e){return $g({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function $g(e){let t=Nr(e.snapshot),n=e.platform===`ios`?Ti(e.snapshot.nodes):void 0;return i_(Oo(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,interactiveRects:n?new Map([...n.sourceNodes].flatMap(([e,t])=>t.rect?[[e,t.rect]]:[])):void 0,canonicalSnapshot:n?{...e.snapshot,nodes:r(n.nodes)}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function e_(e){f_(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Q(e.context.signal);let r=await Zg(e,n),i=$g({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Ma(e.condition,i))return i;if(e.dependencies.now()>=n)break;await d_(e.dependencies,n,Xg,e.context.signal)}return Q(e.context.signal),g_(t)}async function t_(e){f_(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Q(e.context.signal);let i=r??await Zg(e,t);if(r=void 0,n=$g({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 Q(e.context.signal),g_(n)}async function n_(e){f_(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Zg(e,t),r=m_(n);for(;;){Q(e.context.signal),await d_(e.dependencies,t,Xg,e.context.signal);let i=await Zg(e,t),a=m_(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function r_(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function i_(e,t,n,r,i,a,o){if(!e.ok){let t=r_(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=o_({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=r_(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:a_(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 a_(e,t){return!w(e)||!w(t)?0:re(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 o_(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!s_(t,n,r)||i!==1))return c_(t.selector)}function s_(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function c_(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!l_(n)||typeof r!=`string`)return;let i=sr(r)?.trim();return i?{key:n,value:i}:void 0}function l_(e){return e===`id`||e===`label`||e===`text`}async function u_(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?bn():e}Q(n)}async function d_(e,t,n,r){let i=t-e.now();return i<=0?!1:(await u_(e,Math.min(n,i),r),!0)}function Q(e){if(e?.aborted)throw bn()}function f_(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function p_(e){return e instanceof n&&e.details?.retriable===!0}function m_(e){return sa(`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,bounds:h_(e.rect)})))).digest(`hex`)}function h_(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 g_(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function __(e){return v_(e)?y_(e):k_(e)?A_(e):C_(e)}function v_(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function y_(e){switch(e.kind){case`launchApp`:return b_(e);case`stopApp`:return x_(e);case`openLink`:return S_(e)}}function b_(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 x_(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function S_(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function C_(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return w_(e);case`clickPoint`:return T_(e);case`swipe`:return E_(e);case`scroll`:return D_(e);case`pressKey`:return O_(e)}}function w_(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function T_(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function E_(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},internal:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function D_(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function O_(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function k_(e){return e.kind===`screenshot`||e.kind===`snapshot`}function A_(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}}}}async function j_(e,t){let n=__(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=M_(i,n.flags??{}),c=E({...a,...n.internal,...t.kind===`snapshot`?{observationOnly:!0}:{}}),l=await e.invoke(E({...o,command:n.command,positionals:n.positionals,input:n.input,flags:s,internal:Object.keys(c).length>0?c:void 0}));if(!l.ok)throw R_(l);return l.data}function M_(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=E({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function N_(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 P_(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 F_(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 I_(e,t,r){if(U.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 U.resolve(U.dirname(i),e)}function L_(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function R_(e){let t=e.error,r=E({...t.details??{},hint:t.hint??z_(t.details,`hint`),diagnosticId:t.diagnosticId??z_(t.details,`diagnosticId`),logPath:t.logPath??z_(t.details,`logPath`),retriable:t.retriable??B_(t.details,`retriable`),supportedOn:t.supportedOn??z_(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function z_(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function B_(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function V_(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await j_(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new n(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=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 n_({timeoutMs:q.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot}}}}async function H_(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 Zg({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=Qg({query:t,context:n,snapshot:o,platform:i.platform});if(J_(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await d_(i.dependencies,a,Xg,n.signal)}}}async function U_(e,t,n,r,i,a){let o=async()=>await K_(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await zg({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await j_(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await W_(e,t,n,r,i,a.click,o)});return}await W_(e,t,n,r,i,a.click)}async function W_(e,t,n,r,i,a,o){let s=async()=>await K_(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:m_(await t.capture(i))),l=async()=>await n_({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await G_({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 G_(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 K_(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Y_(e,o,n.point,i);return}catch(n){if(!X_(n))throw n;let o=await H_({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!q_(o))throw n;t.invalidate(r.generation),await Z_(e,Ye(o.rect),i);return}}t.invalidate(r.generation),await Z_(e,n.point,i)}function q_(e){return e.matched&&e.visible&&e.rect!==void 0}function J_(e,t){return q_(e)?!t||e.dispatchSelector!==void 0:!1}async function Y_(e,t,n,r){P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await j_(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function X_(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function Z_(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await j_(e,{kind:`clickPoint`,point:t,options:r})}function Q_(e){let t=V_(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),j_(e,t)),o=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},s=async(e,t,n=`none`)=>await o(()=>a(e),t,n),c=async(n,r)=>{qt(n),await s({kind:`typeText`,text:n},r);let i=await n_({timeoutMs:q.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});t.prime(r.generation,i.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await H_({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await e_({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async t=>{let r=await e.dependencies.resolveGestureViewport(t);if(!r)throw new n(`COMMAND_FAILED`,`Unable to resolve Maestro gesture viewport.`);return r},launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...N_(e.arguments),...N_(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;await s({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`stopApp`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await s({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(n,i)=>await U_(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>Z_(e,t.target.point,E({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>Z_(e,t.target.point,{holdMs:q.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??q.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await t_({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=Va(o,n.selector,n.direction,n.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await n_({timeoutMs:Math.min(q.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==q.scrollUntilVisiblePercentage)throw ir(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(P_(n.selector,a))}},pressKey:async(e,t)=>{await s({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await s({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await s({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await qg({timeoutMs:t.timeoutMs??q.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:F_(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:jg({scriptPath:I_(t.file,n,e.sourcePath),env:{...n.env,...t.env?L_(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r})}}function $_(e){let{operations:t,snapshots:n,readMetrics:r}=Q_(e);return No(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{t&&await n.settlePending(e)},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function ev(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),tv(()=>iv(r,e)),tv(()=>av(n,t,e))},actionCompleted:e=>{let r=nv(i,e.stepIndex);tv(()=>ov(n,t,rv(r,e),!0))},actionFailed:e=>{let r=nv(i,e.stepIndex);tv(()=>ov(n,t,rv(r,e),!1))}}}function tv(e){try{e()}catch{}}function nv(e,t){let n=e.get(t);return e.delete(t),n}function rv(e,t){return E({...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 iv(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function av(e,t,n){Eh(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 ov(e,t,r,i){let a=sv(r);Eh(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 sv(e){let t=`data`in e?e.data:void 0,n=cv(t?.timing)?t.timing:void 0;return E({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function cv(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function lv(e,t){return Hi(e,t)}function uv(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:mv(e.action),positionals:hv(e.action,e.value),flags:t.flags??{}}}}async function dv(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,logPath:o}=e,s=xn(r.meta?.requestId),c=uv(t,r),l=_h(e.error),u=[...t.redactions],d=Re(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(i),m=p?await nh({session:p,sessionName:i,sessionStore: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?fv({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,pv(t.value)].filter(Boolean).join(` `),_=Km({sessionStore:a,sessionName:i,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:oh(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:jm({kind:`action-failure`,targetEvidence:void 0,capture:eh(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return yh({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})}function fv(e){let t={createdAt:Date.now(),nodes:e.nodes};return Zm(lv(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>gh({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function pv(e){return!e||e===`<text>`?e??``:St(e)}function mv(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function hv(e,t){return!t||e===`inputText`?[]:[t]}function gv(e){let{outcome:t,startedAt:n,sessionName:r,sessionStore:i,snapshotStart:a}=e,o=vv(i,r,a),s=t.replayed;return{ok:!0,data:{replayed:s,healed:0,session:r,sessionActive:i.get(r)!==void 0,artifactPaths:t.artifactPaths,...t.warnings?{warnings:t.warnings}:{},...o?{snapshotDiagnostics:o}:{},message:bv(s,Date.now()-n)}}}async function _v(e){let{failure:n}=e.outcome,r=t(e.outcome.error);return n?await dv({error:r,failure:n,replayPath:N.expandHome(e.requestedPath,e.req.meta?.cwd),req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,snapshotDiagnostics:vv(e.sessionStore,e.sessionName,e.state.snapshotStart)}):L(r.code,r.message,{...r.details??{},...yv(n)})}function vv(e,t,n){return h(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function yv(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function bv(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function xv(e){let{req:t}=e,n=t.positionals?.[0];if(!n)return L(`INVALID_ARGS`,`replay requires a path`);if(t.flags?.saveScript!==void 0)return L(`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 Sv({...e,requestedPath:n,startedAt:r,state:i})}catch(t){return await _v({...e,requestedPath:n,state:i,outcome:{ok:!1,error:t}})}}async function Sv(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,onStep:a,invoke:o,state:s}=e,c=await Cv(e),l=kv({req:t,invoke:o,logPath:e.logPath,sessionName:n,sessionStore:r,device:c.device,platform:c.platform,runtimeHints:c.runtimeHints,sourcePath:c.filePath});s.snapshotStart=r.get(n)?.snapshotDiagnostics?.samples.length??0;let u=await Yr(c.flow,l,{defaults:c.defaults,env:c.env,platform:c.platform,target:c.target,runtimeHints:c.runtimeHints,signal:c.signal,from:t.flags?.replayFrom,planDigest:t.flags?.replayPlanDigest,observer:ev({filePath:c.filePath,tracePath:i,onStep:a})});return u.ok?gv({outcome:u,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:s.snapshotStart}):await _v({...e,requestedPath:e.requestedPath,state:s,outcome:u})}async function Cv(e){let{req:t,requestedPath:n,sessionName:r,sessionStore:i}=e,a=N.expandHome(n,t.meta?.cwd),o=zi(W.readFileSync(a,`utf8`),a),s=i.get(r);s&&_r(s,t.flags);let c=await wv({req:t,sessionStore:i,sessionName:r,session:s,flow:o});return{filePath:a,flow:o,...c,defaults:Dv({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:Ov(t),signal:xn(t.meta?.requestId)}}async function wv(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 kn(t.flags??{},pi(a.appTarget,o))),c=Pv(t,s),l=qs({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Tv({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Fv(t,s),runtimeHints:l,flow:a})}async function Tv(e){if(e.device||!Ev(e.runtimeHints))return e;let t=await kn(e.req.flags??{},pi(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Fv(e.req,t),runtimeHints:qs({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Ev(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Dv(e){return{...wg({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Ov(e){return{...ga(ya(e.flags?.replayShellEnv)),..._a(va(e.flags?.replayEnv))}}function kv(e){let{req:t,invoke:r,logPath:i,sessionName:a,sessionStore:o,device:s,platform:c,runtimeHints:l,sourcePath:u}=e,{command:d,positionals:f,input:p,flags:m,...h}=t;return $_({baseReq:E({...h,flags:Av(s,c,t.flags),runtime:l}),invoke:r,platform:c,sourcePath:u,dependencies:{now:Date.now,sleep:async(e,t)=>{await da(e,void 0,{signal:t})},resolveGestureViewport:async()=>{let e=o.get(a);if(!e)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);return await Fn(e.device,V(i,t.flags,e.appBundleId,e.trace?.outPath))}}})}function Av(e,t,n){if(!e)return jv(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 jv(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Mv(n,t):Nv(n,t)}function Mv(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Nv(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Pv(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 Fv(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function Iv(e){let{resolved:t,req:n,keepSession:r,coordinator:i,maestroParams:a}=e;if(Ni(t,n.flags?.replayBackend)===`maestro`)return r?L(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):i.view()?.repairBoundary===void 0?await xv(a):L(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Lv(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,coordinator:o}=e,s=Rv(t);if(s)return{ok:!1,response:s};let{manifest:c,replayReq:l}=zv(t,a),{metadata:u,actions:d,actionLines:f,actionSourcePaths:p,planDigest:m}=c,h=r.get(n),g=Bv({req:t,coordinator:o,manifest:c,preEntrySession:h});return g.ok?{ok:!0,value:{replayReq:l,actions:d,actionLines:f,actionSourcePaths:p,planDigest:m,preEntrySession:h,entryIndex:g.value,varSources:Hv({req:t,replayReq:l,sessionName:n,resolved:a,metadata:u}),actionTracePath:i??h?.trace?.outPath}}:{ok:!1,response:g.response}}function Rv(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return L(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function zv(e,t){let n=Qp(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Vv({...e,flags:ii(e.flags,n.actions)},n.metadata)}}function Bv(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:L(`INVALID_ARGS`,a.message)}}function Vv(e,t){return!t.platform&&!t.target?e:{...e,flags:Uv(e.flags,t)}}function Hv(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:wg({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:ga(ya(t.flags?.replayShellEnv)),cliEnv:_a(va(t.flags?.replayEnv))}}function Uv(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}:{}}}function Wv(e){let{req:t,entryIndex:n,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}=e,s=Gv({entryIndex:n,sessionStore:r,sessionName:i,coordinator:o});return s?{ok:!1,response:s}:(Jv({req:t,coordinator:o}),qv({req:t,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}))}function Gv(e){let t=Yv(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return In()}function Kv(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?L(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):Xv({saveScript:t,liveForce:n,persistedForce:Et(r)||void 0,sourcePath:i,existingSaveScriptPath:xt(r)})}function qv(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i,coordinator:a}=e,o=n.get(r),{saveScript:s,force:c}=t.flags??{},l=Kv({saveScript:s,force:c,preRunState:o?.scriptPublication??Ot,sourcePath:i});return l?{ok:!1,response:l}:(a.demoteForRerunIfArmed(),{ok:!0,armSaveScript:Zv({saveScript:s,force:c,coordinator:a,sourcePath:i})})}function Jv(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Yv(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return L(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function Xv(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?kt(t):a??vm(i);if(!(n||r&&o===a)&&W.existsSync(o))return L(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function Zv(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 Qv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,onStep:o,invoke:c}=e,l=t.positionals?.[0];if(!l)return L(`INVALID_ARGS`,`replay requires a path`);let u=Date.now(),d=t.flags?.replayKeepSession===!0,f=``,p=new Set,m=_m({sessionStore:i,sessionName:n});try{if(f=N.expandHome(l,t.meta?.cwd),ni(f)&&t.flags?.replayBackend!==`maestro`)return L(`INVALID_ARGS`,Ur(`replay`,l));let s=await Iv({resolved:f,req:t,keepSession:d,coordinator:m,maestroParams:e});if(s)return s;let h=Lv({req:t,sessionName:n,sessionStore:i,tracePath:a,resolved:f,coordinator:m});if(!h.ok)return h.response;let{replayReq:g,actions:_,actionLines:v,actionSourcePaths:y,planDigest:b,entryIndex:x,varSources:ee,actionTracePath:S}=h.value,C=Wv({req:t,entryIndex:x,sessionStore:i,sessionName:n,sourcePath:f,coordinator:m});if(!C.ok)return C.response;let{runtime:te,readLastResponse:ne}=_g({ctx:{replayReq:g,sessionName:n,sessionStore:i,logPath:r,resolved:f,actions:_,actionLines:v,actionSourcePaths:y,planDigest:b,actionTracePath:S,responseLevel:t.meta?.responseLevel,invoke:c,signal:xn(t.meta?.requestId),coordinator:m},req:t,artifactPaths:p,onStep:o,armSaveScript:C.armSaveScript}),w=await dm({actions:_,entryIndex:x,keepSession:d,actionLines:v,actionSourcePaths:y,resolvedPath:f,varSources:ee},te);return w.status===`failed`?ne()??L(`COMMAND_FAILED`,`replay step failed with no recorded response`):$v({startedAt:u,sessionName:n,sessionStore:i,replayed:w.replayed,artifactPaths:w.artifactPaths,snapshotDiagnosticSamples:w.snapshotDiagnosticSamples,armSaveScript:C.armSaveScript,coordinator:m,keepSession:d})}catch(e){let t=s(e);return L(t.code,t.message,p.size>0?{artifactPaths:[...p]}:void 0)}}function $v(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(n),d=ty({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=h([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:ey(i,Date.now()-t)}}}function ey(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function ty(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return L(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}const ny=/[*?[\]{}]/;function ry(e){let t=e.replayBackend===`maestro`?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`]),n=[],r=[];for(let i of e.inputs){let a=iy(i,e.cwd,t);if(a.source===`file`){n.push(...a.paths);continue}r.push(a.source===`directory`?ly(a.paths):sy(a.paths))}return ly([...n,...r.flat()])}function iy(e,t,r){let i=N.expandHome(e,t);if(W.existsSync(i)){let t=W.statSync(i);return t.isDirectory()?{paths:oy(i,r),source:`directory`}:t.isFile()?(ay(e,i,r),{paths:[i],source:`file`}):{paths:[],source:`file`}}if(!uy(e)&&!uy(i))throw new n(`INVALID_ARGS`,`test input not found: ${e}`);let a=U.isAbsolute(i)?i:e;return{source:`glob`,paths:W.globSync(a,{cwd:U.isAbsolute(i)?void 0:t}).map(e=>U.isAbsolute(e)?e:U.resolve(t,e)).filter(e=>r.has(U.extname(e).toLowerCase())&&dy(e))}}function ay(e,t,r){if(!r.has(U.extname(t).toLowerCase()))throw ni(t)&&!r.has(`.yaml`)?new n(`INVALID_ARGS`,Ur(`test`,e)):new n(`INVALID_ARGS`,`test does not support this file type: ${e}`)}function oy(e,t){let n=[],r=W.opendirSync(e);try{let i;for(;(i=r.readSync())!==null;){let r=U.join(e,i.name);i.isDirectory()?n.push(...oy(r,t)):i.isFile()&&t.has(U.extname(i.name).toLowerCase())&&n.push(r)}}finally{r.closeSync()}return n}function sy(e){return e.map(e=>U.normalize(e)).sort((e,t)=>{let n=cy(e)-cy(t);return n===0?e.localeCompare(t):n})}function cy(e){return+(U.extname(e).toLowerCase()===`.ad`)}function ly(e){return[...new Set(e.map(e=>U.normalize(e)))]}function uy(e){return ny.test(e)}function dy(e){try{return W.statSync(e).isFile()}catch{return!1}}function fy(e){return({inputs:t,cwd:n})=>ry({inputs:t,cwd:n??process.cwd(),replayBackend:e}).map(t=>py(t,e))}function py(e,t){let n=W.readFileSync(e,`utf8`),r=Ni(e,t)===`maestro`,i=bt(n);return{path:e,manifest:{...r?{title:zi(n,e).name}:{},device:{platform:i.platform?{kind:`declared`,value:i.platform}:r?{kind:`caller-bound`}:{kind:`unspecified`},...i.target===void 0?{}:{target:i.target}},...i.timeoutMs!==void 0||i.retries!==void 0?{attemptDefaults:{...i.timeoutMs===void 0?{}:{timeoutMs:i.timeoutMs},...i.retries===void 0?{}:{retries:i.retries}}}:{}}}}function my(e){return async t=>(await _y(e,t)).map(hy)}function hy(e){if(e.platform===`web`||!Se(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 gy(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 _y(e,t){let r=xy(e),i=yy(await zn(vy(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${by(t)}, but only ${i.length} matched`);return i.slice(0,t)}function vy(e){let t=Hn(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:Ce({simulatorSetPath:Wn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function yy(e,t,n){return t.length>0?Sy(e,t,n):e.filter(e=>Cy(e,n)).sort(Ey)}function by(e){return`${e} device${e===1?``:`s`}`}function xy(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Sy(e,t,r){return t.map(t=>{let i=Ty(t),a=e.find(e=>wy(e,r)&&(e.id===t||Ty(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Cy(e,t){return!wy(e,t)||!Se(e)?!1:e.booted!==!1}function wy(e,t){return!(!ye(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Ty(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function Ey(e,t){return e.id.localeCompare(t.id)}function Dy(e){let t=Oy(e?.shardAll,`--shard-all`),r=Oy(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 Oy(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 ky=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Ay(e){let t=jy(e);return t?My(t.details)||Ny(t.code,t.message):!1}function jy(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function My(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?ln(t):!1}function Ny(e,t){let n=`${e}\n${t}`.toLowerCase();return ky.some(e=>n.includes(e))}function Py(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Ly(e.error.details?.artifactPaths),infrastructure:Ay(e),...Ry(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:Iy(t?.warnings),artifactPaths:Ly(t?.artifactPaths),...Ry(t?.snapshotDiagnostics)}}function Fy(e){if(!e||e.ok)return;let t=Py(e);return t.status===`failed`?t:void 0}function Iy(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Ly(e){return[...new Set(Iy(e))]}function Ry(e){let t=m(e);return t?{snapshotDiagnostics:t}:{}}const zy=1e3,By=3e3;function Vy(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Hy(e)}}async function Hy(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get(n);if(!o||o.screenRecording)return;let s=Qt(o.device.platform),c=i?U.join(i,`recording${s}`):Zt(o.device.platform);Wy(a,{type:`video_recording_start`,session:n,videoPath:c}),P({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.throwIfCanceled();let l=await na({req:{token:t.token,session:n,command:`record`,positionals:[`start`,c],flags:{},meta:t.meta},sessionName:n,sessionStore:r,bindDevice:e.bindDevice,bindExactDevice:e.bindExactDevice,admissionLedger:e.screenRecordingAdmissionLedger,requestScope:e.requestScope,retainDeviceExecutionLock:e.retainDeviceExecutionLock,throwIfCanceled:e.throwIfCanceled});if(!l.ok)return Wy(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await $t(zy),Wy(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:zy}),P({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:zy}}),l}async function Uy(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get(n)?.screenRecording)return;Wy(a,{type:`video_tail_start`,session:n,requestedDurationMs:By});let o=Date.now();await $t(By);let s=Date.now(),c=await na({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:r,bindDevice:e.bindDevice,bindExactDevice:e.bindExactDevice,admissionLedger:e.screenRecordingAdmissionLedger,requestScope:e.requestScope,retainDeviceExecutionLock:e.retainDeviceExecutionLock,throwIfCanceled:e.throwIfCanceled});return Nh(c).forEach(e=>i.add(e)),Wy(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}),P({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function Wy(e,t){e({...t,ts:new Date().toISOString()})}const Gy=[{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.`}],Ky=({attemptId:e,parentAttemptId:t})=>{yn(e);let n=qy(e,t);return{cancel:()=>vn(e),release:()=>{n(),wn(e)}}};function qy(e,t){if(!t||t===e)return()=>{};let n=xn(t);if(!n)return()=>{};let r=()=>{vn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function Jy(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=Yy(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:gy({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function Yy(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function Xy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;if(t.command===`replay`)return await Qv({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o});if(t.command===`test`){let c=Zy(e);if(t.flags?.recordVideo===!0&&c===void 0)return L(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of Gy)if(e.requested(l))return L(`INVALID_ARGS`,e.message);let u;try{u=Qy(t,n)}catch(e){let t=s(e);return L(t.code,t.message)}let d=await Dp({request:u,emitProgress:Sn,isCanceled:()=>Cn(t.meta?.requestId),emitDiagnostic:P,bindAttemptCancellation:Ky,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:f,appendTimingEvent:p,shard:m,onStep:h})=>{let g=e=>(d&&Nh(e).forEach(e=>d.add(e)),e),_=Jy({parentFlags:t.flags,platform:a,target:s,artifactsDir:u,shard:m}),v=c?{req:t,sessionName:n,sessionStore:i,artifactsDir:u,appendTimingEvent:p,...c}:void 0,y=v?Vy(v):void 0;return Py(await Qv({req:{...t,command:`replay`,session:n,positionals:[e],flags:_,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||y?{internal:{...t.internal??{},...y?{openLifecycle:y}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:f,onStep:h,invoke:async e=>{let t=v?await Hy(v):void 0;return t&&!t.ok?t:g(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:r,appendTimingEvent:a})=>{if(c)return Fy(await Uy({req:t,sessionName:e,sessionStore:i,artifactsDir:r,appendTimingEvent:a,artifactPaths:n,...c}))},discoverSources:fy(t.flags?.replayBackend),resolveShardTargets:my(t.flags),cleanupSession:async e=>{i.get(e)&&await yl({req:{token:t.token,session:e,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a})}});return d.status===`completed`?{ok:!0,data:d.data}:L(d.error.code,d.error.message)}return null}function Zy(e){if(!(!e.bindDevice||!e.bindExactDevice||!e.screenRecordingAdmissionLedger||!e.requestScope||!e.retainDeviceExecutionLock||!e.throwIfCanceled))return{bindDevice:e.bindDevice,bindExactDevice:e.bindExactDevice,screenRecordingAdmissionLedger:e.screenRecordingAdmissionLedger,requestScope:e.requestScope,retainDeviceExecutionLock:e.retainDeviceExecutionLock,throwIfCanceled:e.throwIfCanceled}}function Qy(e,t){let n=e.flags??{},r=e.meta?.cwd,i=eb(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:N.expandHome(i,r),failFast:n.failFast===!0,retries:$y(n.retries),timeoutMs:$y(n.timeoutMs),shard:Dy(n)}}function $y(e){return typeof e==`number`?e:void 0}function eb(e){return typeof e==`string`?e:void 0}function tb(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==He.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return ab(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return ab(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=ib(a);if(o)return ab(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return ab(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));Ct(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:ct(a,t.flags?.force),publication:`active`});return c.written?(pt(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...Ke(`Published script: ${c.path}`)}}):ab(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 nb(e){if(rt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:vt(e)?void 0:`not-armed`}const rb={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 ib(e){let t=nb(e);return t?rb[t]():void 0}function ab(e){return{ok:!1,error:t(e)}}function ob(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function sb(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function cb(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function lb(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Sn({type:`command`,status:`progress`,message:ub(t)})}function ub(e){return[qe(e),...We(e)].join(`
27
- `)}const db=2e3;async function fb(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=Yt(n,a);i&&$(e,await vb(o,n.id,r)),$(e,await pb(o,n))}async function pb(e,t){try{let n=await dn(e),r=mn(t);return n===await mb()&&!r?await hb(e,t,n):gb(t,n,r)}catch(e){return _b(e)}}async function mb(){try{return(await fn()).manifest.serviceComponent}catch{return}}async function hb(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,hn.previousIme],{allowFailure:!0,timeoutMs:db})).stdout.trim(),i=r&&r!==`null`?r:void 0;return{id:`android-test-ime`,status:`fail`,summary:`Android test IME helper is the active input method on ${t.id}, but no active session owns it -- likely left over from a crashed session.`,hint:`A stuck test IME leaves the real keyboard unavailable on this device until restored.`,command:i?`adb -s ${t.id} shell ime set ${i}`:`adb -s ${t.id} shell ime list -s`,evidence:{currentIme:n,previousIme:i}}}function gb(e,t,n){return{id:`android-test-ime`,status:`pass`,summary:n?`Android test IME helper is active for this session on ${e.id}.`:`Android test IME helper is not active on ${e.id}; the device's normal IME is in use.`,evidence:{currentIme:t}}}function _b(e){let n=t(e);return{id:`android-test-ime`,status:`warn`,summary:`Could not inspect the Android test IME helper state.`,hint:n.message,evidence:{code:n.code}}}async function vb(e,n,r){try{let t=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:db}),i=`tcp:${r} tcp:${r}`,a=t.stdout.includes(i);return{id:`android-reverse`,status:a?`pass`:`warn`,summary:a?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:a?void 0:`adb -s ${n} reverse tcp:${r} tcp:${r}`,evidence:{stdout:t.stdout.trim()}}}catch(e){let n=t(e);return{id:`android-reverse`,status:`warn`,summary:`Could not inspect Android adb reverse mappings.`,hint:n.message,evidence:{code:n.code}}}}async function yb(e,n){let{device:r,targetApp:i,session:a}=n;if(i)try{let t=await bb(r,i);if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${O(r)}.`,evidence:{requested:i,platform:O(r)}});return}$(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);$(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 ${O(r)} --all`,evidence:{code:i.code,message:i.message}})}}async function bb(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return xb(t,(await n(e,`all`)).map(e=>({id:e.package,name:e.name})))?.id}if(k(e)||A(e)){let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return xb(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function xb(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 Sb(e,n,r){let i=wb(n,r);try{let t=await Eb(i),n=Tb(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Ab(n,i,t.failures),hint:n.length===0?Nb(t.failures):void 0,command:n.length===0?Rb(i):void 0,evidence:zb(n,t.failures)}),n.length>0&&Db(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=t(n);return $(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 Cb(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:O(e),id:e.id,name:e.name}))}})}function wb(e,t){let n=e.flags??{};return An({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 Tb(e,t){return e.filter(e=>be(e,t,{includeExplicitSelectors:!0}))}async function Eb(e){if(e.platform)return{devices:await zn(e),failures:[]};let t=[],n=[];for(let r of Ut)try{t.push(...await zn({...e,platform:r}))}catch(e){n.push(kb(r,e))}return{devices:t,failures:n}}function Db(e,t){for(let n of t)$(e,Ob(n))}function Ob(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Ib(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Ib(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function kb(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Ab(e,t,n){if(e.length===0)return n.length>0?`No ${jb(t)} devices found; ${Mb(n)}.`:`No ${jb(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${jb(t)} ${Lb(e.length,`device`)} available; ${r} booted`,a=Pb(e,t);return a?`${i} (${a}).`:`${i}.`}function jb(e){let t=e.platform?Ib(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Mb(e){return e.slice(0,2).map(e=>`${Ib(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Nb(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Pb(e,t){if(t.platform||t.target)return;let n=Vt(e),r=Fb();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 Fb(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Ib(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 Lb(e,t){return e===1?t:`${t}s`}function Rb(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function zb(e,t){let n=new Map;for(let t of e){let e=O(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 Bb=1500;async function Vb(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 Hb(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Ub(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 Hb(e,t,n){try{return await(n.resolveProcessInfo??Wb)(e,t)}catch{return}}function Ub(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 Wb(e,t){if(!Gb(e))return;let n=await Kb(t);if(n!==void 0)return{pid:n,cwd:await qb(n)}}function Gb(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Kb(e){let t=await Xt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Bb});if(t.exitCode===0)return t.stdout.split(`
28
- `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function qb(e){let t=await Xt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Bb});if(t.exitCode===0)return t.stdout.split(`
29
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Jb=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Yb=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Xb(e,t){let n=tn(e.meta?.cwd);return{targetApp:tx(e.flags?.targetApp)??t?.appBundleId,metroHost:tx(e.runtime?.metroHost)??`127.0.0.1`,metroPort:nx(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:$b(e,n)}}function Zb(e,t={}){let n=ex(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 Qb(e,t,n,r={}){let i=n?e.toArray().filter(e=>e.name!==n.name&&e.device.platform===n.device.platform&&e.device.id===n.device.id).map(e=>e.name):[];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 ${O(n.device)}`:void 0,evidence:{session:n.name,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(n.name)}}]:[{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 $b(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function ex(e){let t={...Object.fromEntries([...Jb,...Yb].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 tx(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function nx(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}const rx=3e3;async function ix(e,t){if(t===`android`){$(e,await dx());return}if(t===`vega`){$(e,await ox());return}if(t===`harmonyos`){$(e,await ax());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await gx())}async function ax(){let e=await Sx(`hdc`,[`-v`]);return e?{id:`toolchain`,status:`pass`,summary:`HarmonyOS toolchain: ${e}.`,evidence:{hdcVersion:e}}:{id:`toolchain`,status:`info`,summary:`HarmonyOS toolchain: hdc not found or version check failed.`,hint:`Install HarmonyOS Command Line Tools, then add sdk/default/openharmony/toolchains to PATH or set HDC_SDK_PATH.`,command:`hdc -v`,evidence:{hdcVersion:null}}}async function ox(){let{resolveVegaToolProvider:e}=await import(`./tool-provider3.js`).then(e=>e.n),t=e();if(!await t.isAvailable())return{id:`toolchain`,status:`info`,summary:`Vega toolchain: Vega CLI not found.`,hint:`Install Vega Developer Tools or ensure ~/vega/bin/vega is executable.`,command:`vega --version`};let n=await t.version({allowFailure:!0,timeoutMs:rx}),r=await sx(),i=Cx(n.stdout),a=r.devices.some(e=>e.platform===`vega`&&e.kind===`emulator`&&e.target===`tv`&&e.booted===!0);return{id:`toolchain`,status:n.exitCode===0?`pass`:`info`,summary:i?`Vega toolchain: ${i}; ${a?`VVD running`:`no running VVD`}.`:`Vega toolchain: CLI found but version check failed.`,hint:a?void 0:`Start the Vega Virtual Device and retry doctor.`,evidence:{vegaVersion:i??null,deviceList:ux(r)}}}async function sx(){try{return{devices:await Vn({platform:`vega`,target:`tv`}),listedSerials:[]}}catch(e){if(On(e))throw e;return{devices:[],listedSerials:cx(e)}}}function cx(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)return[];let t=e.details?.listedSerials;return lx(t)?t:[]}function lx(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function ux(e){return(e.devices.length>0?e.devices.map(e=>e.id):e.listedSerials).join(`, `)||null}async function dx(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await xx(e),n=await Sx(`adb`,[`version`]);return n?fx({license:t,sdkRoot:e,versionLine:n}):hx(e,t)}function fx(e){return{id:`toolchain`,status:px(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${mx(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function px(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function mx(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function hx(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function gx(){let e=await Sx(`xcodebuild`,[`-version`]);return e?_x({selectedPath:await Sx(`xcode-select`,[`-p`]),versionLine:e}):bx()}function _x(e){return{id:`toolchain`,status:vx(e),summary:yx(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function vx(e){return e.versionLine?`pass`:`info`}function yx(e){return e.versionLine?e.selectedPath?`Apple toolchain: ${e.versionLine}; xcode-select ${e.selectedPath}.`:`Apple toolchain: ${e.versionLine}; xcode-select path unavailable.`:`Apple toolchain: xcodebuild version check failed.`}function bx(){return{id:`toolchain`,status:`info`,summary:`Apple toolchain: xcodebuild version check failed.`,hint:`Install/select Xcode and complete first launch/license setup if xcodebuild reports it.`,command:`xcodebuild -version`}}async function xx(e){if(!e)return`unknown`;try{return await ua(U.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function Sx(e,t){try{let n=await Xt(e,t,{allowFailure:!0,timeoutMs:rx});return n.exitCode===0?Cx(n.stdout):void 0}catch{return}}function Cx(e){return e.split(`
30
- `).map(e=>e.trim()).find(Boolean)}async function wx(e,t){$(e,await Tx(t))}async function Tx(e){let t=Kn({stateDir:e});if(!t.installed)return{id:`web-agent-browser-processes`,status:`info`,summary:`Managed web backend is not installed; no agent-device-owned browser processes counted.`,evidence:{stateDir:e,installed:!1}};try{let n=await qn(t);return{id:`web-agent-browser-processes`,status:n.count>0?`info`:`pass`,summary:n.count>0?`${n.count} live agent-device-owned Chrome process${n.count===1?``:`es`} detected.`:`No live agent-device-owned Chrome processes detected.`,evidence:{stateDir:e,installed:!0,count:n.count,pids:n.pids,matchReasons:n.processes.map(e=>e.reason)}}}catch(t){return{id:`web-agent-browser-processes`,status:`info`,summary:`Could not inspect live agent-device-owned Chrome processes.`,hint:`Run doctor again from a shell with permission to inspect local processes.`,evidence:{stateDir:e,error:t instanceof Error?t.message:String(t)}}}}async function Ex(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==M.doctor)return null;let a=r.get(n),o=Xb(t,a),s=kx(r,n),c=[];if(lb(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${p()} using ${s}`,evidence:{version:p(),stateDir:s}},...Zb(t,{required:o.remote}),...Qb(r,n,a,{remote:o.remote})),o.remote)return Mx(c,o);let l=await Sb(c,t,a);await ix(c,a?.device.platform??l?.platform);let u=await Ax({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await Ox(c,u??Dx(l)),Mx(c,o,{device:u,includeMetro:!0,inventory:l})}function Dx(e){let t=(e?.devices??[]).filter(e=>k(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function Ox(e,t){if(!(!t||!k(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||F(t))){if(Sn({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await Tn(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}vi(t,{}),Sn({type:`command`,status:`progress`,message:`Warming iOS runner build cache in the background (${t.name})...`}),$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner build started in the background; the first open gets faster once it completes`,hint:"Run `agent-device prepare ios-runner` to wait for a fully warmed runner instead."})}}function kx(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function Ax(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??Cb(t,n,r.targetApp);return s&&await jx(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await Vb(r.metroHost,r.metroPort,r.kind)),await wx(t,o),s}async function jx(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await yb(e,{device:r,session:a,targetApp:i.targetApp}),await fb(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function Mx(e,t,n={}){let r=ob(e);return{ok:!0,data:{status:r,summary:sb(r),kind:t.kind,platform:n.device?O(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:cb(e)}}}async function Nx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return L(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=J(M.prepare,o,s);if(c)return c;let l=await Y({session:o,flags:s,ensureReady:!0}),u=I(M.prepare,l);if(u)return u;let d=Date.now(),f=await Kr(l,Px(t,o,r,d));return{ok:!0,data:Ix(a,l,Math.max(0,Date.now()-d),f)}}function Px(e,t,n,r){let i=Fx(e);return{...qi({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:cn.fromTimeoutMs(i,r),startupTimeoutMs:i}}function Fx(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:pe}function Ix(e,t,n,r){return{action:e,platform:O(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Lx(n,r),message:`Prepared Apple runner: ${t.name}`}}function Lx(e,t){let n=Rx(t.buildMs),r=zx(t.connectMs),i=zx(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 Rx(e){return e===void 0?void 0:zx(e)}function zx(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function Bx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,command:a,positionals:o,recordPositionals:s,deriveNextSession:c}=e,l=i.get(n),u=t.flags??{},d=J(a,l,u);if(d)return d;let f=await Y({session:l,flags:u,ensureReady:!0}),p=I(a,f);if(p)return p;l&&Vi(t)===`may-invalidate`&&Oi(l);let m=await Ln(f,a,o,t.flags?.out,{...V(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;ta(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function Vx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=J(M.clipboard,a,o);if(s)return s;let c=(t.positionals?.[0]??``).toLowerCase();if(c!==`read`&&c!==`write`)return L(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let l=await Y({session:a,flags:o,ensureReady:!0}),u=I(M.clipboard,l);if(u)return u;let d=await Ln(l,M.clipboard,t.positionals??[],t.flags?.out,{...V(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return ta(i,a,t,t.command,d??{}),{ok:!0,data:{platform:O(l),...d??{}}}}const Hx=async({req:e,sessionName:t,sessionStore:n,bindDevice:r})=>await Il({req:e,sessionName:t,sessionStore:n,bindDevice:r}),Ux=async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await tu({req:e,sessionName:t,logPath:n,sessionStore:r}),Wx=async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o})=>await ff({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o}),Gx=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:a,invokeReplayAction:o,bindDevice:s,bindExactDevice:c,screenRecordingAdmissionLedger:l,requestScope:u,retainDeviceExecutionLock:d,throwIfCanceled:f})=>await Xy({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:o??a,bindDevice:s,bindExactDevice:c,screenRecordingAdmissionLedger:l,requestScope:u,retainDeviceExecutionLock:d,throwIfCanceled:f});async function Kx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.positionals?.[0]?.trim().toLowerCase();return!a&&(o===`dismiss`||o===`enter`||o===`return`)&&(t.flags??{}).platform===`ios`?L(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await Bx({req:t,sessionName:n,logPath:r,sessionStore:i,command:M.keyboard,positionals:t.positionals??[]})}async function qx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]?.trim(),o=t.positionals?.[1]?.trim();return!a||!o?L(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`):await Bx({req:t,sessionName:n,logPath:r,sessionStore:i,command:M.push,positionals:[a,Zx(o,t.meta?.cwd)],recordPositionals:[a,o]})}async function Jx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;return await Bx({req:t,sessionName:n,logPath:r,sessionStore:i,command:M.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await Sc(e.device,n,e.appBundleId,vc)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}const Yx={session_list:Hx,devices:Hx,capabilities:Hx,apps:Hx,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await Ex({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),boot:Ux,shutdown:Ux,appstate:Ux,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>tb({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,sessionStore:n})=>await Xs({req:e,sessionName:t,sessionStore:n}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Vx({req:e,sessionName:t,logPath:n,sessionStore:r}),keyboard:Kx,perf:Wx,logs:Wx,events:Wx,network:Wx,audio:Wx,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Nx({req:e,sessionName:t,logPath:n,sessionStore:r}),install:async({req:e,sessionName:t,sessionStore:n})=>await Ol({req:e,command:`install`,sessionName:t,sessionStore:n,deployOps:Dl}),reinstall:async({req:e,sessionName:t,sessionStore:n})=>await Ol({req:e,command:`reinstall`,sessionName:t,sessionStore:n,deployOps:El}),install_source:async({req:e,sessionName:t,sessionStore:n})=>await Uo({req:e,sessionName:t,sessionStore:n}),release_materialized_paths:async({req:e})=>await Qo({req:e}),push:qx,"trigger-app-event":Jx,open:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Mc({req:e,sessionName:t,logPath:n,sessionStore:r,openResponse:await Xc({req:e,sessionName:t,logPath:n,sessionStore:r})}),replay:Gx,test:Gx,batch:async({req:e,sessionName:t,invoke:n})=>await Fl(e,t,n),close:async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})=>await yl({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})};async function Xx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new tr,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l,bindDevice:u,bindExactDevice:d,appLogAdmissionLedger:f,screenRecordingAdmissionLedger:p,requestScope:m,retainDeviceExecutionLock:h,throwIfCanceled:g}=e,_=Yx[t.command];return _?await _({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l,bindDevice:u,bindExactDevice:d,appLogAdmissionLedger:f,screenRecordingAdmissionLedger:p,requestScope:m,retainDeviceExecutionLock:h,throwIfCanceled:g}):null}function Zx(e,t){let n=jn(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>N.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{Xx as handleSessionCommands};
1
+ import{t as e}from"./string-enum.js";const t=[`app`,`frontmost-app`,`desktop`,`menubar`],n=e(t,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${t.join(`|`)}.`});function r(e){return n.parse(e)}export{r as n,t};