agent-device 0.20.6 → 0.20.7

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 (175) hide show
  1. package/README.md +3 -3
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.6.apk → agent-device-android-ime-helper-0.20.7.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.7.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.6.manifest.json → agent-device-android-ime-helper-0.20.7.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.6.apk → agent-device-android-snapshot-helper-0.20.7.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.7.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.6.manifest.json → agent-device-android-snapshot-helper-0.20.7.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +20 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +67 -0
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +339 -4
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +78 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +31 -2
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +29 -7
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +4 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +36 -28
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +7 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +4 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +2 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +100 -12
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +4 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +57 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -0
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +18 -3
  24. package/dist/src/agent-browser-tool.js +1 -1
  25. package/dist/src/agent-device-client.js +2 -2
  26. package/dist/src/android-adb.js +1 -1
  27. package/dist/src/android.js +1 -1
  28. package/dist/src/app-helpers.js +1 -1
  29. package/dist/src/app-lifecycle.js +7 -7
  30. package/dist/src/app-lifecycle2.js +2 -0
  31. package/dist/src/app-log-files.js +1 -0
  32. package/dist/src/app-log-reconnect.js +1 -0
  33. package/dist/src/app-log-runtime.js +4 -0
  34. package/dist/src/app-resolution.js +2 -1
  35. package/dist/src/apps.js +5 -5
  36. package/dist/src/audio-probe.js +1 -1
  37. package/dist/src/auth-session.js +1 -0
  38. package/dist/src/auth.js +2 -0
  39. package/dist/src/boot-diagnostics.js +2 -2
  40. package/dist/src/cli-config.js +1 -1
  41. package/dist/src/cli-grammar.js +1 -0
  42. package/dist/src/cli-help.js +199 -259
  43. package/dist/src/cli-output.js +1 -0
  44. package/dist/src/cli-runner.js +1 -2
  45. package/dist/src/cli.js +6 -16
  46. package/dist/src/client-metro.js +1 -1
  47. package/dist/src/cloud-artifacts.d.ts +2 -137
  48. package/dist/src/command-schema.js +3 -3
  49. package/dist/src/connection-runtime.js +1 -0
  50. package/dist/src/connection.js +5 -0
  51. package/dist/src/context.js +1 -1
  52. package/dist/src/daemon-shutdown-report.js +1 -0
  53. package/dist/src/daemon.js +2 -0
  54. package/dist/src/debug-symbols.js +3 -3
  55. package/dist/src/device-claim-inspection.js +1 -0
  56. package/dist/src/device-input-state.js +2 -2
  57. package/dist/src/device.js +1 -1
  58. package/dist/src/device2.js +2 -0
  59. package/dist/src/find.js +1 -1
  60. package/dist/src/finders.js +1 -1
  61. package/dist/src/generic-settle.js +1 -1
  62. package/dist/src/generic.js +1 -1
  63. package/dist/src/harmonyos.js +1 -0
  64. package/dist/src/helper.js +1 -1
  65. package/dist/src/host-process.js +2 -2
  66. package/dist/src/ime-lifecycle.js +7 -7
  67. package/dist/src/index.d.ts +43 -12
  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 -0
  71. package/dist/src/install-artifact.js +1 -5
  72. package/dist/src/install-artifact2.js +1 -1
  73. package/dist/src/install-source2.js +1 -1
  74. package/dist/src/interaction-runtime.js +1 -1
  75. package/dist/src/interaction-snapshot.js +1 -1
  76. package/dist/src/interaction-touch-reference-frame.js +1 -1
  77. package/dist/src/interaction.js +1 -1
  78. package/dist/src/interactor.js +2 -2
  79. package/dist/src/interactor2.js +1 -1
  80. package/dist/src/internal/bin.js +2 -2
  81. package/dist/src/internal/daemon.js +8 -15
  82. package/dist/src/inventory.js +5 -0
  83. package/dist/src/inventory2.js +1 -0
  84. package/dist/src/inventory3.js +2 -0
  85. package/dist/src/inventory4.js +1 -0
  86. package/dist/src/inventory5.js +1 -0
  87. package/dist/src/inventory6.js +1 -0
  88. package/dist/src/lease-context.js +1 -1
  89. package/dist/src/lease.js +1 -1
  90. package/dist/src/limrun-runtime-dependencies.js +1 -0
  91. package/dist/src/limrun.d.ts +10 -125
  92. package/dist/src/limrun.js +1 -1
  93. package/dist/src/linux.js +1 -1
  94. package/dist/src/logcat.js +1 -1
  95. package/dist/src/manifest.js +1 -1
  96. package/dist/src/owner-identity.js +1 -0
  97. package/dist/src/physical-device-control.js +1 -1
  98. package/dist/src/platform-runtime-app-log-android-transport.js +1 -0
  99. package/dist/src/platform-runtime-app-log-process.js +1 -0
  100. package/dist/src/platform-runtime-host.js +1 -0
  101. package/dist/src/platform-runtime-network-web-transport.js +1 -0
  102. package/dist/src/platform-runtime-operation-host.js +5 -0
  103. package/dist/src/platform-runtime-toolchain-host.js +1 -0
  104. package/dist/src/platform-runtime.js +1 -0
  105. package/dist/src/prepare-kind.js +15 -0
  106. package/dist/src/process-entry.js +1 -0
  107. package/dist/src/process-lock.js +1 -1
  108. package/dist/src/provider-webdriver.js +1 -0
  109. package/dist/src/provider.js +1 -0
  110. package/dist/src/proxy.js +2 -0
  111. package/dist/src/react-native.js +1 -1
  112. package/dist/src/record-trace.js +1 -1
  113. package/dist/src/registry.js +24 -24
  114. package/dist/src/remote-config2.js +1 -1
  115. package/dist/src/replay.js +3 -0
  116. package/dist/src/reporting.js +3 -3
  117. package/dist/src/runner-client.js +1 -1
  118. package/dist/src/runner-disposal.js +1 -1
  119. package/dist/src/runner-lease.js +1 -1
  120. package/dist/src/runtime.js +2 -2
  121. package/dist/src/runtime2.js +4 -0
  122. package/dist/src/runtime3.js +3 -0
  123. package/dist/src/runtime4.js +1 -0
  124. package/dist/src/runtime5.js +1 -0
  125. package/dist/src/runtime6.js +1 -0
  126. package/dist/src/runtime7.js +1 -0
  127. package/dist/src/screenshot-result.js +4 -4
  128. package/dist/src/screenshot.js +1 -0
  129. package/dist/src/sdk-android-adb.js +2 -2
  130. package/dist/src/sdk-batch-runner.js +3 -3
  131. package/dist/src/sdk-contracts.d.ts +31 -5
  132. package/dist/src/sdk-contracts.js +1 -1
  133. package/dist/src/sdk-device.js +1 -1
  134. package/dist/src/sdk-finders.js +1 -1
  135. package/dist/src/sdk-remote-config.js +1 -1
  136. package/dist/src/sdk-selectors.d.ts +280 -4
  137. package/dist/src/sdk-selectors.js +1 -1
  138. package/dist/src/selector-runtime.js +1 -1
  139. package/dist/src/selector-vocabulary.js +1 -1
  140. package/dist/src/selectors.js +1 -1
  141. package/dist/src/server.js +3 -3
  142. package/dist/src/session-target-evidence.js +1 -1
  143. package/dist/src/session.js +10 -9
  144. package/dist/src/shared.js +2 -0
  145. package/dist/src/shell-quote.js +1 -0
  146. package/dist/src/simulator.js +1 -1
  147. package/dist/src/snapshot-runtime.js +1 -0
  148. package/dist/src/snapshot-session.js +1 -0
  149. package/dist/src/snapshot.js +1 -1
  150. package/dist/src/snapshot2.js +1 -1
  151. package/dist/src/src.js +1 -1
  152. package/dist/src/src2.js +2 -0
  153. package/dist/src/src3.js +1 -0
  154. package/dist/src/text-surface.js +1 -1
  155. package/dist/src/timing-safe-equal.js +1 -0
  156. package/dist/src/tool-provider.js +3 -3
  157. package/dist/src/tool-provider2.js +1 -1
  158. package/dist/src/tool-provider3.js +1 -1
  159. package/dist/src/update-check.js +1 -1
  160. package/dist/src/version.js +1 -1
  161. package/dist/src/web.js +1 -1
  162. package/package.json +36 -20
  163. package/server.json +2 -2
  164. package/skills/agent-device/SKILL.md +6 -31
  165. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.6.apk.sha256 +0 -1
  166. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.6.apk.sha256 +0 -1
  167. package/dist/src/app-log-request-scope.js +0 -1
  168. package/dist/src/devices.js +0 -1
  169. package/dist/src/devices2.js +0 -1
  170. package/dist/src/devices3.js +0 -1
  171. package/dist/src/devices4.js +0 -1
  172. package/dist/src/provider-limrun-runtime.js +0 -1
  173. package/dist/src/register-builtins.js +0 -1
  174. package/dist/src/screenshot-geometry.js +0 -1
  175. package/dist/src/viewport-dimension.js +0 -15
@@ -1,7 +1,8 @@
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{B as c,G as l,V as u,ht as d,mt as f,tt as p,vt as m}from"./screenshot-geometry.js";import{B as h,D as g,E as _,Gt as v,H as y,Q as b,T as x,U as ee,V as S,W as C,X as w,Xt as te,Y as T,c as ne,l as re,ln as ie,n as ae,nn as E,on as oe,pn as se,q as ce,s as D,t as le,tt as ue,wn as O}from"./sdk-batch-runner.js";import{_ as de,c as k,d as fe,h as A,l as pe,m as me,o as j,p as he,s as M}from"./sdk-device.js";import{At as ge,Bt as _e,Et as ve,Ft as ye,Gt as be,I as xe,It as Se,Kt as N,L as Ce,Lt as we,Mt as Te,Nt as Ee,Ot as De,Q as Oe,Rt as ke,St as Ae,Wt as je,X as Me,Z as Ne,et as Pe,fn as Fe,k as Ie,n as Le,nn as Re,pn as ze,q as Be,r as Ve,rn as He,vt as Ue,wt as We,xt as Ge,y as Ke,yt as qe,zt as Je}from"./viewport-dimension.js";import{$ as Ye,A as Xe,B as Ze,C as P,Ct as Qe,E as $e,F as et,G as tt,H as nt,J as rt,K as it,Q as at,R as ot,St as st,T as ct,Tt as lt,U as ut,V as dt,W as ft,X as pt,Y as mt,Z as ht,at as gt,bt as _t,dt as vt,et as yt,ft as bt,it as xt,nt as St,ot as Ct,q as wt,tt as Tt,wt as Et,xt as Dt,yt as Ot,z as kt}from"./screenshot-result.js";import{a as At,n as jt,o as Mt,r as Nt,s as Pt,t as Ft}from"./session-target-evidence.js";import{c as It,d as Lt,m as Rt,o as zt}from"./device.js";import{s as Bt}from"./runtime.js";import{C as Vt,N as Ht,P as Ut,j as F,p as Wt,s as Gt,v as Kt}from"./sdk-android-adb.js";import{n as qt}from"./version.js";import{t as Jt}from"./timeouts.js";import{n as Yt,r as Xt,t as Zt}from"./runtime-transport.js";import{f as Qt,p as $t,s as en}from"./app-lifecycle.js";import{a as tn}from"./install-artifact.js";import{a as nn,o as rn,r as an,s as on}from"./boot-diagnostics.js";import{n as sn}from"./entities.js";import{a as cn,l as ln,n as un,r as dn,t as fn}from"./ime-lifecycle.js";import{a as I,o as pn,s as mn}from"./selector-vocabulary.js";import{D as hn,F as gn,I as _n,L as vn,M as yn,N as bn,O as xn,P as Sn,j as Cn,u as wn}from"./runner-disposal.js";import{S as L,a as Tn,b as En,c as Dn,d as On,g as kn,h as An,i as jn,l as R,m as Mn,n as Nn,s as z,t as B,u as Pn,v as Fn,x as In}from"./context.js";import{r as Ln,t as Rn}from"./register-builtins.js";import{a as zn}from"./tool-provider.js";import{n as Bn,s as Vn}from"./agent-browser-tool.js";import{L as Hn}from"./physical-device-control.js";import{r as Un}from"./helper.js";import{c as Wn,i as Gn,l as Kn,n as qn,r as Jn,s as Yn,t as Xn}from"./runner-client.js";import{$ as Zn,A as Qn,At as $n,B as er,Bt as tr,C as nr,Ct as rr,D as ir,Dt as ar,E as or,Et as sr,F as cr,G as lr,H as ur,Ht as dr,I as fr,J as pr,K as mr,Kt as hr,L as gr,M as _r,N as vr,O as yr,Ot as br,P as xr,Pt as Sr,Q as Cr,Qt as wr,R as Tr,S as Er,St as V,T as Dr,Tt as Or,U as kr,V as Ar,W as jr,X as Mr,Xt as Nr,Y as Pr,Z as Fr,_ as Ir,_t as Lr,a as Rr,an as zr,at as Br,b as Vr,bt as H,c as Hr,cn as Ur,ct as Wr,d as Gr,dn as Kr,dt as qr,et as Jr,f as Yr,fn as Xr,ft as Zr,g as Qr,gt as $r,h as ei,hn as ti,ht as ni,i as ri,in as ii,j as ai,k as oi,kt as si,l as ci,ln as li,lt as ui,m as di,mt as fi,n as pi,nt as mi,o as hi,on as gi,ot as _i,p as vi,pn as yi,pt as bi,q as xi,qt as Si,r as Ci,rt as wi,s as Ti,sn as Ei,st as Di,t as Oi,tn as ki,tt as Ai,u as ji,un as Mi,ut as Ni,v as Pi,vt as Fi,w as Ii,wt as Li,x as Ri,xt as zi,y as Bi,yt as Vi,z as Hi}from"./internal/daemon.js";import"./apps.js";import{a as Ui,n as Wi}from"./simulator.js";import{i as Gi}from"./app-resolution.js";import U from"node:path";import{createHash as Ki}from"node:crypto";import W,{promises as qi}from"node:fs";import Ji from"node:os";import{access as Yi}from"node:fs/promises";import{setTimeout as Xi}from"node:timers/promises";import Zi from"node:vm";function Qi(e){return e.startsWith(`AD_`)}function $i(e){return new n(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${e} to avoid the AD_ prefix.`)}function ea(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(Qi(n))throw $i(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function ta(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&&Ot.test(e)&&(Qi(e)||(t[e]=r))}return t}function na(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(!Ot.test(i))throw new n(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(Qi(i))throw $i(i);t[i]=r.slice(e+1)}return t}function ra(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ia(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 aa(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function oa(e){return aa(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||!aa(e[n]))return null;for(n+=1;n<e.length&&oa(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 la(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))Qi(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 ua(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>la(e,t,n)),flags:da(e.flags,t,n)??{},runtime:da(e.runtime,t,n)}}function da(e,t,n){return e&&fa(e,t,n)}function fa(e,t,n){return typeof e==`string`?la(e,t,n):Array.isArray(e)?e.map(e=>fa(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,fa(r,t,n)])):e}function pa(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!Qi(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function ma(e,t){return V({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function ha(e){return V({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function ga(e,t){let n=xa(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},ha(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:_a(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function _a(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function va(e,t,n,r){let i=xa(await r.resolveTarget({selector:e,...t},ma(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Vi(`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 ya(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 ba(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 xa(e,t){return Sa(e,t),Ca(e),wa(e),Ta(e),e}function Sa(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Ca(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function wa(e){if(e.rect!==void 0&&!ba(e.rect)||e.viewport!==void 0&&!ba(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Ta(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ea(e,t,n,r,i){let a=Da(e,t,n,i);if(!a)return;let{start:o,end:s}=Na(a,n);return{gesture:{from:o,to:s,durationMs:r},viewport:a}}function Da(e,t,n,r){let i=n===`up`||n===`down`,a=$r({nodes:e.nodes,matches:e.nodes.filter(e=>ie(e)),platform:r}),o=ka(e.nodes)??Aa(a);if(!o||!E(o))return;let s=a.flatMap(e=>{if(!E(e.rect))return[];let t=ja(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=>Lr(e,t))){let e=Oa(n,c),t=e?l.get(e.index):void 0;if(t)return t.viewport}return s.sort(Ma)[0]?.viewport}function Oa(e,t){return ie(e)?e:v(e,t)}function ka(e){return e.filter(e=>E(e.rect)&&te(e)).sort((e,t)=>t.rect.width*t.rect.height-e.rect.width*e.rect.height)[0]?.rect}function Aa(e){let t;for(let n of e)E(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function ja(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 Ma(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Na(e,t){let n=G(e,.5,.5),r=I.scrollUntilVisibleSwipe.nearEdgeFraction,i=I.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 Pa(e,t,r){let i=H(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(ma(t,t.command)):void 0;return{authored:e,gesture:Ia(await Fa(e.start,t,r,a),await Fa(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(ma(t,t.command)),{start:a,end:o}=La(n,e.direction,r.platform);return{authored:e,gesture:Ia(a,o,i),viewport:n}}let a=await va(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?I.command.optionalTargetLookupTimeoutMs:I.command.targetLookupTimeoutMs},t,r),o=a.viewport??await r.resolveGestureViewport(ma(t,t.command)),{start:s,end:c}=Ra(a,e.direction,o);return{authored:e,gesture:Ia(s,c,i),target:a,viewport:o}}async function Fa(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(ma(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 Ia(e,t,n){return{from:e,to:t,durationMs:n??I.command.swipeDurationMs}}function La(e,t,n){if(t===`left`||t===`right`){let n=p(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=I.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 Ra(e,t,n){let r=zi(e.rect),i=n.x+Math.trunc(n.width*I.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*I.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*I.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*I.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 za={launchApp:Wa,stopApp:Wa,openLink:Wa,tapOn:Ka,doubleTapOn:Ka,longPressOn:Ka,swipe:Za,inputText:Qa,eraseText:Qa,scroll:$a,scrollUntilVisible:$a,hideKeyboard:$a,pressKey:$a,back:$a,waitForAnimationToEnd:$a,takeScreenshot:no,runScript:no,assertVisible:ro,assertNotVisible:ro,extendedWaitUntil:ro},Ba={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 Va(e){return Ba[e.kind]}async function Ha(e,t){let n=e.command;return await Ua(n,e,t,ma(e,n))}function Ua(e,t,n,r){let i=za[e.kind];return i(e,t,n,r)}async function Wa(e,t,n,r){switch(e.kind){case`launchApp`:return await K(n.launchApp,Ga(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 Ga(e,t){return V({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function Ka(e,t,n,r){switch(e.kind){case`tapOn`:return await qa(e,t,n,r);case`doubleTapOn`:{let i=await fo(e.target,{purpose:`doubleTap`,timeoutMs:Ya(e)},t,n),a=H(e.delay,`doubleTapOn.delay`)??I.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?ya(i.resolution):void 0)}case`longPressOn`:{let i=await fo(e.target,{purpose:`longPress`,timeoutMs:Ya(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?ya(i.resolution):void 0)}}}async function qa(e,t,n,r){let i=await Ja(e,t,n);return await K(n.tapOn,Xa(e,i),r,`invalidate`,i.resolution?ya(i.resolution):void 0)}async function Ja(e,t,n){let r={purpose:`tap`,timeoutMs:Ya(e),index:H(e.index,`tapOn.index`),childOf:e.childOf,allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await fo(e.target,r,t,n)}function Ya(e){return e.optional===!0?I.command.optionalTargetLookupTimeoutMs:I.command.targetLookupTimeoutMs}function Xa(e,t){let n=H(e.repeat,`tapOn.repeat`),r=H(e.delay,`tapOn.delay`),i=n===void 0?r:r??I.command.repeatDelayMs;return V({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Za(e,t,n,r){let i=await Pa(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?ya(i.target):void 0)}async function Qa(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,V({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,V({charactersToErase:H(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function $a(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,eo(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,to(e),r,`preserve`)}}function eo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:H(e.timeout,`scrollUntilVisible.timeout`)??I.command.scrollUntilVisibleTimeoutMs,durationMs:mn(I.command.scrollUntilVisibleSpeed)}}function to(e){return V({timeoutMs:H(e.timeout,`waitForAnimationToEnd.timeout`)})}async function no(e,t,n,r){switch(e.kind){case`takeScreenshot`:return ao(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,V({file:e.file,env:e.env}),r,`preserve`)}}async function ro(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=io(n,r);return ao(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function io(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function ao(e,t,n,r){let i=e?.observation;return oo(i,r),{...so(n??i),...co(e?.outputEnv),...lo(t,e?.artifactPaths),...uo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function oo(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 so(e){return e?{observation:e}:{}}function co(e){return e?{outputEnv:{...e}}:{}}function lo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function uo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function fo(e,t,n,r){if(e.space===`target`){let i=await va(e.selector,t,n,r);return{authored:e,point:zi(i.rect),resolution:i}}return{authored:e,point:await Fa(e,n,r)}}function po(e,t,n,r={}){let i=fi(e,t.selector,n,t.childOf);if(!i.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:_o(t,i.matches,[],void 0)};let{matches:a,ranked:o}=i,s=ni(o,t.index),c=_o(t,a,o,s?.node);if(!s)return mo(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?ho(t,{...s,rect:l},r.canonicalSnapshot):0,evidence:c}}function mo(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 ho(e,t,n){if(!n)return 0;let r=fi(n,e.selector,`ios`).ranked;if(r.length!==1)return r.length;let i=ni(r,void 0);return i&&i.node.hittable!==!1&&go(i.rect,t.rect)?1:0}function go(e,t){let n=zi(e),r=zi(t);return n.x===r.x&&n.y===r.y}function _o(e,t,n,r){return V({selector:e.selector,childOf:e.childOf,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:pn,retryTapMaxAttempts:I.command.retryTapMaxAttempts,longPressDurationMs:I.command.longPressDurationMs,eraseTextMaxCharacters:I.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:I.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:I.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:I.command.waitForAnimationToEndDifferencePercent,observationPollMs:I.observation.pollIntervalMs};function vo(e,t={}){return{execute:async n=>{let r=ma(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Va(n.command)&&!i,visualStabilityBarrier:i});let a=await Ha(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await ga(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function yo(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function bo(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:yo(t)}}function xo(e){let t=bo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:ti(n,e.meta?.tenantId)},cleanup:()=>{yi(n)}}}function So(e){return e===`ios`||e===`android`?e:void 0}function Co(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 wo(e){let t=So(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 ei(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 ei(r),r}async function To(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await Vr({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function Eo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Do(e){let{session:t,sessionStore:n,req:r,data:i}=e;di(n,t,r,`install_source`,i,{positionals:[]})}async function Oo(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);try{let e=xo(n),t=Co(n),o=await wo({session:a,flags:n.flags}),s=R(`install`,o,{message:`install_from_source is not supported on this device`});if(s)return s;let c=bn(n.meta?.requestId);if(M(o)){let{prepareIosInstallArtifact:s}=await import(`./install-artifact2.js`).then(e=>e.t),l=await s(e.source,{signal:c});return await ko({prepared:l,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Ao(o,l,e)})}let{prepareAndroidInstallArtifact:l}=await import(`./install-artifact.js`).then(e=>e.t),u=await l(e.source,{signal:c});return await ko({prepared:u,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await jo(o,u,e)})}catch(e){return{ok:!1,error:t(e)}}}async function ko(e){let t;try{t=await To(e);let n=await e.buildResult(t),r=ze(n,Io(n));return Do({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await Pi(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function Ao(e,t,n){let r=await In(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 Mo(t,r,n)}async function jo(e,t,n){let r=await In(e,t.installablePath,{packageNameHint:t.packageName}),i=await Fo(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...Eo(n),packageName:i,...Po(r?.appName??o),launchTarget:r?.launchTarget??i}}function Mo(e,t,n){let r=No(e,t),i=t?.appName??e.appName;return{...Eo(n),bundleId:r,...Po(i),launchTarget:t?.launchTarget??r}}function No(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 Po(e){return e?{appName:e}:{}}async function Fo(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 Io(e){return`Installed: ${He(e)}`}async function Lo(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 Pi(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:t(e)}}}function J(e){return M(e)&&e.kind===`simulator`}function Ro(e){return e.platform===`android`&&e.kind===`emulator`}function Y(e,t,n){return t||ii(n)?null:z(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function zo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function Bo(e,t){L(e)||!J(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function X(e){let t=ii(e.flags)||!e.session?await kn(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await Vo(e.session.device);return e.ensureReady!==!1&&await ei(t),t}async function Vo(e){if(L(e)||!M(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(Yn(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 Ho(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 Uo(e,t){return t?si(t,e).length===0:!1}const Wo=`debug_http_host`,Go=`dev_server_https`,Ko=`RCT_jsLocation`,qo=`RCT_packager_scheme`,Jo=`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.`,Yo=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
3
- `);function Xo(e){return Zt(e)!==void 0}async function Zo(e){let{device:t,appId:n,runtime:r}=e;if(L(t)||!n)return;let i=Zt(r);if(i){if(t.platform===`android`){await es(t,n,i);return}M(t)&&t.kind===`simulator`&&await cs(t,n,i)}}async function Qo(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await ts(t,n);return}M(t)&&t.kind===`simulator`&&await ls(t,n)}}function $o(e){return[`shared_prefs/${e}_preferences.xml`,`shared_prefs/ReactNativeDevPrefs.xml`]}async function es(e,t,n){hs(t);let r=[];for(let i of $o(t)){let a=ds(await ns(e,t,i),Wo,`${n.host}:${n.port}`);a=fs(a,Go,n.scheme===`https`),r.push({path:i,xml:a})}await rs(e,t,r)}async function ts(e,t){hs(t);let n=[];for(let r of $o(t)){let i=await ns(e,t,r),a=ms(ms(i,Wo),Go);a!==i&&n.push({path:r,xml:a})}n.length!==0&&await rs(e,t,n)}async function ns(e,t,n){let r=await tn(e,[`shell`,`run-as`,t,`cat`,n],{allowFailure:!0});return r.exitCode===0?us(r.stdout):Yo}async function rs(e,t,n){await is(e,t);try{await os(e,t,n)}catch(e){throw ss(e,t)}}async function is(e,t){let n=[`shell`,`run-as`,t,`id`],r=await tn(e,n,{allowFailure:!0});if(r.exitCode!==0)throw as(r,t,n)}function as(e,t,r){let i=_s(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}`,Wt(e,{package:t,cmd:`adb`,args:r,hint:i?Jo:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}async function os(e,t,n){await tn(e,[`shell`,`run-as`,t,`mkdir`,`-p`,`shared_prefs`]);for(let r of n)await tn(e,[`shell`,`run-as`,t,`tee`,r.path],{stdin:r.xml.trimEnd()})}function ss(e,t){let r=s(e);if(r.code===`TOOL_MISSING`)return r;let i=_s(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?Jo:`adb run-as succeeded, but writing React Native dev-server preferences failed. Inspect stderr/details for the failing shell command.`},r)}async function cs(e,t,n){await zn(Hn(e,[`spawn`,e.id,`defaults`,`write`,t,Ko,`-string`,`${n.host}:${n.port}`])),await zn(Hn(e,[`spawn`,e.id,`defaults`,`write`,t,qo,`-string`,n.scheme]))}async function ls(e,t){await zn(Hn(e,[`spawn`,e.id,`defaults`,`delete`,t,Ko]),{allowFailure:!0}),await zn(Hn(e,[`spawn`,e.id,`defaults`,`delete`,t,qo]),{allowFailure:!0})}function us(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?Yo:`${t}\n`}function ds(e,t,n){let r=` <string name="${sn(t)}">${sn(n)}</string>`;return ps(ms(e,t),r)}function fs(e,t,n){let r=` <boolean name="${sn(t)}" value="${n?`true`:`false`}" />`;return ps(ms(e,t),r)}function ps(e,t){return us(e).replace(`</map>`,`${t}\n</map>`)}function ms(e,t){let n=gs(t);return us(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 hs(e){if(Qt(e)!==`binary`)return;let t=$t(e);throw new n(`INVALID_ARGS`,t,{package:e,hint:t})}function gs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function _s(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 vs=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function ys(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function bs(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return Yt(e)}}function xs(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 Ss(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return xs(e)}}function Cs(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 ws(e){if(e===`ios`||e===`android`)return e}function Ts(e,t){return{platform:t,metroHost:Yt(e?.metroHost),metroPort:xs(e?.metroPort),bundleUrl:Yt(e?.bundleUrl),launchUrl:Yt(e?.launchUrl)}}function Es(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 Ds(e){if(Ro(e))return`10.0.2.2`;if(J(e))return`127.0.0.1`}function Os(e,t){if(!e||Yt(e.metroHost)||Yt(e.bundleUrl)||e.metroPort===void 0)return e;let n=Ds(t);return n?{...e,metroHost:n}:e}function ks(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=>!vs.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${vs.join(`, `)}.`);return{platform:Cs(a.platform,r,i),metroHost:bs(a.metroHost,`metroHost`),metroPort:Ss(a.metroPort),bundleUrl:bs(a.bundleUrl,`bundleUrl`),launchUrl:bs(a.launchUrl,`launchUrl`)}}function As(e,t,n){if(n){if(ys(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function js(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?A(r):void 0,s=ws(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 Ms(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?ws(A(i)):e.platform,o=n.getRuntimeHints(r),s=ks({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=js(n,r,i,a);return{runtime:i?Os(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&ys(s)>0?s:void 0;return{runtime:i?Os(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Ns(e){return Ms(e).runtime}function Ps(e){try{return{ok:!0,data:Ms(e)}}catch(e){let t=s(e);return z(t.code,t.message,t.details)}}async function Fs(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!Xo(n)||Xo(r)||await Qo({device:i.device,appId:i.appBundleId})}async function Is(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Hs(t);if(!Ls(i))return z(`INVALID_ARGS`,`runtime requires set, show, clear, or port-reverse`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Rs(n,r,a,o):i===`show`?zs(n,o):Vs({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function Ls(e){return e===`set`||e===`show`||e===`clear`}async function Rs(e,t,n,r){return Xo(r)&&n?.appBundleId&&await Qo({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function zs(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Bs(e){return e?A(e.device):void 0}function Vs(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Bs(i),s=ws(t.flags?.platform??a?.platform??o);if(!s)return z(`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 z(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Es(a,Ts(t.flags,s));return ys(c)===0?z(`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 Hs(e){let t=Us(e);if(!t.ok)return t.response;let n=await Fn(t.options);return n?{ok:!0,data:{action:`port-reverse`,...n}}:z(`UNSUPPORTED_OPERATION`,`No active provider device runtime supports port reverse for this lease.`)}function Us(e){let t=Ws(e);if(!t.ok)return t;let n=Gs(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 Ws(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:z(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:z(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Gs(e){let t=Ks(e.flags?.devicePort),n=Ks(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:z(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Ks(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const qs=`open-command-roundtrip`,Js=`Not implemented for this platform in this release.`;function Ys(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=A(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,fe(d.platform)&&(h.serial=d.id)),d&&M(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...Fe(`Opened: ${o??s??t}`)}}function Xs(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s,saveScript:c}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,recordSession:t.recordSession||c,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,recordSession:c,actions:[]}}const Zs=new Set([`app`,`desktop`,`frontmost-app`]);function Qs(e,t,r){if(e.platform===`linux`){if(!t)return`app`;let e=je(t);if(!Zs.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(!k(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 $s(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(k(t)||t.platform===`linux`)&&!n?i??`app`:Qs(t,n,r)}async function ec(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Un();return{appBundleId:t.bundleId,appName:t.appName}}async function tc(e,t,n){if(!(!j(e.platform)||!t))return D(t)?k(e)?void 0:e.kind===`device`?re(n,t):ne(t)?void 0:n??await nc(e,t):await rc(e,t)}async function nc(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function rc(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function ic(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 ac(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 oc(e,t){return e.platform===`android`&&!!(t&&D(t))}async function sc(e,t,n,r){return M(e)&&L(e)?n:await tc(e,t,n)??await r(e,t)??(oc(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 lc(e){let{launchUrl:t,device:n,req:r,logPath:i,appBundleId:a,traceLogPath:o}=e,s=B(i,r.flags?{...r.flags,clearAppState:void 0,launchConsole:void 0,launchArgs:void 0}:void 0,a,o);await Nn(n,`open`,[t],r.flags?.out,s)}function uc(e){return z(`INVALID_ARGS`,e)}function dc(e,t,r,i){try{return $s({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return z(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}function fc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&D(n)?uc(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&Qt(n)===`binary`?uc($t(n)):null:uc(`open --relaunch is supported only for app surfaces.`):null}function pc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&D(n)?uc(`open --relaunch does not support URL targets.`):r===`android`&&n&&Qt(n)===`binary`?uc($t(n)):null:null}async function mc(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await ei(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await hc({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=Ps({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 Fs({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function hc(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await ec(n);return{appBundleId:a.appBundleId??await sc(t,r,i,ic),appName:a.appName??r}}const gc=new Map;function _c(e){return e.internal?.resolvedSessionScope??Or(e)}function vc(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){mt(t,{});return}ht(n)&&(rt(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 yc(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;j(t.platform)&&!J(t)&&await Kn(t.id),await Nn(t,`close`,[n],r,i),await Bo(t,300)}function bc(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}async function xc(e,t,n){if(bc(e,t))try{await un(e,{stateDir:n})}catch(t){F({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,error:t instanceof Error?t.message:String(t)}})}}function Sc(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:qs,appTarget:t,appBundleId:n}}function Cc(e){return!(!e.shouldRelaunch||!e.openTarget||e.collapseSimulatorRelaunch||!e.existingSession&&L(e.device))}async function wc(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=J(a)&&!L(a),b=M(a)&&!L(a)&&l===`app`&&s.length>0&&!!g,x=Gr({req:t,logPath:i,appBundleId:g,traceLogPath:h}),ee=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,S,C=!1,w=!1,te=(e=x)=>{C=!0,v.runnerPrewarmKind=`session`,v.runnerPrewarmScheduled=!0,S=Gn(a,e)},T=async()=>{if(!S||w)return;w=!0;let e=Date.now();await S,v.runnerPrewarmWaited=!0,v.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};b&&y&&!ee&&te();let ne=cc({openPositionals:s,runtime:d,flags:t.flags,foldRuntimeLaunchUrl:y}),re=m&&y&&t.flags?.clearAppState!==!0;if(Cc({shouldRelaunch:m,openTarget:o,collapseSimulatorRelaunch:re,device:a,existingSession:f})&&o){f&&hr(f);let e=g??o,n=Date.now();await yc({device:a,closeTarget:e,outFlag:t.flags?.out,context:{...B(i,t.flags,g??f?.appBundleId,h)}}),v.relaunchCloseDurationMs=Math.max(0,Date.now()-n)}let ie=Date.now();await Zo({device:a,appId:g,runtime:d}),v.runtimeHintsDurationMs=Math.max(0,Date.now()-ie),b&&ee&&(te({...x,propagateError:!0}),await T());let ae=w,E=Date.now(),oe=await Tc({req:t,sessionName:n,sessionStore:r,device:a,surface:l,sessionAppBundleId:g,appName:c,existingSession:f});if(oe.type===`response`)return oe.response;let se=oe.session??f;se&&hr(se),await Nn(a,`open`,ne.openPositionals,t.flags?.out,{...B(i,t.flags,g),...re?{terminateRunningApp:!0}:{}}),v.openDispatchDurationMs=Math.max(0,Date.now()-E),await xc(a,t,r.resolveDaemonStateDir());let ce=Date.now();ne.followUpLaunchUrl&&await lc({launchUrl:ne.followUpLaunchUrl,device:a,req:t,logPath:i,appBundleId:g,traceLogPath:h}),v.launchUrlDurationMs=Math.max(0,Date.now()-ce),b&&!C&&te(),m?await T():S&&!w&&(v.runnerPrewarmWaited=!1),y&&(m||ae)&&await Xn(a,x),g=await ac(a,o,g),a.platform===`android`&&g&&await cr(a,g);let D=o?Sc(E,o,g):void 0,le=Date.now();if(await Bo(a,300),v.postOpenSettleDurationMs=Math.max(0,Date.now()-le),Sn(t.meta?.requestId)){let e=yn();return z(e.code,e.message,e.details)}f&&ki({session:f,command:`open`,positionals:[],flags:void 0});let ue=Xs({existingSession:se,sessionName:f?.name??sr(t),sessionScope:f?.sessionScope??_c(t),device:a,surface:l,appBundleId:g,appName:c,saveScript:!!t.flags?.saveScript});ue.lease=Ei({req:t,existingLease:f?.lease}),p&&(ue.deviceClaim=p),t.runtime!==void 0&&As(r,n,d);let O=r.ensureSessionDir(n),de=ct(O,t.meta?.requestId??Ht().requestId);v.totalDurationMs=Math.max(0,Date.now()-_),F({level:`info`,phase:`open_timing`,durationMs:v.totalDurationMs,data:v});let k=Ys({sessionName:ue.name,sessionStateDir:O,runnerLogPath:$e(O),requestLogPath:de,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:g,surface:l,startup:D,timing:v,device:a,runtime:d,runtimeHintCount:ys,sessionReused:f!==void 0});return vc({session:ue,existingSession:f,saveScriptRequested:!!t.flags?.saveScript,responseData:k}),r.set(n,ue),r.recordAction(ue,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:d,result:k}),{ok:!0,data:k}}async function Tc(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=Xs({existingSession:c,sessionName:c?.name??sr(t),sessionScope:c?.sessionScope??_c(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=Ei({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 Ec(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return Li(t,i)?z(`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.`}):Dc(i,n)}function Dc(e,t){return z(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:t.id,deviceName:t.name,hint:$n(e,`device-in-use`)})}async function Oc(e){let{req:t,device:n,sessionName:r,logPath:i}=e;return Kr(t.meta,L(n))?await li({device:n,session:r,workspace:t.meta?.cwd??process.cwd(),stateDir:U.dirname(i)}):{}}async function kc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s}=e,c=Ec({req:t,device:a,sessionStore:i});if(c)return c;let l=await Oc({req:t,device:a,sessionName:n,logPath:r}),u={mayHaveStarted:!1};try{let e=await mc({req:t,sessionName:n,sessionStore:i,device:a,surface:o,openTarget:s,onIosSimulatorColdBootStart:Yr({req:t,logPath:r,device:a,surface:o,openTarget:s})});if(e.type===`response`)return await Ac(l.ownership,u),e.response;u.mayHaveStarted=!0;let c=await wc({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 Ac(l.ownership,u),c}catch(e){throw await Ac(l.ownership,u),e}}async function Ac(e,t){if(e){if(t.mayHaveStarted){F({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await Mi(e)}}async function jc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n);if(a){if(t.flags?.saveScript)return z(`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=t.flags?.relaunch===!0,o=t.positionals?.[0],s=o??(e?a.appName:void 0),c=dc(a.device,t.flags?.surface,s,a.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return uc(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=fc({shouldRelaunch:e,openTarget:s,surface:c,device:a.device});if(l)return l;let u=await Vo(a.device);await t.internal?.retainDeviceExecutionLock?.(u.id);let d=await mc({req:t,sessionName:n,sessionStore:i,device:u,surface:c,openTarget:s,existingSession:a,onIosSimulatorColdBootStart:Yr({req:t,logPath:r,device:u,surface:c,openTarget:s,traceLogPath:a.trace?.outPath})});return d.type===`response`?d.response:await wc({req:t,sessionName:n,sessionStore:i,logPath:r,device:u,openTarget:s,openPositionals:o?t.positionals??[]:s?[s]:[],appBundleId:d.details.appBundleId,appName:d.details.appName,runtime:d.details.runtime,surface:c,existingSession:a})}let o=t.flags?.relaunch===!0,s=t.positionals?.[0];if(o&&!s)return uc(`open --relaunch requires an app argument.`);let c=pc({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform===`android`?`android`:void 0});if(c)return c;let l=await kn(t.flags??{},rr(s));await t.internal?.retainDeviceExecutionLock?.(l.id);let u=dc(l,t.flags?.surface,s);return typeof u==`string`?fc({shouldRelaunch:o,openTarget:s,surface:u,device:l})||await hn(gc,l.id,async()=>await kc({req:t,sessionName:n,logPath:r,sessionStore:i,device:l,surface:u,openTarget:s})):u}function Mc(e){return J(e)||Ro(e)}async function Nc(e){if(e.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return J(e)?await Pc(e):await Ic(e)}catch(e){let n=t(e);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function Pc(e){let t=await Ui(e);return t.success?t:await Fc(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function Fc(e){try{return await Wi(e)}catch{return null}}async function Ic(e){let t=await tn(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}function Lc(e,t,n){if(!nt(t))return{kind:`not-armed`};let r=t.actions.length;di(e,t,n,`close`,{session:t.name,...Fe(`Closed: ${t.name}`)});let i=at(t),a=e.writeSessionLog(t,{force:pt(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`}:(kt(t),{kind:`aborted`})}function Rc(e,n){let r=t(n),i=Ct(e.scriptPublication??xt);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function zc(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||di(r,n,t,`close`,{session:n.name,...Fe(`Closed: ${n.name}`)}),t.flags?.saveScript&&(n.recordSession=!0);try{let e=r.writeSessionLog(n,{force:pt(n,t.flags?.force)});e.written&&yt(n,e.path);return}catch(e){return Bc(e)}}function Bc(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 Vc(e){let{device:t,shutdownRequested:n}=e;if(n&&!L(t)&&Mc(t))return await Nc(t)}function Hc(e,t){return J(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function Uc(e){return j(e.device.platform)&&!J(e.device)}function Wc(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 Gc(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=Hc(t,n);await Kc(n,a,c);let u=s?void 0:await Xc({req:t,session:n,logPath:i});await Qc(l,n,c),await Zc(n,a,r);let d=s?void 0:zc({req:t,session:n,sessionStore:a,platformCloseError:u});return await c(`materialized_paths`,()=>Bi(r)),{platformCloseError:u,saveScriptError:d}}async function Kc(e,t,n){await n(`recording`,()=>ci(e)),await n(`app_log`,()=>hi(e)),await n(`audio_probe`,async()=>{await Ir(e,`session-close`)}),await n(`apple_perf`,()=>Ti(e)),await n(`android_native_perf`,()=>ri(e)),await n(`android_snapshot_helper`,()=>Rr(e)),await n(`android_ime`,()=>pi(e,t.resolveDaemonStateDir()))}function qc(e){return JSON.stringify(e.positionals??[])}async function Jc(e){let{req:t,session:n,logPath:r,sessionStore:i}=e,a=nt(n),o=qc(t);if(a&&!dt(n,o)){let e=await Xc({req:t,session:n,logPath:r});if(e)return{response:Rc(n,Wc(e))};tt(n,o)}let s=Lc(i,n,t);return s.kind===`failed`?{response:Rc(n,s.error)}:{repairArmed:a,...s.kind===`committed`&&s.path?{healedScriptPath:s.path}:{},...s.kind===`aborted`?{aborted:!0}:{}}}async function Yc(e){try{return{providerData:await gi(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 Xc(e){let{req:t,session:n,logPath:r}=e;if(il(t,n)){if(Uc(n))try{await Ci(n)}catch(e){return e}try{hr(n),await Nn(n.device,`close`,t.positionals??[],t.flags?.out,{...B(r,t.flags,n.appBundleId,n.trace?.outPath)}),await Bo(n.device,300);return}catch(e){return e}}}async function Zc(e,t,n){!Xo(t.getRuntimeHints(n))||!e.appBundleId||await Qo({device:e.device,appId:e.appBundleId}).catch(()=>{})}async function Qc(e,t,n){if(j(t.device.platform)){if(!e){await n(`apple_runner`,()=>Ci(t));return}F({level:`debug`,phase:`ios_runner_retained_after_close`,data:{session:t.name,deviceId:t.device.id}}),Wn(t.device.id)}}function $c(e,t){if(!e.flags?.saveScript||ht(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 el(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await ol(t,r);if($c(t,s),t.internal?.closeAppOnly===!0)return await rl({req:t,session:s,logPath:r});let c=await Jc({req:t,session:s,logPath:r,sessionStore:i});if(`response`in c)return c.response;let l=await tl({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 Vc({device:s.device,shutdownRequested:t.flags?.shutdown});return nl({session:s,repair:c,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:u,providerData:l.providerData})}async function tl(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=[],{platformCloseError:l,saveScriptError:u}=await Gc({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,cleanupFailures:c,repairArmed:e.repairArmed}),d=await Yc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(d.response)return{kind:`response`,response:d.response};let f=Oi({sessionName:r,phase:`session_close_cleanup_failed`,failures:c}),p=l??f;if(p?n.deviceClaim&&F({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await Mi(n.deviceClaim),a.delete(r),p)throw p;if(u)throw u;return{kind:`closed`,providerData:d.providerData}}function nl(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:ze({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...Fe(c),...o,...s}}}async function rl(e){let{req:t,session:n,logPath:r}=e,i=t.positionals?.[0];if(!i)return z(`INVALID_ARGS`,`App-only close requires an app target`);let a=await Xc({req:t,session:n,logPath:r});if(a)throw a;return{ok:!0,data:{app:i,...Fe(`Closed: ${i}`)}}}function il(e,t){return al(e)||t.device.platform===`web`}function al(e){return(e.positionals?.length??0)>0}async function ol(e,t){if(!e.positionals||e.positionals.length===0)return z(`SESSION_NOT_FOUND`,`No active session`);let n=await X({session:void 0,flags:e.flags,ensureReady:!0});return await Nn(n,`close`,e.positionals,e.flags?.out,{...B(t,e.flags)}),await Bo(n,300),{ok:!0,data:{app:e.positionals[0],...Fe(`Closed: ${e.positionals[0]}`)}}}const sl={ios:async(e,t,n)=>{let r=await En(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 En(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)}},cl={ios:async(e,t,n)=>{let r=await En(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 En(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}}};async function ll(e){let{req:t,command:n,sessionName:r,sessionStore:i,deployOps:a}=e,o=i.get(r),s=t.flags??{},c=Y(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?ti(f,t.meta?.tenantId):P.expandHome(d);if(!W.existsSync(e))return z(`INVALID_ARGS`,`App binary not found: ${e}`);let r=await X({session:o,flags:s,ensureReady:!1}),c=R(n,r);if(c)return c;o&&hr(o);let l=M(r)?dl(u,e,await a.ios(r,u,e)):fl(u,e,await a.android(r,u,e)),p=ze(l,ul(l));return di(i,o,t,n,p),{ok:!0,data:p}}finally{f&&yi(f)}}function ul(e){return`Installed: ${e.appName??Re(e)}`}function dl(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 fl(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 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:z(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:z(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}async function ml(e,t,n){return await ae(e,t,n)}async function hl(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`session_list`){let e=Or(t);return{ok:!0,data:{sessions:r.toArray().filter(t=>ar(t,e)).map(e=>{let t=r.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:$e(t),platform:A(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)&&!k(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if(t.command===`devices`)try{let e=nn(t.flags?.androidDeviceAllowlist),n=t.flags?.platform,r=de({simulatorSetPath:rn(t.flags?.iosSimulatorDeviceSet),platform:n,target:t.flags?.target}),i=await An({platform:n,target:t.flags?.target,deviceName:t.flags?.device,udid:t.flags?.udid,serial:t.flags?.serial,iosSimulatorSetPath:r,androidSerialAllowlist:e?Array.from(e).sort():void 0}),a=n?i.filter(e=>vl(e,n)):i;return{ok:!0,data:{devices:(t.flags?.target?a.filter(e=>(e.target??`mobile`)===t.flags?.target):a).map(_l)}}}catch(e){let t=s(e);return z(t.code,t.message,t.details)}if(t.command===`capabilities`){let e=await gl({req:t,sessionName:n,sessionStore:r,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0});if(`response`in e)return e.response;let{device:i}=e;return{ok:!0,data:{device:_l(i),availableCommands:On().filter(e=>Pn(e,i))}}}if(t.command===`apps`){let e=await gl({req:t,sessionName:n,sessionStore:r,ensureReady:!0});if(`response`in e)return e.response;let{device:i}=e,a=R(`apps`,i);if(a)return a;let o=Lt(t.flags?.appsFilter);return j(i.platform)?{ok:!0,data:{apps:(await Gi(i,o)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await en(i,o)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}async function gl(e){let{req:t,sessionName:n,sessionStore:r,ensureReady:i,allowStoppedAndroidAvdPlaceholders:a}=e,o=r.get(n),s=t.flags??{},c=Y(t.command,o,s);return c?{response:c}:{device:await X({session:o,flags:s,ensureReady:i,allowStoppedAndroidAvdPlaceholders:a})}}function _l({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:A({platform:r.platform,appleOs:n}),...j(r.platform)&&n?{appleOs:n}:{}}}function vl(e,t){return me(e,t)}async function yl(e){let{ensureAndroidEmulatorBooted:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t(e)}const bl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,xl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function Sl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&zo(a))return z(`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=Y(`appstate`,i,a);if(s)return s;let c=j(i?.device.platform)&&Uo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return z(`SESSION_NOT_FOUND`,bl);if(u&&!c)return z(`SESSION_NOT_FOUND`,xl);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?k(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:A(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:z(`COMMAND_FAILED`,`No foreground app is tracked for this ${k(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:A(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...M(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a,ensureReady:!0});if(M(d))return z(`SESSION_NOT_FOUND`,bl);if(k(d))return z(`SESSION_NOT_FOUND`,xl);if(d.platform===`web`)return z(`UNSUPPORTED_OPERATION`,`appstate is not supported on web.`);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 Cl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;if(t.command===`boot`){let e=i.get(n),a=t.flags??{},o=Y(t.command,e,a);if(o)return o;let c=(a.platform??e?.device.platform)===`android`,l=a.headless===!0;if(l&&!c)return z(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);let u=Ho({flags:a,sessionDevice:e?.device}),d=c&&!!u,f,p=!1;try{f=await X({session:e,flags:a,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(e){let t=s(e);if(c&&l&&!u&&t.code===`DEVICE_NOT_FOUND`)return z(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);if(!d||t.code!==`DEVICE_NOT_FOUND`||!u)throw e;f=await yl({avdName:u,serial:a.serial,headless:l}),p=!0}if(a.target&&(f.target??`mobile`)!==a.target)return z(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${a.target}.`);if(c&&l){if(f.platform!==`android`||f.kind!==`emulator`)return z(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);if(!p){let t=Ho({flags:a,sessionDevice:e?.device,resolvedDevice:f});if(!t)return z(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);f=await yl({avdName:t,serial:a.serial,headless:!0})}await ei(f)}else f.platform===`android`&&f.kind===`emulator`&&f.booted!==!0?(f=await yl({avdName:f.name,serial:a.serial,headless:!1}),await ei(f)):(f.platform!==`android`||f.booted!==!0)&&await ei(f,{onIosSimulatorColdBootStart:vi({req:t,logPath:r,device:f,enabled:!0})});return R(`boot`,f)||(M(f)&&f.kind===`simulator`&&Jn(f,{}),{ok:!0,data:{platform:A(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...j(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}})}if(t.command===`shutdown`){let e=i.get(n),r=t.flags??{},a=Y(t.command,e,r);if(a)return a;let o=await X({ensureReady:!1,flags:r,session:e}),s=R(`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 z(`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:A(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind});let c=await Nc(o);return c.success?{ok:!0,data:{platform:A(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c,...j(o.platform)&&o.appleOs?{appleOs:o.appleOs}:{}}}:z(c.error?.code??`COMMAND_FAILED`,wl(c),{platform:A(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c})}return t.command===`appstate`?await Sl({req:t,sessionName:n,sessionStore:i}):null}function wl(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}async function Tl(e){if(!Rt(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const El=[`probe`],Dl=[`start`,`status`,`stop`],Ol=`audio probe requires ${Dl.join(`, `)}`;async function kl(e){let n=Al(e);if(!n.ok)return n;let r=await Tl(n.session.device);if(r)return await Ml(e,n,r);let i=zr();if(!i.probeAudio)return z(`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 Al(e){let t=jl(e);if(!t.ok)return t;let n=Nl(e.req);if(!n.ok)return n;let r=Pl(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function jl(e){let t=e.sessionStore.get(e.sessionName);return t?Pn(`audio`,t.device)?{ok:!0,session:t}:z(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):z(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function Ml(e,n,r){try{return{ok:!0,data:await Qr({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 Nl(e){if(!Fl(e.positionals?.[0]))return z(`INVALID_ARGS`,`audio requires probe`);let t=Il(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:z(`INVALID_ARGS`,Ol)}function Pl(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return z(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=Ll(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 z(`INVALID_ARGS`,n.message);let r=Ll(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?z(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function Fl(e){let t=(e??`probe`).toLowerCase();return El.includes(t)?`probe`:void 0}function Il(e){let t=(e??`status`).toLowerCase();return Dl.includes(t)?t:void 0}function Ll(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 Rl(e){let n=zl(e.req,e.area);if(!n.ok)return n;let{session:r}=e;if(r.device.platform!==`android`)return z(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return z(`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 Jl(e,r,r.appBundleId,n):await Yl(e,r,r.appBundleId,n)}}catch(e){return{ok:!1,error:t(e)}}}function zl(e,t){let n=ql(e,t);return t===`cpu`?Bl(e,n):Vl(e,n)}function Bl(e,t){let n=Hl(e,1),r=Hl(e,2),i=Hl(e,3);return Je(n)?Ul(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:z(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):z(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):z(`INVALID_ARGS`,Ee)}function Vl(e,t){let n=Hl(e,1),r=Hl(e,2);return Wl(n)?we(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:z(`INVALID_ARGS`,`perf trace requires --kind perfetto`):z(`INVALID_ARGS`,ge):z(`INVALID_ARGS`,`perf trace action must be start or stop`)}function Hl(e,t){return(e.positionals?.[t]??``).toLowerCase()}function Ul(e){return e===`start`||e===`stop`||e===`report`}function Wl(e){return e===`start`||e===`stop`}function Gl(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),eu(t)}function Kl(e,t,n){return t?P.expandHome(t,e.req.meta?.cwd):$l(e.sessionStore,e.sessionName,n)}function ql(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 Jl(e,t,n,r){if(r.action===`start`){Zl(t);let i=Kl(e,r.outPath,`cpu.perf.data`);return Gl(e,await Qn(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=tu(t,`cpu-profile`,r.kind);if(r.action===`report`){await Xl(i);let n=Kl(e,r.outPath,`cpu-report.json`);return await _r(t.device,i,n,{adb:e.androidAdbExecutor})}let a=Ql(e,r.outPath,i);return Gl(e,await ai(t.device,i,a,{adb:e.androidAdbExecutor}))}async function Yl(e,t,n,r){if(r.action===`start`){Zl(t);let i=Kl(e,r.outPath,`app.perfetto-trace`);return Gl(e,await vr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=tu(t,`trace`,r.kind),a=Ql(e,r.outPath,i);return Gl(e,await xr(t.device,i,a,{adb:e.androidAdbExecutor}))}function Xl(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 Zl(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 Ql(e,t,n){return t?Kl(e,t,n.outPath):n.outPath}function $l(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return U.join(e.ensureSessionDir(t),`${r}-${n}`)}function eu(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 tu(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 nu(e,n){let r=ru(e.req);if(!r.ok)return r;if(n.device.platform===`android`)return z(`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 z(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return z(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await cu(e,n,r):r.action===`stop`?await lu(e,n,r):await mu(e,n,r)}catch(e){return{ok:!1,error:t(e)}}}function ru(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?iu(t):n===`trace`?au(t):z(`INVALID_ARGS`,De)}function iu(e){if(e[1]?.toLowerCase()!==`profile`)return z(`INVALID_ARGS`,`perf cpu requires profile`);let t=ou(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=su(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 au(e){let t=ou(e[1],`perf trace`,!1);if(!t.ok)return t;let n=su(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 ou(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:z(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function su(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:z(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function cu(e,t,n){if(t.applePerf?.active)return z(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??vu(n.mode),i=_u(e,n),a=await Hi({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=yu(`started`,a);return gu(e,t,o),{ok:!0,data:o}}async function lu(e,t,n){let r=t.applePerf?.active;if(!r)return z(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?P.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await er(r,i)}catch(n){throw du(n)&&uu(e,t),n}fu(e,t,a);let o=yu(`stopped`,a);return gu(e,t,o),{ok:!0,data:o}}function uu(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function du(e){return s(e).details?.captureCleanedUp===!0}function fu(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...pu(n)},e.sessionStore.set(e.sessionName,t)}function pu(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function mu(e,t,n){if(n.mode!==`cpu-profile`)return z(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return z(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=_u(e,n),i=hu(t,n);if(!i.ok)return i;let a={perf:`reported`,...await Ar({tracePath:P.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return gu(e,t,a),{ok:!0,data:a}}function hu(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:z(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function gu(e,t,n){di(e.sessionStore,t,e.req,`perf`,n)}function _u(e,t){if(t.outPath)return P.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 vu(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function yu(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}}Rn();function bu(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:qs,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 xu(e,t={}){let n=Tu(e);if(!Nu(e))return n;if(!e.appBundleId)return Au(n,e),n;let r=Su(e.device);return r&&ju(n,e,await r(e,e.appBundleId,t)),n}function Su(e){let t=Ln(e.platform)?.perf?.metricsSamplerTag(e);return t?Vu[t]:void 0}async function Cu(e,t={}){let n=Ou(e);return Nu(e)?e.appBundleId?(await Mu(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:Pu(e)},n):n}async function wu(e,t){let n=ku(e);return Nu(e)?t.action===`sample`?(n.metrics={memory:await Hu(e,t)},n):(n.artifact=await Wu(e,t),n.support=Xu(n.artifact.support)??Yu(e),n):t.action===`snapshot`?(n.artifact=qu(e,Gu(e,t.kind)),n.support=Xu(n.artifact.support)??Yu(e),n):(n.metrics={memory:{available:!1,reason:Js}},n)}function Tu(e){let t=bu(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:qs,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:qs};return{session:e.name,platform:A(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,...Eu()},sampling:{startup:{method:qs,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Fu(e)}}}function Eu(){return{fps:Du(),memory:{available:!1,reason:Js},cpu:{available:!1,reason:Js}}}function Du(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function Ou(e){return{session:e.name,platform:A(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:Du()},sampling:{fps:Ru(e)}}}function ku(e){return{session:e.name,platform:A(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:Iu(e),snapshot:Lu(e)}}}function Au(e,t){let n=Pu(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}function ju(e,t,n){e.metrics.memory=Qu(n.memory),e.metrics.cpu=Qu(n.cpu),e.metrics.fps=$u(Qu(n.fps),t)}async function Mu(e,t,n,r){let i=t.device.platform===`android`?await Zu(fr(t.device,n,{adb:r.androidAdb})):await Zu(pr(t.device,n));e.metrics.fps=$u(Qu(i),t)}function Nu(e){return Ln(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function Pu(e){return e.device.platform===`android`?`No Android app package is associated with this session. Run open <app> first.`:`No Apple app bundle ID is associated with this session. Run open <app> first.`}function Fu(e){return e.device.platform===`android`?{memory:{method:or,description:Dr,unit:`kB`},cpu:{method:Er,description:Ri,unit:`percent`},fps:{method:Tr,description:gr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:mr(e.device)}function Iu(e){return e.device.platform===`android`?{method:or,description:Dr,unit:`kB`,topConsumerLimit:5}:mr(e.device).memory}function Lu(e){return e.device.platform===`android`?{method:Ii,description:nr,defaultKind:`android-hprof`,artifactOnly:!0}:{method:kr,description:ur,defaultKind:`memgraph`,artifactOnly:!0}}function Ru(e){return e.device.platform===`android`?{method:Tr,description:gr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:jr(e.device)}async function zu(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([oi(e.device,t,r),yr(e.device,t,r),fr(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function Bu(e,t){let n=await Zu(pr(e.device,t)),r=await Zu(Pr(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}}const Vu={android:zu,apple:Bu};async function Hu(e,t){return e.appBundleId?Qu(e.device.platform===`android`?await Zu(oi(e.device,e.appBundleId,{adb:t.androidAdb})):await Zu(Uu(e))):{available:!1,reason:Pu(e)}}async function Uu(e){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Pu(e));return(await Pr(e.device,e.appBundleId)).memory}async function Wu(e,t){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Pu(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Gu(e,t.kind),i=Ku(t,r);return e.device.platform===`android`?r===`android-hprof`?await ir(e.device,e.appBundleId,i,{adb:t.androidAdb}):qu(e,r):r===`memgraph`?await xi(e.device,e.appBundleId,i):qu(e,r)}function Gu(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Ku(e,t){if(e.out)return P.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 qu(e,t){let n=Yu(e),r=Ju(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Ju(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 Yu(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)?{...lr(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 Xu(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Zu(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Qu(e){if(e.status===`fulfilled`)return{available:!0,...e.value};let n=t(e.reason);return{available:!1,reason:n.message,error:n}}function $u(e,t){if(e.available!==!0)return e;let n=ed(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function ed(e,t){let n=td(t.windowStartedAt),r=td(t.windowEndedAt)??td(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:nd(e)})).slice(-12)}function td(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function nd(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 rd=`logs requires ${_e.slice(0,-1).join(`, `)}, or ${_e.at(-1)}`,id=[`dump`,`log`],ad=`network requires ${id.join(` or `)}`,od=`network include mode must be one of: ${o.join(`, `)}`,sd={path:({session:e,sessionName:t,sessionStore:n})=>Nd(e,t,n),doctor:({session:e,sessionName:t,sessionStore:n})=>Pd(e,t,n),mark:({req:e,sessionName:t,sessionStore:n})=>Fd(e,t,n),clear:({session:e,sessionName:t,sessionStore:n,restart:r})=>Id(e,t,n,r),start:({session:e,sessionName:t,sessionStore:n})=>Ld(e,t,n),stop:({session:e,sessionName:t,sessionStore:n})=>Rd(e,t,n)};function cd(e){if(e.appLog){let t=e.appLog.getState();return{active:t===`active`||t===`recovering`,state:t,backend:e.appLog.backend,startedAt:e.appLog.startedAt,notes:dd(t)}}return e.appLogFailure?{active:!1,state:`failed`,backend:e.appLogFailure.backend,failureCode:e.appLogFailure.code,failureMessage:e.appLogFailure.message,hint:e.appLogFailure.hint,notes:[ud(e.appLogFailure)]}:{active:!1,state:`inactive`,backend:Ai(e.device)}}function ld(e,t){return{backend:t,code:e.code,message:e.message,hint:e.hint}}function ud(e){return e.hint?`${e.message} ${e.hint}`:e.message}function dd(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 fd(e,t){return Mr([...e,...t.notes??[]])}function pd(e,t,n){return{...n,platform:e.device.platform,outPath:t}}function md(e,n,r,i){let a=t(i);return e.set(n,{...r,appLog:void 0,appLogFailure:ld(a,Ai(r.device))}),{ok:!1,error:a}}async function hd(e){let{req:t}=e;return t.command===`perf`?_d(e):t.command===`logs`?jd(e):t.command===`events`?await gd(e):t.command===`network`?zd(e):t.command===`audio`?await kl(e):null}async function gd(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 _d(e){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=e,o=i.get(r);if(!o)return z(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=(n.positionals?.[0]??`metrics`).toLowerCase();if(vd(s))return o.device.platform===`android`?await Rl({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await nu(e,o);let c=yd(n);if(!c.ok)return c;if(c.native)return await nu(e,o);try{return{ok:!0,data:await bd(e,o,c)}}catch(e){return{ok:!1,error:t(e)}}}function vd(e){return e===`cpu`||e===`trace`}function yd(e){let r=xd(e.positionals?.[0]);if(!r)return z(`INVALID_ARGS`,De);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=Sd(e.positionals?.[1]);if(!i)return z(`INVALID_ARGS`,ve);let a=Cd(e.flags?.kind);return a instanceof n?{ok:!1,error:t(a)}:(wd(r,i)??Dd(e,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:Ad(e.flags?.out)}}async function bd(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await wu(t,{action:Ed(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await Cu(t,{androidAdb:a}):await xu(t,{androidAdb:a})}function xd(e){let t=(e??`metrics`).toString().toLowerCase();return Se(t)?t:void 0}function Sd(e){let t=(e??`sample`).toString().toLowerCase();return ye(t)?t:void 0}function Cd(e){if(e!==void 0)return typeof e!=`string`||!we(e)?new n(`INVALID_ARGS`,ge):e}function wd(e,t){if(e===`memory`)return Td(t)?void 0:z(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return z(`INVALID_ARGS`,`perf metrics and perf frames only support sample`)}function Td(e){return e===`sample`||e===`snapshot`}function Ed(e){if(Td(e))return e;throw new n(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function Dd(e,t,n,r){return Od(e.flags?.out,t,n)??kd(r,t,n)}function Od(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return z(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function kd(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return z(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!ke(e))return z(`INVALID_ARGS`,Te)}}function Ad(e){return typeof e==`string`&&e.length>0?e:void 0}async function jd(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return z(`SESSION_NOT_FOUND`,`logs requires an active session`);let a=R(`logs`,i.device);if(a)return a;let o=Md(t);return o.ok?await sd[o.action]({...e,session:i,restart:o.restart}):o}function Md(e){let t=(e.positionals?.[0]??`path`).toLowerCase(),n=!!e.flags?.restart;return _e.includes(t)?n&&t!==`clear`?z(`INVALID_ARGS`,`logs --restart is only supported with logs clear`):{ok:!0,action:t,restart:n}:z(`INVALID_ARGS`,rd)}function Nd(e,t,n){let r=n.resolveAppLogPath(t),i=Zn(r),a=cd(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,sizeBytes:i.sizeBytes,modifiedAt:i.modifiedAt,startedAt:a.startedAt?new Date(a.startedAt).toISOString():void 0,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint??`Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>`,notes:a.notes}}}async function Pd(e,t,n){let r=n.resolveAppLogPath(t),i=await Br(e.device,e.appBundleId),a=cd(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,checks:i.checks,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint,notes:fd(i.notes,a)}}}function Fd(e,t,n){let r=e.positionals?.slice(1).join(` `)??``,i=n.resolveAppLogPath(t);return Fr(i,r),{ok:!0,data:{path:i,marked:!0}}}async function Id(e,t,n,r){if(e.appLog&&!r)return z(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=n.resolveAppLogPath(t);if(!r){let r=Cr(i);return n.set(t,{...e,appLogFailure:void 0}),{ok:!0,data:r}}let a=e.appBundleId;if(!a)return z(`INVALID_ARGS`,`logs clear --restart requires an app session; run open <app> first`);e.appLog&&await wi(e.appLog);let o=Cr(i),s=n.resolveAppLogPidPath(t);try{let r=await mi(e.device,a,i,s);return n.set(t,{...e,appLog:pd(e,i,r),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(r){return md(n,t,e,r)}}async function Ld(e,t,n){if(e.appLog)return z(`INVALID_ARGS`,`app log already streaming; run logs stop first`);if(!e.appBundleId)return z(`INVALID_ARGS`,`logs start requires an app session; run open <app> first`);let r=n.resolveAppLogPath(t),i=n.resolveAppLogPidPath(t);try{let a=await mi(e.device,e.appBundleId,r,i);return n.set(t,{...e,appLog:pd(e,r,a),appLogFailure:void 0}),{ok:!0,data:{path:r,started:!0}}}catch(r){return md(n,t,e,r)}}async function Rd(e,t,n){if(!e.appLog)return z(`INVALID_ARGS`,`no app log stream active`);let r=e.appLog.outPath;return await wi(e.appLog),n.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:r,stopped:!0}}}async function zd(e){let t=Vd(e);if(!t.ok)return t;let{include:n,maxEntries:r,session:i}=t;if(i.device.platform===`web`)return await Bd({include:n,maxEntries:r});let a=await Jr({device:i.device,appBundleId:i.appBundleId,appLogState:i.appLog?.getState(),appLogStartedAt:i.appLog?.startedAt,appLogPath:e.sessionStore.resolveAppLogPath(e.sessionName),maxEntries:r,include:n,maxPayloadChars:2048,maxScanLines:4e3});return{ok:!0,data:{...a.dump,active:!!i.appLog,state:i.appLog?.getState()??`inactive`,backend:a.backend,notes:a.notes}}}async function Bd(e){let n=zr();if(!n.dumpNetwork)return z(`UNSUPPORTED_OPERATION`,`network is not supported by this web provider`);try{let t=await n.dumpNetwork({include:e.include,limit:e.maxEntries});return{ok:!0,data:{entries:t.entries,active:!0,state:`active`,backend:t.backend??`agent-browser`,include:e.include,matchedLines:t.entries.length,scannedLines:t.entries.length,limits:{maxEntries:e.maxEntries,maxPayloadChars:2048,maxScanLines:t.entries.length},notes:t.notes}}}catch(e){return{ok:!1,error:t(e)}}}function Vd(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return z(`SESSION_NOT_FOUND`,`network requires an active session`);let a=R(`network`,i.device);if(a)return a;let o=(t.positionals?.[0]??`dump`).toLowerCase();if(!id.includes(o))return z(`INVALID_ARGS`,ad);let s=t.positionals?.[1]?Number.parseInt(t.positionals[1],10):25;if(!Number.isInteger(s)||s<1||s>200)return z(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`);let c=Hd(t);return c.ok?{ok:!0,session:i,maxEntries:s,include:c.include}:c}function Hd(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return z(`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}:z(`INVALID_ARGS`,od)}function Ud(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=U.resolve(n??`.`,t??`.agent-device/test-artifacts`);return U.join(i,r)}function Wd(e,t){let n=t?U.relative(t,e):U.basename(e);return Zd((n.length===0||n.startsWith(`..`)?U.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`))||`test`}function Gd(e,t){W.mkdirSync(t,{recursive:!0}),Jd(e,t)}function Kd(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=qd(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(`
4
- `)}\n`;W.writeFileSync(d,f),s||W.writeFileSync(U.join(o,`failure.txt`),f)}function qd(e,t){let n=[],r=new Map;for(let i of e){if(!Xd(i))continue;let e=Yd(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 Jd(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 Yd(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 Xd(e){try{return W.statSync(e).isFile()}catch{return!1}}function Zd(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 Qd(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}af(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 $d(e,t,n,r,i=0){let a=Zd(U.basename(n,U.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function ef(e){return Zd((e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`))||`suite`}function tf(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 nf(e,t){return typeof e==`number`?e:t}function rf(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function af(e,t){return e===`apple`?j(t):t===e}function of(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const sf=2e3;async function cf(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=mf({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=>of({error:t(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([C,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(hf(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 lf(C)||(x=ff(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:sf}}),uf({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await df({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:S,emitDiagnostic:h});x?.status===`passed`&&e&&(x=pf(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??of({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}async function lf(e){return await Promise.race([e.then(()=>!0),Xi(sf).then(()=>!1)])}async function uf(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 df(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}}),of({error:n})}}function ff(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function pf(e,t){return{...e,warnings:[...e.warnings,t]}}function mf(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 hf(e,t=[]){return of({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 gf(e){let t=_f(e),n=await vf(e,t);return{result:wf(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function _f(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}`]:[],Wd(t.path,n)),maxAttempts:r+1}}async function vf(e,t){bf(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await yf(e,t,r);if(xf(n,i),Sf(e,i.outcome,r))break;Cf(e,t,i)}return n}async function yf(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=$d(i,a,r.path,o,n),h=U.join(t.testArtifactsDir,`attempt-${f}`);Gd(r.path,h);let g=tf({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,...Of(d)},v=await cf({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 Kd({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function bf(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:$d(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Of(c)})}function xf(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 Sf(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Cf(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,...Of(e.shard)})}function wf(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Tf(e,t,n,r):Ef(e,t,n,r)}function Tf(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,...Of(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}:{},...Df(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Ef(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,...Of(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}:{},...Df(s)}}function Df(e){return Of(e)}function Of(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function kf(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 Af(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 jf(t,u,d);Ff(s,a);let p=s.shardPlan?If({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await Lf({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 Vf({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:Wf(s.total,p,Date.now()-e)}}catch(e){let t=s(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function jf(e,t,n){let r=Mf(e,t),i=Nf(r),a=r.length-i.length,o=ef(e.requestId),s=await kf(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:Pf(e,o),total:s?.total??r.length}}function Mf(e,t){return Qd({inputs:[...e.inputs],cwd:e.cwd,platformFilter:e.platformFilter,discoverSources:t})}function Nf(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Pf(e,t){return Ud({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Ff(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 If(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 Lf(e){return(await Promise.allSettled(e.shards.map(async t=>await zf({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Rf(r,e.sessionName,t.reason)]:[]})}function Rf(e,n,r){let i=t(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:Bf(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 zf(e){let{shard:t,sessionName:n}=e;return await Hf({...e,entries:t.entries,sessionName:Bf(n,t),shard:t})}function Bf(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Vf(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 gf({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:rf(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:nf(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),Uf(t,o,p))break}return g}async function Hf(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 gf({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:rf(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:nf(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),Uf(b,o,m))break}return _}function Uf(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Wf(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=f(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 Gf(e){return JSON.stringify(Kf(e))}function Kf(e){if(Array.isArray(e))return e.map(Kf);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,Kf(t[e])]))}function qf(e){let t=Gf(Jf(e));return Ki(`sha256`).update(t,`utf8`).digest(`hex`)}function Jf(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)=>Yf(e,n[t]??null,r?.[t]??null))}}function Yf(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 Xf(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=Zf({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Zf(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Qf({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>$f({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>ep(n,r)];for(let e of s){let t=e();if(t)return t}}function Qf(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 $f(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 ep(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 tp(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=_t(r),o=Dt(r),s=qf({actions:a.actions,actionLines:a.actionLines,actionSourcePaths:a.actionSourcePaths,metadata:{platform:t?.platform??st(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=>Xf(e,c,s)}}function np(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function rp(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&y(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function ip(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 ap(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=ip(i,a);return{matchCount:n,observed:r,mismatches:[...r?w(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 op(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...w(e,r),...T(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 sp(e,t,n,r,i,a){if(n.targetEvidences)return cp(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return up(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return up(e,n,r,i,a);if(s.kind===`post-resolution`){let c=np({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return up(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return dp(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=rp({recorded:o,token:s.token});if(c.kind===`skip`)return up(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,lp(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?dp(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 cp(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 up(e,n,r,i,a);let d=rp({recorded:o[c],token:u.token});if(d.kind===`skip`)return up(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,lp(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 dp(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function lp(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 up(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 dp(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=fp(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=pp(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 fp(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 pp(e,t,n){return n.status===`guard-mismatch`?ap(e,n.evidence,t):op(e,n.evidence)}async function mp(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=ea(e.varSources),o=[],s=[],c=vp(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!_p(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(yp(u,n.length,r,e))}let d=ua(r,a,gp(e,u)),f=pa(a),p=t.diagnosticsMarker(),m=await sp(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:hp(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 hp(e,t){return t.length===0?e:[...new Set([...e,...t])]}function gp(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function _p(e){return!!(e&&e.command!==`replay`)}function vp(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(_p(n))return n.command===`close`?t:void 0}}function yp(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function bp(e){let{sessionStore:t,sessionName:n}=e,r=()=>t.get(n);return{view(){let e=r();if(e)return{repairBoundary:it(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){let i=r();i&&(Ze(i,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:xp(e.sourcePath),firstArm:e.firstArm}),t.set(n,i))},demoteForRerunIfArmed(){let e=r();!e||it(e)===void 0||wt(e)},markCompleteIfArmed(){let e=r();!e||it(e)===void 0||(ft(e),t.set(n,e))},markSessionHeldIfArmed(e){if(e.ok||!ut(r()))return e;let t=Sp(e);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){t.clearRepairTombstone(n)},clearCorrectiveWatermarkIfExpected(e){let i=r();!i||i.pendingRecordAndHeal?.expectedFrom!==e||(Tp(i),t.set(n,i))},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){let i=r();i&&(wp({session:i,...e}),t.set(n,i))}}}}function xp(e){let t=U.dirname(e),n=U.basename(e,U.extname(e));return U.join(t,`${n}.healed.ad`)}function Sp(e){let t=e.error.details?.divergence;if(!(!se(t)||!Cp(t.resume)))return t.resume}function Cp(e){return!se(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function wp(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Ep({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Tp(e){e.pendingRecordAndHeal=void 0}function Ep(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 Dp(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=y(`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 Op(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),lt(e.command)){let n=kp(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=y(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Dp([...e.positionals]);n&&t.push(n)}return Mr(t).filter(e=>e.trim().length>0)}function kp(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Ap(n)?t.slice(0,-1):t}function Ap(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function jp(e){let t=Mp({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 Mp(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Np({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Np(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 Pp(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Fp(n))return`manual`;let i=Ip(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Fp(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&Lp(e.scrollRegion)}function Ip(e,t){let n=Ne(t),r=zp(e.ancestry,n,t),i=e.scrollRegion;return i&&Lp(i)?r&&Rp(i,n,t):r}function Lp(e){return e.id!==void 0||e.label!==void 0}function Rp(e,t,n){return n.some(n=>Mt(jt(n,t),e))}function zp(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Me(n,t,e.length);return!r.broken&&b(r.chain,e)})}const Bp=new WeakMap;function Vp(e){return{store:t=>Hp(e,t),finalize:(t,n)=>Up({...e,evidence:t,projection:n})}}function Hp(e,t){let{sessionStore:n,sessionName:r}=e,i=n.get(r);if(!i)throw Error(`Internal observation session is no longer available.`);dr(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 Bp.set(o,{sessionName:r,session:i,sessionCreatedAt:i.createdAt,snapshot:t,snapshotGeneration:a,runtimeRevision:Si(i),refFrame:Gp(i)}),{evidence:o,refsGeneration:a}}function Up(e){let t=Bp.get(e.evidence);Bp.delete(e.evidence);let n=qp(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Wp(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Jp(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(tr(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Wp(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&&Si(n)===t.runtimeRevision&&Kp(Gp(n),t.refFrame)}function Gp(e){return{state:e.refFrameState,scope:e.refFrameScope,tree:e.refFrameTree,generation:e.refFrameGeneration}}function Kp(e,t){return e.state===t.state&&e.scope===t.scope&&e.tree===t.tree&&e.generation===t.generation}function qp(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 Jp(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Yp(t){let{sessionStore:n,sessionName:r,divergence:i,responseLevel:a}=t,o,s,c=Ge({divergence:i,level:a,writeOverflowArtifact:t=>{let i=e(t),a=Qp(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&&Vp({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 Zp(s),Xp(c,`missing-evidence`);let u=Vp({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:(Zp(s),Xp(c,u.reason))}function Xp(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 Zp(e){if(e)try{W.unlinkSync(e)}catch{}}function Qp(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 $p={id:0,"role-label":1,label:2,other:3};function em(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||tm(n.basis)<tm(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>tm(e.basis)-tm(t.basis)||e.nodeIndex-t.nodeIndex)}function tm(e){return $p[e]}async function nm(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=Ae(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await am({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=lm(v,g),b=v.state===`available`&&o?mm({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=Pp({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:rm(v)}),ee=jp({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Yp({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Qe(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 rm(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const im=[300,500,800,1200,2e3,3e3,4e3];async function am(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=sm(a),c=Date.now()+12e3,l=await om({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of im){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await Jt(Math.min(e,a)),l=await om({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s})}return l.observation}async function om(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,flags:a}=e;try{let e=(await Nr({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(xe(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=Vp({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:Ce(e)}}}function sm(e){return{snapshotInteractiveOnly:cm(e)}}function cm(e){return hm(e.command)?gm(e).requiresRect:!0}function lm(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=pm(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function um(e){return!!Ue(e,qe(e.type??`Element`))||e.hittable===!0}function dm(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function fm(e,t){let n=Ke(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&um(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=>dm(e,t)),...o.filter(e=>!dm(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function pm(e,t,n){let{nodes:r,truncated:i}=fm(e,n);return{refs:r.map(e=>{let n=qe(e.type??`Element`),r=Ue(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function mm(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!hm(t.command))return[];let a=Op(t);return a.length===0?[]:_m({candidates:a,nodes:r,session:n,action:t,matching:gm(t),sanitize:i})}function hm(e){return lt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function gm(e){let t=lt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function _m(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=vm({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return em(s).map(e=>e.suggestion)}function vm(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=C(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:ym({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function ym(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=h(t,r.device.platform,{action:i.command===`fill`?`fill`:lt(i.command)?`click`:`get`,nodes:n}),c=qe(t.type??`Element`),l=Ue(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function bm(e){return{...e,hint:e.hint??Cm(e.details,`hint`),diagnosticId:e.diagnosticId??Cm(e.details,`diagnosticId`),logPath:e.logPath??Cm(e.details,`logPath`)}}function xm(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return Sm({error:t,actionLabel:Qe(n),action:n.command,positionals:Xe(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function Sm(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:We(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:We(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Tm(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function Cm(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const wm=[`reason`,`retriable`,`supportedOn`];function Tm(e){if(!e)return{};let t={};for(let n of wm)e[n]!==void 0&&(t[n]=e[n]);return t}async function Em(e){return await Dm({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function Dm(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 _=Om(t.error.details?.replaySource),v=bm(t.error),y=await nm({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:bn(u.meta?.requestId)});return xm({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Om(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 km(t,n){if(t)try{W.appendFileSync(t,`${JSON.stringify(e(n))}\n`)}catch(e){F({level:`warn`,phase:`replay_trace_write_failed`,data:{path:t,error:e instanceof Error?e.message:String(e)}})}}async function Am(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();km(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:Xe(o)??[]});let m;try{m=await Mm({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 km(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?Pm(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),jm(m,u??s,c)}function jm(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 Mm(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Fm(t.flags,r.flags),s=i.command===`fill`?et(ot(i)):void 0;return s&&(o.recordAs=s),await a(Nm({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??Or(t)}:{}}},r))}function Nm(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:l(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Pm(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 Fm(e,t){return le(e,{...t??{}})}function Im(e){return Um(e.ok?Rm(e.data):Lm(e.error.details?.artifactPaths))}function Lm(e){return Array.isArray(e)?e.filter(Hm):[]}function Rm(e){return e?[Vm(e.path),Vm(e.outPath),...zm(e.artifacts)].filter(Hm):[]}function zm(e){return Array.isArray(e)?e.map(Bm).filter(Hm):[]}function Bm(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Vm(t.localPath)??Vm(t.path)}function Vm(e){return typeof e==`string`?e:void 0}function Hm(e){return typeof e==`string`}function Um(e){return[...new Set(e.filter(Wm))]}function Wm(e){try{return W.statSync(e).isFile()}catch{return!1}}function Gm(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Km({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Ne(r),u=ce(t),d=Oe(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Nt(r,e)===t.sibling),p=d.filter(e=>Mt(jt(e,l),t.scrollRegion)),m=At(p)[t.viewportOrder]?.ref,h=Pt({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,...Ym({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Km(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?qm(n,t,i,a):Jm(n,t,r,a,o)}function qm(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?Be(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Jm(e,t,n,r,i){let a=ee(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return a.kind===`resolved`?{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref}:{matchedNodes:[...a.matchedNodes],winnerRef:``}}function Ym(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?Xm(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?Xm(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?Xm(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 Xm(e,t,n){let r=Ft(t),i=Me(t,n,Math.max(e.ancestry.length,1)).chain;return[...w(e,r),...T(e.ancestry,i)].slice(0,5)}function Zm(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=c(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=y(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!lt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!($m(r)&&$m(n[1])))return r}function Qm(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function $m(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function eh(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=Ae(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:uh(ce(n),g),...t.observed?{observed:uh(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>dh(e,g))},v=Pp({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=jp({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b=Yp({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(Qe(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 xm({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:p})}function th(e,t,n){let r=Ae(e.scrubVars);return eh(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:lm(n,r),publicationEvidence:ah(n),repairCapture:rm(n)})}async function nh(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await am({session:t,sessionName:n,sessionStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function rh(e,t){return th(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 nh({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function ih(e,t,n){return th(e,t,await nh({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ah(e){return e.state===`available`?e.evidence:void 0}function oh(e){let{action:t,resolvedAction:n,sessionName:r,sessionStore:i,targetRole:a}=e,o=i.get(r);return o?x(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:g(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Zm(n,a),platform:o.device.platform}:{kind:`inactive`}}function sh(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=gm(r),s=Gm({recorded:t,token:n,nodes:i,platform:a,refLabel:Qm(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Ft(s.winnerNode),structural:ue(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Ft(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function ch(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function lh(e){return!e.ok&&e.error.details?.reason===Ie}function uh(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function dh(e,t){let n=qe(e.type??`Element`),r=Ue(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function fh(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 ph(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 mh(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 hh(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 gh(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:ph(e?.observed),expectedStructural:hh(e?.expectedStructural),observedStructural:hh(e?.observedStructural)}}function _h(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:ph(e?.observed),observedAncestry:mh(e?.observedAncestry)}}function vh(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function yh(e,t,n){let r=vh(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&ch(e)?{status:`guard-mismatch`,evidence:gh(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&lh(e)?{status:`landmark-mismatch`,evidence:_h(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function bh(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,vh(xh(e),Im(e)));return{runtime:{beginTargetVerification(e,n,r,i){return oh({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 am({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 sh({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 Am({req:fh(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,Im(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:yh(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await rh(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=th(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await ih(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=xh(o),u=await Sh(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=>Ch(e),onStep:i,diagnosticsMarker:()=>Th(t.sessionStore,t.sessionName),diagnosticsSince:e=>Eh(t.sessionStore,t.sessionName,e)},readLastResponse:()=>o}}function xh(e){return e&&!e.ok?e:z(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Sh(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return wh(i)?c(i):c(await Em({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 Ch(e){let t=e.positionals??[],n=S(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function wh(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 Th(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function Eh(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function Dh(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Oh(t,i)};return Ah(o,`AD_PLATFORM`,a.platform??r.platform),Ah(o,`AD_TARGET`,a.target??r.target),Ah(o,`AD_DEVICE`,a.device),Ah(o,`AD_DEVICE_ID`,kh(a)),jh(o,`AD_SHARD_INDEX`,a.shardIndex),jh(o,`AD_SHARD_COUNT`,a.shardCount),Ah(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Oh(e,t){let n=e.meta?.cwd??process.cwd();return U.relative(n,t)||t}function kh(e){return typeof e.serial==`string`?e.serial:e.udid}function Ah(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function jh(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Mh=3e4,Nh=1e3;function Ph(e){let{scriptPath:r,env:i}=e,a=W.readFileSync(r,`utf8`),o=Object.create(null);try{Zi.runInNewContext(a,Fh(i,o),{filename:r,timeout:Mh})}catch(e){let i=t(e);throw new n(i.code,`Maestro runScript failed: ${i.message}`,O({...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 zh(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Bh(t)]))}function Fh(e,t){return{...e,output:t,json:Ih,http:{post:(e,t)=>Rh(`POST`,e,t)}}}function Ih(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,Lh)}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,Nh)},t instanceof Error?t:void 0)}}function Lh(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Rh(e,t,r){let i=Vt(process.execPath,[`-e`,`
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,Bn as _,D as v,Dn as y,Dt as b,Et as x,H as ee,Ln as S,Mt as C,Nn as w,O as te,Sn as ne,T as re,Wn as ie,_t as ae,bt as oe,c as se,it as ce,k as le,kt as ue,l as de,n as fe,rt as pe,s as T,t as me,tr as E,vt as he,wt as ge,xt as _e,yt as ve}from"./sdk-batch-runner.js";import{C as ye,_ as D,c as O,g as be,h as xe,l as k,p as Se,s as A,u as Ce,w as we,y as Te}from"./sdk-device.js";import{$ as Ee,At as De,B as Oe,Bt as ke,Dt as Ae,Ht as je,It as Me,Jt as Ne,Lt as Pe,M as Fe,Mt as Ie,Pt as Le,S as Re,St as ze,Tt as Be,Ut as Ve,Vt as He,X as Ue,Xt as j,Yt as We,_n as Ge,a as Ke,et as qe,gn as Je,o as Ye,on as Xe,rt as Ze,sn as Qe,tt as $e,wt as et,xt as tt,z as nt,zt as rt}from"./prepare-kind.js";import{$ as it,B as at,C as ot,Ct as st,G as ct,H as lt,I as ut,J as dt,K as ft,L as pt,N as mt,O as ht,Q as gt,R as _t,St as vt,Tt as yt,U as bt,V as xt,W as St,X as Ct,Y as wt,Z as Tt,at as Et,bt as Dt,ct as Ot,et as kt,it as At,lt as jt,q as Mt,rt as Nt,tt as Pt,w as Ft,wt as It,x as M,xt as Lt,yt as Rt,z as zt}from"./screenshot-result.js";import{a as Bt,n as Vt,o as Ht,r as Ut,s as Wt,t as Gt}from"./session-target-evidence.js";import{c as Kt,f as qt,o as Jt}from"./device.js";import{s as Yt}from"./runtime.js";import{A as N,M as Xt,N as Zt,S as Qt,_ as $t,f as en,o as tn}from"./sdk-android-adb.js";import{t as nn}from"./timeouts.js";import{n as rn,r as an,t as on}from"./runtime-transport.js";import{f as sn,p as cn,s as ln}from"./app-lifecycle.js";import{a as un}from"./install-artifact.js";import{i as dn,r as fn}from"./boot-diagnostics.js";import{n as pn}from"./entities.js";import{a as mn,l as hn,n as gn,r as _n,t as vn}from"./ime-lifecycle.js";import{D as yn,F as bn,I as xn,L as Sn,M as Cn,N as P,O as wn,P as Tn,j as En,u as Dn}from"./runner-disposal.js";import{C as On,D as F,E as kn,T as An,_ as I,a as jn,b as Mn,c as Nn,d as Pn,g as Fn,h as In,i as Ln,l as L,m as Rn,n as zn,s as R,t as z,u as Bn,x as Vn,y as Hn}from"./context.js";import{B as Un,L as Wn,V as Gn}from"./physical-device-control.js";import{a as Kn}from"./tool-provider.js";import{n as qn}from"./provider.js";import{n as Jn,s as Yn}from"./agent-browser-tool.js";import{r as Xn}from"./helper.js";import{a as B,o as Zn,s as Qn}from"./selector-vocabulary.js";import{c as $n,i as er,l as tr,n as nr,r as rr,s as ir,t as ar}from"./runner-client.js";import{$ as or,A as sr,At as cr,B as lr,C as ur,Ct as dr,D as fr,Dt as pr,E as mr,Et as V,F as hr,G as gr,H as _r,I as vr,J as yr,K as br,Kt as xr,L as Sr,M as Cr,Mt as wr,N as Tr,Nt as Er,O as Dr,Ot as Or,P as kr,Pt as Ar,Q as jr,R as Mr,Rt as Nr,S as Pr,St as Fr,Tt as Ir,U as Lr,V as Rr,W as zr,Wt as Br,X as Vr,Xt as Hr,Y as Ur,Z as Wr,Zt as Gr,_ as Kr,_t as qr,a as Jr,an as Yr,at as Xr,b as Zr,bt as Qr,c as $r,cn as ei,ct as ti,d as ni,dn as ri,dt as ii,en as ai,et as oi,f as si,fn as ci,ft as li,g as ui,gn as di,gt as fi,h as pi,hn as mi,ht as hi,i as gi,it as _i,j as vi,jt as yi,k as bi,kt as xi,l as Si,ln as Ci,lt as wi,m as Ti,mn as Ei,mt as Di,n as Oi,nn as ki,nt as Ai,o as ji,ot as Mi,p as Ni,pn as Pi,pt as Fi,q as Ii,r as Li,rt as Ri,s as zi,st as Bi,t as Vi,tt as Hi,u as Ui,un as Wi,ut as Gi,v as Ki,vn as qi,vt as Ji,w as Yi,wt as H,x as Xi,xt as Zi,y as Qi,yt as $i,z as ea}from"./internal/daemon.js";import{r as ta}from"./app-lifecycle2.js";import"./apps.js";import{i as na,n as ra}from"./simulator.js";import{a as ia}from"./app-resolution.js";import{a as U,i as aa,n as oa,r as sa}from"./snapshot-runtime.js";import{t as ca}from"./app-log-files.js";import W from"node:path";import la,{createHash as ua}from"node:crypto";import G,{promises as da}from"node:fs";import fa from"node:os";import{access as pa}from"node:fs/promises";import{setTimeout as ma}from"node:timers/promises";import ha from"node:vm";function ga(e){return e.startsWith(`AD_`)}function _a(e){return new n(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${e} to avoid the AD_ prefix.`)}function va(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(ga(n))throw _a(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function ya(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&&Rt.test(e)&&(ga(e)||(t[e]=r))}return t}function ba(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(!Rt.test(i))throw new n(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(ga(i))throw _a(i);t[i]=r.slice(e+1)}return t}function xa(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Sa(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 Ca(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function wa(e){return Ca(e)||e>=`0`&&e<=`9`||e===`.`}function Ta(e){return e===`
2
+ `||e===`\r`||e===`\u2028`||e===`\u2029`}function Ea(e,t){let n=t+2;if(n>=e.length||!Ca(e[n]))return null;for(n+=1;n<e.length&&wa(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(Ta(t))return{abortEnd:n+2};i+=t,n+=2;continue}i+=t,n+=1}return{abortEnd:e.length}}function Da(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=Ea(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))ga(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 Oa(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>Da(e,t,n)),flags:ka(e.flags,t,n)??{},runtime:ka(e.runtime,t,n)}}function ka(e,t,n){return e&&Aa(e,t,n)}function Aa(e,t,n){return typeof e==`string`?Da(e,t,n):Array.isArray(e)?e.map(e=>Aa(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,Aa(r,t,n)])):e}function ja(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!ga(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function Ma(e,t){return V({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function Na(e){return V({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Pa(e,t){let n=za(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},Na(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:Fa(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Fa(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function Ia(e,t,n,r){let i=za(await r.resolveTarget({selector:e,...t},Ma(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw dr(`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 La(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 Ra(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 za(e,t){return Ba(e,t),Va(e),Ha(e),Ua(e),e}function Ba(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Va(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Ha(e){if(e.rect!==void 0&&!Ra(e.rect)||e.viewport!==void 0&&!Ra(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Ua(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Wa(e,t,n,r,i){let a=Ga(e,t,n,i);if(!a)return;let{start:o,end:s}=Za(a,n);return{gesture:{from:o,to:s,durationMs:r},viewport:a}}function Ga(e,t,n,r){let i=n===`up`||n===`down`,a=Qr({nodes:e.nodes,matches:e.nodes.filter(e=>_(e)),platform:r}),o=qa(e.nodes)??Ja(a);if(!o||!w(o))return;let s=a.flatMap(e=>{if(!w(e.rect))return[];let t=Ya(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=>Zi(e,t))){let e=Ka(n,c),t=e?l.get(e.index):void 0;if(t)return t.viewport}return s.sort(Xa)[0]?.viewport}function Ka(e,t){return _(e)?e:ne(e,t)}function qa(e){return e.filter(e=>w(e.rect)&&y(e)).sort((e,t)=>t.rect.width*t.rect.height-e.rect.width*e.rect.height)[0]?.rect}function Ja(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 Ya(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 Xa(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Za(e,t){let n=K(e,.5,.5),r=B.scrollUntilVisibleSwipe.nearEdgeFraction,i=B.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:K(e,.5,i)};case`down`:return{start:n,end:K(e,.5,r)};case`left`:return{start:n,end:K(e,i,.5)};case`right`:return{start:n,end:K(e,r,.5)}}}async function Qa(e,t,r){let i=H(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(Ma(t,t.command)):void 0;return{authored:e,gesture:eo(await $a(e.start,t,r,a),await $a(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(Ma(t,t.command)),{start:a,end:o}=to(n,e.direction,r.platform);return{authored:e,gesture:eo(a,o,i),viewport:n}}let a=await Ia(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?B.command.optionalTargetLookupTimeoutMs:B.command.targetLookupTimeoutMs},t,r),o=a.viewport??await r.resolveGestureViewport(Ma(t,t.command)),{start:s,end:c}=no(a,e.direction,o);return{authored:e,gesture:eo(s,c,i),target:a,viewport:o}}async function $a(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(Ma(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 eo(e,t,n){return{from:e,to:t,durationMs:n??B.command.swipeDurationMs}}function to(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=B.screenSwipe,i=K(e,r.centerFraction,r.nearEdgeFraction),a=K(e,r.centerFraction,r.farEdgeFraction),o=K(e,r.centerFraction,r.downStartFraction),s=K(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function K(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function no(e,t,n){let r=Ir(e.rect),i=n.x+Math.trunc(n.width*B.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*B.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*B.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*B.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 ro={launchApp:co,stopApp:co,openLink:co,tapOn:uo,doubleTapOn:uo,longPressOn:uo,swipe:go,inputText:_o,eraseText:_o,scroll:vo,scrollUntilVisible:vo,hideKeyboard:vo,pressKey:vo,back:vo,waitForAnimationToEnd:vo,takeScreenshot:xo,runScript:xo,assertVisible:So,assertNotVisible:So,extendedWaitUntil:So},io={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 ao(e){return io[e.kind]}async function oo(e,t){let n=e.command;return await so(n,e,t,Ma(e,n))}function so(e,t,n,r){let i=ro[e.kind];return i(e,t,n,r)}async function co(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,lo(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function lo(e,t){return V({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function uo(e,t,n,r){switch(e.kind){case`tapOn`:return await fo(e,t,n,r);case`doubleTapOn`:{let i=await Ao(e.target,{purpose:`doubleTap`,timeoutMs:mo(e)},t,n),a=H(e.delay,`doubleTapOn.delay`)??B.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?La(i.resolution):void 0)}case`longPressOn`:{let i=await Ao(e.target,{purpose:`longPress`,timeoutMs:mo(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?La(i.resolution):void 0)}}}async function fo(e,t,n,r){let i=await po(e,t,n);return await q(n.tapOn,ho(e,i),r,`invalidate`,i.resolution?La(i.resolution):void 0)}async function po(e,t,n){let r={purpose:`tap`,timeoutMs:mo(e),index:H(e.index,`tapOn.index`),childOf:e.childOf,allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await Ao(e.target,r,t,n)}function mo(e){return e.optional===!0?B.command.optionalTargetLookupTimeoutMs:B.command.targetLookupTimeoutMs}function ho(e,t){let n=H(e.repeat,`tapOn.repeat`),r=H(e.delay,`tapOn.delay`),i=n===void 0?r:r??B.command.repeatDelayMs;return V({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function go(e,t,n,r){let i=await Qa(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?La(i.target):void 0)}async function _o(e,t,n,r){switch(e.kind){case`inputText`:return await q(n.inputText,V({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await q(n.eraseText,V({charactersToErase:H(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function vo(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,yo(e),r,`invalidate`);case`hideKeyboard`:return await q(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await q(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await q(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await q(n.waitForAnimationToEnd,bo(e),r,`preserve`)}}function yo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:H(e.timeout,`scrollUntilVisible.timeout`)??B.command.scrollUntilVisibleTimeoutMs,durationMs:Qn(B.command.scrollUntilVisibleSpeed)}}function bo(e){return V({timeoutMs:H(e.timeout,`waitForAnimationToEnd.timeout`)})}async function xo(e,t,n,r){switch(e.kind){case`takeScreenshot`:return wo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await q(n.runScript,V({file:e.file,env:e.env}),r,`preserve`)}}async function So(e){throw new n(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}async function q(e,t,n,r,i){let a=Co(n,r);return wo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function Co(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function wo(e,t,n,r){let i=e?.observation;return To(i,r),{...Eo(n??i),...Do(e?.outputEnv),...Oo(t,e?.artifactPaths),...ko(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function To(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 Eo(e){return e?{observation:e}:{}}function Do(e){return e?{outputEnv:{...e}}:{}}function Oo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function ko(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function Ao(e,t,n,r){if(e.space===`target`){let i=await Ia(e.selector,t,n,r);return{authored:e,point:Ir(i.rect),resolution:i}}return{authored:e,point:await $a(e,n,r)}}function jo(e,t,n,r={}){let i=Ji(e,t.selector,n,t.childOf);if(!i.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Fo(t,i.matches,[],void 0)};let{matches:a,ranked:o}=i,s=$i(o,t.index),c=Fo(t,a,o,s?.node);if(!s)return Mo(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?No(t,{...s,rect:l},r.canonicalSnapshot):0,evidence:c}}function Mo(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 No(e,t,n){if(!n)return 0;let r=Ji(n,e.selector,`ios`).ranked;if(r.length!==1)return r.length;let i=$i(r,void 0);return i&&i.node.hittable!==!1&&Po(i.rect,t.rect)?1:0}function Po(e,t){let n=Ir(e),r=Ir(t);return n.x===r.x&&n.y===r.y}function Fo(e,t,n,r){return V({selector:e.selector,childOf:e.childOf,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:Zn,retryTapMaxAttempts:B.command.retryTapMaxAttempts,longPressDurationMs:B.command.longPressDurationMs,eraseTextMaxCharacters:B.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:B.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:B.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:B.command.waitForAnimationToEndDifferencePercent,observationPollMs:B.observation.pollIntervalMs};function Io(e,t={}){return{execute:async n=>{let r=Ma(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:ao(n.command)&&!i,visualStabilityBarrier:i});let a=await oo(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Pa(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Lo(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Ro(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:Lo(t)}}function zo(e){let t=Ro(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:qi(n,e.meta?.tenantId)},cleanup:()=>{di(n)}}}function Bo(e){return e===`ios`||e===`android`?e:void 0}function Vo(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 Ho(e){let t=Bo(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 Dr(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 I(e.flags??{});return await Dr(r),r}async function Uo(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await Tr({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function Wo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Go(e){let{session:t,sessionStore:n,req:r,data:i}=e;fr(n,t,r,`install_source`,i,{positionals:[]})}async function Ko(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);try{let e=zo(n),t=Vo(n),o=await Ho({session:a,flags:n.flags}),s=L(`install`,o,{message:`install_from_source is not supported on this device`});if(s)return s;let c=P(n.meta?.requestId);if(O(o)){let{prepareIosInstallArtifact:s}=await import(`./install-artifact2.js`).then(e=>e.t),l=await s(e.source,{signal:c});return await qo({prepared:l,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Jo(o,l,e)})}let{prepareAndroidInstallArtifact:l}=await import(`./install-artifact.js`).then(e=>e.t),u=await l(e.source,{signal:c});return await qo({prepared:u,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Yo(o,u,e)})}catch(e){return{ok:!1,error:t(e)}}}async function qo(e){let t;try{t=await Uo(e);let n=await e.buildResult(t),r=Ge(n,es(n));return Go({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await vi(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function Jo(e,t,n){let r=await kn(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 Xo(t,r,n)}async function Yo(e,t,n){let r=await kn(e,t.installablePath,{packageNameHint:t.packageName}),i=await $o(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...Wo(n),packageName:i,...Qo(r?.appName??o),launchTarget:r?.launchTarget??i}}function Xo(e,t,n){let r=Zo(e,t),i=t?.appName??e.appName;return{...Wo(n),bundleId:r,...Qo(i),launchTarget:t?.launchTarget??r}}function Zo(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 Qo(e){return e?{appName:e}:{}}async function $o(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 es(e){return`Installed: ${Qe(e)}`}async function ts(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 vi(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:t(e)}}}function Y(e,t,n){return t||ei(n)?null:R(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function ns(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function rs(e,t){F(e)||!U(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function X(e){let t=ei(e.flags)||!e.session?await I(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await is(e.session.device);return e.ensureReady!==!1&&await Dr(t),t}async function is(e){if(F(e)||!O(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(ir(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 I(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await I({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function as(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 os(e,t){return t?Er(t,e).length===0:!1}const ss=`debug_http_host`,cs=`dev_server_https`,ls=`RCT_jsLocation`,us=`RCT_packager_scheme`,ds=`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.`,fs=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
3
+ `);function ps(e){return on(e)!==void 0}async function ms(e){let{device:t,appId:n,runtime:r}=e;if(F(t)||!n)return;let i=on(r);if(i){if(t.platform===`android`){await _s(t,n,i);return}O(t)&&t.kind===`simulator`&&await Ts(t,n,i)}}async function hs(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await vs(t,n);return}O(t)&&t.kind===`simulator`&&await Es(t,n)}}function gs(e){return[`shared_prefs/${e}_preferences.xml`,`shared_prefs/ReactNativeDevPrefs.xml`]}async function _s(e,t,n){Ms(t);let r=[];for(let i of gs(t)){let a=Os(await ys(e,t,i),ss,`${n.host}:${n.port}`);a=ks(a,cs,n.scheme===`https`),r.push({path:i,xml:a})}await bs(e,t,r)}async function vs(e,t){Ms(t);let n=[];for(let r of gs(t)){let i=await ys(e,t,r),a=js(js(i,ss),cs);a!==i&&n.push({path:r,xml:a})}n.length!==0&&await bs(e,t,n)}async function ys(e,t,n){let r=await un(e,[`shell`,`run-as`,t,`cat`,n],{allowFailure:!0});return r.exitCode===0?Ds(r.stdout):fs}async function bs(e,t,n){await xs(e,t);try{await Cs(e,t,n)}catch(e){throw ws(e,t)}}async function xs(e,t){let n=[`shell`,`run-as`,t,`id`],r=await un(e,n,{allowFailure:!0});if(r.exitCode!==0)throw Ss(r,t,n)}function Ss(e,t,r){let i=Ps(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}`,en(e,{package:t,cmd:`adb`,args:r,hint:i?ds:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}async function Cs(e,t,n){await un(e,[`shell`,`run-as`,t,`mkdir`,`-p`,`shared_prefs`]);for(let r of n)await un(e,[`shell`,`run-as`,t,`tee`,r.path],{stdin:r.xml.trimEnd()})}function ws(e,t){let r=s(e);if(r.code===`TOOL_MISSING`)return r;let i=Ps(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?ds:`adb run-as succeeded, but writing React Native dev-server preferences failed. Inspect stderr/details for the failing shell command.`},r)}async function Ts(e,t,n){await Kn(Wn(e,[`spawn`,e.id,`defaults`,`write`,t,ls,`-string`,`${n.host}:${n.port}`])),await Kn(Wn(e,[`spawn`,e.id,`defaults`,`write`,t,us,`-string`,n.scheme]))}async function Es(e,t){await Kn(Wn(e,[`spawn`,e.id,`defaults`,`delete`,t,ls]),{allowFailure:!0}),await Kn(Wn(e,[`spawn`,e.id,`defaults`,`delete`,t,us]),{allowFailure:!0})}function Ds(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?fs:`${t}\n`}function Os(e,t,n){let r=` <string name="${pn(t)}">${pn(n)}</string>`;return As(js(e,t),r)}function ks(e,t,n){let r=` <boolean name="${pn(t)}" value="${n?`true`:`false`}" />`;return As(js(e,t),r)}function As(e,t){return Ds(e).replace(`</map>`,`${t}\n</map>`)}function js(e,t){let n=Ns(t);return Ds(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 Ms(e){if(sn(e)!==`binary`)return;let t=cn(e);throw new n(`INVALID_ARGS`,t,{package:e,hint:t})}function Ns(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Ps(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 Fs=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Is(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Ls(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return rn(e)}}function Rs(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 zs(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Rs(e)}}function Bs(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 Vs(e){if(e===`ios`||e===`android`)return e}function Hs(e,t){return{platform:t,metroHost:rn(e?.metroHost),metroPort:Rs(e?.metroPort),bundleUrl:rn(e?.bundleUrl),launchUrl:rn(e?.launchUrl)}}function Us(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 Ws(e){if(aa(e))return`10.0.2.2`;if(U(e))return`127.0.0.1`}function Gs(e,t){if(!e||rn(e.metroHost)||rn(e.bundleUrl)||e.metroPort===void 0)return e;let n=Ws(t);return n?{...e,metroHost:n}:e}function Ks(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=>!Fs.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Fs.join(`, `)}.`);return{platform:Bs(a.platform,r,i),metroHost:Ls(a.metroHost,`metroHost`),metroPort:zs(a.metroPort),bundleUrl:Ls(a.bundleUrl,`bundleUrl`),launchUrl:Ls(a.launchUrl,`launchUrl`)}}function qs(e,t,n){if(n){if(Is(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function Js(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?D(r):void 0,s=Vs(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 Ys(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Vs(D(i)):e.platform,o=n.getRuntimeHints(r),s=Ks({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Js(n,r,i,a);return{runtime:i?Gs(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Is(s)>0?s:void 0;return{runtime:i?Gs(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Xs(e){return Ys(e).runtime}function Zs(e){try{return{ok:!0,data:Ys(e)}}catch(e){let t=s(e);return R(t.code,t.message,t.details)}}async function Qs(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!ps(n)||ps(r)||await hs({device:i.device,appId:i.appBundleId})}async function $s(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await ac(t);if(!ec(i))return R(`INVALID_ARGS`,`runtime requires set, show, clear, or port-reverse`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await tc(n,r,a,o):i===`show`?nc(n,o):ic({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function ec(e){return e===`set`||e===`show`||e===`clear`}async function tc(e,t,n,r){return ps(r)&&n?.appBundleId&&await hs({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function nc(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function rc(e){return e?D(e.device):void 0}function ic(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=rc(i),s=Vs(t.flags?.platform??a?.platform??o);if(!s)return R(`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 R(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Us(a,Hs(t.flags,s));return Is(c)===0?R(`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 ac(e){let t=oc(e);if(!t.ok)return t.response;let n=await On(t.options);return n?{ok:!0,data:{action:`port-reverse`,...n}}:R(`UNSUPPORTED_OPERATION`,`No active provider device runtime supports port reverse for this lease.`)}function oc(e){let t=sc(e);if(!t.ok)return t;let n=cc(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 sc(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:R(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:R(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function cc(e){let t=lc(e.flags?.devicePort),n=lc(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:R(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function lc(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const uc=`open-command-roundtrip`,dc=`Not implemented for this platform in this release.`;function fc(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=D(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,Se(d.platform)&&(h.serial=d.id)),d&&O(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...Je(`Opened: ${o??s??t}`)}}function pc(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s,saveScript:c}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,recordSession:it(t,c),snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,recordSession:c,actions:[]}}const mc=new Set([`app`,`desktop`,`frontmost-app`]);function hc(e,t,r){if(e.platform===`linux`){if(!t)return`app`;let e=Ne(t);if(!mc.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(!k(e)){if(t)throw new n(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}let i=t?Ne(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 gc(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(k(t)||t.platform===`linux`)&&!n?i??`app`:hc(t,n,r)}async function _c(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Xn();return{appBundleId:t.bundleId,appName:t.appName}}async function vc(e,t,n){if(!(!A(e.platform)||!t))return T(t)?k(e)?void 0:e.kind===`device`?de(n,t):se(t)?void 0:n??await yc(e,t):await bc(e,t)}async function yc(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function bc(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function xc(e,t){if(!(e.platform!==`android`||!t||T(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 Sc(e,t,n){if(n||e.platform!==`android`||!t||!T(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 Cc(e,t){return e.platform===`android`&&!!(t&&T(t))}function wc(e){let t=e?.trim();if(!(!t||T(t)||!t.includes(`.`)))return t}async function Tc(e,t,n,r){return O(e)&&F(e)||e.platform===`harmonyos`?wc(t)??n:await vc(e,t,n)??await r(e,t)??(Cc(e,t)?n:void 0)}function Ec(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||T(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 Dc(e){let{launchUrl:t,device:n,req:r,logPath:i,appBundleId:a,traceLogPath:o}=e,s=z(i,r.flags?{...r.flags,clearAppState:void 0,launchConsole:void 0,launchArgs:void 0}:void 0,a,o);await zn(n,`open`,[t],r.flags?.out,s)}function Oc(e){return R(`INVALID_ARGS`,e)}function kc(e,t,r,i){try{return gc({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return R(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}function Ac(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&T(n)?Oc(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&sn(n)===`binary`?Oc(cn(n)):null:Oc(`open --relaunch is supported only for app surfaces.`):null}function jc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&T(n)?Oc(`open --relaunch does not support URL targets.`):r===`android`&&n&&sn(n)===`binary`?Oc(cn(n)):null:null}async function Mc(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await Dr(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await Nc({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=Zs({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 Qs({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function Nc(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await _c(n);return{appBundleId:a.appBundleId??await Tc(t,r,i,xc),appName:a.appName??r}}async function Pc(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:R(`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:R(`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:R(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)};let r=await sa({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:R(`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 Fc(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 oa({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}}:Ic(o.data,e.error)}catch(e){return Ic(o.data,t(e))}}function Ic(e,t){return{ok:!0,data:{...e,warnings:[...Lc(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Lc(e){return!e||!Array.isArray(e.warnings)?[]:e.warnings.filter(e=>typeof e==`string`)}const Rc=new Map;function zc(e){return e.internal?.resolvedSessionScope??xi(e)}function Bc(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Mt(t,{});return}wt(n)&&(ft(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 Vc(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;A(t.platform)&&!U(t)&&await tr(t.id),await zn(t,`close`,[n],r,i),await rs(t,300)}function Hc(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}async function Uc(e,t,n){if(Hc(e,t))try{await gn(e,{stateDir:n})}catch(t){N({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,error:t instanceof Error?t.message:String(t)}})}}function Wc(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:uc,appTarget:t,appBundleId:n}}function Gc(e){return!(!e.shouldRelaunch||!e.openTarget||e.collapseSimulatorRelaunch||!e.existingSession&&F(e.device))}async function Kc(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=U(a)&&!F(a),b=O(a)&&!F(a)&&l===`app`&&s.length>0&&!!g,x=Pr({req:t,logPath:i,appBundleId:g,traceLogPath:h}),ee=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,S,C=!1,w=!1,te=(e=x)=>{C=!0,v.runnerPrewarmKind=`session`,v.runnerPrewarmScheduled=!0,S=er(a,e)},ne=async()=>{if(!S||w)return;w=!0;let e=Date.now();await S,v.runnerPrewarmWaited=!0,v.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};b&&y&&!ee&&te();let re=Ec({openPositionals:s,runtime:d,flags:t.flags,foldRuntimeLaunchUrl:y}),ie=m&&y&&t.flags?.clearAppState!==!0;if(Gc({shouldRelaunch:m,openTarget:o,collapseSimulatorRelaunch:ie,device:a,existingSession:f})&&o){f&&Hr(f);let e=g??o,n=Date.now();await Vc({device:a,closeTarget:e,outFlag:t.flags?.out,context:{...z(i,t.flags,g??f?.appBundleId,h)}}),v.relaunchCloseDurationMs=Math.max(0,Date.now()-n)}let ae=Date.now();await ms({device:a,appId:g,runtime:d}),v.runtimeHintsDurationMs=Math.max(0,Date.now()-ae),b&&ee&&(te({...x,propagateError:!0}),await ne());let oe=w,se=Date.now(),ce=await qc({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&&Hr(le),await zn(a,`open`,re.openPositionals,t.flags?.out,{...z(i,t.flags,g),...ie?{terminateRunningApp:!0}:{}}),v.openDispatchDurationMs=Math.max(0,Date.now()-se),await Uc(a,t,r.resolveDaemonStateDir());let ue=Date.now();re.followUpLaunchUrl&&await Dc({launchUrl:re.followUpLaunchUrl,device:a,req:t,logPath:i,appBundleId:g,traceLogPath:h}),v.launchUrlDurationMs=Math.max(0,Date.now()-ue),b&&!C&&te(),m?await ne():S&&!w&&(v.runnerPrewarmWaited=!1),y&&(m||oe)&&await ar(a,x),g=await Sc(a,o,g),a.platform===`android`&&g&&await yr(a,g);let de=o?Wc(se,o,g):void 0,fe=Date.now();if(await rs(a,300),v.postOpenSettleDurationMs=Math.max(0,Date.now()-fe),Tn(t.meta?.requestId)){let e=Cn();return R(e.code,e.message,e.details)}f&&Yr({session:f,command:`open`,positionals:[],flags:void 0});let pe=pc({existingSession:le,sessionName:f?.name??cr(t),sessionScope:f?.sessionScope??zc(t),device:a,surface:l,appBundleId:g,appName:c,saveScript:!!t.flags?.saveScript});pe.lease=Wi({req:t,existingLease:f?.lease}),p&&(pe.deviceClaim=p),t.runtime!==void 0&&qs(r,n,d);let T=r.ensureSessionDir(n),me=ot(T,t.meta?.requestId??Xt().requestId);v.totalDurationMs=Math.max(0,Date.now()-_),N({level:`info`,phase:`open_timing`,durationMs:v.totalDurationMs,data:v});let E=fc({sessionName:pe.name,sessionStateDir:T,runnerLogPath:Ft(T),requestLogPath:me,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:g,surface:l,startup:de,timing:v,device:a,runtime:d,runtimeHintCount:Is,sessionReused:f!==void 0});return Bc({session:pe,existingSession:f,saveScriptRequested:!!t.flags?.saveScript,responseData:E}),r.set(n,pe),r.recordAction(pe,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:d,result:E}),{ok:!0,data:E}}async function qc(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=pc({existingSession:c,sessionName:c?.name??cr(t),sessionScope:c?.sessionScope??zc(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=Wi({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 Jc(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return Or(t,i)?R(`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.`}):Yc(i,n)}function Yc(e,t){return R(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:t.id,deviceName:t.name,hint:Ar(e,`device-in-use`)})}async function Xc(e){let{req:t,device:n,sessionName:r,logPath:i}=e;return Ei(t.meta,F(n))?await ci({device:n,session:r,workspace:t.meta?.cwd??process.cwd(),stateDir:W.dirname(i)}):{}}async function Zc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s}=e,c=Jc({req:t,device:a,sessionStore:i});if(c)return c;let l=await Xc({req:t,device:a,sessionName:n,logPath:r}),u={mayHaveStarted:!1};try{let e=await Mc({req:t,sessionName:n,sessionStore:i,device:a,surface:o,openTarget:s,onIosSimulatorColdBootStart:ur({req:t,logPath:r,device:a,surface:o,openTarget:s})});if(e.type===`response`)return await Qc(l.ownership,u),e.response;u.mayHaveStarted=!0;let c=await Kc({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 Qc(l.ownership,u),c}catch(e){throw await Qc(l.ownership,u),e}}async function Qc(e,t){if(e){if(t.mayHaveStarted){N({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await Pi(e)}}async function $c(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Pc({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 R(`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=kc(i.device,o.flags?.surface,s,i.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return Oc(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=Ac({shouldRelaunch:e,openTarget:s,surface:c,device:i.device});if(l)return l;let u=await is(i.device);await o.internal?.retainDeviceExecutionLock?.(u.id);let d=await Mc({req:o,sessionName:t,sessionStore:r,device:u,surface:c,openTarget:s,existingSession:i,onIosSimulatorColdBootStart:ur({req:o,logPath:n,device:u,surface:c,openTarget:s,traceLogPath:i.trace?.outPath})});return d.type===`response`?d.response:await Kc({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 Oc(`open --relaunch requires an app argument.`);let l=jc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await I(o.flags??{},pr(c));await o.internal?.retainDeviceExecutionLock?.(u.id);let d=kc(u,o.flags?.surface,c);return typeof d==`string`?Ac({shouldRelaunch:s,openTarget:c,surface:d,device:u})||await yn(Rc,u.id,async()=>await Zc({req:o,sessionName:t,logPath:n,sessionStore:r,device:u,surface:d,openTarget:c})):d}function el(e){return U(e)||aa(e)}async function tl(e){if(e.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return U(e)?await nl(e):await il(e)}catch(e){let n=t(e);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function nl(e){let t=await na(e);return t.success?t:await rl(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function rl(e){try{return await ra(e)}catch{return null}}async function il(e){let t=await un(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}function al(e,t,n){if(!at(t))return{kind:`not-armed`};let r=t.actions.length;fr(e,t,n,`close`,{session:t.name,...Je(`Closed: ${t.name}`)});let i=Ct(t),a=e.writeSessionLog(t,{force:dt(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`}:(pt(t),{kind:`aborted`})}function ol(e,n){let r=t(n),i=Et(e.scriptPublication??Nt);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function sl(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||fr(r,n,t,`close`,{session:n.name,...Je(`Closed: ${n.name}`)}),t.flags?.saveScript&&(n.recordSession=it(n,!0));try{let e=r.writeSessionLog(n,{force:dt(n,t.flags?.force)});e.written&&gt(n,e.path);return}catch(e){return cl(e)}}function cl(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 ll(e){let{device:t,shutdownRequested:n}=e;if(n&&!F(t)&&el(t))return await tl(t)}function ul(e,t){return U(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function dl(e){return A(e.device.platform)&&!U(e.device)}function fl(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 pl(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=ul(t,n);await ml(n,a,c);let u=s?void 0:await vl({req:t,session:n,logPath:i});await bl(l,n,c),await yl(n,a,r);let d=s?void 0:sl({req:t,session:n,sessionStore:a,platformCloseError:u});return await c(`materialized_paths`,()=>Cr(r)),{platformCloseError:u,saveScriptError:d}}async function ml(e,t,n){await n(`recording`,()=>Zr(e)),await n(`app_log`,()=>ji({session:e,sessionStore:t})),await n(`audio_probe`,async()=>{await sr(e,`session-close`)}),await n(`apple_perf`,()=>zi(e)),await n(`android_native_perf`,()=>gi(e)),await n(`android_snapshot_helper`,()=>Jr(e)),await n(`android_ime`,()=>Oi(e,t.resolveDaemonStateDir()))}function hl(e){return JSON.stringify(e.positionals??[])}async function gl(e){let{req:t,session:n,logPath:r,sessionStore:i}=e,a=at(n),o=hl(t);if(a&&!zt(n,o)){let e=await vl({req:t,session:n,logPath:r});if(e)return{response:ol(n,fl(e))};bt(n,o)}let s=al(i,n,t);return s.kind===`failed`?{response:ol(n,s.error)}:{repairArmed:a,...s.kind===`committed`&&s.path?{healedScriptPath:s.path}:{},...s.kind===`aborted`?{aborted:!0}:{}}}async function _l(e){try{return{providerData:await Ci(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 vl(e){let{req:t,session:n,logPath:r}=e;if(El(t,n)){if(dl(n))try{await Li(n)}catch(e){return e}try{Hr(n),await zn(n.device,`close`,t.positionals??[],t.flags?.out,{...z(r,t.flags,n.appBundleId,n.trace?.outPath)}),await rs(n.device,300);return}catch(e){return e}}}async function yl(e,t,n){!ps(t.getRuntimeHints(n))||!e.appBundleId||await hs({device:e.device,appId:e.appBundleId}).catch(()=>{})}async function bl(e,t,n){if(A(t.device.platform)){if(!e){await n(`apple_runner`,()=>Li(t));return}N({level:`debug`,phase:`ios_runner_retained_after_close`,data:{session:t.name,deviceId:t.device.id}}),$n(t.device.id)}}function xl(e,t){if(!e.flags?.saveScript||wt(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 Sl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await Ol(t,r);if(xl(t,s),t.internal?.closeAppOnly===!0)return await Tl({req:t,session:s,logPath:r});let c=await gl({req:t,session:s,logPath:r,sessionStore:i});if(`response`in c)return c.response;let l=await Cl({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 ll({device:s.device,shutdownRequested:t.flags?.shutdown});return wl({session:s,repair:c,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:u,providerData:l.providerData})}async function Cl(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=[],{platformCloseError:l,saveScriptError:u}=await pl({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,cleanupFailures:c,repairArmed:e.repairArmed}),d=await _l({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(d.response)return{kind:`response`,response:d.response};let f=Vi({sessionName:r,phase:`session_close_cleanup_failed`,failures:c}),p=l??f;if(p?n.deviceClaim&&N({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await Pi(n.deviceClaim),a.delete(r),p)throw p;if(u)throw u;return{kind:`closed`,providerData:d.providerData}}function wl(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:Ge({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...Je(c),...o,...s}}}async function Tl(e){let{req:t,session:n,logPath:r}=e,i=t.positionals?.[0];if(!i)return R(`INVALID_ARGS`,`App-only close requires an app target`);let a=await vl({req:t,session:n,logPath:r});if(a)throw a;return{ok:!0,data:{app:i,...Je(`Closed: ${i}`)}}}function El(e,t){return Dl(e)||t.device.platform===`web`}function Dl(e){return(e.positionals?.length??0)>0}async function Ol(e,t){if(!e.positionals||e.positionals.length===0)return R(`SESSION_NOT_FOUND`,`No active session`);let n=await X({session:void 0,flags:e.flags,ensureReady:!0});return await zn(n,`close`,e.positionals,e.flags?.out,{...z(t,e.flags)}),await rs(n,300),{ok:!0,data:{app:e.positionals[0],...Je(`Closed: ${e.positionals[0]}`)}}}const kl={ios:async(e,t,n)=>{let r=await An(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 An(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})}},Al={ios:async(e,t,n)=>{let r=await An(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 An(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 jl(e){let{req:t,command:n,sessionName:r,sessionStore:i,deployOps:a}=e,o=i.get(r),s=t.flags??{},c=Y(n,o,s);if(c)return c;let l=Ll(n,t.positionals??[]);if(!l.ok)return l.response;let{app:u,appPathInput:d}=l,f=t.meta?.uploadedArtifactId;try{let e=f?qi(f,t.meta?.tenantId):M.expandHome(d);if(!G.existsSync(e))return R(`INVALID_ARGS`,`App binary not found: ${e}`);let c=await X({session:o,flags:s,ensureReady:!1}),l=L(n,c);if(l)return l;o&&Hr(o);let p=O(c)?Pl(u,e,await a.ios(c,u,e)):c.platform===`harmonyos`?Il(u,e,await a.harmonyos(c,u,e)):Fl(u,e,await a.android(c,u,e)),m=Ge(p,Nl(p)),h=Ml(o,p);return h&&h!==o&&i.set(r,h),fr(i,h,t,n,m),{ok:!0,data:m}}finally{f&&di(f)}}function Ml(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Nl(e){return`Installed: ${e.appName??Xe(e)}`}function Pl(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 Fl(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 Il(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 Ll(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:R(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:R(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}async function Rl(e,t,n){return await fe(e,t,n)}async function zl(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return Bl(t,r);case`devices`:return await Hl(t);case`capabilities`:return await Jl({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice});case`apps`:return await Yl({req:t,sessionName:n,sessionStore:r});default:return null}}function Bl(e,t){let n=xi(e);return{ok:!0,data:{sessions:t.toArray().filter(e=>yi(e,n)).map(e=>Vl(e,t))}}}function Vl(e,t){let n=t.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:n,runnerLogPath:Ft(n),platform:D(e.device),...A(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,...A(e.device.platform)&&!k(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}}async function Hl(e){try{return{ok:!0,data:{devices:(await Ul(e)).map(Ql)}}}catch(e){let t=s(e);return R(t.code,t.message,t.details)}}async function Ul(e){let t=e.flags?.platform;return ql(await Hn(Wl(e,t)),e.flags?.platform,e.flags?.target)}function Wl(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Gl(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Kl(n?.androidDeviceAllowlist)}}function Gl(e,t,n){return Te({simulatorSetPath:Gn(e),platform:t,target:n})}function Kl(e){let t=Un(e);return t?Array.from(t).sort():void 0}function ql(e,t,n){let r=t?e.filter(e=>$l(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Jl(e){let t=await Zl({...e,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0});if(`response`in t)return t.response;let{device:n}=t,[r,i]=e.bindDevice?await Promise.all([e.bindDevice(n,v).then(e=>e.facts.appLogInspect.available),e.bindDevice(n,le).then(e=>e.facts.networkDump.available)]):[!1,!1];return{ok:!0,data:{device:Ql(n),availableCommands:Pn().filter(e=>e===`logs`?r:e===`network`?i:Bn(e,n))}}}async function Yl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=await Zl({req:t,sessionName:n,sessionStore:r,ensureReady:!0});if(`response`in i)return i.response;let{device:a}=i,o=L(`apps`,a);if(o)return o;let s=qt(t.flags?.appsFilter);return A(a.platform)?Xl((await ia(a,s)).map(e=>({id:e.bundleId,name:e.name}))):a.platform===`harmonyos`?Xl((await ta(a,s,{signal:P(t.meta?.requestId)})).map(e=>({id:e.package,name:e.name}))):Xl((await ln(a,s)).map(e=>({id:e.package,name:e.name})))}function Xl(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Zl(e){let{req:t,sessionName:n,sessionStore:r,ensureReady:i,allowStoppedAndroidAvdPlaceholders:a}=e,o=r.get(n),s=t.flags??{},c=Y(t.command,o,s);return c?{response:c}:{device:await X({session:o,flags:s,ensureReady:i,allowStoppedAndroidAvdPlaceholders:a})}}function Ql({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:D({platform:r.platform,appleOs:n}),...A(r.platform)&&n?{appleOs:n}:{}}}function $l(e,t){return be(e,t)}async function eu(e){let{ensureAndroidEmulatorBooted:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t(e,{discoverLocal:Mn,androidSerialAllowlist:e.androidSerialAllowlist})}const tu=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,nu=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function ru(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&ns(a))return R(`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=Y(`appstate`,i,a);if(s)return s;let c=A(i?.device.platform)&&os(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return R(`SESSION_NOT_FOUND`,tu);if(u&&!c)return R(`SESSION_NOT_FOUND`,nu);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?k(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:D(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:R(`COMMAND_FAILED`,`No foreground app is tracked for this ${k(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:D(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...O(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a,ensureReady:!0});if(O(d))return R(`SESSION_NOT_FOUND`,tu);if(k(d))return R(`SESSION_NOT_FOUND`,nu);if(d.platform===`web`)return R(`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 iu(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;if(t.command===`boot`){let e=i.get(n),a=t.flags??{},o=Y(t.command,e,a);if(o)return o;let c=(a.platform??e?.device.platform)===`android`,l=Un(a.androidDeviceAllowlist),u=l?[...l].sort():void 0,d=a.headless===!0;if(d&&!c)return R(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);let f=as({flags:a,sessionDevice:e?.device}),p=c&&!!f,m,h=!1;try{m=await X({session:e,flags:a,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(e){let t=s(e);if(c&&d&&!f&&t.code===`DEVICE_NOT_FOUND`)return R(`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 eu({avdName:f,serial:a.serial,headless:d,androidSerialAllowlist:u}),h=!0}if(a.target&&(m.target??`mobile`)!==a.target)return R(`DEVICE_NOT_FOUND`,`No ${m.platform} device found matching --target ${a.target}.`);if(c&&d){if(m.platform!==`android`||m.kind!==`emulator`)return R(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);if(!h){let t=as({flags:a,sessionDevice:e?.device,resolvedDevice:m});if(!t)return R(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);m=await eu({avdName:t,serial:a.serial,headless:!0,androidSerialAllowlist:u})}await Dr(m)}else m.platform===`android`&&m.kind===`emulator`&&m.booted!==!0?(m=await eu({avdName:m.name,serial:a.serial,headless:!1,androidSerialAllowlist:u}),await Dr(m)):(m.platform!==`android`||m.booted!==!0)&&await Dr(m,{onIosSimulatorColdBootStart:Yi({req:t,logPath:r,device:m,enabled:!0})});return L(`boot`,m)||(O(m)&&m.kind===`simulator`&&rr(m,{}),{ok:!0,data:{platform:D(m),target:m.target??`mobile`,device:m.name,id:m.id,kind:m.kind,booted:!0,...A(m.platform)&&m.appleOs?{appleOs:m.appleOs}:{}}})}if(t.command===`shutdown`){let e=i.get(n),r=t.flags??{},a=Y(t.command,e,r);if(a)return a;let o=await X({ensureReady:!1,flags:r,session:e}),s=L(`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 R(`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:D(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind});let c=await tl(o);return c.success?{ok:!0,data:{platform:D(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c,...A(o.platform)&&o.appleOs?{appleOs:o.appleOs}:{}}}:R(c.error?.code??`COMMAND_FAILED`,au(c),{platform:D(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c})}return t.command===`appstate`?await ru({req:t,sessionName:n,sessionStore:i}):null}function au(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function ou(e){let t=Kr(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=G.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{G.closeSync(t)}}function su(e,t){ca(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=ui(e);try{G.writeFileSync(r,n,`utf8`)}finally{G.closeSync(r)}}function cu(e){let t=W.dirname(e),n=W.basename(e);G.existsSync(t)||G.mkdirSync(t,{recursive:!0});let r=Ki(e);try{G.fsyncSync(r)}finally{G.closeSync(r)}let i=0;for(let e of G.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{G.unlinkSync(W.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function lu(e){let{ledger:t,resourcePath:n,device:r}=e;t.assertStartAllowed(r),uu(n,we(ye(r)));let i=Ti(n);return Object.freeze({token:la.randomUUID(),generation:i.status===`decoded`?i.envelope.fence.generation+1:1})}function uu(e,t){let r=W.dirname(W.dirname(e));for(let i of Ni(r)){let r=Ti(i);if(r.status===`unreattachable`)throw du(r);if(r.status===`decoded`&&r.envelope.lifecycle!==`completed`&&(i===e||we(r.envelope.device)===t))throw new n(`COMMAND_FAILED`,`An app-log resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing app-log.resource.json before starting a replacement.`})}}function du(e){return new n(`COMMAND_FAILED`,`An app-log recovery record is unreattachable: ${e.message}`,{reason:e.reason,retriable:!1,hint:`Retain the corrupt or future-version app-log.resource.json for manual recovery; no replacement capture is safe.`})}async function fu(e){if(!ee(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const pu=[`probe`],mu=[`start`,`status`,`stop`],hu=`audio probe requires ${mu.join(`, `)}`;async function gu(e){let n=_u(e);if(!n.ok)return n;let r=await fu(n.session.device);if(r)return await yu(e,n,r);let i=qn();if(!i.probeAudio)return R(`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 _u(e){let t=vu(e);if(!t.ok)return t;let n=bu(e.req);if(!n.ok)return n;let r=xu(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function vu(e){let t=e.sessionStore.get(e.sessionName);return t?Bn(`audio`,t.device)?{ok:!0,session:t}:R(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):R(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function yu(e,n,r){try{return{ok:!0,data:await bi({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 bu(e){if(!Su(e.positionals?.[0]))return R(`INVALID_ARGS`,`audio requires probe`);let t=Cu(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:R(`INVALID_ARGS`,hu)}function xu(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return R(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=wu(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 R(`INVALID_ARGS`,n.message);let r=wu(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?R(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function Su(e){let t=(e??`probe`).toLowerCase();return pu.includes(t)?`probe`:void 0}function Cu(e){let t=(e??`status`).toLowerCase();return mu.includes(t)?t:void 0}function wu(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 Tu(e){let n=Eu(e.req,e.area);if(!n.ok)return n;let{session:r}=e;if(r.device.platform!==`android`)return R(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return R(`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 Fu(e,r,r.appBundleId,n):await Iu(e,r,r.appBundleId,n)}}catch(e){return{ok:!1,error:t(e)}}}function Eu(e,t){let n=Pu(e,t);return t===`cpu`?Du(e,n):Ou(e,n)}function Du(e,t){let n=ku(e,1),r=ku(e,2),i=ku(e,3);return Ve(n)?Au(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:R(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):R(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):R(`INVALID_ARGS`,Pe)}function Ou(e,t){let n=ku(e,1),r=ku(e,2);return ju(n)?He(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:R(`INVALID_ARGS`,`perf trace requires --kind perfetto`):R(`INVALID_ARGS`,Le):R(`INVALID_ARGS`,`perf trace action must be start or stop`)}function ku(e,t){return(e.positionals?.[t]??``).toLowerCase()}function Au(e){return e===`start`||e===`stop`||e===`report`}function ju(e){return e===`start`||e===`stop`}function Mu(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),Vu(t)}function Nu(e,t,n){return t?M.expandHome(t,e.req.meta?.cwd):Bu(e.sessionStore,e.sessionName,n)}function Pu(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 Fu(e,t,n,r){if(r.action===`start`){Ru(t);let i=Nu(e,r.outPath,`cpu.perf.data`);return Mu(e,await Lr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Hu(t,`cpu-profile`,r.kind);if(r.action===`report`){await Lu(i);let n=Nu(e,r.outPath,`cpu-report.json`);return await gr(t.device,i,n,{adb:e.androidAdbExecutor})}let a=zu(e,r.outPath,i);return Mu(e,await zr(t.device,i,a,{adb:e.androidAdbExecutor}))}async function Iu(e,t,n,r){if(r.action===`start`){Ru(t);let i=Nu(e,r.outPath,`app.perfetto-trace`);return Mu(e,await br(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Hu(t,`trace`,r.kind),a=zu(e,r.outPath,i);return Mu(e,await Ii(t.device,i,a,{adb:e.androidAdbExecutor}))}function Lu(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 Ru(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 zu(e,t,n){return t?Nu(e,t,n.outPath):n.outPath}function Bu(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return W.join(e.ensureSessionDir(t),`${r}-${n}`)}function Vu(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 Hu(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 Uu(e,n){let r=Wu(e.req);if(!r.ok)return r;if(n.device.platform===`android`)return R(`UNSUPPORTED_OPERATION`,`Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.`);if(!A(n.device.platform))return R(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return R(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await Yu(e,n,r):r.action===`stop`?await Xu(e,n,r):await td(e,n,r)}catch(e){return{ok:!1,error:t(e)}}}function Wu(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Gu(t):n===`trace`?Ku(t):R(`INVALID_ARGS`,Ie)}function Gu(e){if(e[1]?.toLowerCase()!==`profile`)return R(`INVALID_ARGS`,`perf cpu requires profile`);let t=qu(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=Ju(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 Ku(e){let t=qu(e[1],`perf trace`,!1);if(!t.ok)return t;let n=Ju(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 qu(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:R(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function Ju(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:R(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function Yu(e,t,n){if(t.applePerf?.active)return R(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??ad(n.mode),i=id(e,n),a=await jr({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=od(`started`,a);return rd(e,t,o),{ok:!0,data:o}}async function Xu(e,t,n){let r=t.applePerf?.active;if(!r)return R(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?M.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await or(r,i)}catch(n){throw Qu(n)&&Zu(e,t),n}$u(e,t,a);let o=od(`stopped`,a);return rd(e,t,o),{ok:!0,data:o}}function Zu(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 $u(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...ed(n)},e.sessionStore.set(e.sessionName,t)}function ed(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function td(e,t,n){if(n.mode!==`cpu-profile`)return R(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return R(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=id(e,n),i=nd(t,n);if(!i.ok)return i;let a={perf:`reported`,...await oi({tracePath:M.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return rd(e,t,a),{ok:!0,data:a}}function nd(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:R(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function rd(e,t,n){fr(e.sessionStore,t,e.req,`perf`,n)}function id(e,t){if(t.outPath)return M.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 ad(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function od(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 sd=`hdc-shell-top`,cd=`hdc-shell-proc-status`,ld=`Resident memory snapshot from HarmonyOS /proc/<pid>/status. Values are reported in kilobytes.`;function ud(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 dd(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 fd(e){let t=gd(e,`VmRSS`);if(t===void 0)return;let n=gd(e,`VmHWM`);return{totalRssKb:t,...n===void 0?{}:{peakRssKb:n}}}async function pd(e,t){let r=await hd(e,t),i=dd((await mr(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:sd,matchedProcesses:[t],pid:r}}async function md(e,t){let r=await hd(e,t),i=fd((await mr(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:cd,pid:r}}async function hd(e,t){let r=await mr(e,[`shell`,`pidof`,t],{allowFailure:!0,timeoutMs:15e3}),i=r.exitCode===0?ud(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 gd(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}Rn();function _d(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:uc,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 vd(e,t={}){let n=Sd(e);if(!Ad(e))return n;if(!e.appBundleId)return Dd(n,e),n;let r=yd(e.device);return r&&Od(n,e,await r(e,e.appBundleId,t)),n}function yd(e){let t=In(e.platform)?.perf?.metricsSamplerTag(e);return t?zd[t]:void 0}async function bd(e,t={}){let n=Td(e);return Ad(e)?e.appBundleId?(await kd(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:jd(e)},n):n}async function xd(e,t){let n=Ed(e);return Ad(e)?t.action===`sample`?(n.metrics={memory:await Bd(e,t)},n):(n.artifact=await Hd(e,t),n.support=Jd(n.artifact.support)??qd(e),n):t.action===`snapshot`?(n.artifact=Gd(e,Ud(e,t.kind)),n.support=Jd(n.artifact.support)??qd(e),n):(n.metrics={memory:{available:!1,reason:dc}},n)}function Sd(e){let t=_d(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:uc,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:uc};return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,...Cd()},sampling:{startup:{method:uc,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Md(e)}}}function Cd(){return{fps:wd(),memory:{available:!1,reason:dc},cpu:{available:!1,reason:dc}}}function wd(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function Td(e){return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:wd()},sampling:{fps:Fd(e)}}}function Ed(e){return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:Nd(e),snapshot:Pd(e)}}}function Dd(e,t){let n=jd(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}function Od(e,t,n){e.metrics.memory=Xd(n.memory),e.metrics.cpu=Xd(n.cpu),e.metrics.fps=Zd(Xd(n.fps),t)}async function kd(e,t,n,r){if(t.device.platform===`harmonyos`)return;let i=t.device.platform===`android`?await Yd(Ur(t.device,n,{adb:r.androidAdb})):await Yd(Bi(t.device,n));e.metrics.fps=Zd(Xd(i),t)}function Ad(e){return In(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function jd(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 Md(e){return e.device.platform===`android`?{memory:{method:ea,description:Mr,unit:`kB`},cpu:{method:hr,description:kr,unit:`percent`},fps:{method:Wr,description:Vr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:e.device.platform===`harmonyos`?{memory:{method:cd,description:ld,unit:`kB`},cpu:{method:sd,description:`Instantaneous process CPU usage from HarmonyOS shell top.`,unit:`percent`},fps:wd()}:Xr(e.device)}function Nd(e){return e.device.platform===`android`?{method:ea,description:Mr,unit:`kB`,topConsumerLimit:5}:e.device.platform===`harmonyos`?{method:cd,description:ld,unit:`kB`,topConsumerLimit:1}:Xr(e.device).memory}function Pd(e){return e.device.platform===`android`?{method:Sr,description:vr,defaultKind:`android-hprof`,artifactOnly:!0}:e.device.platform===`harmonyos`?{method:`unsupported`,description:`HarmonyOS memory snapshot capture is not available through HDC.`,artifactOnly:!0}:{method:Ai,description:Hi,defaultKind:`memgraph`,artifactOnly:!0}}function Fd(e){return e.device.platform===`android`?{method:Wr,description:Vr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:e.device.platform===`harmonyos`?wd():Ri(e.device)}async function Id(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([_r(e.device,t,r),Rr(e.device,t,r),Ur(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function Ld(e,t){let n=await Yd(Bi(e.device,t)),r=await Yd(ti(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 Rd(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([md(e.device,t),pd(e.device,t),r]);return{memory:i,cpu:a,fps:o}}const zd={android:Id,apple:Ld,harmonyos:Rd};async function Bd(e,t){return e.appBundleId?Xd(e.device.platform===`android`?await Yd(_r(e.device,e.appBundleId,{adb:t.androidAdb})):e.device.platform===`harmonyos`?await Yd(md(e.device,e.appBundleId)):await Yd(Vd(e))):{available:!1,reason:jd(e)}}async function Vd(e){if(!e.appBundleId)throw new n(`INVALID_ARGS`,jd(e));return(await ti(e.device,e.appBundleId)).memory}async function Hd(e,t){if(!e.appBundleId)throw new n(`INVALID_ARGS`,jd(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Ud(e,t.kind),i=Wd(t,r);return e.device.platform===`android`?r===`android-hprof`?await lr(e.device,e.appBundleId,i,{adb:t.androidAdb}):Gd(e,r):e.device.platform===`harmonyos`||r!==`memgraph`?Gd(e,r):await Mi(e.device,e.appBundleId,i)}function Ud(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Wd(e,t){if(e.out)return M.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 W.join(i,`artifacts`,`memory-${t}-${r}.${n}`)}function Gd(e,t){let n=qd(e),r=Kd(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Kd(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.`}:A(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 qd(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.`}:A(e.device.platform)?{..._i(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 Jd(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Yd(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Xd(e){if(e.status===`fulfilled`)return{available:!0,...e.value};let n=t(e.reason);return{available:!1,reason:n.message,error:n}}function Zd(e,t){if(e.available!==!0)return e;let n=Qd(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Qd(e,t){let n=$d(t.windowStartedAt),r=$d(t.windowEndedAt)??$d(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:ef(e)})).slice(-12)}function $d(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function ef(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 tf=[`dump`,`log`],nf=`network requires ${tf.join(` or `)}`,rf=`network include mode must be one of: ${o.join(`, `)}`,af=2048;async function of(e){let n=e.sessionStore.get(e.sessionName);if(!n)return R(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=sf(e.bindDevice),r=(await t(n.device,le)).facts.networkDump;if(!r.available)return ff(r.hint);let i=cf(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 pf(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:af,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function sf(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function cf(e){let t=lf(e);if(!t.ok)return t;let n=uf(e);if(!n.ok)return n;let r=df(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function lf(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return tf.includes(t)?{ok:!0,action:t}:R(`INVALID_ARGS`,nf)}function uf(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?R(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function df(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return R(`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}:R(`INVALID_ARGS`,rf)}function ff(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function pf(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:af,maxScanLines:e.entries.length},notes:e.notes}}}function mf(e,t){let n=ni(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[hf(e.appLogFailure)]:gf(n.state)}}function hf(e){return e.hint?`${e.message} ${e.hint}`:e.message}function gf(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 _f(e,t){return wi([...e,...t.notes??[]])}async function vf(e){let{req:t}=e;return t.command===`perf`?bf(e):t.command===`logs`?Pf(e):t.command===`events`?await yf(e):t.command===`network`?await of(e):t.command===`audio`?await gu(e):null}async function yf(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 bf(e){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=e,o=i.get(r);if(!o)return R(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=(n.positionals?.[0]??`metrics`).toLowerCase();if(xf(s))return o.device.platform===`android`?await Tu({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await Uu(e,o);let c=Sf(n);if(!c.ok)return c;if(c.native)return await Uu(e,o);try{return{ok:!0,data:await Cf(e,o,c)}}catch(e){return{ok:!1,error:t(e)}}}function xf(e){return e===`cpu`||e===`trace`}function Sf(e){let r=wf(e.positionals?.[0]);if(!r)return R(`INVALID_ARGS`,Ie);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=Tf(e.positionals?.[1]);if(!i)return R(`INVALID_ARGS`,De);let a=Ef(e.flags?.kind);return a instanceof n?{ok:!1,error:t(a)}:(Df(r,i)??Af(e,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:Nf(e.flags?.out)}}async function Cf(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await xd(t,{action:kf(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await bd(t,{androidAdb:a}):await vd(t,{androidAdb:a})}function wf(e){let t=(e??`metrics`).toString().toLowerCase();return ke(t)?t:void 0}function Tf(e){let t=(e??`sample`).toString().toLowerCase();return rt(t)?t:void 0}function Ef(e){if(e!==void 0)return typeof e!=`string`||!He(e)?new n(`INVALID_ARGS`,Le):e}function Df(e,t){if(e===`memory`)return Of(t)?void 0:R(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return R(`INVALID_ARGS`,`perf metrics and perf frames only support sample`)}function Of(e){return e===`sample`||e===`snapshot`}function kf(e){if(Of(e))return e;throw new n(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function Af(e,t,n,r){return jf(e.flags?.out,t,n)??Mf(r,t,n)}function jf(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return R(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function Mf(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return R(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!je(e))return R(`INVALID_ARGS`,Me)}}function Nf(e){return typeof e==`string`&&e.length>0?e:void 0}async function Pf(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return R(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=Kf({...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=Lf(te({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Ff(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function Ff(e,t){switch(t.kind){case`path`:return Rf(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return zf(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await If(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Wf(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Bf(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Vf(e)}}async function If(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Uf(e,t.appBundleId,n.owner,n.operations.appLogStart):await Hf(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Lf(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):R(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Rf(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=ou(a),s=mf(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 zf(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=mf(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:_f(t.notes,o)}}}function Bf(e,t,n){let r=n.resolveAppLogPath(t);return su(r,e),{ok:!0,data:{path:r,marked:!0}}}function Vf(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return R(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=cu(r.resolveAppLogPath(n));return Si({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Hf(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await Ui({session:i,sessionName:a,sessionStore:o,resourcePath:pi(o.resolveSessionDir(a))});let s=cu(o.resolveAppLogPath(a)),c=await Gf(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Uf(e,t,n,r){let{session:i}=e;return i.appLog?R(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Gf(e,t,r,n)}async function Wf(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return R(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await Ui({session:t,sessionName:n,sessionStore:r,resourcePath:pi(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Gf(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=pi(o.resolveSessionDir(a));try{let l=lu({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 $r({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:si({session:i,sessionName:a,sessionStore:o,error:e})}}}function Kf(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 qf(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=W.resolve(n??`.`,t??`.agent-device/test-artifacts`);return W.join(i,r)}function Jf(e,t){let n=t?W.relative(t,e):W.basename(e);return tp((n.length===0||n.startsWith(`..`)?W.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`))||`test`}function Yf(e,t){G.mkdirSync(t,{recursive:!0}),Qf(e,t)}function Xf(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=Zf(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=>W.basename(e)).join(`, `)}`);let d=W.join(o,`result.txt`),f=`${u.join(`
5
+ `)}\n`;G.writeFileSync(d,f),s||G.writeFileSync(W.join(o,`failure.txt`),f)}function Zf(e,t){let n=[],r=new Map;for(let i of e){if(!ep(i))continue;let e=$f(W.basename(i),r),a=W.join(t,e);W.resolve(i)!==W.resolve(a)&&G.copyFileSync(i,a),n.push(a)}return n}function Qf(e,t){let n=W.join(t,`replay.ad`);if(G.copyFileSync(e,n),W.extname(e).toLowerCase()===`.ad`)return;let r=W.join(t,W.basename(e));W.resolve(r)!==W.resolve(n)&&G.copyFileSync(e,r)}function $f(e,t){let n=W.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 ep(e){try{return G.statSync(e).isFile()}catch{return!1}}function tp(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 np(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}cp(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 rp(e,t,n,r,i=0){let a=tp(W.basename(n,W.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function ip(e){return tp((e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`))||`suite`}function ap(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,W.basename(r),`attempt`,a+1].join(`:`)}function op(e,t){return typeof e==`number`?e:t}function sp(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function cp(e,t){return e===`apple`?A(t):t===e}function lp(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const up=2e3;async function dp(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=_p({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=>lp({error:t(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([C,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(vp(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 fp(C)||(x=hp(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:up}}),pp({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await mp({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:S,emitDiagnostic:h});x?.status===`passed`&&e&&(x=gp(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??lp({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}async function fp(e){return await Promise.race([e.then(()=>!0),ma(up).then(()=>!1)])}async function pp(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 mp(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}}),lp({error:n})}}function hp(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function gp(e,t){return{...e,warnings:[...e.warnings,t]}}function _p(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=W.join(t,`replay-timing.ndjson`);return G.mkdirSync(W.dirname(l),{recursive:!0}),G.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&&G.appendFileSync(e,`${JSON.stringify(t)}\n`)}function vp(e,t=[]){return lp({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 yp(e){let t=bp(e),n=await xp(e,t);return{result:Dp(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function bp(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:W.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Jf(t.path,n)),maxAttempts:r+1}}async function xp(e,t){Cp(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Sp(e,t,r);if(wp(n,i),Tp(e,i.outcome,r))break;Ep(e,t,i)}return n}async function Sp(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=rp(i,a,r.path,o,n),h=W.join(t.testArtifactsDir,`attempt-${f}`);Yf(r.path,h);let g=ap({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,...jp(d)},v=await dp({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 Xf({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Cp(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:rp(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...jp(c)})}function wp(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 Tp(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Ep(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,...jp(e.shard)})}function Dp(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Op(e,t,n,r):kp(e,t,n,r)}function Op(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,...jp(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}:{},...Ap(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function kp(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,...jp(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}:{},...Ap(s)}}function Ap(e){return jp(e)}function jp(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Mp(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 Np(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 Pp(t,u,d);Rp(s,a);let p=s.shardPlan?zp({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await Bp({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 Wp({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:qp(s.total,p,Date.now()-e)}}catch(e){let t=s(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Pp(e,t,n){let r=Fp(e,t),i=Ip(r),a=r.length-i.length,o=ip(e.requestId),s=await Mp(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:Lp(e,o),total:s?.total??r.length}}function Fp(e,t){return np({inputs:[...e.inputs],cwd:e.cwd,platformFilter:e.platformFilter,discoverSources:t})}function Ip(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Lp(e,t){return qf({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Rp(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 zp(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 Bp(e){return(await Promise.allSettled(e.shards.map(async t=>await Hp({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Vp(r,e.sessionName,t.reason)]:[]})}function Vp(e,n,r){let i=t(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:Up(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 Hp(e){let{shard:t,sessionName:n}=e;return await Gp({...e,entries:t.entries,sessionName:Up(n,t),shard:t})}function Up(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Wp(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 yp({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:sp(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:op(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),Kp(t,o,p))break}return g}async function Gp(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 yp({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:sp(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:op(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),Kp(b,o,m))break}return _}function Kp(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function qp(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 Jp(e){return JSON.stringify(Yp(e))}function Yp(e){if(Array.isArray(e))return e.map(Yp);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,Yp(t[e])]))}function Xp(e){let t=Jp(Zp(e));return ua(`sha256`).update(t,`utf8`).digest(`hex`)}function Zp(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)=>Qp(e,n[t]??null,r?.[t]??null))}}function Qp(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 $p(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=em({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function em(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>tm({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>nm({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>rm(n,r)];for(let e of s){let t=e();if(t)return t}}function tm(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 nm(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 rm(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 im(e,t){let r=G.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=Dt(r),o=Lt(r),s=Xp({actions:a.actions,actionLines:a.actionLines,actionSourcePaths:a.actionSourcePaths,metadata:{platform:t?.platform??vt(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=>$p(e,c,s)}}function am(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function om(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 sm(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 cm(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=sm(i,a);return{matchCount:n,observed:r,mismatches:[...r?b(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 lm(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...b(e,r),...x(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 um(e,t,n,r,i,a){if(n.targetEvidences)return dm(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return pm(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return pm(e,n,r,i,a);if(s.kind===`post-resolution`){let c=am({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return pm(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return mm(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=om({recorded:o,token:s.token});if(c.kind===`skip`)return pm(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,fm(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?mm(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 dm(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 pm(e,n,r,i,a);let d=om({recorded:o[c],token:u.token});if(d.kind===`skip`)return pm(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,fm(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 mm(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function fm(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 pm(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 mm(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=hm(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=gm(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 hm(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 gm(e,t,n){return n.status===`guard-mismatch`?cm(e,n.evidence,t):lm(e,n.evidence)}async function _m(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=va(e.varSources),o=[],s=[],c=xm(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!bm(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Sm(u,n.length,r,e))}let d=Oa(r,a,ym(e,u)),f=ja(a),p=t.diagnosticsMarker(),m=await um(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:vm(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 vm(e,t){return t.length===0?e:[...new Set([...e,...t])]}function ym(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function bm(e){return!!(e&&e.command!==`replay`)}function xm(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(bm(n))return n.command===`close`?t:void 0}}function Sm(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function Cm(e){let{sessionStore:t,sessionName:n}=e,r=()=>t.get(n);return{view(){let e=r();if(e)return{repairBoundary:St(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){let i=r();i&&(_t(i,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:wm(e.sourcePath),firstArm:e.firstArm}),t.set(n,i))},demoteForRerunIfArmed(){let e=r();!e||St(e)===void 0||ct(e)},markCompleteIfArmed(){let e=r();!e||St(e)===void 0||(lt(e),t.set(n,e))},markSessionHeldIfArmed(e){if(e.ok||!xt(r()))return e;let t=Tm(e);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){t.clearRepairTombstone(n)},clearCorrectiveWatermarkIfExpected(e){let i=r();!i||i.pendingRecordAndHeal?.expectedFrom!==e||(Om(i),t.set(n,i))},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){let i=r();i&&(Dm({session:i,...e}),t.set(n,i))}}}}function wm(e){let t=W.dirname(e),n=W.basename(e,W.extname(e));return W.join(t,`${n}.healed.ad`)}function Tm(e){let t=e.error.details?.divergence;if(!(!ie(t)||!Em(t.resume)))return t.resume}function Em(e){return!ie(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function Dm(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=km({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Om(e){e.pendingRecordAndHeal=void 0}function km(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 Am(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 jm(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),yt(e.command)){let n=Mm(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}=Am([...e.positionals]);n&&t.push(n)}return wi(t).filter(e=>e.trim().length>0)}function Mm(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Nm(n)?t.slice(0,-1):t}function Nm(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Pm(e){let t=Fm({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 Fm(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Im({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Im(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 Lm(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Rm(n))return`manual`;let i=zm(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Rm(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&Bm(e.scrollRegion)}function zm(e,t){let n=qe(t),r=Hm(e.ancestry,n,t),i=e.scrollRegion;return i&&Bm(i)?r&&Vm(i,n,t):r}function Bm(e){return e.id!==void 0||e.label!==void 0}function Vm(e,t,n){return n.some(n=>Ht(Vt(n,t),e))}function Hm(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Ee(n,t,e.length);return!r.broken&&ue(r.chain,e)})}const Um=new WeakMap;function Wm(e){return{store:t=>Gm(e,t),finalize:(t,n)=>Km({...e,evidence:t,projection:n})}}function Gm(e,t){let{sessionStore:n,sessionName:r}=e,i=n.get(r);if(!i)throw Error(`Internal observation session is no longer available.`);xr(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 Um.set(o,{sessionName:r,session:i,sessionCreatedAt:i.createdAt,snapshot:t,snapshotGeneration:a,runtimeRevision:Gr(i),refFrame:Jm(i)}),{evidence:o,refsGeneration:a}}function Km(e){let t=Um.get(e.evidence);Um.delete(e.evidence);let n=Xm(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!qm(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Zm(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Br(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function qm(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&&Gr(n)===t.runtimeRevision&&Ym(Jm(n),t.refFrame)}function Jm(e){return{state:e.refFrameState,scope:e.refFrameScope,tree:e.refFrameTree,generation:e.refFrameGeneration}}function Ym(e,t){return e.state===t.state&&e.scope===t.scope&&e.tree===t.tree&&e.generation===t.generation}function Xm(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 Zm(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Qm(t){let{sessionStore:n,sessionName:r,divergence:i,responseLevel:a}=t,o,s,c=et({divergence:i,level:a,writeOverflowArtifact:t=>{let i=e(t),a=th(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&&Wm({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 eh(s),$m(c,`missing-evidence`);let u=Wm({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:(eh(s),$m(c,u.reason))}function $m(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 eh(e){if(e)try{G.unlinkSync(e)}catch{}}function th(e,t,n){try{let r=W.join(e.ensureSessionDir(t),`replay-divergence`);G.mkdirSync(r,{recursive:!0});let i=`${Date.now()}-step${n.step.index}.json`,a=W.join(r,i);return G.writeFileSync(a,`${JSON.stringify(n,null,2)}\n`),{artifactPath:a}}catch{return{artifactUnavailable:!0}}}const nh={id:0,"role-label":1,label:2,other:3};function rh(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||ih(n.basis)<ih(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>ih(e.basis)-ih(t.basis)||e.nodeIndex-t.nodeIndex)}function ih(e){return nh[e]}async function ah(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=Be(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await ch({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=fh(v,g),b=v.state===`available`&&o?_h({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=Lm({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:oh(v)}),ee=Pm({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Qm({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(st(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:ee,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function oh(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const sh=[300,500,800,1200,2e3,3e3,4e3];async function ch(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=uh(a),c=Date.now()+12e3,l=await lh({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of sh){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await nn(Math.min(e,a)),l=await lh({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s})}return l.observation}async function lh(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,flags:a}=e;try{let e=(await ai({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(nt(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=Wm({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:Oe(e)}}}function uh(e){return{snapshotInteractiveOnly:dh(e)}}function dh(e){return vh(e.command)?yh(e).requiresRect:!0}function fh(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=gh(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function ph(e){return!!tt(e,ze(e.type??`Element`))||e.hittable===!0}function mh(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function hh(e,t){let n=Re(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&ph(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=>mh(e,t)),...o.filter(e=>!mh(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function gh(e,t,n){let{nodes:r,truncated:i}=hh(e,n);return{refs:r.map(e=>{let n=ze(e.type??`Element`),r=tt(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function _h(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!vh(t.command))return[];let a=jm(t);return a.length===0?[]:bh({candidates:a,nodes:r,session:n,action:t,matching:yh(t),sanitize:i})}function vh(e){return yt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function yh(e){let t=yt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function bh(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=xh({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return rh(s).map(e=>e.suggestion)}function xh(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:Sh({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function Sh(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=ae(t,r.device.platform,{action:i.command===`fill`?`fill`:yt(i.command)?`click`:`get`,nodes:n}),c=ze(t.type??`Element`),l=tt(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function Ch(e){return{...e,hint:e.hint??Eh(e.details,`hint`),diagnosticId:e.diagnosticId??Eh(e.details,`diagnosticId`),logPath:e.logPath??Eh(e.details,`logPath`)}}function wh(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return Th({error:t,actionLabel:st(n),action:n.command,positionals:ht(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function Th(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:Ae(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Ae(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Oh(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function Eh(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const Dh=[`reason`,`retriable`,`supportedOn`];function Oh(e){if(!e)return{};let t={};for(let n of Dh)e[n]!==void 0&&(t[n]=e[n]);return t}async function kh(e){return await Ah({...e,snapshotDiagnostics:h(e.snapshotDiagnosticSamples)})}async function Ah(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 _=jh(t.error.details?.replaySource),v=Ch(t.error),y=await ah({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:P(u.meta?.requestId)});return wh({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function jh(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 Mh(t,n){if(t)try{G.appendFileSync(t,`${JSON.stringify(e(n))}\n`)}catch(e){N({level:`warn`,phase:`replay_trace_write_failed`,data:{path:t,error:e instanceof Error?e.message:String(e)}})}}async function Nh(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();Mh(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:ht(o)??[]});let m;try{m=await Fh({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 Mh(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?Lh(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Ph(m,u??s,c)}function Ph(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 Fh(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Rh(t.flags,r.flags),s=i.command===`fill`?mt(ut(i)):void 0;return s&&(o.recordAs=s),await a(Ih({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??xi(t)}:{}}},r))}function Ih(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 Lh(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 Rh(e,t){return me(e,{...t??{}})}function zh(e){return Kh(e.ok?Vh(e.data):Bh(e.error.details?.artifactPaths))}function Bh(e){return Array.isArray(e)?e.filter(Gh):[]}function Vh(e){return e?[Wh(e.path),Wh(e.outPath),...Hh(e.artifacts)].filter(Gh):[]}function Hh(e){return Array.isArray(e)?e.map(Uh).filter(Gh):[]}function Uh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Wh(t.localPath)??Wh(t.path)}function Wh(e){return typeof e==`string`?e:void 0}function Gh(e){return typeof e==`string`}function Kh(e){return[...new Set(e.filter(qh))]}function qh(e){try{return G.statSync(e).isFile()}catch{return!1}}function Jh(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Yh({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=qe(r),u=ge(t),d=$e(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Ut(r,e)===t.sibling),p=d.filter(e=>Ht(Vt(e,l),t.scrollRegion)),m=Bt(p)[t.viewportOrder]?.ref,h=Wt({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,...Qh({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Yh(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Xh(n,t,i,a):Zh(n,t,r,a,o)}function Xh(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?Ue(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Zh(e,t,n,r,i){let a=oe(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return a.kind===`resolved`?{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref}:{matchedNodes:[...a.matchedNodes],winnerRef:``}}function Qh(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?$h(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?$h(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?$h(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 $h(e,t,n){let r=Gt(t),i=Ee(t,n,Math.max(e.ancestry.length,1)).chain;return[...b(e,r),...x(e.ancestry,i)].slice(0,5)}function eg(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(!yt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(ng(r)&&ng(n[1])))return r}function tg(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function ng(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function rg(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=Be(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:pg(ge(n),g),...t.observed?{observed:pg(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>mg(e,g))},v=Lm({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Pm({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b=Qm({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(st(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 wh({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:p})}function ig(e,t,n){let r=Be(e.scrubVars);return rg(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:fh(n,r),publicationEvidence:cg(n),repairCapture:oh(n)})}async function ag(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await ch({session:t,sessionName:n,sessionStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function og(e,t){return ig(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 ag({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function sg(e,t,n){return ig(e,t,await ag({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function cg(e){return e.state===`available`?e.evidence:void 0}function lg(e){let{action:t,resolvedAction:n,sessionName:r,sessionStore:i,targetRole:a}=e,o=i.get(r);return o?re(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:ce(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:eg(n,a),platform:o.device.platform}:{kind:`inactive`}}function ug(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=yh(r),s=Jh({recorded:t,token:n,nodes:i,platform:a,refLabel:tg(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Gt(s.winnerNode),structural:C(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Gt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function dg(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function fg(e){return!e.ok&&e.error.details?.reason===Fe}function pg(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function mg(e,t){let n=ze(e.type??`Element`),r=tt(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function hg(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 gg(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 _g(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 vg(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 yg(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:gg(e?.observed),expectedStructural:vg(e?.expectedStructural),observedStructural:vg(e?.observedStructural)}}function bg(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:gg(e?.observed),observedAncestry:_g(e?.observedAncestry)}}function xg(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function Sg(e,t,n){let r=xg(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&dg(e)?{status:`guard-mismatch`,evidence:yg(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&fg(e)?{status:`landmark-mismatch`,evidence:bg(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function Cg(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,xg(wg(e),zh(e)));return{runtime:{beginTargetVerification(e,n,r,i){return lg({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 ch({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 ug({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 Nh({req:hg(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,zh(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:Sg(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await og(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=ig(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await sg(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=wg(o),u=await Tg(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=>Eg(e),onStep:i,diagnosticsMarker:()=>Og(t.sessionStore,t.sessionName),diagnosticsSince:e=>kg(t.sessionStore,t.sessionName,e)},readLastResponse:()=>o}}function wg(e){return e&&!e.ok?e:R(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Tg(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Dg(i)?c(i):c(await kh({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 Eg(e){let t=e.positionals??[],n=he(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Dg(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 Og(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function kg(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function Ag(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:jg(t,i)};return Ng(o,`AD_PLATFORM`,a.platform??r.platform),Ng(o,`AD_TARGET`,a.target??r.target),Ng(o,`AD_DEVICE`,a.device),Ng(o,`AD_DEVICE_ID`,Mg(a)),Pg(o,`AD_SHARD_INDEX`,a.shardIndex),Pg(o,`AD_SHARD_COUNT`,a.shardCount),Ng(o,`AD_ARTIFACTS`,a.artifactsDir),o}function jg(e,t){let n=e.meta?.cwd??process.cwd();return W.relative(n,t)||t}function Mg(e){return typeof e.serial==`string`?e.serial:e.udid}function Ng(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Pg(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Fg=3e4,Ig=1e3;function Lg(e){let{scriptPath:r,env:i}=e,a=G.readFileSync(r,`utf8`),o=Object.create(null);try{ha.runInNewContext(a,Rg(i,o),{filename:r,timeout:Fg})}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 Hg(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Ug(t)]))}function Rg(e,t){return{...e,output:t,json:zg,http:{post:(e,t)=>Vg(`POST`,e,t)}}}function zg(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,Bg)}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,Ig)},t instanceof Error?t:void 0)}}function Bg(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Vg(e,t,r){let i=Qt(process.execPath,[`-e`,`
5
6
  const fs = require('node:fs');
6
7
  const input = JSON.parse(fs.readFileSync(0, 'utf8'));
7
8
  if (typeof fetch !== 'function') {
@@ -22,8 +23,8 @@ fetch(input.url, {
22
23
  console.error(error && error.stack ? error.stack : String(error));
23
24
  process.exit(1);
24
25
  });
25
- `],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??``}),timeoutMs:Mh,allowFailure:!0});if(i.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Vh(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,Nh),stderr:i.stderr.slice(0,Nh)},r instanceof Error?r:void 0)}}function zh(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 Bh(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Vh(e){let t=e.trim();return t.length>0?t.slice(0,Nh):`request process exited without stderr`}async function Hh(e){return await Uh(`tap`,async t=>{let n=U.join(t,`before.png`),r=U.join(t,`after.png`),i=await Gh(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Gh(e,r)))return await Wh(n,r,e.signal,`tap`)}})})}async function Uh(e,t){let n=await qi.mkdtemp(U.join(Ji.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await qi.rm(n,{recursive:!0,force:!0})}catch{}}}async function Wh(e,t,n,r){try{let[i,a]=await Promise.all([qi.readFile(e),qi.readFile(t)]);Yh(n);let o=await Bt(i,a,`Maestro screenshot`);return Yh(n),Kh(o,r)}catch(e){Jh(e,n),F({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Gh(e,t){try{return await qi.rm(t,{force:!0}),Yh(e.signal),await e.capture(t),Yh(e.signal),!0}catch(t){return Jh(t,e.signal),!1}}function Kh(e,t){if(e.status!==`compared`)return qh(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return qh(t,n?`stable`:`changed`,e),n}function qh(e,t,n){F({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Jh(e,t){if(t?.aborted||gn(e))throw yn()}function Yh(e){if(e?.aborted)throw yn()}async function Xh(e){Qh(e.timeoutMs),Yh(e.signal);let t=e.now()+e.timeoutMs;return await Uh(`animation`,async n=>{let r=U.join(n,`first.png`),i=U.join(n,`second.png`);for(;;){if(Yh(e.signal),await Zh(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Zh(e,t,n){let r=[await Gh(e,t),await Gh(e,n)];return!r[0]||!r[1]?!1:await Wh(t,n,e.signal,`animation`)===!0}function Qh(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const $h=q.observationPollMs;async function eg(e,t){for(;;){Q(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!gg(n)||(Q(e.context.signal),!await mg(e.dependencies,t,$h,e.context.signal)))throw n}}}function tg(e){return ng({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function ng(e){let t=Sr(e.snapshot),n=e.platform===`ios`?wr(e.snapshot.nodes):void 0;return sg(po(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 rg(e){hg(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Q(e.context.signal);let r=await eg(e,n),i=ng({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,_a(e.condition,i))return i;if(e.dependencies.now()>=n)break;await mg(e.dependencies,n,$h,e.context.signal)}return Q(e.context.signal),yg(t)}async function ig(e){hg(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Q(e.context.signal);let i=r??await eg(e,t);if(r=void 0,n=ng({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),yg(n)}async function ag(e){hg(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await eg(e,t),r=_g(n);for(;;){Q(e.context.signal),await mg(e.dependencies,t,$h,e.context.signal);let i=await eg(e,t),a=_g(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function og(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function sg(e,t,n,r,i,a,o){if(!e.ok){let t=og(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=lg({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=og(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:cg(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:_g(t)}:{}}}function cg(e,t){return!E(e)||!E(t)?0:oe(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 lg(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!ug(t,n,r)||i!==1))return dg(t.selector)}function ug(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function dg(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!fg(n)||typeof r!=`string`)return;let i=Fi(r)?.trim();return i?{key:n,value:i}:void 0}function fg(e){return e===`id`||e===`label`||e===`text`}async function pg(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?yn():e}Q(n)}async function mg(e,t,n,r){let i=t-e.now();return i<=0?!1:(await pg(e,Math.min(n,i),r),!0)}function Q(e){if(e?.aborted)throw yn()}function hg(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function gg(e){return e instanceof n&&e.details?.retriable===!0}function _g(e){return Ki(`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:vg(e.rect)})))).digest(`hex`)}function vg(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 yg(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function bg(e){return xg(e)?Sg(e):Mg(e)?Ng(e):Eg(e)}function xg(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Sg(e){switch(e.kind){case`launchApp`:return Cg(e);case`stopApp`:return wg(e);case`openLink`:return Tg(e)}}function Cg(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 wg(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function Tg(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Eg(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Dg(e);case`clickPoint`:return Og(e);case`swipe`:return kg(e);case`scroll`:return Ag(e);case`pressKey`:return jg(e)}}function Dg(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Og(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function kg(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 Ag(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function jg(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Mg(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Ng(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 Pg(e,t){let n=bg(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=Fg(i,n.flags??{}),c=O({...a,...n.internal,...t.kind===`snapshot`?{observationOnly:!0}:{}}),l=await e.invoke(O({...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 Vg(l);return l.data}function Fg(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=O({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Ig(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 Lg(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 Rg(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 zg(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 Bg(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Vg(e){let t=e.error,r=O({...t.details??{},hint:t.hint??Hg(t.details,`hint`),diagnosticId:t.diagnosticId??Hg(t.details,`diagnosticId`),logPath:t.logPath??Hg(t.details,`logPath`),retriable:t.retriable??Ug(t.details,`retriable`),supportedOn:t.supportedOn??Hg(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function Hg(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Ug(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Wg(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Pg(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 ag({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 Gg(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 eg({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=tg({query:t,context:n,snapshot:o,platform:i.platform});if(Zg(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await mg(i.dependencies,a,$h,n.signal)}}}async function Kg(e,t,n,r,i,a){let o=async()=>await Yg(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Hh({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Pg(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await qg(e,t,n,r,i,a.click,o)});return}await qg(e,t,n,r,i,a.click)}async function qg(e,t,n,r,i,a,o){let s=async()=>await Yg(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:_g(await t.capture(i))),l=async()=>await ag({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await Jg({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 Jg(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 Yg(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Qg(e,o,n.point,i);return}catch(n){if(!$g(n))throw n;let o=await Gg({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Xg(o))throw n;t.invalidate(r.generation),await e_(e,Pe(o.rect),i);return}}t.invalidate(r.generation),await e_(e,n.point,i)}function Xg(e){return e.matched&&e.visible&&e.rect!==void 0}function Zg(e,t){return Xg(e)?!t||e.dispatchSelector!==void 0:!1}async function Qg(e,t,n,r){F({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Pg(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function $g(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function e_(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);F({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Pg(e,{kind:`clickPoint`,point:t,options:r})}function t_(e){let t=Wg(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),Pg(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)=>{Ut(n),await s({kind:`typeText`,text:n},r);let i=await ag({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 Gg({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await rg({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=[...Ig(e.arguments),...Ig(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 Kg(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>e_(e,t.target.point,O({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>e_(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 ig({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=Ea(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 ag({timeoutMs:Math.min(q.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==q.scrollUntilVisiblePercentage)throw Vi(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Lg(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 Xh({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:Rg(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Ph({scriptPath:zg(t.file,n,e.sourcePath),env:{...n.env,...t.env?Bg(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r})}}function n_(e){let{operations:t,snapshots:n,readMetrics:r}=t_(e);return vo(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 r_(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),i_(()=>s_(r,e)),i_(()=>c_(n,t,e))},actionCompleted:e=>{let r=a_(i,e.stepIndex);i_(()=>l_(n,t,o_(r,e),!0))},actionFailed:e=>{let r=a_(i,e.stepIndex);i_(()=>l_(n,t,o_(r,e),!1))}}}function i_(e){try{e()}catch{}}function a_(e,t){let n=e.get(t);return e.delete(t),n}function o_(e,t){return O({...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 s_(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function c_(e,t,n){km(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 l_(e,t,r,i){let a=u_(r);km(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 u_(e){let t=`data`in e?e.data:void 0,n=d_(t?.timing)?t.timing:void 0;return O({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function d_(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function f_(e,t){return qr(e,t)}function p_(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:__(e.action),positionals:v_(e.action,e.value),flags:t.flags??{}}}}async function m_(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,logPath:o}=e,s=bn(r.meta?.requestId),c=p_(t,r),l=bm(e.error),u=[...t.redactions],d=Ae(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(i),m=p?await am({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?h_({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,g_(t.value)].filter(Boolean).join(` `),_=Yp({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:lm(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Pp({kind:`action-failure`,targetEvidence:void 0,capture:rm(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return Sm({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 h_(e){let t={createdAt:Date.now(),nodes:e.nodes};return em(f_(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>ym({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function g_(e){return!e||e===`<text>`?e??``:Et(e)}function __(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function v_(e,t){return!t||e===`inputText`?[]:[t]}function y_(e){let{outcome:t,startedAt:n,sessionName:r,sessionStore:i,snapshotStart:a}=e,o=x_(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:C_(s,Date.now()-n)}}}async function b_(e){let{failure:n}=e.outcome,r=t(e.outcome.error);return n?await m_({error:r,failure:n,replayPath:P.expandHome(e.requestedPath,e.req.meta?.cwd),req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,snapshotDiagnostics:x_(e.sessionStore,e.sessionName,e.state.snapshotStart)}):z(r.code,r.message,{...r.details??{},...S_(n)})}function x_(e,t,n){return m(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function S_(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function C_(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function w_(e){let{req:t}=e,n=t.positionals?.[0];if(!n)return z(`INVALID_ARGS`,`replay requires a path`);if(t.flags?.saveScript!==void 0)return z(`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 T_({...e,requestedPath:n,startedAt:r,state:i})}catch(t){return await b_({...e,requestedPath:n,state:i,outcome:{ok:!1,error:t}})}}async function T_(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,onStep:a,invoke:o,state:s}=e,c=await E_(e),l=M_({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 Zr(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:r_({filePath:c.filePath,tracePath:i,onStep:a})});return u.ok?y_({outcome:u,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:s.snapshotStart}):await b_({...e,requestedPath:e.requestedPath,state:s,outcome:u})}async function E_(e){let{req:t,requestedPath:n,sessionName:r,sessionStore:i}=e,a=P.expandHome(n,t.meta?.cwd),o=bi(W.readFileSync(a,`utf8`),a),s=i.get(r);s&&br(s,t.flags);let c=await D_({req:t,sessionStore:i,sessionName:r,session:s,flow:o});return{filePath:a,flow:o,...c,defaults:A_({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:j_(t),signal:bn(t.meta?.requestId)}}async function D_(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??{},_i(a.appTarget,o))),c=L_(t,s),l=Ns({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await O_({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:R_(t,s),runtimeHints:l,flow:a})}async function O_(e){if(e.device||!k_(e.runtimeHints))return e;let t=await kn(e.req.flags??{},_i(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:R_(e.req,t),runtimeHints:Ns({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function k_(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function A_(e){return{...Dh({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function j_(e){return{...ta(ia(e.flags?.replayShellEnv)),...na(ra(e.flags?.replayEnv))}}function M_(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 n_({baseReq:O({...h,flags:N_(s,c,t.flags),runtime:l}),invoke:r,platform:c,sourcePath:u,dependencies:{now:Date.now,sleep:async(e,t)=>{await Xi(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 jn(e.device,B(i,t.flags,e.appBundleId,e.trace?.outPath))}}})}function N_(e,t,n){if(!e)return P_(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 P_(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?F_(n,t):I_(n,t)}function F_(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function I_(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function L_(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 R_(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function z_(e){let{resolved:t,req:n,keepSession:r,coordinator:i,maestroParams:a}=e;if(Ni(t,n.flags?.replayBackend)===`maestro`)return r?z(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):i.view()?.repairBoundary===void 0?await w_(a):z(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function B_(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,coordinator:o}=e,s=V_(t);if(s)return{ok:!1,response:s};let{manifest:c,replayReq:l}=H_(t,a),{metadata:u,actions:d,actionLines:f,actionSourcePaths:p,planDigest:m}=c,h=r.get(n),g=U_({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:G_({req:t,replayReq:l,sessionName:n,resolved:a,metadata:u}),actionTracePath:i??h?.trace?.outPath}}:{ok:!1,response:g.response}}function V_(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return z(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function H_(e,t){let n=tp(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:W_({...e,flags:Di(e.flags,n.actions)},n.metadata)}}function U_(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:z(`INVALID_ARGS`,a.message)}}function W_(e,t){return!t.platform&&!t.target?e:{...e,flags:K_(e.flags,t)}}function G_(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Dh({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:ta(ia(t.flags?.replayShellEnv)),cliEnv:na(ra(t.flags?.replayEnv))}}function K_(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 q_(e){let{req:t,entryIndex:n,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}=e,s=J_({entryIndex:n,sessionStore:r,sessionName:i,coordinator:o});return s?{ok:!1,response:s}:(Z_({req:t,coordinator:o}),X_({req:t,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}))}function J_(e){let t=Q_(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return Dn()}function Y_(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?z(`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.`):$_({saveScript:t,liveForce:n,persistedForce:gt(r)||void 0,sourcePath:i,existingSaveScriptPath:Ct(r)})}function X_(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i,coordinator:a}=e,o=n.get(r),{saveScript:s,force:c}=t.flags??{},l=Y_({saveScript:s,force:c,preRunState:o?.scriptPublication??xt,sourcePath:i});return l?{ok:!1,response:l}:(a.demoteForRerunIfArmed(),{ok:!0,armSaveScript:ev({saveScript:s,force:c,coordinator:a,sourcePath:i})})}function Z_(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Q_(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return z(`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 $_(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?St(t):a??xp(i);if(!(n||r&&o===a)&&W.existsSync(o))return z(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function ev(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 tv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,onStep:o,invoke:c}=e,l=t.positionals?.[0];if(!l)return z(`INVALID_ARGS`,`replay requires a path`);let u=Date.now(),d=t.flags?.replayKeepSession===!0,f=``,p=new Set,m=bp({sessionStore:i,sessionName:n});try{if(f=P.expandHome(l,t.meta?.cwd),Wr(f)&&t.flags?.replayBackend!==`maestro`)return z(`INVALID_ARGS`,ui(`replay`,l));let s=await z_({resolved:f,req:t,keepSession:d,coordinator:m,maestroParams:e});if(s)return s;let h=B_({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=q_({req:t,entryIndex:x,sessionStore:i,sessionName:n,sourcePath:f,coordinator:m});if(!C.ok)return C.response;let{runtime:w,readLastResponse:te}=bh({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:bn(t.meta?.requestId),coordinator:m},req:t,artifactPaths:p,onStep:o,armSaveScript:C.armSaveScript}),T=await mp({actions:_,entryIndex:x,keepSession:d,actionLines:v,actionSourcePaths:y,resolvedPath:f,varSources:ee},w);return T.status===`failed`?te()??z(`COMMAND_FAILED`,`replay step failed with no recorded response`):nv({startedAt:u,sessionName:n,sessionStore:i,replayed:T.replayed,artifactPaths:T.artifactPaths,snapshotDiagnosticSamples:T.snapshotDiagnosticSamples,armSaveScript:C.armSaveScript,coordinator:m,keepSession:d})}catch(e){let t=s(e);return z(t.code,t.message,p.size>0?{artifactPaths:[...p]}:void 0)}}function nv(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=iv({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=m([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:rv(i,Date.now()-t)}}}function rv(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function iv(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return z(`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 av=/[*?[\]{}]/;function ov(e){let t=e.replayBackend===`maestro`?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`]),n=[],r=[];for(let i of e.inputs){let a=sv(i,e.cwd,t);if(a.source===`file`){n.push(...a.paths);continue}r.push(a.source===`directory`?fv(a.paths):uv(a.paths))}return fv([...n,...r.flat()])}function sv(e,t,r){let i=P.expandHome(e,t);if(W.existsSync(i)){let t=W.statSync(i);return t.isDirectory()?{paths:lv(i,r),source:`directory`}:t.isFile()?(cv(e,i,r),{paths:[i],source:`file`}):{paths:[],source:`file`}}if(!pv(e)&&!pv(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())&&mv(e))}}function cv(e,t,r){if(!r.has(U.extname(t).toLowerCase()))throw Wr(t)&&!r.has(`.yaml`)?new n(`INVALID_ARGS`,ui(`test`,e)):new n(`INVALID_ARGS`,`test does not support this file type: ${e}`)}function lv(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(...lv(r,t)):i.isFile()&&t.has(U.extname(i.name).toLowerCase())&&n.push(r)}}finally{r.closeSync()}return n}function uv(e){return e.map(e=>U.normalize(e)).sort((e,t)=>{let n=dv(e)-dv(t);return n===0?e.localeCompare(t):n})}function dv(e){return+(U.extname(e).toLowerCase()===`.ad`)}function fv(e){return[...new Set(e.map(e=>U.normalize(e)))]}function pv(e){return av.test(e)}function mv(e){try{return W.statSync(e).isFile()}catch{return!1}}function hv(e){return({inputs:t,cwd:n})=>ov({inputs:t,cwd:n??process.cwd(),replayBackend:e}).map(t=>gv(t,e))}function gv(e,t){let n=W.readFileSync(e,`utf8`),r=Ni(e,t)===`maestro`,i=Dt(n);return{path:e,manifest:{...r?{title:bi(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 _v(e){return async t=>(await bv(e,t)).map(vv)}function vv(e){if(e.platform===`web`||!pe(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 yv(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 bv(e,t){let r=wv(e),i=Sv(await An(xv(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${Cv(t)}, but only ${i.length} matched`);return i.slice(0,t)}function xv(e){let t=nn(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:de({simulatorSetPath:rn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Sv(e,t,n){return t.length>0?Tv(e,t,n):e.filter(e=>Ev(e,n)).sort(kv)}function Cv(e){return`${e} device${e===1?``:`s`}`}function wv(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Tv(e,t,r){return t.map(t=>{let i=Ov(t),a=e.find(e=>Dv(e,r)&&(e.id===t||Ov(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Ev(e,t){return!Dv(e,t)||!pe(e)?!1:e.booted!==!1}function Dv(e,t){return!(!me(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Ov(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function kv(e,t){return e.id.localeCompare(t.id)}function Av(e){let t=jv(e?.shardAll,`--shard-all`),r=jv(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 jv(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 Mv=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Nv(e){let t=Pv(e);return t?Fv(t.details)||Iv(t.code,t.message):!1}function Pv(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Fv(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?an(t):!1}function Iv(e,t){let n=`${e}\n${t}`.toLowerCase();return Mv.some(e=>n.includes(e))}function Lv(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Bv(e.error.details?.artifactPaths),infrastructure:Nv(e),...Vv(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:zv(t?.warnings),artifactPaths:Bv(t?.artifactPaths),...Vv(t?.snapshotDiagnostics)}}function Rv(e){if(!e||e.ok)return;let t=Lv(e);return t.status===`failed`?t:void 0}function zv(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Bv(e){return[...new Set(zv(e))]}function Vv(e){let t=d(e);return t?{snapshotDiagnostics:t}:{}}const Hv=1e3,Uv=3e3;function Wv(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Gv(e)}}async function Gv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:a,appendTimingEvent:o}=e;if(t.flags?.recordVideo!==!0)return;let s=i.get(n);if(!s||s.recording)return;let c=bt(s.device.platform),l=a?U.join(a,`recording${c}`):vt(s.device.platform);qv(o,{type:`video_recording_start`,session:n,videoPath:l}),F({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let u=await Hr({req:{token:t.token,session:n,command:`record`,positionals:[`start`,l],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});if(!u.ok)return qv(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:u.error.code}),u;let d=Date.now();return await Jt(Hv),qv(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-d,requestedDurationMs:Hv}),F({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-d,data:{session:n,requestedDurationMs:Hv}}),u}async function Kv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,artifactPaths:a,appendTimingEvent:o}=e;if(t.flags?.recordVideo!==!0||!i.get(n)?.recording)return;qv(o,{type:`video_tail_start`,session:n,requestedDurationMs:Uv});let s=Date.now();await Jt(Uv);let c=Date.now(),l=await Hr({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return Im(l).forEach(e=>a.add(e)),qv(o,{type:`video_recording_stop`,session:n,ok:l.ok,durationMs:Date.now()-c,tailDurationMs:c-s,errorCode:l.ok?void 0:l.error.code}),F({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-c,data:{session:n,ok:l.ok,tailDurationMs:c-s}}),l}function qv(e,t){e({...t,ts:new Date().toISOString()})}const Jv=[{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.`}],Yv=({attemptId:e,parentAttemptId:t})=>{vn(e);let n=Xv(e,t);return{cancel:()=>_n(e),release:()=>{n(),Cn(e)}}};function Xv(e,t){if(!t||t===e)return()=>{};let n=bn(t);if(!n)return()=>{};let r=()=>{_n(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function Zv(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=Qv(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:yv({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function Qv(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function $v(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;if(t.command===`replay`)return await tv({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o});if(t.command===`test`){let e=t.flags??{};for(let t of Jv)if(t.requested(e))return z(`INVALID_ARGS`,t.message);let c;try{c=ey(t,n)}catch(e){let t=s(e);return z(t.code,t.message)}let l=await Af({request:c,emitProgress:xn,isCanceled:()=>Sn(t.meta?.requestId),emitDiagnostic:F,bindAttemptCancellation:Yv,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:c,artifactsDir:l,artifactPaths:u,tracePath:d,appendTimingEvent:f,shard:p,onStep:m})=>{let h=e=>(u&&Im(e).forEach(e=>u.add(e)),e),g=Zv({parentFlags:t.flags,platform:a,target:s,artifactsDir:l,shard:p}),_={req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:l,tracePath:d,appendTimingEvent:f},v=Wv(_);return Lv(await tv({req:{...t,command:`replay`,session:n,positionals:[e],flags:g,meta:{...t.meta??{},...c?{requestId:c}:{}},...t.internal||v?{internal:{...t.internal??{},...v?{openLifecycle:v}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:d,onStep:m,invoke:async e=>{let t=await Gv(_);return t&&!t.ok?t:h(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o,appendTimingEvent:s})=>Rv(await Kv({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,appendTimingEvent:s,artifactPaths:n})),discoverSources:hv(t.flags?.replayBackend),resolveShardTargets:_v(t.flags),cleanupSession:async e=>{i.get(e)&&await el({req:{token:t.token,session:e,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a})}});return l.status===`completed`?{ok:!0,data:l.data}:z(l.error.code,l.error.message)}return null}function ey(e,t){let n=e.flags??{},r=e.meta?.cwd,i=ny(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:P.expandHome(i,r),failFast:n.failFast===!0,retries:ty(n.retries),timeoutMs:ty(n.timeoutMs),shard:Av(n)}}function ty(e){return typeof e==`number`?e:void 0}function ny(e){return typeof e==`string`?e:void 0}function ry(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==be.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return sy(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return sy(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=oy(a);if(o)return sy(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return sy(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));Tt(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:pt(a,t.flags?.force),publication:`active`});return c.written?(Ye(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...Fe(`Published script: ${c.path}`)}}):sy(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 iy(e){if(nt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:ht(e)&&e.recordSession?void 0:`not-armed`}const ay={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 oy(e){let t=iy(e);return t?ay[t]():void 0}function sy(e){return{ok:!1,error:t(e)}}function cy(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function ly(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function uy(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function dy(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),xn({type:`command`,status:`progress`,message:fy(t)})}function fy(e){return[Ve(e),...Le(e)].join(`
26
- `)}const py=2e3;async function my(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=Gt(n,a);i&&$(e,await by(o,n.id,r)),$(e,await hy(o,n))}async function hy(e,t){try{let n=await cn(e),r=dn(t);return n===await gy()&&!r?await _y(e,t,n):vy(t,n,r)}catch(e){return yy(e)}}async function gy(){try{return(await ln()).manifest.serviceComponent}catch{return}}async function _y(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,fn.previousIme],{allowFailure:!0,timeoutMs:py})).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 vy(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 yy(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 by(e,n,r){try{let t=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:py}),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 xy(e,n){let{device:r,targetApp:i,session:a}=n;if(i)try{let t=await Sy(r,i);if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${A(r)}.`,evidence:{requested:i,platform:A(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 ${A(r)} --all`,evidence:{code:i.code,message:i.message}})}}async function Sy(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return Cy(t,(await n(e,`all`)).map(e=>({id:e.package,name:e.name})))?.id}if(M(e)||k(e)){let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return Cy(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function Cy(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 wy(e,n,r){let i=Ey(n,r);try{let t=await Oy(i),n=Dy(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:My(n,i,t.failures),hint:n.length===0?Fy(t.failures):void 0,command:n.length===0?By(i):void 0,evidence:Vy(n,t.failures)}),n.length>0&&ky(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 Ty(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:A(e),id:e.id,name:e.name}))}})}function Ey(e,t){let n=e.flags??{};return Mn({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 Dy(e,t){return e.filter(e=>he(e,t,{includeExplicitSelectors:!0}))}async function Oy(e){if(e.platform)return{devices:await An(e),failures:[]};let t=[],n=[];for(let r of zt)try{t.push(...await An({...e,platform:r}))}catch(e){n.push(jy(r,e))}return{devices:t,failures:n}}function ky(e,t){for(let n of t)$(e,Ay(n))}function Ay(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Ry(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Ry(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function jy(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function My(e,t,n){if(e.length===0)return n.length>0?`No ${Ny(t)} devices found; ${Py(n)}.`:`No ${Ny(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Ny(t)} ${zy(e.length,`device`)} available; ${r} booted`,a=Iy(e,t);return a?`${i} (${a}).`:`${i}.`}function Ny(e){let t=e.platform?Ry(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Py(e){return e.slice(0,2).map(e=>`${Ry(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Fy(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Iy(e,t){if(t.platform||t.target)return;let n=It(e),r=Ly();return[`android`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function Ly(){return{android:`Android`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Ry(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function zy(e,t){return e===1?t:`${t}s`}function By(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Vy(e,t){let n=new Map;for(let t of e){let e=A(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 Hy=1500;async function Uy(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await Wy(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Gy(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 Wy(e,t,n){try{return await(n.resolveProcessInfo??Ky)(e,t)}catch{return}}function Gy(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 Ky(e,t){if(!qy(e))return;let n=await Jy(t);if(n!==void 0)return{pid:n,cwd:await Yy(n)}}function qy(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Jy(e){let t=await Kt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Hy});if(t.exitCode===0)return t.stdout.split(`
27
- `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Yy(e){let t=await Kt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Hy});if(t.exitCode===0)return t.stdout.split(`
28
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Xy=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Zy=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Qy(e,t){let n=Xt(e.meta?.cwd);return{targetApp:rb(e.flags?.targetApp)??t?.appBundleId,metroHost:rb(e.runtime?.metroHost)??`127.0.0.1`,metroPort:ib(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:tb(e,n)}}function $y(e,t={}){let n=nb(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 eb(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 ${A(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 tb(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function nb(e){let t={...Object.fromEntries([...Xy,...Zy].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 rb(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function ib(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}const ab=3e3;async function ob(e,t){if(t===`android`){$(e,await cb());return}if(t===`vega`){$(e,await sb());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await pb())}async function sb(){let{parseVegaDeviceList:e}=await import(`./devices4.js`),{resolveVegaToolProvider:t}=await import(`./tool-provider3.js`).then(e=>e.n),n=t();if(!await n.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 r=await n.version({allowFailure:!0,timeoutMs:ab}),i=await n.listDevices({allowFailure:!0,timeoutMs:ab}),a=bb(r.stdout),o=i.exitCode===0&&e(i.stdout).length>0;return{id:`toolchain`,status:r.exitCode===0?`pass`:`info`,summary:a?`Vega toolchain: ${a}; ${o?`VVD running`:`no running VVD`}.`:`Vega toolchain: CLI found but version check failed.`,hint:o?void 0:`Start the Vega Virtual Device and retry doctor.`,evidence:{vegaVersion:a??null,deviceList:i.stdout.trim()||null}}}async function cb(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await vb(e),n=await yb(`adb`,[`version`]);return n?lb({license:t,sdkRoot:e,versionLine:n}):fb(e,t)}function lb(e){return{id:`toolchain`,status:ub(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${db(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 ub(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function db(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function fb(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 pb(){let e=await yb(`xcodebuild`,[`-version`]);return e?mb({selectedPath:await yb(`xcode-select`,[`-p`]),versionLine:e}):_b()}function mb(e){return{id:`toolchain`,status:hb(e),summary:gb(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function hb(e){return e.versionLine?`pass`:`info`}function gb(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 _b(){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 vb(e){if(!e)return`unknown`;try{return await Yi(U.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function yb(e,t){try{let n=await Kt(e,t,{allowFailure:!0,timeoutMs:ab});return n.exitCode===0?bb(n.stdout):void 0}catch{return}}function bb(e){return e.split(`
29
- `).map(e=>e.trim()).find(Boolean)}async function xb(e,t){$(e,await Sb(t))}async function Sb(e){let t=Bn({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 Vn(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 Cb(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==N.doctor)return null;let a=r.get(n),o=Qy(t,a),s=Eb(r,n),c=[];if(dy(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${qt()} using ${s}`,evidence:{version:qt(),stateDir:s}},...$y(t,{required:o.remote}),...eb(r,n,a,{remote:o.remote})),o.remote)return kb(c,o);let l=await wy(c,t,a);await ob(c,a?.device.platform??l?.platform);let u=await Db({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await Tb(c,u??wb(l)),kb(c,o,{device:u,includeMetro:!0,inventory:l})}function wb(e){let t=(e?.devices??[]).filter(e=>M(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function Tb(e,t){if(!(!t||!M(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||L(t))){if(xn({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await wn(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}Jn(t,{}),xn({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 Eb(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function Db(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??Ty(t,n,r.targetApp);return s&&await Ob(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await Uy(r.metroHost,r.metroPort,r.kind)),await xb(t,o),s}async function Ob(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await xy(e,{device:r,session:a,targetApp:i.targetApp}),await my(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function kb(e,t,n={}){let r=cy(e);return{ok:!0,data:{status:r,summary:ly(r),kind:t.kind,platform:n.device?A(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:uy(e)}}}async function Ab(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return z(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(N.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s,ensureReady:!0}),u=R(N.prepare,l);if(u)return u;let d=Date.now(),f=await qn(l,jb(t,o,r,d));return{ok:!0,data:Nb(a,l,Math.max(0,Date.now()-d),f)}}function jb(e,t,n,r){let i=Mb(e);return{...ji({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:on.fromTimeoutMs(i,r),startupTimeoutMs:i}}function Mb(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:_}function Nb(e,t,n,r){return{action:e,platform:A(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Pb(n,r),message:`Prepared Apple runner: ${t.name}`}}function Pb(e,t){let n=Fb(t.buildMs),r=Ib(t.connectMs),i=Ib(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 Fb(e){return e===void 0?void 0:Ib(e)}function Ib(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function Lb(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=Y(a,l,u);if(d)return d;let f=await X({session:l,flags:u,ensureReady:!0}),p=R(a,f);if(p)return p;l&&Ur(t)===`may-invalidate`&&hr(l);let m=await Nn(f,a,o,t.flags?.out,{...B(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;di(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function Rb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=Y(N.clipboard,a,o);if(s)return s;let c=(t.positionals?.[0]??``).toLowerCase();if(c!==`read`&&c!==`write`)return z(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let l=await X({session:a,flags:o,ensureReady:!0}),u=R(N.clipboard,l);if(u)return u;let d=await Nn(l,N.clipboard,t.positionals??[],t.flags?.out,{...B(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return di(i,a,t,t.command,d??{}),{ok:!0,data:{platform:A(l),...d??{}}}}const zb=async({req:e,sessionName:t,sessionStore:n})=>await hl({req:e,sessionName:t,sessionStore:n}),Bb=async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Cl({req:e,sessionName:t,logPath:n,sessionStore:r}),Vb=async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await hd({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),Hb=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:a,invokeReplayAction:o})=>await $v({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:o??a});async function Ub(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`?z(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await Lb({req:t,sessionName:n,logPath:r,sessionStore:i,command:N.keyboard,positionals:t.positionals??[]})}async function Wb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]?.trim(),o=t.positionals?.[1]?.trim();return!a||!o?z(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`):await Lb({req:t,sessionName:n,logPath:r,sessionStore:i,command:N.push,positionals:[a,Jb(o,t.meta?.cwd)],recordPositionals:[a,o]})}async function Gb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;return await Lb({req:t,sessionName:n,logPath:r,sessionStore:i,command:N.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,ic)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}const Kb={session_list:zb,devices:zb,capabilities:zb,apps:zb,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await Cb({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),boot:Bb,shutdown:Bb,appstate:Bb,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>ry({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,sessionStore:n})=>await Is({req:e,sessionName:t,sessionStore:n}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Rb({req:e,sessionName:t,logPath:n,sessionStore:r}),keyboard:Ub,perf:Vb,logs:Vb,events:Vb,network:Vb,audio:Vb,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Ab({req:e,sessionName:t,logPath:n,sessionStore:r}),install:async({req:e,sessionName:t,sessionStore:n})=>await ll({req:e,command:`install`,sessionName:t,sessionStore:n,deployOps:cl}),reinstall:async({req:e,sessionName:t,sessionStore:n})=>await ll({req:e,command:`reinstall`,sessionName:t,sessionStore:n,deployOps:sl}),install_source:async({req:e,sessionName:t,sessionStore:n})=>await Oo({req:e,sessionName:t,sessionStore:n}),release_materialized_paths:async({req:e})=>await Lo({req:e}),push:Wb,"trigger-app-event":Gb,open:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await jc({req:e,sessionName:t,logPath:n,sessionStore:r}),replay:Hb,test:Hb,batch:async({req:e,sessionName:t,invoke:n})=>await ml(e,t,n),close:async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})=>await el({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})};async function qb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Xr,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}=e,u=Kb[t.command];return u?await u({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}):null}function Jb(e,t){let n=Tn(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>P.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{qb as handleSessionCommands};
26
+ `],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??``}),timeoutMs:Fg,allowFailure:!0});if(i.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Wg(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,Ig),stderr:i.stderr.slice(0,Ig)},r instanceof Error?r:void 0)}}function Hg(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 Ug(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Wg(e){let t=e.trim();return t.length>0?t.slice(0,Ig):`request process exited without stderr`}async function Gg(e){return await Kg(`tap`,async t=>{let n=W.join(t,`before.png`),r=W.join(t,`after.png`),i=await Jg(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Jg(e,r)))return await qg(n,r,e.signal,`tap`)}})})}async function Kg(e,t){let n=await da.mkdtemp(W.join(fa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await da.rm(n,{recursive:!0,force:!0})}catch{}}}async function qg(e,t,n,r){try{let[i,a]=await Promise.all([da.readFile(e),da.readFile(t)]);Qg(n);let o=await Yt(i,a,`Maestro screenshot`);return Qg(n),Yg(o,r)}catch(e){Zg(e,n),N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Jg(e,t){try{return await da.rm(t,{force:!0}),Qg(e.signal),await e.capture(t),Qg(e.signal),!0}catch(t){return Zg(t,e.signal),!1}}function Yg(e,t){if(e.status!==`compared`)return Xg(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return Xg(t,n?`stable`:`changed`,e),n}function Xg(e,t,n){N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Zg(e,t){if(t?.aborted||bn(e))throw Cn()}function Qg(e){if(e?.aborted)throw Cn()}async function $g(e){t_(e.timeoutMs),Qg(e.signal);let t=e.now()+e.timeoutMs;return await Kg(`animation`,async n=>{let r=W.join(n,`first.png`),i=W.join(n,`second.png`);for(;;){if(Qg(e.signal),await e_(e,r,i))return!0;if(e.now()>=t)return!1}})}async function e_(e,t,n){let r=[await Jg(e,t),await Jg(e,n)];return!r[0]||!r[1]?!1:await qg(t,n,e.signal,`animation`)===!0}function t_(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const n_=J.observationPollMs;async function r_(e,t){for(;;){Q(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!y_(n)||(Q(e.context.signal),!await __(e.dependencies,t,n_,e.context.signal)))throw n}}}function i_(e){return a_({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function a_(e){let t=Nr(e.snapshot),n=e.platform===`ios`?ki(e.snapshot.nodes):void 0;return u_(jo(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 o_(e){v_(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Q(e.context.signal);let r=await r_(e,n),i=a_({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Fa(e.condition,i))return i;if(e.dependencies.now()>=n)break;await __(e.dependencies,n,n_,e.context.signal)}return Q(e.context.signal),S_(t)}async function s_(e){v_(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Q(e.context.signal);let i=r??await r_(e,t);if(r=void 0,n=a_({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===J.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),S_(n)}async function c_(e){v_(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await r_(e,t),r=b_(n);for(;;){Q(e.context.signal),await __(e.dependencies,t,n_,e.context.signal);let i=await r_(e,t),a=b_(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function l_(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function u_(e,t,n,r,i,a,o){if(!e.ok){let t=l_(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=f_({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=l_(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:d_(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:b_(t)}:{}}}function d_(e,t){return!w(e)||!w(t)?0:S(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 f_(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!p_(t,n,r)||i!==1))return m_(t.selector)}function p_(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function m_(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!h_(n)||typeof r!=`string`)return;let i=Fr(r)?.trim();return i?{key:n,value:i}:void 0}function h_(e){return e===`id`||e===`label`||e===`text`}async function g_(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?Cn():e}Q(n)}async function __(e,t,n,r){let i=t-e.now();return i<=0?!1:(await g_(e,Math.min(n,i),r),!0)}function Q(e){if(e?.aborted)throw Cn()}function v_(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function y_(e){return e instanceof n&&e.details?.retriable===!0}function b_(e){return ua(`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:x_(e.rect)})))).digest(`hex`)}function x_(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 S_(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function C_(e){return w_(e)?T_(e):F_(e)?I_(e):k_(e)}function w_(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function T_(e){switch(e.kind){case`launchApp`:return E_(e);case`stopApp`:return D_(e);case`openLink`:return O_(e)}}function E_(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 D_(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function O_(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function k_(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return A_(e);case`clickPoint`:return j_(e);case`swipe`:return M_(e);case`scroll`:return N_(e);case`pressKey`:return P_(e)}}function A_(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function j_(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function M_(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 N_(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function P_(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function F_(e){return e.kind===`screenshot`||e.kind===`snapshot`}function I_(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 L_(e,t){let n=C_(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=R_(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 W_(l);return l.data}function R_(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 z_(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 B_(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 V_(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 H_(e,t,r){if(W.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 W.resolve(W.dirname(i),e)}function U_(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function W_(e){let t=e.error,r=E({...t.details??{},hint:t.hint??G_(t.details,`hint`),diagnosticId:t.diagnosticId??G_(t.details,`diagnosticId`),logPath:t.logPath??G_(t.details,`logPath`),retriable:t.retriable??K_(t.details,`retriable`),supportedOn:t.supportedOn??G_(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function G_(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function K_(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function q_(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await L_(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 c_({timeoutMs:J.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 J_(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 r_({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=i_({query:t,context:n,snapshot:o,platform:i.platform});if(ev(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await __(i.dependencies,a,n_,n.signal)}}}async function Y_(e,t,n,r,i,a){let o=async()=>await Q_(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Gg({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await L_(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await X_(e,t,n,r,i,a.click,o)});return}await X_(e,t,n,r,i,a.click)}async function X_(e,t,n,r,i,a,o){let s=async()=>await Q_(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:b_(await t.capture(i))),l=async()=>await c_({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await Z_({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 Z_(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<J.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Q_(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await tv(e,o,n.point,i);return}catch(n){if(!nv(n))throw n;let o=await J_({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!$_(o))throw n;t.invalidate(r.generation),await rv(e,Ze(o.rect),i);return}}t.invalidate(r.generation),await rv(e,n.point,i)}function $_(e){return e.matched&&e.visible&&e.rect!==void 0}function ev(e,t){return $_(e)?!t||e.dispatchSelector!==void 0:!1}async function tv(e,t,n,r){N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await L_(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function nv(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function rv(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await L_(e,{kind:`clickPoint`,point:t,options:r})}function iv(e){let t=q_(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),L_(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)=>{Zt(n),await s({kind:`typeText`,text:n},r);let i=await c_({timeoutMs:J.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});t.prime(r.generation,i.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await J_({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await o_({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=[...z_(e.arguments),...z_(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 Y_(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>rv(e,t.target.point,E({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>rv(e,t.target.point,{holdMs:J.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??J.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await s_({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=Wa(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 c_({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw dr(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(B_(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 $g({timeoutMs:t.timeoutMs??J.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:V_(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Lg({scriptPath:H_(t.file,n,e.sourcePath),env:{...n.env,...t.env?U_(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r})}}function av(e){let{operations:t,snapshots:n,readMetrics:r}=iv(e);return Io(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 ov(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),sv(()=>uv(r,e)),sv(()=>dv(n,t,e))},actionCompleted:e=>{let r=cv(i,e.stepIndex);sv(()=>fv(n,t,lv(r,e),!0))},actionFailed:e=>{let r=cv(i,e.stepIndex);sv(()=>fv(n,t,lv(r,e),!1))}}}function sv(e){try{e()}catch{}}function cv(e,t){let n=e.get(t);return e.delete(t),n}function lv(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 uv(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function dv(e,t,n){Mh(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 fv(e,t,r,i){let a=pv(r);Mh(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 pv(e){let t=`data`in e?e.data:void 0,n=mv(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 mv(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function hv(e,t){return hi(e,t)}function gv(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:bv(e.action),positionals:xv(e.action,e.value),flags:t.flags??{}}}}async function _v(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,logPath:o}=e,s=P(r.meta?.requestId),c=gv(t,r),l=Ch(e.error),u=[...t.redactions],d=Be(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(i),m=p?await ch({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?vv({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,yv(t.value)].filter(Boolean).join(` `),_=Qm({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:fh(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Lm({kind:`action-failure`,targetEvidence:void 0,capture:oh(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return Th({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 vv(e){let t={createdAt:Date.now(),nodes:e.nodes};return rh(hv(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>Sh({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function yv(e){return!e||e===`<text>`?e??``:It(e)}function bv(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function xv(e,t){return!t||e===`inputText`?[]:[t]}function Sv(e){let{outcome:t,startedAt:n,sessionName:r,sessionStore:i,snapshotStart:a}=e,o=wv(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:Ev(s,Date.now()-n)}}}async function Cv(e){let{failure:n}=e.outcome,r=t(e.outcome.error);return n?await _v({error:r,failure:n,replayPath:M.expandHome(e.requestedPath,e.req.meta?.cwd),req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,snapshotDiagnostics:wv(e.sessionStore,e.sessionName,e.state.snapshotStart)}):R(r.code,r.message,{...r.details??{},...Tv(n)})}function wv(e,t,n){return h(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function Tv(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function Ev(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Dv(e){let{req:t}=e,n=t.positionals?.[0];if(!n)return R(`INVALID_ARGS`,`replay requires a path`);if(t.flags?.saveScript!==void 0)return R(`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 Ov({...e,requestedPath:n,startedAt:r,state:i})}catch(t){return await Cv({...e,requestedPath:n,state:i,outcome:{ok:!1,error:t}})}}async function Ov(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,onStep:a,invoke:o,state:s}=e,c=await kv(e),l=Fv({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 fi(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:ov({filePath:c.filePath,tracePath:i,onStep:a})});return u.ok?Sv({outcome:u,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:s.snapshotStart}):await Cv({...e,requestedPath:e.requestedPath,state:s,outcome:u})}async function kv(e){let{req:t,requestedPath:n,sessionName:r,sessionStore:i}=e,a=M.expandHome(n,t.meta?.cwd),o=qr(G.readFileSync(a,`utf8`),a),s=i.get(r);s&&wr(s,t.flags);let c=await Av({req:t,sessionStore:i,sessionName:r,session:s,flow:o});return{filePath:a,flow:o,...c,defaults:Nv({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:Pv(t),signal:P(t.meta?.requestId)}}async function Av(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 I(t.flags??{},Gi(a.appTarget,o))),c=Bv(t,s),l=Xs({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await jv({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Vv(t,s),runtimeHints:l,flow:a})}async function jv(e){if(e.device||!Mv(e.runtimeHints))return e;let t=await I(e.req.flags??{},Gi(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Vv(e.req,t),runtimeHints:Xs({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Mv(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Nv(e){return{...Ag({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Pv(e){return{...ya(Sa(e.flags?.replayShellEnv)),...ba(xa(e.flags?.replayEnv))}}function Fv(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 av({baseReq:E({...h,flags:Iv(s,c,t.flags),runtime:l}),invoke:r,platform:c,sourcePath:u,dependencies:{now:Date.now,sleep:async(e,t)=>{await ma(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 Ln(e.device,z(i,t.flags,e.appBundleId,e.trace?.outPath))}}})}function Iv(e,t,n){if(!e)return Lv(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 Lv(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Rv(n,t):zv(n,t)}function Rv(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function zv(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Bv(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 Vv(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function Hv(e){let{resolved:t,req:n,keepSession:r,coordinator:i,maestroParams:a}=e;if(Di(t,n.flags?.replayBackend)===`maestro`)return r?R(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):i.view()?.repairBoundary===void 0?await Dv(a):R(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Uv(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,coordinator:o}=e,s=Wv(t);if(s)return{ok:!1,response:s};let{manifest:c,replayReq:l}=Gv(t,a),{metadata:u,actions:d,actionLines:f,actionSourcePaths:p,planDigest:m}=c,h=r.get(n),g=Kv({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:Jv({req:t,replayReq:l,sessionName:n,resolved:a,metadata:u}),actionTracePath:i??h?.trace?.outPath}}:{ok:!1,response:g.response}}function Wv(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return R(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Gv(e,t){let n=im(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:qv({...e,flags:ii(e.flags,n.actions)},n.metadata)}}function Kv(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:R(`INVALID_ARGS`,a.message)}}function qv(e,t){return!t.platform&&!t.target?e:{...e,flags:Yv(e.flags,t)}}function Jv(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Ag({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:ya(Sa(t.flags?.replayShellEnv)),cliEnv:ba(xa(t.flags?.replayEnv))}}function Yv(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 Xv(e){let{req:t,entryIndex:n,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}=e,s=Zv({entryIndex:n,sessionStore:r,sessionName:i,coordinator:o});return s?{ok:!1,response:s}:(ey({req:t,coordinator:o}),$v({req:t,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}))}function Zv(e){let t=ty(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return Nn()}function Qv(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?R(`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.`):ny({saveScript:t,liveForce:n,persistedForce:At(r)||void 0,sourcePath:i,existingSaveScriptPath:Et(r)})}function $v(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i,coordinator:a}=e,o=n.get(r),{saveScript:s,force:c}=t.flags??{},l=Qv({saveScript:s,force:c,preRunState:o?.scriptPublication??Nt,sourcePath:i});return l?{ok:!1,response:l}:(a.demoteForRerunIfArmed(),{ok:!0,armSaveScript:ry({saveScript:s,force:c,coordinator:a,sourcePath:i})})}function ey(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function ty(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return R(`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 ny(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Pt(t):a??wm(i);if(!(n||r&&o===a)&&G.existsSync(o))return R(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function ry(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 iy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,onStep:o,invoke:c}=e,l=t.positionals?.[0];if(!l)return R(`INVALID_ARGS`,`replay requires a path`);let u=Date.now(),d=t.flags?.replayKeepSession===!0,f=``,p=new Set,m=Cm({sessionStore:i,sessionName:n});try{if(f=M.expandHome(l,t.meta?.cwd),li(f)&&t.flags?.replayBackend!==`maestro`)return R(`INVALID_ARGS`,Fi(`replay`,l));let s=await Hv({resolved:f,req:t,keepSession:d,coordinator:m,maestroParams:e});if(s)return s;let h=Uv({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=Xv({req:t,entryIndex:x,sessionStore:i,sessionName:n,sourcePath:f,coordinator:m});if(!C.ok)return C.response;let{runtime:w,readLastResponse:te}=Cg({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:P(t.meta?.requestId),coordinator:m},req:t,artifactPaths:p,onStep:o,armSaveScript:C.armSaveScript}),ne=await _m({actions:_,entryIndex:x,keepSession:d,actionLines:v,actionSourcePaths:y,resolvedPath:f,varSources:ee},w);return ne.status===`failed`?te()??R(`COMMAND_FAILED`,`replay step failed with no recorded response`):ay({startedAt:u,sessionName:n,sessionStore:i,replayed:ne.replayed,artifactPaths:ne.artifactPaths,snapshotDiagnosticSamples:ne.snapshotDiagnosticSamples,armSaveScript:C.armSaveScript,coordinator:m,keepSession:d})}catch(e){let t=s(e);return R(t.code,t.message,p.size>0?{artifactPaths:[...p]}:void 0)}}function ay(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=sy({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:oy(i,Date.now()-t)}}}function oy(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function sy(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return R(`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 cy=/[*?[\]{}]/;function ly(e){let t=e.replayBackend===`maestro`?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`]),n=[],r=[];for(let i of e.inputs){let a=uy(i,e.cwd,t);if(a.source===`file`){n.push(...a.paths);continue}r.push(a.source===`directory`?hy(a.paths):py(a.paths))}return hy([...n,...r.flat()])}function uy(e,t,r){let i=M.expandHome(e,t);if(G.existsSync(i)){let t=G.statSync(i);return t.isDirectory()?{paths:fy(i,r),source:`directory`}:t.isFile()?(dy(e,i,r),{paths:[i],source:`file`}):{paths:[],source:`file`}}if(!gy(e)&&!gy(i))throw new n(`INVALID_ARGS`,`test input not found: ${e}`);let a=W.isAbsolute(i)?i:e;return{source:`glob`,paths:G.globSync(a,{cwd:W.isAbsolute(i)?void 0:t}).map(e=>W.isAbsolute(e)?e:W.resolve(t,e)).filter(e=>r.has(W.extname(e).toLowerCase())&&_y(e))}}function dy(e,t,r){if(!r.has(W.extname(t).toLowerCase()))throw li(t)&&!r.has(`.yaml`)?new n(`INVALID_ARGS`,Fi(`test`,e)):new n(`INVALID_ARGS`,`test does not support this file type: ${e}`)}function fy(e,t){let n=[],r=G.opendirSync(e);try{let i;for(;(i=r.readSync())!==null;){let r=W.join(e,i.name);i.isDirectory()?n.push(...fy(r,t)):i.isFile()&&t.has(W.extname(i.name).toLowerCase())&&n.push(r)}}finally{r.closeSync()}return n}function py(e){return e.map(e=>W.normalize(e)).sort((e,t)=>{let n=my(e)-my(t);return n===0?e.localeCompare(t):n})}function my(e){return+(W.extname(e).toLowerCase()===`.ad`)}function hy(e){return[...new Set(e.map(e=>W.normalize(e)))]}function gy(e){return cy.test(e)}function _y(e){try{return G.statSync(e).isFile()}catch{return!1}}function vy(e){return({inputs:t,cwd:n})=>ly({inputs:t,cwd:n??process.cwd(),replayBackend:e}).map(t=>yy(t,e))}function yy(e,t){let n=G.readFileSync(e,`utf8`),r=Di(e,t)===`maestro`,i=Lt(n);return{path:e,manifest:{...r?{title:qr(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 by(e){return async t=>(await Cy(e,t)).map(xy)}function xy(e){if(e.platform===`web`||!Ce(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 Sy(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 Cy(e,t){let r=Dy(e),i=Ty(await Hn(wy(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${Ey(t)}, but only ${i.length} matched`);return i.slice(0,t)}function wy(e){let t=Un(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:Te({simulatorSetPath:Gn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Ty(e,t,n){return t.length>0?Oy(e,t,n):e.filter(e=>ky(e,n)).sort(My)}function Ey(e){return`${e} device${e===1?``:`s`}`}function Dy(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Oy(e,t,r){return t.map(t=>{let i=jy(t),a=e.find(e=>Ay(e,r)&&(e.id===t||jy(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function ky(e,t){return!Ay(e,t)||!Ce(e)?!1:e.booted!==!1}function Ay(e,t){return!(!be(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function jy(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function My(e,t){return e.id.localeCompare(t.id)}function Ny(e){let t=Py(e?.shardAll,`--shard-all`),r=Py(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 Py(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 Fy=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Iy(e){let t=Ly(e);return t?Ry(t.details)||zy(t.code,t.message):!1}function Ly(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Ry(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?fn(t):!1}function zy(e,t){let n=`${e}\n${t}`.toLowerCase();return Fy.some(e=>n.includes(e))}function By(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Uy(e.error.details?.artifactPaths),infrastructure:Iy(e),...Wy(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:Hy(t?.warnings),artifactPaths:Uy(t?.artifactPaths),...Wy(t?.snapshotDiagnostics)}}function Vy(e){if(!e||e.ok)return;let t=By(e);return t.status===`failed`?t:void 0}function Hy(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Uy(e){return[...new Set(Hy(e))]}function Wy(e){let t=m(e);return t?{snapshotDiagnostics:t}:{}}const Gy=1e3,Ky=3e3;function qy(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Jy(e)}}async function Jy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:a,appendTimingEvent:o}=e;if(t.flags?.recordVideo!==!0)return;let s=i.get(n);if(!s||s.recording)return;let c=jt(s.device.platform),l=a?W.join(a,`recording${c}`):Ot(s.device.platform);Xy(o,{type:`video_recording_start`,session:n,videoPath:l}),N({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let u=await Qi({req:{token:t.token,session:n,command:`record`,positionals:[`start`,l],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});if(!u.ok)return Xy(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:u.error.code}),u;let d=Date.now();return await nn(Gy),Xy(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-d,requestedDurationMs:Gy}),N({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-d,data:{session:n,requestedDurationMs:Gy}}),u}async function Yy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,artifactPaths:a,appendTimingEvent:o}=e;if(t.flags?.recordVideo!==!0||!i.get(n)?.recording)return;Xy(o,{type:`video_tail_start`,session:n,requestedDurationMs:Ky});let s=Date.now();await nn(Ky);let c=Date.now(),l=await Qi({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return zh(l).forEach(e=>a.add(e)),Xy(o,{type:`video_recording_stop`,session:n,ok:l.ok,durationMs:Date.now()-c,tailDurationMs:c-s,errorCode:l.ok?void 0:l.error.code}),N({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-c,data:{session:n,ok:l.ok,tailDurationMs:c-s}}),l}function Xy(e,t){e({...t,ts:new Date().toISOString()})}const Zy=[{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.`}],Qy=({attemptId:e,parentAttemptId:t})=>{Sn(e);let n=$y(e,t);return{cancel:()=>xn(e),release:()=>{n(),En(e)}}};function $y(e,t){if(!t||t===e)return()=>{};let n=P(t);if(!n)return()=>{};let r=()=>{xn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function eb(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=tb(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:Sy({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function tb(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function nb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;if(t.command===`replay`)return await iy({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o});if(t.command===`test`){let e=t.flags??{};for(let t of Zy)if(t.requested(e))return R(`INVALID_ARGS`,t.message);let c;try{c=rb(t,n)}catch(e){let t=s(e);return R(t.code,t.message)}let l=await Np({request:c,emitProgress:wn,isCanceled:()=>Tn(t.meta?.requestId),emitDiagnostic:N,bindAttemptCancellation:Qy,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:c,artifactsDir:l,artifactPaths:u,tracePath:d,appendTimingEvent:f,shard:p,onStep:m})=>{let h=e=>(u&&zh(e).forEach(e=>u.add(e)),e),g=eb({parentFlags:t.flags,platform:a,target:s,artifactsDir:l,shard:p}),_={req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:l,tracePath:d,appendTimingEvent:f},v=qy(_);return By(await iy({req:{...t,command:`replay`,session:n,positionals:[e],flags:g,meta:{...t.meta??{},...c?{requestId:c}:{}},...t.internal||v?{internal:{...t.internal??{},...v?{openLifecycle:v}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:d,onStep:m,invoke:async e=>{let t=await Jy(_);return t&&!t.ok?t:h(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o,appendTimingEvent:s})=>Vy(await Yy({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,appendTimingEvent:s,artifactPaths:n})),discoverSources:vy(t.flags?.replayBackend),resolveShardTargets:by(t.flags),cleanupSession:async e=>{i.get(e)&&await Sl({req:{token:t.token,session:e,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a})}});return l.status===`completed`?{ok:!0,data:l.data}:R(l.error.code,l.error.message)}return null}function rb(e,t){let n=e.flags??{},r=e.meta?.cwd,i=ab(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:M.expandHome(i,r),failFast:n.failFast===!0,retries:ib(n.retries),timeoutMs:ib(n.timeoutMs),shard:Ny(n)}}function ib(e){return typeof e==`number`?e:void 0}function ab(e){return typeof e==`string`?e:void 0}function ob(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==We.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return ub(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return ub(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=lb(a);if(o)return ub(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return ub(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));kt(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:dt(a,t.flags?.force),publication:`active`});return c.written?(Tt(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...Je(`Published script: ${c.path}`)}}):ub(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 sb(e){if(at(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:wt(e)&&e.recordSession?void 0:`not-armed`}const cb={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 lb(e){let t=sb(e);return t?cb[t]():void 0}function ub(e){return{ok:!1,error:t(e)}}function db(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function fb(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function pb(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function mb(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),wn({type:`command`,status:`progress`,message:hb(t)})}function hb(e){return[Ye(e),...Ke(e)].join(`
27
+ `)}const gb=2e3;async function _b(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=tn(n,a);i&&$(e,await Cb(o,n.id,r)),$(e,await vb(o,n))}async function vb(e,t){try{let n=await mn(e),r=_n(t);return n===await yb()&&!r?await bb(e,t,n):xb(t,n,r)}catch(e){return Sb(e)}}async function yb(){try{return(await hn()).manifest.serviceComponent}catch{return}}async function bb(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,vn.previousIme],{allowFailure:!0,timeoutMs:gb})).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 xb(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 Sb(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 Cb(e,n,r){try{let t=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:gb}),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 wb(e,n){let{device:r,targetApp:i,session:a}=n;if(i)try{let t=await Tb(r,i);if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${D(r)}.`,evidence:{requested:i,platform:D(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 ${D(r)} --all`,evidence:{code:i.code,message:i.message}})}}async function Tb(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return Eb(t,(await n(e,`all`)).map(e=>({id:e.package,name:e.name})))?.id}if(O(e)||k(e)){let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return Eb(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function Eb(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 Db(e,n,r){let i=kb(n,r);try{let t=await jb(i),n=Ab(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Fb(n,i,t.failures),hint:n.length===0?Rb(t.failures):void 0,command:n.length===0?Ub(i):void 0,evidence:Wb(n,t.failures)}),n.length>0&&Mb(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 Ob(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:D(e),id:e.id,name:e.name}))}})}function kb(e,t){let n=e.flags??{};return Fn({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 Ab(e,t){return e.filter(e=>xe(e,t,{includeExplicitSelectors:!0}))}async function jb(e){if(e.platform)return{devices:await Hn(e),failures:[]};let t=[],n=[];for(let r of Jt)try{t.push(...await Hn({...e,platform:r}))}catch(e){n.push(Pb(r,e))}return{devices:t,failures:n}}function Mb(e,t){for(let n of t)$(e,Nb(n))}function Nb(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Vb(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Vb(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Pb(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Fb(e,t,n){if(e.length===0)return n.length>0?`No ${Ib(t)} devices found; ${Lb(n)}.`:`No ${Ib(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Ib(t)} ${Hb(e.length,`device`)} available; ${r} booted`,a=zb(e,t);return a?`${i} (${a}).`:`${i}.`}function Ib(e){let t=e.platform?Vb(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Lb(e){return e.slice(0,2).map(e=>`${Vb(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Rb(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function zb(e,t){if(t.platform||t.target)return;let n=Kt(e),r=Bb();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 Bb(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Vb(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 Hb(e,t){return e===1?t:`${t}s`}function Ub(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Wb(e,t){let n=new Map;for(let t of e){let e=D(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 Gb=1500;async function Kb(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 qb(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Jb(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 qb(e,t,n){try{return await(n.resolveProcessInfo??Yb)(e,t)}catch{return}}function Jb(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 Yb(e,t){if(!Xb(e))return;let n=await Zb(t);if(n!==void 0)return{pid:n,cwd:await Qb(n)}}function Xb(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Zb(e){let t=await $t(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Gb});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 $t(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Gb});if(t.exitCode===0)return t.stdout.split(`
29
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const $b=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],ex=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function tx(e,t){let n=an(e.meta?.cwd);return{targetApp:ox(e.flags?.targetApp)??t?.appBundleId,metroHost:ox(e.runtime?.metroHost)??`127.0.0.1`,metroPort:sx(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:ix(e,n)}}function nx(e,t={}){let n=ax(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 rx(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 ${D(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 ix(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function ax(e){let t={...Object.fromEntries([...$b,...ex].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 ox(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function sx(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}const cx=3e3;async function lx(e,t){if(t===`android`){$(e,await gx());return}if(t===`vega`){$(e,await dx());return}if(t===`harmonyos`){$(e,await ux());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await xx())}async function ux(){let e=await Dx(`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 dx(){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:cx}),r=await fx(),i=Ox(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:hx(r)}}}async function fx(){try{return{devices:await Mn({platform:`vega`,target:`tv`}),listedSerials:[]}}catch(e){if(Vn(e))throw e;return{devices:[],listedSerials:px(e)}}}function px(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)return[];let t=e.details?.listedSerials;return mx(t)?t:[]}function mx(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function hx(e){return(e.devices.length>0?e.devices.map(e=>e.id):e.listedSerials).join(`, `)||null}async function gx(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await Ex(e),n=await Dx(`adb`,[`version`]);return n?_x({license:t,sdkRoot:e,versionLine:n}):bx(e,t)}function _x(e){return{id:`toolchain`,status:vx(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${yx(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 vx(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function yx(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function bx(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 xx(){let e=await Dx(`xcodebuild`,[`-version`]);return e?Sx({selectedPath:await Dx(`xcode-select`,[`-p`]),versionLine:e}):Tx()}function Sx(e){return{id:`toolchain`,status:Cx(e),summary:wx(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function Cx(e){return e.versionLine?`pass`:`info`}function wx(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 Tx(){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 Ex(e){if(!e)return`unknown`;try{return await pa(W.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function Dx(e,t){try{let n=await $t(e,t,{allowFailure:!0,timeoutMs:cx});return n.exitCode===0?Ox(n.stdout):void 0}catch{return}}function Ox(e){return e.split(`
30
+ `).map(e=>e.trim()).find(Boolean)}async function kx(e,t){$(e,await Ax(t))}async function Ax(e){let t=Jn({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 Yn(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 jx(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==j.doctor)return null;let a=r.get(n),o=tx(t,a),s=Px(r,n),c=[];if(mb(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${p()} using ${s}`,evidence:{version:p(),stateDir:s}},...nx(t,{required:o.remote}),...rx(r,n,a,{remote:o.remote})),o.remote)return Lx(c,o);let l=await Db(c,t,a);await lx(c,a?.device.platform??l?.platform);let u=await Fx({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await Nx(c,u??Mx(l)),Lx(c,o,{device:u,includeMetro:!0,inventory:l})}function Mx(e){let t=(e?.devices??[]).filter(e=>O(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function Nx(e,t){if(!(!t||!O(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||F(t))){if(wn({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await Dn(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}rr(t,{}),wn({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 Px(e,t){let n=W.dirname(e.resolveSessionDir(t));return W.basename(n)===`sessions`?W.dirname(n):n}async function Fx(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??Ob(t,n,r.targetApp);return s&&await Ix(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await Kb(r.metroHost,r.metroPort,r.kind)),await kx(t,o),s}async function Ix(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await wb(e,{device:r,session:a,targetApp:i.targetApp}),await _b(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function Lx(e,t,n={}){let r=db(e);return{ok:!0,data:{status:r,summary:fb(r),kind:t.kind,platform:n.device?D(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:pb(e)}}}async function Rx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return R(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(j.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s,ensureReady:!0}),u=L(j.prepare,l);if(u)return u;let d=Date.now(),f=await nr(l,zx(t,o,r,d));return{ok:!0,data:Vx(a,l,Math.max(0,Date.now()-d),f)}}function zx(e,t,n,r){let i=Bx(e);return{...Xi({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:dn.fromTimeoutMs(i,r),startupTimeoutMs:i}}function Bx(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:pe}function Vx(e,t,n,r){return{action:e,platform:D(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Hx(n,r),message:`Prepared Apple runner: ${t.name}`}}function Hx(e,t){let n=Ux(t.buildMs),r=Wx(t.connectMs),i=Wx(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 Ux(e){return e===void 0?void 0:Wx(e)}function Wx(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function Gx(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=Y(a,l,u);if(d)return d;let f=await X({session:l,flags:u,ensureReady:!0}),p=L(a,f);if(p)return p;l&&ri(t)===`may-invalidate`&&Hr(l);let m=await zn(f,a,o,t.flags?.out,{...z(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;fr(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function Kx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=Y(j.clipboard,a,o);if(s)return s;let c=(t.positionals?.[0]??``).toLowerCase();if(c!==`read`&&c!==`write`)return R(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let l=await X({session:a,flags:o,ensureReady:!0}),u=L(j.clipboard,l);if(u)return u;let d=await zn(l,j.clipboard,t.positionals??[],t.flags?.out,{...z(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return fr(i,a,t,t.command,d??{}),{ok:!0,data:{platform:D(l),...d??{}}}}const qx=async({req:e,sessionName:t,sessionStore:n,bindDevice:r})=>await zl({req:e,sessionName:t,sessionStore:n,bindDevice:r}),Jx=async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await iu({req:e,sessionName:t,logPath:n,sessionStore:r}),Yx=async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o})=>await vf({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o}),Xx=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:a,invokeReplayAction:o})=>await nb({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:o??a});async function Zx(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`?R(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await Gx({req:t,sessionName:n,logPath:r,sessionStore:i,command:j.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?R(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`):await Gx({req:t,sessionName:n,logPath:r,sessionStore:i,command:j.push,positionals:[a,nS(o,t.meta?.cwd)],recordPositionals:[a,o]})}async function $x(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;return await Gx({req:t,sessionName:n,logPath:r,sessionStore:i,command:j.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await Tc(e.device,n,e.appBundleId,xc)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}const eS={session_list:qx,devices:qx,capabilities:qx,apps:qx,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await jx({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),boot:Jx,shutdown:Jx,appstate:Jx,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>ob({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,sessionStore:n})=>await $s({req:e,sessionName:t,sessionStore:n}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Kx({req:e,sessionName:t,logPath:n,sessionStore:r}),keyboard:Zx,perf:Yx,logs:Yx,events:Yx,network:Yx,audio:Yx,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Rx({req:e,sessionName:t,logPath:n,sessionStore:r}),install:async({req:e,sessionName:t,sessionStore:n})=>await jl({req:e,command:`install`,sessionName:t,sessionStore:n,deployOps:Al}),reinstall:async({req:e,sessionName:t,sessionStore:n})=>await jl({req:e,command:`reinstall`,sessionName:t,sessionStore:n,deployOps:kl}),install_source:async({req:e,sessionName:t,sessionStore:n})=>await Ko({req:e,sessionName:t,sessionStore:n}),release_materialized_paths:async({req:e})=>await ts({req:e}),push:Qx,"trigger-app-event":$x,open:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Fc({req:e,sessionName:t,logPath:n,sessionStore:r,openResponse:await $c({req:e,sessionName:t,logPath:n,sessionStore:r})}),replay:Xx,test:Xx,batch:async({req:e,sessionName:t,invoke:n})=>await Rl(e,t,n),close:async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})=>await Sl({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})};async function tS(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new mi,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l,bindDevice:u,appLogAdmissionLedger:d,throwIfCanceled:f}=e,p=eS[t.command];return p?await p({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l,bindDevice:u,appLogAdmissionLedger:d,throwIfCanceled:f}):null}function nS(e,t){let n=jn(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>M.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{tS as handleSessionCommands};