agent-device 0.20.4 → 0.20.5

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 (45) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.4.apk → agent-device-android-ime-helper-0.20.5.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.5.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.4.manifest.json → agent-device-android-ime-helper-0.20.5.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.apk → agent-device-android-snapshot-helper-0.20.5.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.5.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.manifest.json → agent-device-android-snapshot-helper-0.20.5.manifest.json} +6 -6
  7. package/dist/src/agent-device-client.js +2 -2
  8. package/dist/src/android.js +1 -1
  9. package/dist/src/apps.js +2 -2
  10. package/dist/src/cli-config.js +1 -1
  11. package/dist/src/cli-help.js +1 -1
  12. package/dist/src/cli-runner.js +1 -1
  13. package/dist/src/cli.js +14 -14
  14. package/dist/src/context.js +1 -1
  15. package/dist/src/find.js +1 -1
  16. package/dist/src/generic.js +1 -1
  17. package/dist/src/ime-lifecycle.js +1 -1
  18. package/dist/src/input-actions.js +1 -1
  19. package/dist/src/interaction-snapshot.js +1 -1
  20. package/dist/src/interaction.js +1 -1
  21. package/dist/src/interactor.js +2 -2
  22. package/dist/src/internal/bin.js +1 -1
  23. package/dist/src/internal/daemon.js +14 -14
  24. package/dist/src/lease-context.js +1 -1
  25. package/dist/src/lease.js +1 -1
  26. package/dist/src/react-native.js +1 -1
  27. package/dist/src/register-builtins.js +1 -1
  28. package/dist/src/registry.js +18 -18
  29. package/dist/src/reporting.js +5 -5
  30. package/dist/src/runtime.js +3 -3
  31. package/dist/src/screenshot-geometry.js +1 -1
  32. package/dist/src/screenshot-result.js +4 -4
  33. package/dist/src/sdk-selectors.js +1 -1
  34. package/dist/src/selector-runtime.js +1 -1
  35. package/dist/src/selector-vocabulary.js +1 -1
  36. package/dist/src/selectors.js +1 -1
  37. package/dist/src/server.js +1 -1
  38. package/dist/src/session-target-evidence.js +1 -1
  39. package/dist/src/session.js +9 -8
  40. package/dist/src/snapshot2.js +1 -1
  41. package/dist/src/viewport-dimension.js +12 -12
  42. package/package.json +6 -4
  43. package/server.json +2 -2
  44. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.4.apk.sha256 +0 -1
  45. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.4.apk.sha256 +0 -1
@@ -1,6 +1,7 @@
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{At as c,B as l,Ct as u,Dt as d,Et as f,Ft as p,G as m,H as h,Ht as g,J as _,Jt as v,M as y,N as b,Ot as x,U as S,V as C,Vt as w,W as T,_t as E,dt as ee,ft as te,g as ne,gt as re,in as ie,jt as ae,kt as oe,mt as D,n as se,pt as ce,qt as le,r as ue,rn as O,wt as de,xt as fe,yt as pe}from"./viewport-dimension.js";import{A as me,B as he,E as ge}from"./screenshot-geometry.js";import{D as _e,E as ve,O as ye,U as be,W as xe,c as Se,it as k,l as Ce,n as we,q as Te,s as Ee,t as De}from"./sdk-batch-runner.js";import{$ as Oe,A as ke,B as Ae,C as A,Ct as je,E as Me,F as Ne,G as Pe,H as Fe,J as Ie,K as Le,Q as Re,R as ze,T as Be,U as Ve,V as He,W as Ue,X as We,Y as Ge,Z as Ke,at as qe,bt as Je,dt as Ye,et as Xe,ft as Ze,it as Qe,nt as $e,ot as et,q as tt,tt as nt,yt as rt,z as it}from"./screenshot-result.js";import{_ as at,c as j,d as ot,h as M,l as st,m as ct,o as N,p as lt,s as P}from"./sdk-device.js";import{P as ut,_ as dt,c as ft,h as pt,lt as mt,m as ht,st as gt,t as _t,w as vt}from"./sdk-selectors.js";import{c as yt,d as bt,m as xt,o as St}from"./device.js";import{o as Ct}from"./runtime.js";import{C as wt,N as Tt,P as Et,j as F,p as Dt,s as Ot,v as kt}from"./sdk-android-adb.js";import{n as At}from"./version.js";import{t as jt}from"./timeouts.js";import{n as Mt,r as Nt,t as Pt}from"./runtime-transport.js";import{f as Ft,p as It,s as Lt}from"./app-lifecycle.js";import{a as Rt}from"./install-artifact.js";import{a as zt,o as Bt,r as Vt,s as Ht}from"./boot-diagnostics.js";import{n as Ut}from"./entities.js";import{a as Wt,l as Gt,n as Kt,r as qt,t as Jt}from"./ime-lifecycle.js";import{c as Yt,o as I,s as Xt}from"./selector-vocabulary.js";import{A as Zt,E as Qt,F as $t,M as en,N as tn,P as nn,T as rn,j as an,k as on,u as sn}from"./runner-disposal.js";import{S as L,a as cn,b as ln,c as un,d as dn,g as fn,h as pn,i as mn,l as R,m as hn,n as gn,s as z,t as B,u as _n,v as vn,x as yn}from"./context.js";import{r as bn,t as xn}from"./register-builtins.js";import{a as Sn}from"./tool-provider.js";import{r as Cn}from"./helper.js";import{L as wn}from"./physical-device-control.js";import{c as Tn,i as En,l as Dn,n as On,r as kn,s as An,t as jn}from"./runner-client.js";import{n as Mn,s as Nn}from"./agent-browser-tool.js";import{$ as Pn,A as Fn,At as In,B as Ln,C as Rn,Ct as V,D as zn,Dt as Bn,E as Vn,Et as Hn,F as Un,G as Wn,H as Gn,Ht as Kn,I as qn,J as Jn,Jt as Yn,K as Xn,L as Zn,Lt as Qn,M as $n,Mt as er,N as tr,Nt as nr,O as rr,Ot as ir,P as ar,Q as or,Qt as sr,R as cr,S as lr,St as ur,T as dr,Tt as H,U as fr,V as pr,W as mr,Wt as hr,X as gr,Y as _r,Yt as vr,Z as yr,_ as br,_t as xr,a as Sr,b as Cr,bt as wr,c as Tr,cn as Er,ct as Dr,d as Or,dn as kr,dt as Ar,en as jr,et as Mr,f as Nr,fn as Pr,ft as Fr,g as Ir,gn as Lr,gt as Rr,h as zr,hn as Br,ht as Vr,i as Hr,it as Ur,j as Wr,jt as Gr,k as Kr,kt as qr,l as Jr,ln as Yr,lt as Xr,m as Zr,mn as Qr,mt as $r,n as ei,nt as ti,o as ni,ot as ri,p as ii,pn as ai,pt as oi,q as si,r as ci,rt as li,s as ui,sn as di,st as fi,t as pi,tt as mi,u as hi,un as gi,ut as _i,v as vi,vn as yi,vt as bi,w as xi,wt as Si,x as Ci,xt as wi,y as Ti,yt as Ei,z as Di}from"./internal/daemon.js";import"./apps.js";import{a as Oi,n as ki}from"./simulator.js";import{i as Ai}from"./app-resolution.js";import{a as ji,n as Mi,o as Ni,r as Pi,t as Fi}from"./session-target-evidence.js";import U from"node:path";import{createHash as Ii}from"node:crypto";import{REPLAY_VAR_KEY_RE as Li,formatDivergenceActionLabel as Ri,formatScriptArg as zi,isTouchTargetCommand as Bi,readReplayScriptMetadata as Vi}from"@agent-device/ad-script";import W,{promises as Hi}from"node:fs";import Ui from"node:os";import{access as Wi}from"node:fs/promises";import{setTimeout as Gi}from"node:timers/promises";import Ki from"node:vm";function qi(e,t){return H({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function Ji(e){return H({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Yi(e,t){let n=ea(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},Ji(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:Xi(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Xi(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function Zi(e,t,n,r){let i=ea(await r.resolveTarget({selector:e,...t},qi(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw ur(`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 Qi(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 $i(e){if(!e||typeof e!=`object`)return!1;let t=e;return[`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`&&Number.isFinite(t[e]))}function ea(e,t){return ta(e,t),na(e),ra(e),ia(e),e}function ta(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function na(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function ra(e){if(e.rect!==void 0&&!$i(e.rect)||e.viewport!==void 0&&!$i(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function ia(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function aa(e,t,n,r,i){let a=oa(e,t,n,i);if(!a)return;let{start:o,end:s}=pa(a,n);return{gesture:{from:o,to:s,durationMs:r},viewport:a}}function oa(e,t,n,r){let i=n===`up`||n===`down`,a=bi({nodes:e.nodes,matches:e.nodes.filter(e=>ca(e.type)),platform:r}),o=sa(e.nodes)??ua(a);if(!o||!gt(o))return;let s=a.flatMap(e=>{if(!gt(e.rect))return[];let t=da(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=>Ei(e,t))){let e=la(n,c,{includeSelf:!0}),t=e?l.get(e.index):void 0;if(t)return t.viewport}return s.sort(fa)[0]?.viewport}function sa(e){return e.filter(e=>{let t=wr(e.type??``);return gt(e.rect)&&(t===`application`||t===`window`)}).sort((e,t)=>t.rect.width*t.rect.height-e.rect.width*e.rect.height)[0]?.rect}function ca(e){let t=wr(e??``);return t===`collectionview`||t===`table`||t===`scrollview`||t===`scrollarea`}function la(e,t,n={}){let r=n.includeSelf===!0&&ca(e.type)?e:typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),ca(r.type))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function ua(e){let t;for(let n of e)gt(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function da(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 fa(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function pa(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 ma(e,t,r){let i=V(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(qi(t,t.command)):void 0;return{authored:e,gesture:ga(await ha(e.start,t,r,a),await ha(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(qi(t,t.command)),{start:a,end:o}=_a(n,e.direction,r.platform);return{authored:e,gesture:ga(a,o,i),viewport:n}}let a=await Zi(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(qi(t,t.command)),{start:s,end:c}=va(a,e.direction,o);return{authored:e,gesture:ga(s,c,i),target:a,viewport:o}}async function ha(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(qi(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 ga(e,t,n){return{from:e,to:t,durationMs:n??I.command.swipeDurationMs}}function _a(e,t,n){if(t===`left`||t===`right`){let n=he(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 va(e,t,n){let r=Si(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 ya={launchApp:wa,stopApp:wa,openLink:wa,tapOn:Ea,doubleTapOn:Ea,longPressOn:Ea,swipe:ja,inputText:Ma,eraseText:Ma,scroll:Na,scrollUntilVisible:Na,hideKeyboard:Na,pressKey:Na,back:Na,waitForAnimationToEnd:Na,takeScreenshot:Ia,runScript:Ia,assertVisible:La,assertNotVisible:La,extendedWaitUntil:La},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 xa(e){return ba[e.kind]}async function Sa(e,t){let n=e.command;return await Ca(n,e,t,qi(e,n))}function Ca(e,t,n,r){let i=ya[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,Ta(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 Ta(e,t){return H({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function Ea(e,t,n,r){switch(e.kind){case`tapOn`:return await Da(e,t,n,r);case`doubleTapOn`:{let i=await Ga(e.target,{purpose:`doubleTap`,timeoutMs:ka(e)},t,n),a=V(e.delay,`doubleTapOn.delay`)??I.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?Qi(i.resolution):void 0)}case`longPressOn`:{let i=await Ga(e.target,{purpose:`longPress`,timeoutMs:ka(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?Qi(i.resolution):void 0)}}}async function Da(e,t,n,r){let i=await Oa(e,t,n);return await K(n.tapOn,Aa(e,i),r,`invalidate`,i.resolution?Qi(i.resolution):void 0)}async function Oa(e,t,n){let r={purpose:`tap`,timeoutMs:ka(e),index:V(e.index,`tapOn.index`),childOf:e.childOf,allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await Ga(e.target,r,t,n)}function ka(e){return e.optional===!0?I.command.optionalTargetLookupTimeoutMs:I.command.targetLookupTimeoutMs}function Aa(e,t){let n=V(e.repeat,`tapOn.repeat`),r=V(e.delay,`tapOn.delay`),i=n===void 0?r:r??I.command.repeatDelayMs;return H({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function ja(e,t,n,r){let i=await ma(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?Qi(i.target):void 0)}async function Ma(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,H({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,H({charactersToErase:V(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function Na(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,Pa(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,Fa(e),r,`preserve`)}}function Pa(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:V(e.timeout,`scrollUntilVisible.timeout`)??I.command.scrollUntilVisibleTimeoutMs,durationMs:Yt(I.command.scrollUntilVisibleSpeed)}}function Fa(e){return H({timeoutMs:V(e.timeout,`waitForAnimationToEnd.timeout`)})}async function Ia(e,t,n,r){switch(e.kind){case`takeScreenshot`:return za(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,H({file:e.file,env:e.env}),r,`preserve`)}}async function La(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=Ra(n,r);return za(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function Ra(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function za(e,t,n,r){let i=e?.observation;return Ba(i,r),{...Va(n??i),...Ha(e?.outputEnv),...Ua(t,e?.artifactPaths),...Wa(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function Ba(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 Va(e){return e?{observation:e}:{}}function Ha(e){return e?{outputEnv:{...e}}:{}}function Ua(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function Wa(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function Ga(e,t,n,r){if(e.space===`target`){let i=await Zi(e.selector,t,n,r);return{authored:e,point:Si(i.rect),resolution:i}}return{authored:e,point:await ha(e,n,r)}}function Ka(e,t,n,r={}){let i=Rr(e,t.selector,n,t.childOf);if(!i.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Xa(t,i.matches,[],void 0)};let{matches:a,ranked:o}=i,s=xr(o,t.index),c=Xa(t,a,o,s?.node);if(!s)return qa(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?Ja(t,{...s,rect:l},r.canonicalSnapshot):0,evidence:c}}function qa(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 Ja(e,t,n){if(!n)return 0;let r=Rr(n,e.selector,`ios`).ranked;if(r.length!==1)return r.length;let i=xr(r,void 0);return i&&i.node.hittable!==!1&&Ya(i.rect,t.rect)?1:0}function Ya(e,t){let n=Si(e),r=Si(t);return n.x===r.x&&n.y===r.y}function Xa(e,t,n,r){return H({selector:e.selector,childOf:e.childOf,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:Xt,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 Za(e,t={}){return{execute:async n=>{let r=qi(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:xa(n.command)&&!i,visualStabilityBarrier:i});let a=await Sa(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Yi(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Qa(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function $a(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:Qa(t)}}function eo(e){let t=$a(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:yi(n,e.meta?.tenantId)},cleanup:()=>{Lr(n)}}}function to(e){return e===`ios`||e===`android`?e:void 0}function no(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 ro(e){let t=to(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 Ir(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 fn(e.flags??{});return await Ir(r),r}async function io(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await Ci({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function ao(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function oo(e){let{session:t,sessionStore:n,req:r,data:i}=e;zr(n,t,r,`install_source`,i,{positionals:[]})}async function so(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);try{let e=eo(n),t=no(n),o=await ro({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=an(n.meta?.requestId);if(P(o)){let{prepareIosInstallArtifact:s}=await import(`./install-artifact2.js`).then(e=>e.t),l=await s(e.source,{signal:c});return await co({prepared:l,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await lo(o,l,e)})}let{prepareAndroidInstallArtifact:l}=await import(`./install-artifact.js`).then(e=>e.t),u=await l(e.source,{signal:c});return await co({prepared:u,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await uo(o,u,e)})}catch(e){return{ok:!1,error:t(e)}}}async function co(e){let t;try{t=await io(e);let n=await e.buildResult(t),r=ie(n,go(n));return oo({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await Ti(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function lo(e,t,n){let r=await yn(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 fo(t,r,n)}async function uo(e,t,n){let r=await yn(e,t.installablePath,{packageNameHint:t.packageName}),i=await ho(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...ao(n),packageName:i,...mo(r?.appName??o),launchTarget:r?.launchTarget??i}}function fo(e,t,n){let r=po(e,t),i=t?.appName??e.appName;return{...ao(n),bundleId:r,...mo(i),launchTarget:t?.launchTarget??r}}function po(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 mo(e){return e?{appName:e}:{}}async function ho(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 go(e){return`Installed: ${v(e)}`}async function _o(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 Ti(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:t(e)}}}function J(e){return P(e)&&e.kind===`simulator`}function vo(e){return e.platform===`android`&&e.kind===`emulator`}function Y(e,t,n){return t||Er(n)?null:z(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function yo(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=Er(e.flags)||!e.session?await fn(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await xo(e.session.device);return e.ensureReady!==!1&&await Ir(t),t}async function xo(e){if(L(e)||!P(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(An(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 fn(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await fn({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function So(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 Co(e,t){return t?er(t,e).length===0:!1}const wo=`debug_http_host`,To=`dev_server_https`,Eo=`RCT_jsLocation`,Do=`RCT_packager_scheme`,Oo=`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.`,ko=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
2
- `);function Ao(e){return Pt(e)!==void 0}async function jo(e){let{device:t,appId:n,runtime:r}=e;if(L(t)||!n)return;let i=Pt(r);if(i){if(t.platform===`android`){await Po(t,n,i);return}P(t)&&t.kind===`simulator`&&await Ho(t,n,i)}}async function Mo(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await Fo(t,n);return}P(t)&&t.kind===`simulator`&&await Uo(t,n)}}function No(e){return[`shared_prefs/${e}_preferences.xml`,`shared_prefs/ReactNativeDevPrefs.xml`]}async function Po(e,t,n){Yo(t);let r=[];for(let i of No(t)){let a=Go(await Io(e,t,i),wo,`${n.host}:${n.port}`);a=Ko(a,To,n.scheme===`https`),r.push({path:i,xml:a})}await Lo(e,t,r)}async function Fo(e,t){Yo(t);let n=[];for(let r of No(t)){let i=await Io(e,t,r),a=Jo(Jo(i,wo),To);a!==i&&n.push({path:r,xml:a})}n.length!==0&&await Lo(e,t,n)}async function Io(e,t,n){let r=await Rt(e,[`shell`,`run-as`,t,`cat`,n],{allowFailure:!0});return r.exitCode===0?Wo(r.stdout):ko}async function Lo(e,t,n){await Ro(e,t);try{await Bo(e,t,n)}catch(e){throw Vo(e,t)}}async function Ro(e,t){let n=[`shell`,`run-as`,t,`id`],r=await Rt(e,n,{allowFailure:!0});if(r.exitCode!==0)throw zo(r,t,n)}function zo(e,t,r){let i=Zo(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}`,Dt(e,{package:t,cmd:`adb`,args:r,hint:i?Oo:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}async function Bo(e,t,n){await Rt(e,[`shell`,`run-as`,t,`mkdir`,`-p`,`shared_prefs`]);for(let r of n)await Rt(e,[`shell`,`run-as`,t,`tee`,r.path],{stdin:r.xml.trimEnd()})}function Vo(e,t){let r=s(e);if(r.code===`TOOL_MISSING`)return r;let i=Zo(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?Oo:`adb run-as succeeded, but writing React Native dev-server preferences failed. Inspect stderr/details for the failing shell command.`},r)}async function Ho(e,t,n){await Sn(wn(e,[`spawn`,e.id,`defaults`,`write`,t,Eo,`-string`,`${n.host}:${n.port}`])),await Sn(wn(e,[`spawn`,e.id,`defaults`,`write`,t,Do,`-string`,n.scheme]))}async function Uo(e,t){await Sn(wn(e,[`spawn`,e.id,`defaults`,`delete`,t,Eo]),{allowFailure:!0}),await Sn(wn(e,[`spawn`,e.id,`defaults`,`delete`,t,Do]),{allowFailure:!0})}function Wo(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?ko:`${t}\n`}function Go(e,t,n){let r=` <string name="${Ut(t)}">${Ut(n)}</string>`;return qo(Jo(e,t),r)}function Ko(e,t,n){let r=` <boolean name="${Ut(t)}" value="${n?`true`:`false`}" />`;return qo(Jo(e,t),r)}function qo(e,t){return Wo(e).replace(`</map>`,`${t}\n</map>`)}function Jo(e,t){let n=Xo(t);return Wo(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 Yo(e){if(Ft(e)!==`binary`)return;let t=It(e);throw new n(`INVALID_ARGS`,t,{package:e,hint:t})}function Xo(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Zo(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 Qo=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function $o(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function es(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return Mt(e)}}function ts(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 ns(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return ts(e)}}function rs(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 is(e){if(e===`ios`||e===`android`)return e}function as(e,t){return{platform:t,metroHost:Mt(e?.metroHost),metroPort:ts(e?.metroPort),bundleUrl:Mt(e?.bundleUrl),launchUrl:Mt(e?.launchUrl)}}function os(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 ss(e){if(vo(e))return`10.0.2.2`;if(J(e))return`127.0.0.1`}function cs(e,t){if(!e||Mt(e.metroHost)||Mt(e.bundleUrl)||e.metroPort===void 0)return e;let n=ss(t);return n?{...e,metroHost:n}:e}function ls(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=>!Qo.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Qo.join(`, `)}.`);return{platform:rs(a.platform,r,i),metroHost:es(a.metroHost,`metroHost`),metroPort:ns(a.metroPort),bundleUrl:es(a.bundleUrl,`bundleUrl`),launchUrl:es(a.launchUrl,`launchUrl`)}}function us(e,t,n){if(n){if($o(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function ds(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?M(r):void 0,s=is(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 fs(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?is(M(i)):e.platform,o=n.getRuntimeHints(r),s=ls({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=ds(n,r,i,a);return{runtime:i?cs(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&$o(s)>0?s:void 0;return{runtime:i?cs(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function ps(e){return fs(e).runtime}function ms(e){try{return{ok:!0,data:fs(e)}}catch(e){let t=s(e);return z(t.code,t.message,t.details)}}async function hs(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!Ao(n)||Ao(r)||await Mo({device:i.device,appId:i.appBundleId})}async function gs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Ss(t);if(!_s(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 vs(n,r,a,o):i===`show`?ys(n,o):xs({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function _s(e){return e===`set`||e===`show`||e===`clear`}async function vs(e,t,n,r){return Ao(r)&&n?.appBundleId&&await Mo({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function ys(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function bs(e){return e?M(e.device):void 0}function xs(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=bs(i),s=is(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=os(a,as(t.flags,s));return $o(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 Ss(e){let t=Cs(e);if(!t.ok)return t.response;let n=await vn(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 Cs(e){let t=ws(e);if(!t.ok)return t;let n=Ts(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 Ts(e){let t=Es(e.flags?.devicePort),n=Es(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 Es(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const Ds=`open-command-roundtrip`,Os=`Not implemented for this platform in this release.`;function ks(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=M(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,ot(d.platform)&&(h.serial=d.id)),d&&P(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...O(`Opened: ${o??s??t}`)}}function As(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 js=new Set([`app`,`desktop`,`frontmost-app`]);function Ms(e,t,r){if(e.platform===`linux`){if(!t)return`app`;let e=p(t);if(!js.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(!j(e)){if(t)throw new n(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}let i=t?p(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 Ns(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(j(t)||t.platform===`linux`)&&!n?i??`app`:Ms(t,n,r)}async function Ps(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Cn();return{appBundleId:t.bundleId,appName:t.appName}}async function Fs(e,t,n){if(!(!N(e.platform)||!t))return Ee(t)?j(e)?void 0:e.kind===`device`?Ce(n,t):Se(t)?void 0:n??await Is(e,t):await Ls(e,t)}async function Is(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function Ls(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function Rs(e,t){if(!(e.platform!==`android`||!t||Ee(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 zs(e,t,n){if(n||e.platform!==`android`||!t||!Ee(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 Bs(e,t){return e.platform===`android`&&!!(t&&Ee(t))}async function Vs(e,t,n,r){return P(e)&&L(e)?n:await Fs(e,t,n)??await r(e,t)??(Bs(e,t)?n:void 0)}function Hs(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||Ee(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 Us(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 gn(n,`open`,[t],r.flags?.out,s)}function Ws(e){return z(`INVALID_ARGS`,e)}function Gs(e,t,r,i){try{return Ns({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return z(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}function Ks(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&Ee(n)?Ws(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&Ft(n)===`binary`?Ws(It(n)):null:Ws(`open --relaunch is supported only for app surfaces.`):null}function qs(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&Ee(n)?Ws(`open --relaunch does not support URL targets.`):r===`android`&&n&&Ft(n)===`binary`?Ws(It(n)):null:null}async function Js(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await Ir(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await Ys({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=ms({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 hs({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function Ys(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await Ps(n);return{appBundleId:a.appBundleId??await Vs(t,r,i,Rs),appName:a.appName??r}}const Xs=new Map;function Zs(e){return e.internal?.resolvedSessionScope??ir(e)}function Qs(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Ge(t,{});return}Ke(n)&&(Ie(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 $s(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;N(t.platform)&&!J(t)&&await Dn(t.id),await gn(t,`close`,[n],r,i),await bo(t,300)}function ec(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}async function tc(e,t,n){if(ec(e,t))try{await Kt(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 nc(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:Ds,appTarget:t,appBundleId:n}}function rc(e){return!(!e.shouldRelaunch||!e.openTarget||e.collapseSimulatorRelaunch||!e.existingSession&&L(e.device))}async function ic(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=P(a)&&!L(a)&&l===`app`&&s.length>0&&!!g,x=Or({req:t,logPath:i,appBundleId:g,traceLogPath:h}),S=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,C,w=!1,T=!1,E=(e=x)=>{w=!0,v.runnerPrewarmKind=`session`,v.runnerPrewarmScheduled=!0,C=En(a,e)},ee=async()=>{if(!C||T)return;T=!0;let e=Date.now();await C,v.runnerPrewarmWaited=!0,v.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};b&&y&&!S&&E();let te=Hs({openPositionals:s,runtime:d,flags:t.flags,foldRuntimeLaunchUrl:y}),ne=m&&y&&t.flags?.clearAppState!==!0;if(rc({shouldRelaunch:m,openTarget:o,collapseSimulatorRelaunch:ne,device:a,existingSession:f})&&o){f&&Yn(f);let e=g??o,n=Date.now();await $s({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 re=Date.now();await jo({device:a,appId:g,runtime:d}),v.runtimeHintsDurationMs=Math.max(0,Date.now()-re),b&&S&&(E({...x,propagateError:!0}),await ee());let ie=T,ae=Date.now(),oe=await ac({req:t,sessionName:n,sessionStore:r,device:a,surface:l,sessionAppBundleId:g,appName:c,existingSession:f});if(oe.type===`response`)return oe.response;let D=oe.session??f;D&&Yn(D),await gn(a,`open`,te.openPositionals,t.flags?.out,{...B(i,t.flags,g),...ne?{terminateRunningApp:!0}:{}}),v.openDispatchDurationMs=Math.max(0,Date.now()-ae),await tc(a,t,r.resolveDaemonStateDir());let se=Date.now();te.followUpLaunchUrl&&await Us({launchUrl:te.followUpLaunchUrl,device:a,req:t,logPath:i,appBundleId:g,traceLogPath:h}),v.launchUrlDurationMs=Math.max(0,Date.now()-se),b&&!w&&E(),m?await ee():C&&!T&&(v.runnerPrewarmWaited=!1),y&&(m||ie)&&await jn(a,x),g=await zs(a,o,g),a.platform===`android`&&g&&await qn(a,g);let ce=o?nc(ae,o,g):void 0,le=Date.now();if(await bo(a,300),v.postOpenSettleDurationMs=Math.max(0,Date.now()-le),en(t.meta?.requestId)){let e=Zt();return z(e.code,e.message,e.details)}f&&di(f,`open`,f.snapshot);let ue=As({existingSession:D,sessionName:f?.name??qr(t),sessionScope:f?.sessionScope??Zs(t),device:a,surface:l,appBundleId:g,appName:c,saveScript:!!t.flags?.saveScript});ue.lease=gi({req:t,existingLease:f?.lease}),p&&(ue.deviceClaim=p),t.runtime!==void 0&&us(r,n,d);let O=r.ensureSessionDir(n),de=Be(O,t.meta?.requestId??Tt().requestId);v.totalDurationMs=Math.max(0,Date.now()-_),F({level:`info`,phase:`open_timing`,durationMs:v.totalDurationMs,data:v});let fe=ks({sessionName:ue.name,sessionStateDir:O,runnerLogPath:Me(O),requestLogPath:de,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:g,surface:l,startup:ce,timing:v,device:a,runtime:d,runtimeHintCount:$o,sessionReused:f!==void 0});return Qs({session:ue,existingSession:f,saveScriptRequested:!!t.flags?.saveScript,responseData:fe}),r.set(n,ue),r.recordAction(ue,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:d,result:fe}),{ok:!0,data:fe}}async function ac(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=As({existingSession:c,sessionName:c?.name??qr(t),sessionScope:c?.sessionScope??Zs(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=gi({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 oc(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return Bn(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.`}):sc(i,n)}function sc(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:nr(e,`device-in-use`)})}async function cc(e){let{req:t,device:n,sessionName:r,logPath:i}=e;return Qr(t.meta,L(n))?await Pr({device:n,session:r,workspace:t.meta?.cwd??process.cwd(),stateDir:U.dirname(i)}):{}}async function lc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s}=e,c=oc({req:t,device:a,sessionStore:i});if(c)return c;let l=await cc({req:t,device:a,sessionName:n,logPath:r}),u={mayHaveStarted:!1};try{let e=await Js({req:t,sessionName:n,sessionStore:i,device:a,surface:o,openTarget:s,onIosSimulatorColdBootStart:Nr({req:t,logPath:r,device:a,surface:o,openTarget:s})});if(e.type===`response`)return await uc(l.ownership,u),e.response;u.mayHaveStarted=!0;let c=await ic({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 uc(l.ownership,u),c}catch(e){throw await uc(l.ownership,u),e}}async function uc(e,t){if(e){if(t.mayHaveStarted){F({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await ai(e)}}async function dc(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=Gs(a.device,t.flags?.surface,s,a.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return Ws(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=Ks({shouldRelaunch:e,openTarget:s,surface:c,device:a.device});if(l)return l;let u=await xo(a.device);await t.internal?.retainDeviceExecutionLock?.(u.id);let d=await Js({req:t,sessionName:n,sessionStore:i,device:u,surface:c,openTarget:s,existingSession:a,onIosSimulatorColdBootStart:Nr({req:t,logPath:r,device:u,surface:c,openTarget:s,traceLogPath:a.trace?.outPath})});return d.type===`response`?d.response:await ic({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 Ws(`open --relaunch requires an app argument.`);let c=qs({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform===`android`?`android`:void 0});if(c)return c;let l=await fn(t.flags??{},Hn(s));await t.internal?.retainDeviceExecutionLock?.(l.id);let u=Gs(l,t.flags?.surface,s);return typeof u==`string`?Ks({shouldRelaunch:o,openTarget:s,surface:u,device:l})||await rn(Xs,l.id,async()=>await lc({req:t,sessionName:n,logPath:r,sessionStore:i,device:l,surface:u,openTarget:s})):u}function fc(e){return J(e)||vo(e)}async function pc(e){if(e.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return J(e)?await mc(e):await gc(e)}catch(e){let n=t(e);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function mc(e){let t=await Oi(e);return t.success?t:await hc(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function hc(e){try{return await ki(e)}catch{return null}}async function gc(e){let t=await Rt(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}function _c(e,t,n){if(!Fe(t))return{kind:`not-armed`};let r=t.actions.length;zr(e,t,n,`close`,{session:t.name,...O(`Closed: ${t.name}`)});let i=Re(t),a=e.writeSessionLog(t,{force:We(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`}:(it(t),{kind:`aborted`})}function vc(e,n){let r=t(n),i=et(e.scriptPublication??Qe);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function yc(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||zr(r,n,t,`close`,{session:n.name,...O(`Closed: ${n.name}`)}),t.flags?.saveScript&&(n.recordSession=!0);try{let e=r.writeSessionLog(n,{force:We(n,t.flags?.force)});e.written&&Xe(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 xc(e){let{device:t,shutdownRequested:n}=e;if(n&&!L(t)&&fc(t))return await pc(t)}function Sc(e,t){return J(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function Cc(e){return N(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 Tc(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=Sc(t,n);await Ec(n,a,c);let u=s?void 0:await Ac({req:t,session:n,logPath:i});await Mc(l,n,c),await jc(n,a,r);let d=s?void 0:yc({req:t,session:n,sessionStore:a,platformCloseError:u});return await c(`materialized_paths`,()=>Cr(r)),{platformCloseError:u,saveScriptError:d}}async function Ec(e,t,n){await n(`recording`,()=>Jr(e)),await n(`app_log`,()=>ni(e)),await n(`audio_probe`,async()=>{await vi(e,`session-close`)}),await n(`apple_perf`,()=>ui(e)),await n(`android_native_perf`,()=>Hr(e)),await n(`android_snapshot_helper`,()=>Sr(e)),await n(`android_ime`,()=>ei(e,t.resolveDaemonStateDir()))}function Dc(e){return JSON.stringify(e.positionals??[])}async function Oc(e){let{req:t,session:n,logPath:r,sessionStore:i}=e,a=Fe(n),o=Dc(t);if(a&&!He(n,o)){let e=await Ac({req:t,session:n,logPath:r});if(e)return{response:vc(n,wc(e))};Pe(n,o)}let s=_c(i,n,t);return s.kind===`failed`?{response:vc(n,s.error)}:{repairArmed:a,...s.kind===`committed`&&s.path?{healedScriptPath:s.path}:{},...s.kind===`aborted`?{aborted:!0}:{}}}async function kc(e){try{return{providerData:await Yr(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 Ac(e){let{req:t,session:n,logPath:r}=e;if(Rc(t,n)){if(Cc(n))try{await ci(n)}catch(e){return e}try{Yn(n),await gn(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 jc(e,t,n){!Ao(t.getRuntimeHints(n))||!e.appBundleId||await Mo({device:e.device,appId:e.appBundleId}).catch(()=>{})}async function Mc(e,t,n){if(N(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}}),Tn(t.device.id)}}function Nc(e,t){if(!e.flags?.saveScript||Ke(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 Pc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await Bc(t,r);if(Nc(t,s),t.internal?.closeAppOnly===!0)return await Lc({req:t,session:s,logPath:r});let c=await Oc({req:t,session:s,logPath:r,sessionStore:i});if(`response`in c)return c.response;let l=await Fc({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 xc({device:s.device,shutdownRequested:t.flags?.shutdown});return Ic({session:s,repair:c,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:u,providerData:l.providerData})}async function Fc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=[],{platformCloseError:l,saveScriptError:u}=await Tc({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,cleanupFailures:c,repairArmed:e.repairArmed}),d=await kc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(d.response)return{kind:`response`,response:d.response};let f=pi({sessionName:r,phase:`session_close_cleanup_failed`,failures:c}),p=l??f;if(p||await ai(n.deviceClaim),a.delete(r),p)throw p;if(u)throw u;return{kind:`closed`,providerData:d.providerData}}function Ic(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:ie({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...O(c),...o,...s}}}async function Lc(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 Ac({req:t,session:n,logPath:r});if(a)throw a;return{ok:!0,data:{app:i,...O(`Closed: ${i}`)}}}function Rc(e,t){return zc(e)||t.device.platform===`web`}function zc(e){return(e.positionals?.length??0)>0}async function Bc(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 gn(n,`close`,e.positionals,e.flags?.out,{...B(t,e.flags)}),await bo(n,300),{ok:!0,data:{app:e.positionals[0],...O(`Closed: ${e.positionals[0]}`)}}}const Vc={ios:async(e,t,n)=>{let r=await ln(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 ln(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)}},Hc={ios:async(e,t,n)=>{let r=await ln(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 ln(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 Uc(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=qc(n,t.positionals??[]);if(!l.ok)return l.response;let{app:u,appPathInput:d}=l,f=t.meta?.uploadedArtifactId;try{let e=f?yi(f,t.meta?.tenantId):A.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&&Yn(o);let l=P(r)?Gc(u,e,await a.ios(r,u,e)):Kc(u,e,await a.android(r,u,e)),p=ie(l,Wc(l));return zr(i,o,t,n,p),{ok:!0,data:p}}finally{f&&Lr(f)}}function Wc(e){return`Installed: ${e.appName??le(e)}`}function Gc(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 Kc(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 qc(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 Jc(e,t,n){return await we(e,t,n)}async function Yc(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`session_list`){let e=ir(t);return{ok:!0,data:{sessions:r.toArray().filter(t=>In(t,e)).map(e=>{let t=r.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:Me(t),platform:M(e.device),...N(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,...N(e.device.platform)&&!j(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if(t.command===`devices`)try{let e=zt(t.flags?.androidDeviceAllowlist),n=t.flags?.platform,r=at({simulatorSetPath:Bt(t.flags?.iosSimulatorDeviceSet),platform:n,target:t.flags?.target}),i=await pn({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=>Qc(e,n)):i;return{ok:!0,data:{devices:(t.flags?.target?a.filter(e=>(e.target??`mobile`)===t.flags?.target):a).map(Zc)}}}catch(e){let t=s(e);return z(t.code,t.message,t.details)}if(t.command===`capabilities`){let e=await Xc({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:Zc(i),availableCommands:dn().filter(e=>_n(e,i))}}}if(t.command===`apps`){let e=await Xc({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=bt(t.flags?.appsFilter);return N(i.platform)?{ok:!0,data:{apps:(await Ai(i,o)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await Lt(i,o)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}async function Xc(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 Zc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:M({platform:r.platform,appleOs:n}),...N(r.platform)&&n?{appleOs:n}:{}}}function Qc(e,t){return ct(e,t)}async function $c(e){let{ensureAndroidEmulatorBooted:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t(e)}const el=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,tl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function nl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&yo(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=N(i?.device.platform)&&Co(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return z(`SESSION_NOT_FOUND`,el);if(u&&!c)return z(`SESSION_NOT_FOUND`,tl);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?j(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:M(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:z(`COMMAND_FAILED`,`No foreground app is tracked for this ${j(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:M(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...P(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(P(d))return z(`SESSION_NOT_FOUND`,el);if(j(d))return z(`SESSION_NOT_FOUND`,tl);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 rl(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=So({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 $c({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=So({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 $c({avdName:t,serial:a.serial,headless:!0})}await Ir(f)}else f.platform===`android`&&f.kind===`emulator`&&f.booted!==!0?(f=await $c({avdName:f.name,serial:a.serial,headless:!1}),await Ir(f)):(f.platform!==`android`||f.booted!==!0)&&await Ir(f,{onIosSimulatorColdBootStart:ii({req:t,logPath:r,device:f,enabled:!0})});return R(`boot`,f)||(P(f)&&f.kind===`simulator`&&kn(f,{}),{ok:!0,data:{platform:M(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...N(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:M(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind});let c=await pc(o);return c.success?{ok:!0,data:{platform:M(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c,...N(o.platform)&&o.appleOs?{appleOs:o.appleOs}:{}}}:z(c.error?.code??`COMMAND_FAILED`,il(c),{platform:M(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c})}return t.command===`appstate`?await nl({req:t,sessionName:n,sessionStore:i}):null}function il(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}async function al(e){if(!xt(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const ol=[`probe`],sl=[`start`,`status`,`stop`],cl=`audio probe requires ${sl.join(`, `)}`;async function ll(e){let n=ul(e);if(!n.ok)return n;let r=await al(n.session.device);if(r)return await fl(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 ul(e){let t=dl(e);if(!t.ok)return t;let n=pl(e.req);if(!n.ok)return n;let r=ml(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function dl(e){let t=e.sessionStore.get(e.sessionName);return t?_n(`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 fl(e,n,r){try{return{ok:!0,data:await br({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 pl(e){if(!hl(e.positionals?.[0]))return z(`INVALID_ARGS`,`audio requires probe`);let t=gl(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:z(`INVALID_ARGS`,cl)}function ml(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=_l(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=_l(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 hl(e){let t=(e??`probe`).toLowerCase();return ol.includes(t)?`probe`:void 0}function gl(e){let t=(e??`status`).toLowerCase();return sl.includes(t)?t:void 0}function _l(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 vl(e){let n=yl(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 Ol(e,r,r.appBundleId,n):await kl(e,r,r.appBundleId,n)}}catch(e){return{ok:!1,error:t(e)}}}function yl(e,t){let n=Dl(e,t);return t===`cpu`?bl(e,n):xl(e,n)}function bl(e,t){let n=Sl(e,1),r=Sl(e,2),i=Sl(e,3);return c(n)?Cl(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`,de)}function xl(e,t){let n=Sl(e,1),r=Sl(e,2);return wl(n)?x(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:z(`INVALID_ARGS`,`perf trace requires --kind perfetto`):z(`INVALID_ARGS`,fe):z(`INVALID_ARGS`,`perf trace action must be start or stop`)}function Sl(e,t){return(e.positionals?.[t]??``).toLowerCase()}function Cl(e){return e===`start`||e===`stop`||e===`report`}function wl(e){return e===`start`||e===`stop`}function Tl(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),Pl(t)}function El(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):Nl(e.sessionStore,e.sessionName,n)}function Dl(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 Ol(e,t,n,r){if(r.action===`start`){jl(t);let i=El(e,r.outPath,`cpu.perf.data`);return Tl(e,await Wr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Fl(t,`cpu-profile`,r.kind);if(r.action===`report`){await Al(i);let n=El(e,r.outPath,`cpu-report.json`);return await tr(t.device,i,n,{adb:e.androidAdbExecutor})}let a=Ml(e,r.outPath,i);return Tl(e,await $n(t.device,i,a,{adb:e.androidAdbExecutor}))}async function kl(e,t,n,r){if(r.action===`start`){jl(t);let i=El(e,r.outPath,`app.perfetto-trace`);return Tl(e,await ar(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Fl(t,`trace`,r.kind),a=Ml(e,r.outPath,i);return Tl(e,await Un(t.device,i,a,{adb:e.androidAdbExecutor}))}function Al(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 jl(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 Ml(e,t,n){return t?El(e,t,n.outPath):n.outPath}function Nl(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return U.join(e.ensureSessionDir(t),`${r}-${n}`)}function Pl(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 Fl(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 Il(e,n){let r=Ll(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(!N(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 Hl(e,n,r):r.action===`stop`?await Ul(e,n,r):await Jl(e,n,r)}catch(e){return{ok:!1,error:t(e)}}}function Ll(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Rl(t):n===`trace`?zl(t):z(`INVALID_ARGS`,pe)}function Rl(e){if(e[1]?.toLowerCase()!==`profile`)return z(`INVALID_ARGS`,`perf cpu requires profile`);let t=Bl(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=Vl(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 zl(e){let t=Bl(e[1],`perf trace`,!1);if(!t.ok)return t;let n=Vl(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 Bl(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 Vl(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:z(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function Hl(e,t,n){if(t.applePerf?.active)return z(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??Ql(n.mode),i=Zl(e,n),a=await Ln({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=$l(`started`,a);return Xl(e,t,o),{ok:!0,data:o}}async function Ul(e,t,n){let r=t.applePerf?.active;if(!r)return z(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?A.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await pr(r,i)}catch(n){throw Gl(n)&&Wl(e,t),n}Kl(e,t,a);let o=$l(`stopped`,a);return Xl(e,t,o),{ok:!0,data:o}}function Wl(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function Gl(e){return s(e).details?.captureCleanedUp===!0}function Kl(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...ql(n)},e.sessionStore.set(e.sessionName,t)}function ql(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function Jl(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=Zl(e,n),i=Yl(t,n);if(!i.ok)return i;let a={perf:`reported`,...await Gn({tracePath:A.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return Xl(e,t,a),{ok:!0,data:a}}function Yl(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 Xl(e,t,n){zr(e.sessionStore,t,e.req,`perf`,n)}function Zl(e,t){if(t.outPath)return A.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 Ql(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function $l(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}}xn();function eu(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:Ds,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 tu(e,t={}){let n=au(e);if(!pu(e))return n;if(!e.appBundleId)return uu(n,e),n;let r=nu(e.device);return r&&du(n,e,await r(e,e.appBundleId,t)),n}function nu(e){let t=bn(e.platform)?.perf?.metricsSamplerTag(e);return t?xu[t]:void 0}async function ru(e,t={}){let n=cu(e);return pu(e)?e.appBundleId?(await fu(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:mu(e)},n):n}async function iu(e,t){let n=lu(e);return pu(e)?t.action===`sample`?(n.metrics={memory:await Su(e,t)},n):(n.artifact=await wu(e,t),n.support=Au(n.artifact.support)??ku(e),n):t.action===`snapshot`?(n.artifact=Du(e,Tu(e,t.kind)),n.support=Au(n.artifact.support)??ku(e),n):(n.metrics={memory:{available:!1,reason:Os}},n)}function au(e){let t=eu(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:Ds,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:Ds};return{session:e.name,platform:M(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,...ou()},sampling:{startup:{method:Ds,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...hu(e)}}}function ou(){return{fps:su(),memory:{available:!1,reason:Os},cpu:{available:!1,reason:Os}}}function su(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function cu(e){return{session:e.name,platform:M(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:su()},sampling:{fps:vu(e)}}}function lu(e){return{session:e.name,platform:M(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:gu(e),snapshot:_u(e)}}}function uu(e,t){let n=mu(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}function du(e,t,n){e.metrics.memory=Mu(n.memory),e.metrics.cpu=Mu(n.cpu),e.metrics.fps=Nu(Mu(n.fps),t)}async function fu(e,t,n,r){let i=t.device.platform===`android`?await ju(Zn(t.device,n,{adb:r.androidAdb})):await ju(_r(t.device,n));e.metrics.fps=Nu(Mu(i),t)}function pu(e){return bn(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function mu(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 hu(e){return e.device.platform===`android`?{memory:{method:zn,description:Vn,unit:`kB`},cpu:{method:Rn,description:lr,unit:`percent`},fps:{method:Di,description:cr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:si(e.device)}function gu(e){return e.device.platform===`android`?{method:zn,description:Vn,unit:`kB`,topConsumerLimit:5}:si(e.device).memory}function _u(e){return e.device.platform===`android`?{method:dr,description:xi,defaultKind:`android-hprof`,artifactOnly:!0}:{method:mr,description:fr,defaultKind:`memgraph`,artifactOnly:!0}}function vu(e){return e.device.platform===`android`?{method:Di,description:cr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:Wn(e.device)}async function yu(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([Fn(e.device,t,r),Kr(e.device,t,r),Zn(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function bu(e,t){let n=await ju(_r(e.device,t)),r=await ju(gr(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 xu={android:yu,apple:bu};async function Su(e,t){return e.appBundleId?Mu(e.device.platform===`android`?await ju(Fn(e.device,e.appBundleId,{adb:t.androidAdb})):await ju(Cu(e))):{available:!1,reason:mu(e)}}async function Cu(e){if(!e.appBundleId)throw new n(`INVALID_ARGS`,mu(e));return(await gr(e.device,e.appBundleId)).memory}async function wu(e,t){if(!e.appBundleId)throw new n(`INVALID_ARGS`,mu(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Tu(e,t.kind),i=Eu(t,r);return e.device.platform===`android`?r===`android-hprof`?await rr(e.device,e.appBundleId,i,{adb:t.androidAdb}):Du(e,r):r===`memgraph`?await Jn(e.device,e.appBundleId,i):Du(e,r)}function Tu(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Eu(e,t){if(e.out)return A.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 Du(e,t){let n=ku(e),r=Ou(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Ou(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.`}:N(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 ku(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.`}:N(e.device.platform)?{...Xn(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 Au(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function ju(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Mu(e){if(e.status===`fulfilled`)return{available:!0,...e.value};let n=t(e.reason);return{available:!1,reason:n.message,error:n}}function Nu(e,t){if(e.available!==!0)return e;let n=Pu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Pu(e,t){let n=Fu(t.windowStartedAt),r=Fu(t.windowEndedAt)??Fu(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:Iu(e)})).slice(-12)}function Fu(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Iu(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 Lu=`logs requires ${ae.slice(0,-1).join(`, `)}, or ${ae.at(-1)}`,Ru=[`dump`,`log`],zu=`network requires ${Ru.join(` or `)}`,Bu=`network include mode must be one of: ${o.join(`, `)}`,Vu={path:({session:e,sessionName:t,sessionStore:n})=>pd(e,t,n),doctor:({session:e,sessionName:t,sessionStore:n})=>md(e,t,n),mark:({req:e,sessionName:t,sessionStore:n})=>hd(e,t,n),clear:({session:e,sessionName:t,sessionStore:n,restart:r})=>gd(e,t,n,r),start:({session:e,sessionName:t,sessionStore:n})=>_d(e,t,n),stop:({session:e,sessionName:t,sessionStore:n})=>vd(e,t,n)};function Hu(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:Gu(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:[Wu(e.appLogFailure)]}:{active:!1,state:`inactive`,backend:ti(e.device)}}function Uu(e,t){return{backend:t,code:e.code,message:e.message,hint:e.hint}}function Wu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Gu(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 Ku(e,t){return yr([...e,...t.notes??[]])}function qu(e,t,n){return{...n,platform:e.device.platform,outPath:t}}function Ju(e,n,r,i){let a=t(i);return e.set(n,{...r,appLog:void 0,appLogFailure:Uu(a,ti(r.device))}),{ok:!1,error:a}}async function Yu(e){let{req:t}=e;return t.command===`perf`?Zu(e):t.command===`logs`?dd(e):t.command===`events`?await Xu(e):t.command===`network`?yd(e):t.command===`audio`?await ll(e):null}async function Xu(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 Zu(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(Qu(s))return o.device.platform===`android`?await vl({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await Il(e,o);let c=$u(n);if(!c.ok)return c;if(c.native)return await Il(e,o);try{return{ok:!0,data:await ed(e,o,c)}}catch(e){return{ok:!1,error:t(e)}}}function Qu(e){return e===`cpu`||e===`trace`}function $u(e){let r=td(e.positionals?.[0]);if(!r)return z(`INVALID_ARGS`,pe);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=nd(e.positionals?.[1]);if(!i)return z(`INVALID_ARGS`,E);let a=rd(e.flags?.kind);return a instanceof n?{ok:!1,error:t(a)}:(id(r,i)??sd(e,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:ud(e.flags?.out)}}async function ed(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await iu(t,{action:od(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await ru(t,{androidAdb:a}):await tu(t,{androidAdb:a})}function td(e){let t=(e??`metrics`).toString().toLowerCase();return d(t)?t:void 0}function nd(e){let t=(e??`sample`).toString().toLowerCase();return f(t)?t:void 0}function rd(e){if(e!==void 0)return typeof e!=`string`||!x(e)?new n(`INVALID_ARGS`,fe):e}function id(e,t){if(e===`memory`)return ad(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 ad(e){return e===`sample`||e===`snapshot`}function od(e){if(ad(e))return e;throw new n(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function sd(e,t,n,r){return cd(e.flags?.out,t,n)??ld(r,t,n)}function cd(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return z(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function ld(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return z(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!oe(e))return z(`INVALID_ARGS`,u)}}function ud(e){return typeof e==`string`&&e.length>0?e:void 0}async function dd(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=fd(t);return o.ok?await Vu[o.action]({...e,session:i,restart:o.restart}):o}function fd(e){let t=(e.positionals?.[0]??`path`).toLowerCase(),n=!!e.flags?.restart;return ae.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`,Lu)}function pd(e,t,n){let r=n.resolveAppLogPath(t),i=Mr(r),a=Hu(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 md(e,t,n){let r=n.resolveAppLogPath(t),i=await ri(e.device,e.appBundleId),a=Hu(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:Ku(i.notes,a)}}}function hd(e,t,n){let r=e.positionals?.slice(1).join(` `)??``,i=n.resolveAppLogPath(t);return or(i,r),{ok:!0,data:{path:i,marked:!0}}}async function gd(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=Pn(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 Ur(e.appLog);let o=Pn(i),s=n.resolveAppLogPidPath(t);try{let r=await li(e.device,a,i,s);return n.set(t,{...e,appLog:qu(e,i,r),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(r){return Ju(n,t,e,r)}}async function _d(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 li(e.device,e.appBundleId,r,i);return n.set(t,{...e,appLog:qu(e,r,a),appLogFailure:void 0}),{ok:!0,data:{path:r,started:!0}}}catch(r){return Ju(n,t,e,r)}}async function vd(e,t,n){if(!e.appLog)return z(`INVALID_ARGS`,`no app log stream active`);let r=e.appLog.outPath;return await Ur(e.appLog),n.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:r,stopped:!0}}}async function yd(e){let t=xd(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 mi({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 xd(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(!Ru.includes(o))return z(`INVALID_ARGS`,zu);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=Sd(t);return c.ok?{ok:!0,session:i,maxEntries:s,include:c.include}:c}function Sd(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`,Bu)}function Cd(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 jd((n.length===0||n.startsWith(`..`)?U.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`))||`test`}function Td(e,t){W.mkdirSync(t,{recursive:!0}),Od(e,t)}function Ed(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=Dd(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(`
3
- `)}\n`;W.writeFileSync(d,f),s||W.writeFileSync(U.join(o,`failure.txt`),f)}function Dd(e,t){let n=[],r=new Map;for(let i of e){if(!Ad(i))continue;let e=kd(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 Od(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 kd(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 Ad(e){try{return W.statSync(e).isFile()}catch{return!1}}function jd(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 Md(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}Rd(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 Nd(e,t,n,r,i=0){let a=jd(U.basename(n,U.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function Pd(e){return jd((e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`))||`suite`}function Fd(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 Id(e,t){return typeof e==`number`?e:t}function Ld(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Rd(e,t){return e===`apple`?N(t):t===e}function zd(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Bd=2e3;async function Vd(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,S=Date.now(),C=qd({artifactsDir:l,artifactPaths:v,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Z(C,e),shard:u,onStep:d}).catch(e=>zd({error:t(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Jd(o,[...v]))},o)})]):await w,Z(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Hd(w)||(x=Gd(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:Bd}}),Ud({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await Wd({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Kd(x,`Replay test finalization failed: ${e.error.message}`));let n=Date.now();try{Z(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(e){let i=t(e);Z(C,{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??zd({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}async function Hd(e){return await Promise.race([e.then(()=>!0),Gi(Bd).then(()=>!1)])}async function Ud(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 Wd(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}}),zd({error:n})}}function Gd(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Kd(e,t){return{...e,warnings:[...e.warnings,t]}}function qd(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 Jd(e,t=[]){return zd({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 Yd(e){let t=Xd(e),n=await Zd(e,t);return{result:rf(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Xd(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 Zd(e,t){$d(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Qd(e,t,r);if(ef(n,i),tf(e,i.outcome,r))break;nf(e,t,i)}return n}async function Qd(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=Nd(i,a,r.path,o,n),h=U.join(t.testArtifactsDir,`attempt-${f}`);Td(r.path,h);let g=Fd({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,...cf(d)},v=await Vd({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 Ed({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function $d(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:Nd(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...cf(c)})}function ef(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 tf(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function nf(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,...cf(e.shard)})}function rf(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?af(e,t,n,r):of(e,t,n,r)}function af(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,...cf(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}:{},...sf(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function of(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,...cf(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}:{},...sf(s)}}function sf(e){return cf(e)}function cf(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function lf(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 uf(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 df(t,u,d);hf(s,a);let p=s.shardPlan?gf({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await _f({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 xf({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 df(e,t,n){let r=ff(e,t),i=pf(r),a=r.length-i.length,o=Pd(e.requestId),s=await lf(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:mf(e,o),total:s?.total??r.length}}function ff(e,t){return Md({inputs:[...e.inputs],cwd:e.cwd,platformFilter:e.platformFilter,discoverSources:t})}function pf(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function mf(e,t){return Cd({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function hf(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 gf(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 _f(e){return(await Promise.allSettled(e.shards.map(async t=>await yf({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[vf(r,e.sessionName,t.reason)]:[]})}function vf(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 yf(e){let{shard:t,sessionName:n}=e;return await Sf({...e,entries:t.entries,sessionName:bf(n,t),shard:t})}function bf(e,t){return`${e}:shard-${t.shardIndex+1}`}async function xf(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 Yd({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Ld(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Id(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),Cf(t,o,p))break}return g}async function Sf(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 Yd({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Ld(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Id(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),Cf(b,o,m))break}return _}function Cf(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=rt(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 Tf(e){return JSON.stringify(Ef(e))}function Ef(e){if(Array.isArray(e))return e.map(Ef);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,Ef(t[e])]))}function Df(e){let t=Tf(Of(e));return Ii(`sha256`).update(t,`utf8`).digest(`hex`)}function Of(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)=>kf(e,n[t]??null,r?.[t]??null))}}function kf(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,source:{path:n,line:t}}}const Af=/(\\\$\{)|\$\{([A-Za-z_][A-Za-z0-9_.]*)(?::-((?:[^}\\]|\\.)*))?\}/g;function jf(e){return e.startsWith(`AD_`)}function Mf(e){return new n(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${e} to avoid the AD_ prefix.`)}function Nf(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(jf(n))throw Mf(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function Pf(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&&Li.test(e)&&(jf(e)||(t[e]=r))}return t}function Ff(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(!Li.test(i))throw new n(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(jf(i))throw Mf(i);t[i]=r.slice(e+1)}return t}function If(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Lf(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 Rf(e,t,r){return e.replace(Af,(e,i,a,o)=>{if(i)return"${";if(!a)return e;if(Object.prototype.hasOwnProperty.call(t.values,a))return jf(a)&&(t.expandedBuiltinNames??=new Set).add(a),String(t.values[a]);if(o!==void 0)return o.replace(/\\(.)/g,`$1`);throw new n(`INVALID_ARGS`,`Unresolved variable \${${a}} at ${r.file}:${r.line}.`)})}function zf(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>Rf(e,t,n)),flags:Bf(e.flags,t,n)??{},runtime:Bf(e.runtime,t,n)}}function Bf(e,t,n){return e&&Vf(e,t,n)}function Vf(e,t,n){return typeof e==`string`?Rf(e,t,n):Array.isArray(e)?e.map(e=>Vf(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,Vf(r,t,n)])):e}function Hf(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!jf(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function Uf(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 Wf(e){let{req:r,sessionName:i,action:a,scope:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=e,p=zf(a,o,{file:u??s,line:c}),m=Date.now();Uf(d,{type:`replay_action_start`,ts:new Date(m).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:p.command,positionals:ke(p)??[]});let h;try{h=await Kf({req:r,sessionName:i,resolved:p,sourceAction:a,scope:o,line:c,step:l,invoke:f})}catch(e){if(!(e instanceof n))throw e;h={ok:!1,error:t(e)}}let g=Date.now();return Uf(d,{type:`replay_action_stop`,ts:new Date(g).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:p.command,ok:h.ok,durationMs:g-m,resultTiming:h.ok?Jf(h.data):void 0,errorCode:h.ok?void 0:h.error.code}),Gf(h,u??s,c)}function Gf(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function Kf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Yf(t.flags,r.flags),s=i.command===`fill`?Ne(ze(i)):void 0;return s&&(o.recordAs=s),await a(qf({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??ir(t)}:{}}},r))}function qf(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:ge(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:me(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Jf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function Yf(e,t){return De(e,{...t??{}})}function Xf(e){return rp(e.ok?Qf(e.data):Zf(e.error.details?.artifactPaths))}function Zf(e){return Array.isArray(e)?e.filter(np):[]}function Qf(e){return e?[tp(e.path),tp(e.outPath),...$f(e.artifacts)].filter(np):[]}function $f(e){return Array.isArray(e)?e.map(ep).filter(np):[]}function ep(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return tp(t.localPath)??tp(t.path)}function tp(e){return typeof e==`string`?e:void 0}function np(e){return typeof e==`string`}function rp(e){return[...new Set(e.filter(ip))]}function ip(e){try{return W.statSync(e).isFile()}catch{return!1}}function ap(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=be(n===null?e.slice():e.slice(0,-1));return!r||r.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:r.selectorExpression,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),Bi(e.command)){let n=sp(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{split:n}=vt([...e.positionals]);n&&t.push(n.selectorExpression)}if(e.command===`wait`){let{selectorExpression:n}=ap([...e.positionals]);n&&t.push(n)}return yr(t).filter(e=>e.trim().length>0)}function sp(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&cp(n)?t.slice(0,-1):t}function cp(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function lp(e){let t=up({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 up(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=dp({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function dp(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}const fp={id:0,"role-label":1,label:2,other:3};function pp(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||mp(n.basis)<mp(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>mp(e.basis)-mp(t.basis)||e.nodeIndex-t.nodeIndex)}function mp(e){return fp[e]}function hp(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!gp(n))return`manual`;let i=_p(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function gp(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&vp(e.scrollRegion)}function _p(e,t){let n=C(t),r=bp(e.ancestry,n,t),i=e.scrollRegion;return i&&vp(i)?r&&yp(i,n,t):r}function vp(e){return e.id!==void 0||e.label!==void 0}function yp(e,t,n){return n.some(n=>Ni(Mi(n,t),e))}function bp(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=l(n,t,e.length);return!r.broken&&m(r.chain,e)})}const xp=new WeakMap;function Sp(e){return{store:t=>Cp(e,t),finalize:(t,n)=>wp({...e,evidence:t,projection:n})}}function Cp(e,t){let{sessionStore:n,sessionName:r}=e,i=n.get(r);if(!i)throw Error(`Internal observation session is no longer available.`);hr(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 xp.set(o,{sessionName:r,session:i,sessionCreatedAt:i.createdAt,snapshot:t,snapshotGeneration:a,runtimeRevision:vr(i),refFrame:Ep(i)}),{evidence:o,refsGeneration:a}}function wp(e){let t=xp.get(e.evidence);xp.delete(e.evidence);let n=Op(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Tp(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!kp(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Kn(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Tp(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&&vr(n)===t.runtimeRevision&&Dp(Ep(n),t.refFrame)}function Ep(e){return{state:e.refFrameState,scope:e.refFrameScope,tree:e.refFrameTree,generation:e.refFrameGeneration}}function Dp(e,t){return e.state===t.state&&e.scope===t.scope&&e.tree===t.tree&&e.generation===t.generation}function Op(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 kp(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Ap(t){let{sessionStore:n,sessionName:r,divergence:i,responseLevel:a}=t,o,s,c=ce({divergence:i,level:a,writeOverflowArtifact:t=>{let i=e(t),a=Np(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&&Sp({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 Mp(s),jp(c,`missing-evidence`);let u=Sp({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:(Mp(s),jp(c,u.reason))}function jp(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 Mp(e){if(e)try{W.unlinkSync(e)}catch{}}function Np(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}}}async function Pp(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=D(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await Lp({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=Vp(v,g),b=v.state===`available`&&o?qp({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=hp({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Fp(v)}),S=lp({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Ap({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Ri(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function Fp(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Ip=[300,500,800,1200,2e3,3e3,4e3];async function Lp(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=zp(a),c=Date.now()+12e3,l=await Rp({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Ip){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 Rp({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s})}return l.observation}async function Rp(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,flags:a}=e;try{let e=(await sr({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(y(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=Sp({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:b(e)}}}function zp(e){return{snapshotInteractiveOnly:Bp(e)}}function Bp(e){return Jp(e.command)?Yp(e).requiresRect:!0}function Vp(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=Gp(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function Hp(e){return!!ee(e,te(e.type??`Element`))||e.hittable===!0}function Up(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function Wp(e,t){let n=ne(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&Hp(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=>Up(e,t)),...o.filter(e=>!Up(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function Gp(e,t,n){let{nodes:r,truncated:i}=Wp(e,n);return{refs:r.map(e=>{let n=te(e.type??`Element`),r=ee(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function Kp(e){let t=new Set(e.terms.map(e=>e.key));if(t.has(`id`))return`id`;let n=t.has(`role`),r=t.has(`label`)||t.has(`text`);return n&&r?`role-label`:r||t.has(`value`)?`label`:`other`}function qp(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!Jp(t.command))return[];let a=op(t);return a.length===0?[]:Xp({candidates:a,nodes:r,session:n,action:t,matching:Yp(t),sanitize:i})}function Jp(e){return Bi(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function Yp(e){let t=Bi(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function Xp(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=Zp({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return pp(s).map(e=>e.suggestion)}function Zp(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=xe(t);if(!s)return;let c=pt(n,s,{platform:r.device.platform,requireRect:a.requiresRect,requireUnique:!0,disambiguateAmbiguous:a.allowDisambiguation});if(!c)return;let l=Kp(c.selector);return{suggestion:Qp({node:c.node,nodes:n,session:r,action:i,basis:l,sanitize:o}),basis:l,nodeIndex:c.node.index}}function Qp(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=_t(t,r.device.platform,{action:i.command===`fill`?`fill`:Bi(i.command)?`click`:`get`,nodes:n}),c=te(t.type??`Element`),l=ee(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function $p(e){return{...e,hint:e.hint??nm(e.details,`hint`),diagnosticId:e.diagnosticId??nm(e.details,`diagnosticId`),logPath:e.logPath??nm(e.details,`logPath`)}}function em(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return tm({error:t,actionLabel:Ri(n),action:n.command,positionals:ke(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function tm(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:re(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:re(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...im(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function nm(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const rm=[`reason`,`retriable`,`supportedOn`];function im(e){if(!e)return{};let t={};for(let n of rm)e[n]!==void 0&&(t[n]=e[n]);return t}async function am(e){return await om({...e,snapshotDiagnostics:je(e.snapshotDiagnosticSamples)})}async function om(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scope:l,req:u,sessionName:d,sessionStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=sm(t.error.details?.replaySource),v=Hf(l),y=$p(t.error),b=await Pp({error:y,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:v,planActions:h,planDigest:g,signal:an(u.meta?.requestId)});return em({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:v})}function sm(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 cm(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 lm(e){return{platform:typeof e?.platform==`string`?e.platform:void 0,target:typeof e?.target==`string`?e.target:void 0}}function um(e,t,n,r,i){let a=e?.replayFrom,o=e?.replayPlanDigest;if(a===void 0&&o===void 0)return{ok:!0,value:0};if(a===void 0||o===void 0)return dm(`replay --from requires --plan-digest (and --plan-digest requires --from).`);let s=fm({from:a,digest:o,planDigest:n,actionCount:t,pendingRecordAndHeal:r,sessionActionsLength:i});return s?dm(s):{ok:!0,value:a-1}}function dm(e){return{ok:!1,response:z(`INVALID_ARGS`,e)}}function fm(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>pm({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>mm({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>hm(n,r)];for(let e of s){let t=e();if(t)return t}}function pm(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 mm(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 hm(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 gm(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=_m({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=C(r),u=S(t),d=h(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Pi(r,e)===t.sibling),p=d.filter(e=>Ni(Mi(e,l),t.scrollRegion)),m=ji(p)[t.viewportOrder]?.ref,g=T({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}),_=c.matchedNodes.find(e=>e.ref===c.winnerRef);return g.outcome===`verified`&&_?{verified:!0,winnerNode:_,matchCount:c.matchedNodes.length}:g.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,...bm({classification:g,matchCount:c.matchedNodes.length,winnerNode:_,identitySet:d,byIndex:l,recorded:t})}}function _m(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?vm(n,t,i,a):ym(n,t,r,a,o)}function vm(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?ut(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function ym(e,t,n,r,i){let a=xe(t);if(!a)return{matchedNodes:[],winnerRef:``};let o=pt(e,a,{platform:n,requireRect:r,requireUnique:!0,disambiguateAmbiguous:i});return o?{matchedNodes:e.filter(e=>r&&!e.rect?!1:dt(e,o.selector,n)),winnerRef:o.node.ref}:{matchedNodes:ht(e,a,{platform:n,requireRect:r})?.matchedNodes??[],winnerRef:``}}function bm(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=Fi(t),i=l(t,n,Math.max(e.ancestry.length,1)).chain;return[...Sm(e,r),...Tm(e.ancestry,i)].slice(0,5)}function Sm(e,t){let n=[];return e.id!==t.id&&n.push(`id: recorded=${e.id??`(none)`} observed=${t.id??`(none)`}`),e.role!==t.role&&n.push(`role: recorded=${e.role} observed=${t.role}`),e.label!==t.label&&n.push(`label: recorded=${e.label??`(none)`} observed=${t.label??`(none)`}`),n}function Cm(e){return e?`${e.role}${e.label?`/${e.label}`:``}`:`(missing)`}function wm(e,t){return!t||t.role!==e.role?!0:e.label!==void 0&&t.label!==e.label}function Tm(e,t){for(let[n,r]of e.entries()){let e=t[n];if(wm(r,e))return[`ancestry[${n}]: recorded=${Cm(r)} observed=${Cm(e)}`]}return[]}function Em(e){let t=e.positionals??[];if(e.command===`get`)return t[1];if(e.command===`is`)return vt(t).split?.selectorExpression;if(!Bi(e.command)&&e.command!==`fill`)return;let n=t[0];if(n!==void 0&&!(Om(n)&&Om(t[1])))return n}function Dm(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Om(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function km(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=D(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:Vm(S(n),g),...t.observed?{observed:Vm(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>Hm(e,g))},v=hp({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=lp({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b=Ap({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(Ri(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 em({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:p})}async function Am(e){let{action:t,scope:n,sourcePath:r,sourceLine:i,replayPath:a,step:o,sessionName:s,sessionStore:c,resumeStamper:l,logPath:u,artifactPaths:d,responseLevel:f,planActions:p,planDigest:m,signal:h}=e,g=t.targetEvidence;if(!g)return{verified:!0};let _=c.get(s);if(!_)return{verified:!0};let v=zf(t,n,{file:r,line:i}),y=Hf(n),b=D(y),x={recorded:g,action:t,step:o,sourcePath:r,sourceLine:i,replayPath:a,artifactPaths:d,sessionName:s,sessionStore:c,resumeStamper:l,responseLevel:f,scrubVars:y,planActions:p,planDigest:m,signal:h},S=async()=>{let e=await Lp({session:_,sessionName:s,sessionStore:c,logPath:u,action:t});return km(x,{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.`,screen:Vp(e,b),publicationEvidence:Nm(e),repairCapture:Fp(e)})};if(ve(t.command)===`post-resolution`)return ye(v.positionals??[])?.kind===`selector`?g.verification===`unverifiable`?{verified:!1,response:await S()}:{verified:!0,deferredLandmark:g}:{verified:!0};let C=Em(v);if(C===void 0||!C.startsWith(`@`)&&!xe(C))return{verified:!0};if(g.verification===`unverifiable`)return{verified:!1,response:await S()};let w=await Lp({session:_,sessionName:s,sessionStore:c,logPath:u,action:t,retryLaunchRace:!0});if(w.state!==`available`)return{verified:!1,response:km(x,{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 (${w.reason}).`,causeHint:w.hint,screen:Vp(w,b),repairCapture:Fp(w)})};let T=Yp(t),E=gm({recorded:g,token:C,nodes:w.nodes,platform:_.device.platform,refLabel:Dm(t),requireRect:T.requiresRect,allowDisambiguation:T.allowDisambiguation});return E.verified?{verified:!0,guard:{expected:{identity:Fi(E.winnerNode),structural:ft(E.winnerNode,w.nodes)},matchCount:E.matchCount}}:{verified:!1,response:km(x,{kind:E.kind,matchCount:E.matchCount,observed:E.observedNode?Fi(E.observedNode):void 0,candidateNodes:E.candidateNodes,mismatches:E.mismatches,causeCode:E.causeCode,causeMessage:E.causeMessage,screen:Vp(w,b),publicationEvidence:w.evidence,repairCapture:Fp(w)})}}function jm(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}async function Mm(e,t){let{action:n,scope:r,failedResponse:i,sessionName:a,sessionStore:o,logPath:s}=e,c=n.targetEvidence;if(!c)return i;let l=Hf(r),u=D(l),d=t(c,i.ok?void 0:i.error.details),f=o.get(a),p=f?await Lp({session:f,sessionName:a,sessionStore:o,logPath:s,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`};return km({recorded:c,action:n,step:e.step,sourcePath:e.sourcePath,sourceLine:e.sourceLine,replayPath:e.replayPath,artifactPaths:e.artifactPaths,sessionName:a,sessionStore:o,resumeStamper:e.resumeStamper,responseLevel:e.responseLevel,scrubVars:l,planActions:e.planActions,planDigest:e.planDigest,signal:e.signal},{kind:`identity-mismatch`,matchCount:d.matchCount,observed:d.observed,candidateNodes:[],mismatches:d.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:d.causeMessage,screen:Vp(p,u),publicationEvidence:Nm(p),repairCapture:Fp(p)})}function Nm(e){return e.state===`available`?e.evidence:void 0}async function Pm(e){return await Mm(e,(t,n)=>{let r=Rm(n?.observed),i=zm(n?.expectedStructural,n?.observedStructural);return{matchCount:e.guard.matchCount,observed:r,mismatches:[...r?Sm(t,r):[],...i?[i]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}})}function Fm(e){return!e.ok&&e.error.details?.reason===`wait_landmark_identity_mismatch`}async function Im(e){return await Mm(e,(e,t)=>{let n=Rm(t?.observed),r=Lm(t?.observedAncestry);return{matchCount:typeof t?.matchCount==`number`?t.matchCount:void 0,observed:n,mismatches:n?[...Sm(e,n),...Tm(e.ancestry,r)]:[],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.`}})}function Lm(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 Rm(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 zm(e,t){let n=Bm(e),r=Bm(t);if(!(!n||!r)&&!(n.documentOrder===r.documentOrder&&n.sibling===r.sibling))return`position: recorded=doc${n.documentOrder}/sibling${n.sibling} observed=doc${r.documentOrder}/sibling${r.sibling}`}function Bm(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 Vm(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function Hm(e,t){let n=te(e.type??`Element`),r=ee(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function Um(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Wm(t,i)};return Km(o,`AD_PLATFORM`,a.platform??r.platform),Km(o,`AD_TARGET`,a.target??r.target),Km(o,`AD_DEVICE`,a.device),Km(o,`AD_DEVICE_ID`,Gm(a)),qm(o,`AD_SHARD_INDEX`,a.shardIndex),qm(o,`AD_SHARD_COUNT`,a.shardCount),Km(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Wm(e,t){let n=e.meta?.cwd??process.cwd();return U.relative(n,t)||t}function Gm(e){return typeof e.serial==`string`?e.serial:e.udid}function Km(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function qm(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Jm=3e4,Ym=1e3;function Xm(e){let{scriptPath:r,env:i}=e,a=W.readFileSync(r,`utf8`),o=Object.create(null);try{Ki.runInNewContext(a,Zm(i,o),{filename:r,timeout:Jm})}catch(e){let i=t(e);throw new n(i.code,`Maestro runScript failed: ${i.message}`,k({...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 th(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,nh(t)]))}function Zm(e,t){return{...e,output:t,json:Qm,http:{post:(e,t)=>eh(`POST`,e,t)}}}function Qm(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,$m)}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,Ym)},t instanceof Error?t:void 0)}}function $m(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function eh(e,t,r){let i=wt(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{At as c,B as l,Dt as u,G as d,H as f,Ht as p,It as m,Jt as h,K as g,M as _,Mt as v,N as y,Ot as b,St as x,Tt as S,U as C,Ut as w,V as T,W as ee,Y as te,Yt as E,_t as ne,an as re,bt as ie,ft as ae,g as oe,ht as se,in as D,jt as ce,kt as le,mt as ue,n as de,pt as fe,r as pe,vt as me,wt as he}from"./viewport-dimension.js";import{D as ge,V as _e,j as ve}from"./screenshot-geometry.js";import{D as ye,E as be,O as xe,U as Se,W as Ce,c as we,it as O,l as Te,n as Ee,q as De,s as Oe,t as ke}from"./sdk-batch-runner.js";import{$ as Ae,A as je,At as Me,B as Ne,C as k,Ct as Pe,Dt as Fe,E as Ie,Et as Le,F as Re,G as ze,H as Be,J as Ve,K as He,Q as Ue,R as We,St as Ge,T as Ke,Tt as qe,U as Je,V as Ye,W as Xe,X as Ze,Y as Qe,Z as $e,at as et,bt as tt,dt as nt,et as rt,ft as it,it as at,nt as ot,ot as st,q as ct,tt as lt,wt as ut,xt as dt,yt as ft,z as pt}from"./screenshot-result.js";import{_ as mt,c as A,d as ht,h as j,l as gt,m as _t,o as M,p as vt,s as N}from"./sdk-device.js";import{S as yt,b as bt,c as xt,ft as St,k as Ct,mt as wt,t as Tt,y as Et,z as Dt}from"./sdk-selectors.js";import{a as Ot,n as kt,o as At,r as jt,s as Mt,t as Nt}from"./session-target-evidence.js";import{c as Pt,d as Ft,m as It,o as Lt}from"./device.js";import{o as Rt}from"./runtime.js";import{C as zt,N as Bt,P as Vt,j as P,p as Ht,s as Ut,v as Wt}from"./sdk-android-adb.js";import{n as Gt}from"./version.js";import{t as Kt}from"./timeouts.js";import{n as qt,r as Jt,t as Yt}from"./runtime-transport.js";import{f as Xt,p as Zt,s as Qt}from"./app-lifecycle.js";import{a as $t}from"./install-artifact.js";import{a as en,o as tn,r as nn,s as rn}from"./boot-diagnostics.js";import{n as an}from"./entities.js";import{a as on,l as sn,n as cn,r as ln,t as un}from"./ime-lifecycle.js";import{c as dn,o as F,s as fn}from"./selector-vocabulary.js";import{A as pn,E as mn,F as hn,M as gn,N as _n,P as vn,T as yn,j as bn,k as xn,u as Sn}from"./runner-disposal.js";import{S as I,a as Cn,b as wn,c as Tn,d as En,g as Dn,h as On,i as kn,l as L,m as An,n as R,s as z,t as B,u as jn,v as Mn,x as Nn}from"./context.js";import{r as Pn,t as Fn}from"./register-builtins.js";import{a as In}from"./tool-provider.js";import{r as Ln}from"./helper.js";import{L as Rn}from"./physical-device-control.js";import{c as zn,i as Bn,l as Vn,n as Hn,r as Un,s as Wn,t as Gn}from"./runner-client.js";import{n as Kn,s as qn}from"./agent-browser-tool.js";import{$ as Jn,$t as Yn,A as Xn,At as Zn,B as Qn,C as $n,Ct as er,D as tr,Dt as nr,E as rr,Et as ir,F as ar,G as or,H as sr,I as cr,It as lr,J as ur,Jt as dr,K as fr,L as pr,M as mr,Mt as hr,N as gr,O as _r,Ot as vr,P as yr,Q as br,R as xr,S as Sr,St as V,T as Cr,Tt as wr,U as Tr,Ut as Er,V as Dr,Vt as Or,W as kr,X as Ar,Y as jr,Z as Mr,Zt as Nr,_ as Pr,_n as Fr,_t as Ir,a as Lr,b as Rr,bt as zr,c as Br,cn as Vr,ct as Hr,d as Ur,dn as Wr,dt as Gr,et as Kr,f as qr,fn as Jr,ft as Yr,g as Xr,gt as Zr,h as Qr,hn as $r,ht as ei,i as ti,it as ni,j as ri,jt as ii,k as ai,kt as oi,l as si,ln as ci,lt as li,m as ui,mn 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,tt as ki,u as Ai,un as ji,ut as Mi,v as Ni,vt as Pi,w as Fi,wt as H,x as Ii,xt as Li,y as Ri,yt as zi,z as Bi}from"./internal/daemon.js";import"./apps.js";import{a as Vi,n as Hi}from"./simulator.js";import{i as Ui}from"./app-resolution.js";import U from"node:path";import{createHash as Wi}from"node:crypto";import W,{promises as Gi}from"node:fs";import Ki from"node:os";import{access as qi}from"node:fs/promises";import{setTimeout as Ji}from"node:timers/promises";import Yi from"node:vm";function Xi(e){return e.startsWith(`AD_`)}function Zi(e){return new n(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${e} to avoid the AD_ prefix.`)}function Qi(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(Xi(n))throw Zi(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function $i(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&&ft.test(e)&&(Xi(e)||(t[e]=r))}return t}function ea(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(!ft.test(i))throw new n(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(Xi(i))throw Zi(i);t[i]=r.slice(e+1)}return t}function ta(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function na(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 ra(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function ia(e){return ra(e)||e>=`0`&&e<=`9`||e===`.`}function aa(e){return e===`
2
+ `||e===`\r`||e===`\u2028`||e===`\u2029`}function oa(e,t){let n=t+2;if(n>=e.length||!ra(e[n]))return null;for(n+=1;n<e.length&&ia(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(aa(t))return{abortEnd:n+2};i+=t,n+=2;continue}i+=t,n+=1}return{abortEnd:e.length}}function sa(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=oa(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))Xi(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 ca(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>sa(e,t,n)),flags:la(e.flags,t,n)??{},runtime:la(e.runtime,t,n)}}function la(e,t,n){return e&&ua(e,t,n)}function ua(e,t,n){return typeof e==`string`?sa(e,t,n):Array.isArray(e)?e.map(e=>ua(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,ua(r,t,n)])):e}function da(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!Xi(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function fa(e,t){return H({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function pa(e){return H({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function ma(e,t){let n=ya(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},pa(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:ha(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ha(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function ga(e,t,n,r){let i=ya(await r.resolveTarget({selector:e,...t},fa(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Li(`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 _a(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 va(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 ya(e,t){return ba(e,t),xa(e),Sa(e),Ca(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 xa(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Sa(e){if(e.rect!==void 0&&!va(e.rect)||e.viewport!==void 0&&!va(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Ca(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=Ta(e,t,n,i);if(!a)return;let{start:o,end:s}=Ma(a,n);return{gesture:{from:o,to:s,durationMs:r},viewport:a}}function Ta(e,t,n,r){let i=n===`up`||n===`down`,a=Ir({nodes:e.nodes,matches:e.nodes.filter(e=>Da(e.type)),platform:r}),o=Ea(e.nodes)??ka(a);if(!o||!St(o))return;let s=a.flatMap(e=>{if(!St(e.rect))return[];let t=Aa(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=>Pi(e,t))){let e=Oa(n,c,{includeSelf:!0}),t=e?l.get(e.index):void 0;if(t)return t.viewport}return s.sort(ja)[0]?.viewport}function Ea(e){return e.filter(e=>{let t=zi(e.type??``);return St(e.rect)&&(t===`application`||t===`window`)}).sort((e,t)=>t.rect.width*t.rect.height-e.rect.width*e.rect.height)[0]?.rect}function Da(e){let t=zi(e??``);return t===`collectionview`||t===`table`||t===`scrollview`||t===`scrollarea`}function Oa(e,t,n={}){let r=n.includeSelf===!0&&Da(e.type)?e:typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),Da(r.type))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function ka(e){let t;for(let n of e)St(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Aa(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 ja(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ma(e,t){let n=G(e,.5,.5),r=F.scrollUntilVisibleSwipe.nearEdgeFraction,i=F.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 Na(e,t,r){let i=V(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(fa(t,t.command)):void 0;return{authored:e,gesture:Fa(await Pa(e.start,t,r,a),await Pa(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(fa(t,t.command)),{start:a,end:o}=Ia(n,e.direction,r.platform);return{authored:e,gesture:Fa(a,o,i),viewport:n}}let a=await ga(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?F.command.optionalTargetLookupTimeoutMs:F.command.targetLookupTimeoutMs},t,r),o=a.viewport??await r.resolveGestureViewport(fa(t,t.command)),{start:s,end:c}=La(a,e.direction,o);return{authored:e,gesture:Fa(s,c,i),target:a,viewport:o}}async function Pa(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(fa(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 Fa(e,t,n){return{from:e,to:t,durationMs:n??F.command.swipeDurationMs}}function Ia(e,t,n){if(t===`left`||t===`right`){let n=_e(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=F.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 La(e,t,n){let r=er(e.rect),i=n.x+Math.trunc(n.width*F.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*F.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*F.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*F.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 Ra={launchApp:Ua,stopApp:Ua,openLink:Ua,tapOn:Ga,doubleTapOn:Ga,longPressOn:Ga,swipe:Xa,inputText:Za,eraseText:Za,scroll:Qa,scrollUntilVisible:Qa,hideKeyboard:Qa,pressKey:Qa,back:Qa,waitForAnimationToEnd:Qa,takeScreenshot:to,runScript:to,assertVisible:no,assertNotVisible:no,extendedWaitUntil:no},za={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 Ba(e){return za[e.kind]}async function Va(e,t){let n=e.command;return await Ha(n,e,t,fa(e,n))}function Ha(e,t,n,r){let i=Ra[e.kind];return i(e,t,n,r)}async function Ua(e,t,n,r){switch(e.kind){case`launchApp`:return await K(n.launchApp,Wa(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 Wa(e,t){return H({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function Ga(e,t,n,r){switch(e.kind){case`tapOn`:return await Ka(e,t,n,r);case`doubleTapOn`:{let i=await uo(e.target,{purpose:`doubleTap`,timeoutMs:Ja(e)},t,n),a=V(e.delay,`doubleTapOn.delay`)??F.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?_a(i.resolution):void 0)}case`longPressOn`:{let i=await uo(e.target,{purpose:`longPress`,timeoutMs:Ja(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?_a(i.resolution):void 0)}}}async function Ka(e,t,n,r){let i=await qa(e,t,n);return await K(n.tapOn,Ya(e,i),r,`invalidate`,i.resolution?_a(i.resolution):void 0)}async function qa(e,t,n){let r={purpose:`tap`,timeoutMs:Ja(e),index:V(e.index,`tapOn.index`),childOf:e.childOf,allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await uo(e.target,r,t,n)}function Ja(e){return e.optional===!0?F.command.optionalTargetLookupTimeoutMs:F.command.targetLookupTimeoutMs}function Ya(e,t){let n=V(e.repeat,`tapOn.repeat`),r=V(e.delay,`tapOn.delay`),i=n===void 0?r:r??F.command.repeatDelayMs;return H({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Xa(e,t,n,r){let i=await Na(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?_a(i.target):void 0)}async function Za(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,H({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,H({charactersToErase:V(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function Qa(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,$a(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,eo(e),r,`preserve`)}}function $a(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:V(e.timeout,`scrollUntilVisible.timeout`)??F.command.scrollUntilVisibleTimeoutMs,durationMs:dn(F.command.scrollUntilVisibleSpeed)}}function eo(e){return H({timeoutMs:V(e.timeout,`waitForAnimationToEnd.timeout`)})}async function to(e,t,n,r){switch(e.kind){case`takeScreenshot`:return io(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,H({file:e.file,env:e.env}),r,`preserve`)}}async function no(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=ro(n,r);return io(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function ro(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function io(e,t,n,r){let i=e?.observation;return ao(i,r),{...oo(n??i),...so(e?.outputEnv),...co(t,e?.artifactPaths),...lo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function ao(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 oo(e){return e?{observation:e}:{}}function so(e){return e?{outputEnv:{...e}}:{}}function co(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function lo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function uo(e,t,n,r){if(e.space===`target`){let i=await ga(e.selector,t,n,r);return{authored:e,point:er(i.rect),resolution:i}}return{authored:e,point:await Pa(e,n,r)}}function fo(e,t,n,r={}){let i=ei(e,t.selector,n,t.childOf);if(!i.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:go(t,i.matches,[],void 0)};let{matches:a,ranked:o}=i,s=Zr(o,t.index),c=go(t,a,o,s?.node);if(!s)return po(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?mo(t,{...s,rect:l},r.canonicalSnapshot):0,evidence:c}}function po(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 mo(e,t,n){if(!n)return 0;let r=ei(n,e.selector,`ios`).ranked;if(r.length!==1)return r.length;let i=Zr(r,void 0);return i&&i.node.hittable!==!1&&ho(i.rect,t.rect)?1:0}function ho(e,t){let n=er(e),r=er(t);return n.x===r.x&&n.y===r.y}function go(e,t,n,r){return H({selector:e.selector,childOf:e.childOf,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:fn,retryTapMaxAttempts:F.command.retryTapMaxAttempts,longPressDurationMs:F.command.longPressDurationMs,eraseTextMaxCharacters:F.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:F.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:F.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:F.command.waitForAnimationToEndDifferencePercent,observationPollMs:F.observation.pollIntervalMs};function _o(e,t={}){return{execute:async n=>{let r=fa(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ba(n.command)&&!i,visualStabilityBarrier:i});let a=await Va(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await ma(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function vo(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function yo(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:vo(t)}}function bo(e){let t=yo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Fr(n,e.meta?.tenantId)},cleanup:()=>{$r(n)}}}function xo(e){return e===`ios`||e===`android`?e:void 0}function So(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 Co(e){let t=xo(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 Xr(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 Dn(e.flags??{});return await Xr(r),r}async function wo(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await Ii({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function To(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Eo(e){let{session:t,sessionStore:n,req:r,data:i}=e;Qr(n,t,r,`install_source`,i,{positionals:[]})}async function Do(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);try{let e=bo(n),t=So(n),o=await Co({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=bn(n.meta?.requestId);if(N(o)){let{prepareIosInstallArtifact:s}=await import(`./install-artifact2.js`).then(e=>e.t),l=await s(e.source,{signal:c});return await Oo({prepared:l,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await ko(o,l,e)})}let{prepareAndroidInstallArtifact:l}=await import(`./install-artifact.js`).then(e=>e.t),u=await l(e.source,{signal:c});return await Oo({prepared:u,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Ao(o,u,e)})}catch(e){return{ok:!1,error:t(e)}}}async function Oo(e){let t;try{t=await wo(e);let n=await e.buildResult(t),r=re(n,Fo(n));return Eo({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await Ri(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function ko(e,t,n){let r=await Nn(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 jo(t,r,n)}async function Ao(e,t,n){let r=await Nn(e,t.installablePath,{packageNameHint:t.packageName}),i=await Po(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...To(n),packageName:i,...No(r?.appName??o),launchTarget:r?.launchTarget??i}}function jo(e,t,n){let r=Mo(e,t),i=t?.appName??e.appName;return{...To(n),bundleId:r,...No(i),launchTarget:t?.launchTarget??r}}function Mo(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 No(e){return e?{appName:e}:{}}async function Po(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 Fo(e){return`Installed: ${E(e)}`}async function Io(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 Ri(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:t(e)}}}function J(e){return N(e)&&e.kind===`simulator`}function Lo(e){return e.platform===`android`&&e.kind===`emulator`}function Y(e,t,n){return t||Ei(n)?null:z(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function Ro(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function zo(e,t){I(e)||!J(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function X(e){let t=Ei(e.flags)||!e.session?await Dn(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await Bo(e.session.device);return e.ensureReady!==!1&&await Xr(t),t}async function Bo(e){if(I(e)||!N(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(Wn(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 Dn(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Dn({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Vo(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 Ho(e,t){return t?ii(t,e).length===0:!1}const Uo=`debug_http_host`,Wo=`dev_server_https`,Go=`RCT_jsLocation`,Ko=`RCT_packager_scheme`,qo=`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.`,Jo=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
3
+ `);function Yo(e){return Yt(e)!==void 0}async function Xo(e){let{device:t,appId:n,runtime:r}=e;if(I(t)||!n)return;let i=Yt(r);if(i){if(t.platform===`android`){await $o(t,n,i);return}N(t)&&t.kind===`simulator`&&await ss(t,n,i)}}async function Zo(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await es(t,n);return}N(t)&&t.kind===`simulator`&&await cs(t,n)}}function Qo(e){return[`shared_prefs/${e}_preferences.xml`,`shared_prefs/ReactNativeDevPrefs.xml`]}async function $o(e,t,n){ms(t);let r=[];for(let i of Qo(t)){let a=us(await ts(e,t,i),Uo,`${n.host}:${n.port}`);a=ds(a,Wo,n.scheme===`https`),r.push({path:i,xml:a})}await ns(e,t,r)}async function es(e,t){ms(t);let n=[];for(let r of Qo(t)){let i=await ts(e,t,r),a=ps(ps(i,Uo),Wo);a!==i&&n.push({path:r,xml:a})}n.length!==0&&await ns(e,t,n)}async function ts(e,t,n){let r=await $t(e,[`shell`,`run-as`,t,`cat`,n],{allowFailure:!0});return r.exitCode===0?ls(r.stdout):Jo}async function ns(e,t,n){await rs(e,t);try{await as(e,t,n)}catch(e){throw os(e,t)}}async function rs(e,t){let n=[`shell`,`run-as`,t,`id`],r=await $t(e,n,{allowFailure:!0});if(r.exitCode!==0)throw is(r,t,n)}function is(e,t,r){let i=gs(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}`,Ht(e,{package:t,cmd:`adb`,args:r,hint:i?qo:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}async function as(e,t,n){await $t(e,[`shell`,`run-as`,t,`mkdir`,`-p`,`shared_prefs`]);for(let r of n)await $t(e,[`shell`,`run-as`,t,`tee`,r.path],{stdin:r.xml.trimEnd()})}function os(e,t){let r=s(e);if(r.code===`TOOL_MISSING`)return r;let i=gs(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?qo:`adb run-as succeeded, but writing React Native dev-server preferences failed. Inspect stderr/details for the failing shell command.`},r)}async function ss(e,t,n){await In(Rn(e,[`spawn`,e.id,`defaults`,`write`,t,Go,`-string`,`${n.host}:${n.port}`])),await In(Rn(e,[`spawn`,e.id,`defaults`,`write`,t,Ko,`-string`,n.scheme]))}async function cs(e,t){await In(Rn(e,[`spawn`,e.id,`defaults`,`delete`,t,Go]),{allowFailure:!0}),await In(Rn(e,[`spawn`,e.id,`defaults`,`delete`,t,Ko]),{allowFailure:!0})}function ls(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?Jo:`${t}\n`}function us(e,t,n){let r=` <string name="${an(t)}">${an(n)}</string>`;return fs(ps(e,t),r)}function ds(e,t,n){let r=` <boolean name="${an(t)}" value="${n?`true`:`false`}" />`;return fs(ps(e,t),r)}function fs(e,t){return ls(e).replace(`</map>`,`${t}\n</map>`)}function ps(e,t){let n=hs(t);return ls(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(Xt(e)!==`binary`)return;let t=Zt(e);throw new n(`INVALID_ARGS`,t,{package:e,hint:t})}function hs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function gs(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 _s=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function vs(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function ys(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return qt(e)}}function bs(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 xs(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return bs(e)}}function Ss(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 Cs(e){if(e===`ios`||e===`android`)return e}function ws(e,t){return{platform:t,metroHost:qt(e?.metroHost),metroPort:bs(e?.metroPort),bundleUrl:qt(e?.bundleUrl),launchUrl:qt(e?.launchUrl)}}function Ts(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 Es(e){if(Lo(e))return`10.0.2.2`;if(J(e))return`127.0.0.1`}function Ds(e,t){if(!e||qt(e.metroHost)||qt(e.bundleUrl)||e.metroPort===void 0)return e;let n=Es(t);return n?{...e,metroHost:n}:e}function Os(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=>!_s.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${_s.join(`, `)}.`);return{platform:Ss(a.platform,r,i),metroHost:ys(a.metroHost,`metroHost`),metroPort:xs(a.metroPort),bundleUrl:ys(a.bundleUrl,`bundleUrl`),launchUrl:ys(a.launchUrl,`launchUrl`)}}function ks(e,t,n){if(n){if(vs(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function As(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?j(r):void 0,s=Cs(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 js(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Cs(j(i)):e.platform,o=n.getRuntimeHints(r),s=Os({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=As(n,r,i,a);return{runtime:i?Ds(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&vs(s)>0?s:void 0;return{runtime:i?Ds(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Ms(e){return js(e).runtime}function Ns(e){try{return{ok:!0,data:js(e)}}catch(e){let t=s(e);return z(t.code,t.message,t.details)}}async function Ps(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!Yo(n)||Yo(r)||await Zo({device:i.device,appId:i.appBundleId})}async function Fs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Vs(t);if(!Is(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 Ls(n,r,a,o):i===`show`?Rs(n,o):Bs({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function Is(e){return e===`set`||e===`show`||e===`clear`}async function Ls(e,t,n,r){return Yo(r)&&n?.appBundleId&&await Zo({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function Rs(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function zs(e){return e?j(e.device):void 0}function Bs(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=zs(i),s=Cs(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=Ts(a,ws(t.flags,s));return vs(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 Vs(e){let t=Hs(e);if(!t.ok)return t.response;let n=await Mn(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 Hs(e){let t=Us(e);if(!t.ok)return t;let n=Ws(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 Us(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 Ws(e){let t=Gs(e.flags?.devicePort),n=Gs(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 Gs(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const Ks=`open-command-roundtrip`,qs=`Not implemented for this platform in this release.`;function Js(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=j(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,ht(d.platform)&&(h.serial=d.id)),d&&N(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...D(`Opened: ${o??s??t}`)}}function Ys(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 Xs=new Set([`app`,`desktop`,`frontmost-app`]);function Zs(e,t,r){if(e.platform===`linux`){if(!t)return`app`;let e=m(t);if(!Xs.has(e))throw new n(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${t}")`);if(e!==`app`&&r)throw new n(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`);return e}if(!A(e)){if(t)throw new n(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}let i=t?m(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 Qs(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(A(t)||t.platform===`linux`)&&!n?i??`app`:Zs(t,n,r)}async function $s(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Ln();return{appBundleId:t.bundleId,appName:t.appName}}async function ec(e,t,n){if(!(!M(e.platform)||!t))return Oe(t)?A(e)?void 0:e.kind===`device`?Te(n,t):we(t)?void 0:n??await tc(e,t):await nc(e,t)}async function tc(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function nc(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function rc(e,t){if(!(e.platform!==`android`||!t||Oe(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 ic(e,t,n){if(n||e.platform!==`android`||!t||!Oe(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 ac(e,t){return e.platform===`android`&&!!(t&&Oe(t))}async function oc(e,t,n,r){return N(e)&&I(e)?n:await ec(e,t,n)??await r(e,t)??(ac(e,t)?n:void 0)}function sc(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||Oe(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 cc(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 R(n,`open`,[t],r.flags?.out,s)}function lc(e){return z(`INVALID_ARGS`,e)}function uc(e,t,r,i){try{return Qs({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return z(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}function dc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&Oe(n)?lc(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&Xt(n)===`binary`?lc(Zt(n)):null:lc(`open --relaunch is supported only for app surfaces.`):null}function fc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&Oe(n)?lc(`open --relaunch does not support URL targets.`):r===`android`&&n&&Xt(n)===`binary`?lc(Zt(n)):null:null}async function pc(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await Xr(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await mc({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=Ns({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 Ps({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function mc(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await $s(n);return{appBundleId:a.appBundleId??await oc(t,r,i,rc),appName:a.appName??r}}const hc=new Map;function gc(e){return e.internal?.resolvedSessionScope??nr(e)}function _c(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Qe(t,{});return}$e(n)&&(Ve(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;M(t.platform)&&!J(t)&&await Vn(t.id),await R(t,`close`,[n],r,i),await zo(t,300)}function yc(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}async function bc(e,t,n){if(yc(e,t))try{await cn(e,{stateDir:n})}catch(t){P({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,error:t instanceof Error?t.message:String(t)}})}}function xc(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:Ks,appTarget:t,appBundleId:n}}function Sc(e){return!(!e.shouldRelaunch||!e.openTarget||e.collapseSimulatorRelaunch||!e.existingSession&&I(e.device))}async function Cc(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)&&!I(a),b=N(a)&&!I(a)&&l===`app`&&s.length>0&&!!g,x=Ur({req:t,logPath:i,appBundleId:g,traceLogPath:h}),S=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,C,w=!1,T=!1,ee=(e=x)=>{w=!0,v.runnerPrewarmKind=`session`,v.runnerPrewarmScheduled=!0,C=Bn(a,e)},te=async()=>{if(!C||T)return;T=!0;let e=Date.now();await C,v.runnerPrewarmWaited=!0,v.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};b&&y&&!S&&ee();let E=sc({openPositionals:s,runtime:d,flags:t.flags,foldRuntimeLaunchUrl:y}),ne=m&&y&&t.flags?.clearAppState!==!0;if(Sc({shouldRelaunch:m,openTarget:o,collapseSimulatorRelaunch:ne,device:a,existingSession:f})&&o){f&&Si(f);let e=g??o,n=Date.now();await vc({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 re=Date.now();await Xo({device:a,appId:g,runtime:d}),v.runtimeHintsDurationMs=Math.max(0,Date.now()-re),b&&S&&(ee({...x,propagateError:!0}),await te());let ie=T,ae=Date.now(),oe=await wc({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&&Si(se),await R(a,`open`,E.openPositionals,t.flags?.out,{...B(i,t.flags,g),...ne?{terminateRunningApp:!0}:{}}),v.openDispatchDurationMs=Math.max(0,Date.now()-ae),await bc(a,t,r.resolveDaemonStateDir());let D=Date.now();E.followUpLaunchUrl&&await cc({launchUrl:E.followUpLaunchUrl,device:a,req:t,logPath:i,appBundleId:g,traceLogPath:h}),v.launchUrlDurationMs=Math.max(0,Date.now()-D),b&&!w&&ee(),m?await te():C&&!T&&(v.runnerPrewarmWaited=!1),y&&(m||ie)&&await Gn(a,x),g=await ic(a,o,g),a.platform===`android`&&g&&await cr(a,g);let ce=o?xc(ae,o,g):void 0,le=Date.now();if(await zo(a,300),v.postOpenSettleDurationMs=Math.max(0,Date.now()-le),gn(t.meta?.requestId)){let e=pn();return z(e.code,e.message,e.details)}f&&gi(f,`open`,f.snapshot);let ue=Ys({existingSession:se,sessionName:f?.name??vr(t),sessionScope:f?.sessionScope??gc(t),device:a,surface:l,appBundleId:g,appName:c,saveScript:!!t.flags?.saveScript});ue.lease=ci({req:t,existingLease:f?.lease}),p&&(ue.deviceClaim=p),t.runtime!==void 0&&ks(r,n,d);let de=r.ensureSessionDir(n),fe=Ke(de,t.meta?.requestId??Bt().requestId);v.totalDurationMs=Math.max(0,Date.now()-_),P({level:`info`,phase:`open_timing`,durationMs:v.totalDurationMs,data:v});let pe=Js({sessionName:ue.name,sessionStateDir:de,runnerLogPath:Ie(de),requestLogPath:fe,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:g,surface:l,startup:ce,timing:v,device:a,runtime:d,runtimeHintCount:vs,sessionReused:f!==void 0});return _c({session:ue,existingSession:f,saveScriptRequested:!!t.flags?.saveScript,responseData:pe}),r.set(n,ue),r.recordAction(ue,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:d,result:pe}),{ok:!0,data:pe}}async function wc(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,sessionAppBundleId:o,appName:s,existingSession:c}=e,l=t.internal?.openLifecycle?.beforeDispatch;if(!l)return{type:`session`,session:c};let u=Ys({existingSession:c,sessionName:c?.name??vr(t),sessionScope:c?.sessionScope??gc(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=ci({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 Tc(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return ir(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.`}):Ec(i,n)}function Ec(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:hr(e,`device-in-use`)})}async function Dc(e){let{req:t,device:n,sessionName:r,logPath:i}=e;return yi(t.meta,I(n))?await Wr({device:n,session:r,workspace:t.meta?.cwd??process.cwd(),stateDir:U.dirname(i)}):{}}async function Oc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s}=e,c=Tc({req:t,device:a,sessionStore:i});if(c)return c;let l=await Dc({req:t,device:a,sessionName:n,logPath:r}),u={mayHaveStarted:!1};try{let e=await pc({req:t,sessionName:n,sessionStore:i,device:a,surface:o,openTarget:s,onIosSimulatorColdBootStart:qr({req:t,logPath:r,device:a,surface:o,openTarget:s})});if(e.type===`response`)return await kc(l.ownership,u),e.response;u.mayHaveStarted=!0;let c=await Cc({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 kc(l.ownership,u),c}catch(e){throw await kc(l.ownership,u),e}}async function kc(e,t){if(e){if(t.mayHaveStarted){P({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await Jr(e)}}async function Ac(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=uc(a.device,t.flags?.surface,s,a.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return lc(e?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let l=dc({shouldRelaunch:e,openTarget:s,surface:c,device:a.device});if(l)return l;let u=await Bo(a.device);await t.internal?.retainDeviceExecutionLock?.(u.id);let d=await pc({req:t,sessionName:n,sessionStore:i,device:u,surface:c,openTarget:s,existingSession:a,onIosSimulatorColdBootStart:qr({req:t,logPath:r,device:u,surface:c,openTarget:s,traceLogPath:a.trace?.outPath})});return d.type===`response`?d.response:await Cc({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 lc(`open --relaunch requires an app argument.`);let c=fc({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform===`android`?`android`:void 0});if(c)return c;let l=await Dn(t.flags??{},wr(s));await t.internal?.retainDeviceExecutionLock?.(l.id);let u=uc(l,t.flags?.surface,s);return typeof u==`string`?dc({shouldRelaunch:o,openTarget:s,surface:u,device:l})||await yn(hc,l.id,async()=>await Oc({req:t,sessionName:n,logPath:r,sessionStore:i,device:l,surface:u,openTarget:s})):u}function jc(e){return J(e)||Lo(e)}async function Mc(e){if(e.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return J(e)?await Nc(e):await Fc(e)}catch(e){let n=t(e);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function Nc(e){let t=await Vi(e);return t.success?t:await Pc(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function Pc(e){try{return await Hi(e)}catch{return null}}async function Fc(e){let t=await $t(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}function Ic(e,t,n){if(!Be(t))return{kind:`not-armed`};let r=t.actions.length;Qr(e,t,n,`close`,{session:t.name,...D(`Closed: ${t.name}`)});let i=Ue(t),a=e.writeSessionLog(t,{force:Ze(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 Lc(e,n){let r=t(n),i=st(e.scriptPublication??at);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Rc(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Qr(r,n,t,`close`,{session:n.name,...D(`Closed: ${n.name}`)}),t.flags?.saveScript&&(n.recordSession=!0);try{let e=r.writeSessionLog(n,{force:Ze(n,t.flags?.force)});e.written&&rt(n,e.path);return}catch(e){return zc(e)}}function zc(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 Bc(e){let{device:t,shutdownRequested:n}=e;if(n&&!I(t)&&jc(t))return await Mc(t)}function Vc(e,t){return J(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function Hc(e){return M(e.device.platform)&&!J(e.device)}function Uc(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 Wc(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=Vc(t,n);await Gc(n,a,c);let u=s?void 0:await Yc({req:t,session:n,logPath:i});await Zc(l,n,c),await Xc(n,a,r);let d=s?void 0:Rc({req:t,session:n,sessionStore:a,platformCloseError:u});return await c(`materialized_paths`,()=>Rr(r)),{platformCloseError:u,saveScriptError:d}}async function Gc(e,t,n){await n(`recording`,()=>si(e)),await n(`app_log`,()=>hi(e)),await n(`audio_probe`,async()=>{await Ni(e,`session-close`)}),await n(`apple_perf`,()=>Ti(e)),await n(`android_native_perf`,()=>ti(e)),await n(`android_snapshot_helper`,()=>Lr(e)),await n(`android_ime`,()=>pi(e,t.resolveDaemonStateDir()))}function Kc(e){return JSON.stringify(e.positionals??[])}async function qc(e){let{req:t,session:n,logPath:r,sessionStore:i}=e,a=Be(n),o=Kc(t);if(a&&!Ye(n,o)){let e=await Yc({req:t,session:n,logPath:r});if(e)return{response:Lc(n,Uc(e))};ze(n,o)}let s=Ic(i,n,t);return s.kind===`failed`?{response:Lc(n,s.error)}:{repairArmed:a,...s.kind===`committed`&&s.path?{healedScriptPath:s.path}:{},...s.kind===`aborted`?{aborted:!0}:{}}}async function Jc(e){try{return{providerData:await Vr(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 Yc(e){let{req:t,session:n,logPath:r}=e;if(rl(t,n)){if(Hc(n))try{await Ci(n)}catch(e){return e}try{Si(n),await R(n.device,`close`,t.positionals??[],t.flags?.out,{...B(r,t.flags,n.appBundleId,n.trace?.outPath)}),await zo(n.device,300);return}catch(e){return e}}}async function Xc(e,t,n){!Yo(t.getRuntimeHints(n))||!e.appBundleId||await Zo({device:e.device,appId:e.appBundleId}).catch(()=>{})}async function Zc(e,t,n){if(M(t.device.platform)){if(!e){await n(`apple_runner`,()=>Ci(t));return}P({level:`debug`,phase:`ios_runner_retained_after_close`,data:{session:t.name,deviceId:t.device.id}}),zn(t.device.id)}}function Qc(e,t){if(!e.flags?.saveScript||$e(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 $c(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await al(t,r);if(Qc(t,s),t.internal?.closeAppOnly===!0)return await nl({req:t,session:s,logPath:r});let c=await qc({req:t,session:s,logPath:r,sessionStore:i});if(`response`in c)return c.response;let l=await el({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 Bc({device:s.device,shutdownRequested:t.flags?.shutdown});return tl({session:s,repair:c,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:u,providerData:l.providerData})}async function el(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=[],{platformCloseError:l,saveScriptError:u}=await Wc({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,cleanupFailures:c,repairArmed:e.repairArmed}),d=await Jc({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||await Jr(n.deviceClaim),a.delete(r),p)throw p;if(u)throw u;return{kind:`closed`,providerData:d.providerData}}function tl(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:re({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...D(c),...o,...s}}}async function nl(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 Yc({req:t,session:n,logPath:r});if(a)throw a;return{ok:!0,data:{app:i,...D(`Closed: ${i}`)}}}function rl(e,t){return il(e)||t.device.platform===`web`}function il(e){return(e.positionals?.length??0)>0}async function al(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 R(n,`close`,e.positionals,e.flags?.out,{...B(t,e.flags)}),await zo(n,300),{ok:!0,data:{app:e.positionals[0],...D(`Closed: ${e.positionals[0]}`)}}}const ol={ios:async(e,t,n)=>{let r=await wn(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 wn(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)}},sl={ios:async(e,t,n)=>{let r=await wn(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 wn(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 cl(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=fl(n,t.positionals??[]);if(!l.ok)return l.response;let{app:u,appPathInput:d}=l,f=t.meta?.uploadedArtifactId;try{let e=f?Fr(f,t.meta?.tenantId):k.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=L(n,r);if(c)return c;o&&Si(o);let l=N(r)?ul(u,e,await a.ios(r,u,e)):dl(u,e,await a.android(r,u,e)),p=re(l,ll(l));return Qr(i,o,t,n,p),{ok:!0,data:p}}finally{f&&$r(f)}}function ll(e){return`Installed: ${e.appName??h(e)}`}function ul(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 dl(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 fl(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 pl(e,t,n){return await Ee(e,t,n)}async function ml(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`session_list`){let e=nr(t);return{ok:!0,data:{sessions:r.toArray().filter(t=>oi(t,e)).map(e=>{let t=r.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:Ie(t),platform:j(e.device),...M(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,...M(e.device.platform)&&!A(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if(t.command===`devices`)try{let e=en(t.flags?.androidDeviceAllowlist),n=t.flags?.platform,r=mt({simulatorSetPath:tn(t.flags?.iosSimulatorDeviceSet),platform:n,target:t.flags?.target}),i=await On({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=>_l(e,n)):i;return{ok:!0,data:{devices:(t.flags?.target?a.filter(e=>(e.target??`mobile`)===t.flags?.target):a).map(gl)}}}catch(e){let t=s(e);return z(t.code,t.message,t.details)}if(t.command===`capabilities`){let e=await hl({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:gl(i),availableCommands:En().filter(e=>jn(e,i))}}}if(t.command===`apps`){let e=await hl({req:t,sessionName:n,sessionStore:r,ensureReady:!0});if(`response`in e)return e.response;let{device:i}=e,a=L(`apps`,i);if(a)return a;let o=Ft(t.flags?.appsFilter);return M(i.platform)?{ok:!0,data:{apps:(await Ui(i,o)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await Qt(i,o)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}async function hl(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 gl({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:j({platform:r.platform,appleOs:n}),...M(r.platform)&&n?{appleOs:n}:{}}}function _l(e,t){return _t(e,t)}async function vl(e){let{ensureAndroidEmulatorBooted:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t(e)}const yl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,bl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function xl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Ro(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=M(i?.device.platform)&&Ho(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return z(`SESSION_NOT_FOUND`,yl);if(u&&!c)return z(`SESSION_NOT_FOUND`,bl);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?A(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:j(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:z(`COMMAND_FAILED`,`No foreground app is tracked for this ${A(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:j(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...N(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(N(d))return z(`SESSION_NOT_FOUND`,yl);if(A(d))return z(`SESSION_NOT_FOUND`,bl);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 Sl(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=Vo({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 vl({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=Vo({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 vl({avdName:t,serial:a.serial,headless:!0})}await Xr(f)}else f.platform===`android`&&f.kind===`emulator`&&f.booted!==!0?(f=await vl({avdName:f.name,serial:a.serial,headless:!1}),await Xr(f)):(f.platform!==`android`||f.booted!==!0)&&await Xr(f,{onIosSimulatorColdBootStart:vi({req:t,logPath:r,device:f,enabled:!0})});return L(`boot`,f)||(N(f)&&f.kind===`simulator`&&Un(f,{}),{ok:!0,data:{platform:j(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...M(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}})}if(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 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:j(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind});let c=await Mc(o);return c.success?{ok:!0,data:{platform:j(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c,...M(o.platform)&&o.appleOs?{appleOs:o.appleOs}:{}}}:z(c.error?.code??`COMMAND_FAILED`,Cl(c),{platform:j(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c})}return t.command===`appstate`?await xl({req:t,sessionName:n,sessionStore:i}):null}function Cl(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}async function wl(e){if(!It(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const Tl=[`probe`],El=[`start`,`status`,`stop`],Dl=`audio probe requires ${El.join(`, `)}`;async function Ol(e){let n=kl(e);if(!n.ok)return n;let r=await wl(n.session.device);if(r)return await jl(e,n,r);let i=ui();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 kl(e){let t=Al(e);if(!t.ok)return t;let n=Ml(e.req);if(!n.ok)return n;let r=Nl(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function Al(e){let t=e.sessionStore.get(e.sessionName);return t?jn(`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 jl(e,n,r){try{return{ok:!0,data:await Pr({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 Ml(e){if(!Pl(e.positionals?.[0]))return z(`INVALID_ARGS`,`audio requires probe`);let t=Fl(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:z(`INVALID_ARGS`,Dl)}function Nl(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=Il(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=Il(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 Pl(e){let t=(e??`probe`).toLowerCase();return Tl.includes(t)?`probe`:void 0}function Fl(e){let t=(e??`status`).toLowerCase();return El.includes(t)?t:void 0}function Il(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 Ll(e){let n=Rl(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 ql(e,r,r.appBundleId,n):await Jl(e,r,r.appBundleId,n)}}catch(e){return{ok:!1,error:t(e)}}}function Rl(e,t){let n=Kl(e,t);return t===`cpu`?zl(e,n):Bl(e,n)}function zl(e,t){let n=Vl(e,1),r=Vl(e,2),i=Vl(e,3);return ce(n)?Hl(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`,S)}function Bl(e,t){let n=Vl(e,1),r=Vl(e,2);return Ul(n)?le(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:z(`INVALID_ARGS`,`perf trace requires --kind perfetto`):z(`INVALID_ARGS`,x):z(`INVALID_ARGS`,`perf trace action must be start or stop`)}function Vl(e,t){return(e.positionals?.[t]??``).toLowerCase()}function Hl(e){return e===`start`||e===`stop`||e===`report`}function Ul(e){return e===`start`||e===`stop`}function Wl(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),$l(t)}function Gl(e,t,n){return t?k.expandHome(t,e.req.meta?.cwd):Ql(e.sessionStore,e.sessionName,n)}function Kl(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 ql(e,t,n,r){if(r.action===`start`){Xl(t);let i=Gl(e,r.outPath,`cpu.perf.data`);return Wl(e,await ri(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=eu(t,`cpu-profile`,r.kind);if(r.action===`report`){await Yl(i);let n=Gl(e,r.outPath,`cpu-report.json`);return await gr(t.device,i,n,{adb:e.androidAdbExecutor})}let a=Zl(e,r.outPath,i);return Wl(e,await mr(t.device,i,a,{adb:e.androidAdbExecutor}))}async function Jl(e,t,n,r){if(r.action===`start`){Xl(t);let i=Gl(e,r.outPath,`app.perfetto-trace`);return Wl(e,await yr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=eu(t,`trace`,r.kind),a=Zl(e,r.outPath,i);return Wl(e,await ar(t.device,i,a,{adb:e.androidAdbExecutor}))}function Yl(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 Xl(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 Zl(e,t,n){return t?Gl(e,t,n.outPath):n.outPath}function Ql(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return U.join(e.ensureSessionDir(t),`${r}-${n}`)}function $l(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 eu(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 tu(e,n){let r=nu(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(!M(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 su(e,n,r):r.action===`stop`?await cu(e,n,r):await pu(e,n,r)}catch(e){return{ok:!1,error:t(e)}}}function nu(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?ru(t):n===`trace`?iu(t):z(`INVALID_ARGS`,ie)}function ru(e){if(e[1]?.toLowerCase()!==`profile`)return z(`INVALID_ARGS`,`perf cpu requires profile`);let t=au(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=ou(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 iu(e){let t=au(e[1],`perf trace`,!1);if(!t.ok)return t;let n=ou(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 au(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 ou(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:z(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function su(e,t,n){if(t.applePerf?.active)return z(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??_u(n.mode),i=gu(e,n),a=await Qn({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=vu(`started`,a);return hu(e,t,o),{ok:!0,data:o}}async function cu(e,t,n){let r=t.applePerf?.active;if(!r)return z(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?k.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await Dr(r,i)}catch(n){throw uu(n)&&lu(e,t),n}du(e,t,a);let o=vu(`stopped`,a);return hu(e,t,o),{ok:!0,data:o}}function lu(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function uu(e){return s(e).details?.captureCleanedUp===!0}function du(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...fu(n)},e.sessionStore.set(e.sessionName,t)}function fu(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function pu(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=gu(e,n),i=mu(t,n);if(!i.ok)return i;let a={perf:`reported`,...await sr({tracePath:k.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return hu(e,t,a),{ok:!0,data:a}}function mu(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 hu(e,t,n){Qr(e.sessionStore,t,e.req,`perf`,n)}function gu(e,t){if(t.outPath)return k.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 _u(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function vu(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}}Fn();function yu(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:Ks,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 bu(e,t={}){let n=wu(e);if(!Mu(e))return n;if(!e.appBundleId)return ku(n,e),n;let r=xu(e.device);return r&&Au(n,e,await r(e,e.appBundleId,t)),n}function xu(e){let t=Pn(e.platform)?.perf?.metricsSamplerTag(e);return t?Bu[t]:void 0}async function Su(e,t={}){let n=Du(e);return Mu(e)?e.appBundleId?(await ju(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:Nu(e)},n):n}async function Cu(e,t){let n=Ou(e);return Mu(e)?t.action===`sample`?(n.metrics={memory:await Vu(e,t)},n):(n.artifact=await Uu(e,t),n.support=Yu(n.artifact.support)??Ju(e),n):t.action===`snapshot`?(n.artifact=Ku(e,Wu(e,t.kind)),n.support=Yu(n.artifact.support)??Ju(e),n):(n.metrics={memory:{available:!1,reason:qs}},n)}function wu(e){let t=yu(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:Ks,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:Ks};return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,...Tu()},sampling:{startup:{method:Ks,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Pu(e)}}}function Tu(){return{fps:Eu(),memory:{available:!1,reason:qs},cpu:{available:!1,reason:qs}}}function Eu(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function Du(e){return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:Eu()},sampling:{fps:Lu(e)}}}function Ou(e){return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:Fu(e),snapshot:Iu(e)}}}function ku(e,t){let n=Nu(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}function Au(e,t,n){e.metrics.memory=Zu(n.memory),e.metrics.cpu=Zu(n.cpu),e.metrics.fps=Qu(Zu(n.fps),t)}async function ju(e,t,n,r){let i=t.device.platform===`android`?await Xu(pr(t.device,n,{adb:r.androidAdb})):await Xu(jr(t.device,n));e.metrics.fps=Qu(Zu(i),t)}function Mu(e){return Pn(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function Nu(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 Pu(e){return e.device.platform===`android`?{memory:{method:tr,description:rr,unit:`kB`},cpu:{method:$n,description:Sr,unit:`percent`},fps:{method:Bi,description:xr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:xi(e.device)}function Fu(e){return e.device.platform===`android`?{method:tr,description:rr,unit:`kB`,topConsumerLimit:5}:xi(e.device).memory}function Iu(e){return e.device.platform===`android`?{method:Cr,description:Fi,defaultKind:`android-hprof`,artifactOnly:!0}:{method:kr,description:Tr,defaultKind:`memgraph`,artifactOnly:!0}}function Lu(e){return e.device.platform===`android`?{method:Bi,description:xr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:or(e.device)}async function Ru(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([Xn(e.device,t,r),ai(e.device,t,r),pr(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function zu(e,t){let n=await Xu(jr(e.device,t)),r=await Xu(Ar(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 Bu={android:Ru,apple:zu};async function Vu(e,t){return e.appBundleId?Zu(e.device.platform===`android`?await Xu(Xn(e.device,e.appBundleId,{adb:t.androidAdb})):await Xu(Hu(e))):{available:!1,reason:Nu(e)}}async function Hu(e){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Nu(e));return(await Ar(e.device,e.appBundleId)).memory}async function Uu(e,t){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Nu(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Wu(e,t.kind),i=Gu(t,r);return e.device.platform===`android`?r===`android-hprof`?await _r(e.device,e.appBundleId,i,{adb:t.androidAdb}):Ku(e,r):r===`memgraph`?await ur(e.device,e.appBundleId,i):Ku(e,r)}function Wu(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Gu(e,t){if(e.out)return k.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 Ku(e,t){let n=Ju(e),r=qu(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function qu(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.`}:M(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 Ju(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.`}:M(e.device.platform)?{...fr(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 Yu(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Xu(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Zu(e){if(e.status===`fulfilled`)return{available:!0,...e.value};let n=t(e.reason);return{available:!1,reason:n.message,error:n}}function Qu(e,t){if(e.available!==!0)return e;let n=$u(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function $u(e,t){let n=ed(t.windowStartedAt),r=ed(t.windowEndedAt)??ed(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:td(e)})).slice(-12)}function ed(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function td(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 nd=`logs requires ${v.slice(0,-1).join(`, `)}, or ${v.at(-1)}`,rd=[`dump`,`log`],id=`network requires ${rd.join(` or `)}`,ad=`network include mode must be one of: ${o.join(`, `)}`,od={path:({session:e,sessionName:t,sessionStore:n})=>Md(e,t,n),doctor:({session:e,sessionName:t,sessionStore:n})=>Nd(e,t,n),mark:({req:e,sessionName:t,sessionStore:n})=>Pd(e,t,n),clear:({session:e,sessionName:t,sessionStore:n,restart:r})=>Fd(e,t,n,r),start:({session:e,sessionName:t,sessionStore:n})=>Id(e,t,n),stop:({session:e,sessionName:t,sessionStore:n})=>Ld(e,t,n)};function sd(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:ud(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:[ld(e.appLogFailure)]}:{active:!1,state:`inactive`,backend:mi(e.device)}}function cd(e,t){return{backend:t,code:e.code,message:e.message,hint:e.hint}}function ld(e){return e.hint?`${e.message} ${e.hint}`:e.message}function ud(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 dd(e,t){return Mr([...e,...t.notes??[]])}function fd(e,t,n){return{...n,platform:e.device.platform,outPath:t}}function pd(e,n,r,i){let a=t(i);return e.set(n,{...r,appLog:void 0,appLogFailure:cd(a,mi(r.device))}),{ok:!1,error:a}}async function md(e){let{req:t}=e;return t.command===`perf`?gd(e):t.command===`logs`?Ad(e):t.command===`events`?await hd(e):t.command===`network`?Rd(e):t.command===`audio`?await Ol(e):null}async function hd(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 gd(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(_d(s))return o.device.platform===`android`?await Ll({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await tu(e,o);let c=vd(n);if(!c.ok)return c;if(c.native)return await tu(e,o);try{return{ok:!0,data:await yd(e,o,c)}}catch(e){return{ok:!1,error:t(e)}}}function _d(e){return e===`cpu`||e===`trace`}function vd(e){let r=bd(e.positionals?.[0]);if(!r)return z(`INVALID_ARGS`,ie);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=xd(e.positionals?.[1]);if(!i)return z(`INVALID_ARGS`,me);let a=Sd(e.flags?.kind);return a instanceof n?{ok:!1,error:t(a)}:(Cd(r,i)??Ed(e,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:kd(e.flags?.out)}}async function yd(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await Cu(t,{action:Td(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await Su(t,{androidAdb:a}):await bu(t,{androidAdb:a})}function bd(e){let t=(e??`metrics`).toString().toLowerCase();return b(t)?t:void 0}function xd(e){let t=(e??`sample`).toString().toLowerCase();return u(t)?t:void 0}function Sd(e){if(e!==void 0)return typeof e!=`string`||!le(e)?new n(`INVALID_ARGS`,x):e}function Cd(e,t){if(e===`memory`)return wd(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 wd(e){return e===`sample`||e===`snapshot`}function Td(e){if(wd(e))return e;throw new n(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function Ed(e,t,n,r){return Dd(e.flags?.out,t,n)??Od(r,t,n)}function Dd(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return z(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function Od(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return z(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!c(e))return z(`INVALID_ARGS`,he)}}function kd(e){return typeof e==`string`&&e.length>0?e:void 0}async function Ad(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=L(`logs`,i.device);if(a)return a;let o=jd(t);return o.ok?await od[o.action]({...e,session:i,restart:o.restart}):o}function jd(e){let t=(e.positionals?.[0]??`path`).toLowerCase(),n=!!e.flags?.restart;return v.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`,nd)}function Md(e,t,n){let r=n.resolveAppLogPath(t),i=Kr(r),a=sd(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 Nd(e,t,n){let r=n.resolveAppLogPath(t),i=await _i(e.device,e.appBundleId),a=sd(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:dd(i.notes,a)}}}function Pd(e,t,n){let r=e.positionals?.slice(1).join(` `)??``,i=n.resolveAppLogPath(t);return br(i,r),{ok:!0,data:{path:i,marked:!0}}}async function Fd(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=Jn(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 ni(e.appLog);let o=Jn(i),s=n.resolveAppLogPidPath(t);try{let r=await wi(e.device,a,i,s);return n.set(t,{...e,appLog:fd(e,i,r),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(r){return pd(n,t,e,r)}}async function Id(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 wi(e.device,e.appBundleId,r,i);return n.set(t,{...e,appLog:fd(e,r,a),appLogFailure:void 0}),{ok:!0,data:{path:r,started:!0}}}catch(r){return pd(n,t,e,r)}}async function Ld(e,t,n){if(!e.appLog)return z(`INVALID_ARGS`,`no app log stream active`);let r=e.appLog.outPath;return await ni(e.appLog),n.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:r,stopped:!0}}}async function Rd(e){let t=Bd(e);if(!t.ok)return t;let{include:n,maxEntries:r,session:i}=t;if(i.device.platform===`web`)return await zd({include:n,maxEntries:r});let a=await ki({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 zd(e){let n=ui();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 Bd(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=L(`network`,i.device);if(a)return a;let o=(t.positionals?.[0]??`dump`).toLowerCase();if(!rd.includes(o))return z(`INVALID_ARGS`,id);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=Vd(t);return c.ok?{ok:!0,session:i,maxEntries:s,include:c.include}:c}function Vd(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`,ad)}function Hd(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=U.resolve(n??`.`,t??`.agent-device/test-artifacts`);return U.join(i,r)}function Ud(e,t){let n=t?U.relative(t,e):U.basename(e);return Xd((n.length===0||n.startsWith(`..`)?U.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`))||`test`}function Wd(e,t){W.mkdirSync(t,{recursive:!0}),qd(e,t)}function Gd(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=Kd(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 Kd(e,t){let n=[],r=new Map;for(let i of e){if(!Yd(i))continue;let e=Jd(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 qd(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 Jd(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 Yd(e){try{return W.statSync(e).isFile()}catch{return!1}}function Xd(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 Zd(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}rf(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 Qd(e,t,n,r,i=0){let a=Xd(U.basename(n,U.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function $d(e){return Xd((e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`))||`suite`}function ef(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 tf(e,t){return typeof e==`number`?e:t}function nf(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function rf(e,t){return e===`apple`?M(t):t===e}function af(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const of=2e3;async function sf(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,S=Date.now(),C=pf({artifactsDir:l,artifactPaths:v,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Z(C,e),shard:u,onStep:d}).catch(e=>af({error:t(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(mf(o,[...v]))},o)})]):await w,Z(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await cf(w)||(x=df(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:of}}),lf({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await uf({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=ff(x,`Replay test finalization failed: ${e.error.message}`));let n=Date.now();try{Z(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(e){let i=t(e);Z(C,{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??af({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}async function cf(e){return await Promise.race([e.then(()=>!0),Ji(of).then(()=>!1)])}async function lf(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 uf(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}}),af({error:n})}}function df(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function ff(e,t){return{...e,warnings:[...e.warnings,t]}}function pf(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 mf(e,t=[]){return af({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 hf(e){let t=gf(e),n=await _f(e,t);return{result:Cf(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function gf(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}`]:[],Ud(t.path,n)),maxAttempts:r+1}}async function _f(e,t){yf(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await vf(e,t,r);if(bf(n,i),xf(e,i.outcome,r))break;Sf(e,t,i)}return n}async function vf(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=Qd(i,a,r.path,o,n),h=U.join(t.testArtifactsDir,`attempt-${f}`);Wd(r.path,h);let g=ef({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,...Df(d)},v=await sf({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 Gd({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function yf(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:Qd(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Df(c)})}function bf(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 xf(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Sf(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,...Df(e.shard)})}function Cf(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?wf(e,t,n,r):Tf(e,t,n,r)}function wf(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,...Df(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}:{},...Ef(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Tf(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,...Df(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}:{},...Ef(s)}}function Ef(e){return Df(e)}function Df(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Of(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 kf(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 Af(t,u,d);Pf(s,a);let p=s.shardPlan?Ff({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await If({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 Bf({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:Uf(s.total,p,Date.now()-e)}}catch(e){let t=s(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Af(e,t,n){let r=jf(e,t),i=Mf(r),a=r.length-i.length,o=$d(e.requestId),s=await Of(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:Nf(e,o),total:s?.total??r.length}}function jf(e,t){return Zd({inputs:[...e.inputs],cwd:e.cwd,platformFilter:e.platformFilter,discoverSources:t})}function Mf(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Nf(e,t){return Hd({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Pf(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 Ff(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 If(e){return(await Promise.allSettled(e.shards.map(async t=>await Rf({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Lf(r,e.sessionName,t.reason)]:[]})}function Lf(e,n,r){let i=t(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:zf(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 Rf(e){let{shard:t,sessionName:n}=e;return await Vf({...e,entries:t.entries,sessionName:zf(n,t),shard:t})}function zf(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Bf(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 hf({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:nf(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:tf(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),Hf(t,o,p))break}return g}async function Vf(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 hf({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:nf(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:tf(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),Hf(b,o,m))break}return _}function Hf(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Uf(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=Le(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 Wf(){return{readSelectorExpression:Gf,resolveRecordedTarget:Kf,buildSelectorCandidates:qf}}function Gf(e,t){let n=e===`is`?Ct([...t]).split:Se([...t]);return n?Ce(n.selectorExpression)?{kind:`expression`,expression:n.selectorExpression,rest:n.rest}:{kind:`invalid`}:{kind:`not-applicable`}}function Kf(e,t,n){let r=Ce(e);if(!r)return{kind:`unresolved`,reason:`parse-invalid`,matchedNodes:[]};let i=bt(t,r,{platform:n.platform,requireRect:n.requireRect,requireUnique:!0,disambiguateAmbiguous:n.allowDisambiguation});if(i){let e=t.filter(e=>n.requireRect&&!e.rect?!1:yt(e,i.selector,n.platform));return{kind:`resolved`,winner:i.node,matchedNodes:e,matchCount:e.length,...i.disambiguation?{disambiguation:{tiebreak:i.disambiguation.tiebreak,matchCount:i.disambiguation.matchCount,alternatives:i.disambiguation.alternatives}}:{}}}let a=Et(t,r,{platform:n.platform,requireRect:n.requireRect})?.matchedNodes??[];return{kind:`unresolved`,reason:a.length>0?`ambiguous`:`no-match`,matchedNodes:a}}function qf(e,t,n={}){return Tt(e,t,n)}function Jf(e,t,n){let r=Ce(e);if(!r)return;let i=bt(t,r,{platform:n.platform,requireRect:n.requireRect,requireUnique:!0,disambiguateAmbiguous:n.allowDisambiguation});if(i)return{node:i.node,basis:Yf(i.selector)}}function Yf(e){let t=new Set(e.terms.map(e=>e.key));if(t.has(`id`))return`id`;let n=t.has(`role`),r=t.has(`label`)||t.has(`text`);return n&&r?`role-label`:r||t.has(`value`)?`label`:`other`}function Xf(e){if(!e)return;let t=Ce(e);if(!t)return;let n=t.selectors.flatMap(e=>e.terms.flatMap(e=>(e.key===`label`||e.key===`text`||e.key===`id`)&&typeof e.value==`string`?[e.value]:[]));if(n.length===0)return;let r=n[0];return r&&n.every(e=>e===r)?r:void 0}function Zf(e){return JSON.stringify(Qf(e))}function Qf(e){if(Array.isArray(e))return e.map(Qf);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,Qf(t[e])]))}function $f(e){let t=Zf(ep(e));return Wi(`sha256`).update(t,`utf8`).digest(`hex`)}function ep(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)=>tp(e,n[t]??null,r?.[t]??null))}}function tp(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,source:{path:n,line:t}}}function np(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=rp({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function rp(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>ip({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>ap({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>op(n,r)];for(let e of s){let t=e();if(t)return t}}function ip(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 ap(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 op(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 sp(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=tt(r),o=dt(r),s=$f({actions:a.actions,actionLines:a.actionLines,actionSourcePaths:a.actionSourcePaths,metadata:{platform:t?.platform??Ge(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=>np(e,c,s)}}function cp(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function lp(e){let{recorded:t,token:n,port:r}=e;return n===void 0||!n.startsWith(`@`)&&r.readSelectorExpression(`ordinary`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function up(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 dp(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=up(i,a);return{matchCount:n,observed:r,mismatches:[...r?d(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 fp(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...d(e,r),...ee(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 pp(e,t,n,r,i,a){let o=n.targetEvidence;if(!o)return mp(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return mp(e,n,r,i,a);if(s.kind===`post-resolution`){let c=cp({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return mp(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return hp(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=lp({recorded:o,token:s.token,port:e.port});if(c.kind===`skip`)return mp(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,{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 (${u.reason}).`,...u.hint===void 0?{}:{causeHint:u.hint}},a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?hp(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 mp(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 hp(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=n.targetEvidence;if(!c)return{status:`failed`,failure:s.plainFailure};let l=s.status===`guard-mismatch`?dp(c,s.evidence,o.kind===`target`?o.guard.matchCount:0):fp(c,s.evidence);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(n,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}async function gp(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Qi(e.varSources),o=new Set,s=[],c=yp(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!vp(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(bp(u,n.length,r,e))}let d=ca(r,a,_p(e,u)),f=da(a),p=t.diagnosticsMarker(),m=await pp(t,f,r,d,u,[...o]);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){m.artifactPaths.forEach(e=>o.add(e));continue}m.failure.artifactPaths.forEach(e=>o.add(e));let h=await t.handleActionFailure({action:r,index:u,artifactPaths:[...o],snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function _p(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function vp(e){return!!(e&&e.command!==`replay`)}function yp(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(vp(n))return n.command===`close`?t:void 0}}function bp(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function xp(e){let{sessionStore:t,sessionName:n}=e,r=()=>t.get(n);return{view(){let e=r();if(e)return{repairBoundary:He(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){let i=r();i&&(Ne(i,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Sp(e.sourcePath),firstArm:e.firstArm}),t.set(n,i))},demoteForRerunIfArmed(){let e=r();!e||He(e)===void 0||ct(e)},markCompleteIfArmed(){let e=r();!e||He(e)===void 0||(Xe(e),t.set(n,e))},markSessionHeldIfArmed(e){if(e.ok||!Je(r()))return e;let t=Cp(e);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){t.clearRepairTombstone(n)},clearCorrectiveWatermarkIfExpected(e){let i=r();!i||i.pendingRecordAndHeal?.expectedFrom!==e||(Ep(i),t.set(n,i))},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){let i=r();i&&(Tp({session:i,...e}),t.set(n,i))}}}}function Sp(e){let t=U.dirname(e),n=U.basename(e,U.extname(e));return U.join(t,`${n}.healed.ad`)}function Cp(e){let t=e.error.details?.divergence;if(!(!De(t)||!wp(t.resume)))return t.resume}function wp(e){return!De(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function Tp(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Dp({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Ep(e){e.pendingRecordAndHeal=void 0}function Dp(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 Op(e,t){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let n=e[e.length-1],r=n!==void 0&&/^\d+$/.test(n)?n:null,i=r===null?e.slice():e.slice(0,-1),a=t.readSelectorExpression(`wait`,i);return a.kind!==`expression`||a.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:a.expression,selectorTimeout:r}}function kp(e,t){let n=[],r=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(n.push(...r),qe(e.command)){let t=Ap(e),r=t[0]??``;r&&!r.startsWith(`@`)&&n.push(t.join(` `))}if(e.command===`fill`){let t=e.positionals?.[0]??``;t&&!t.startsWith(`@`)&&Number.isNaN(Number(t))&&n.push(t)}if(e.command===`get`){let t=e.positionals?.[1]??``;t&&!t.startsWith(`@`)&&n.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let r=t.readSelectorExpression(`is`,[...e.positionals]);r.kind===`expression`&&n.push(r.expression)}if(e.command===`wait`){let{selectorExpression:r}=Op([...e.positionals],t);r&&n.push(r)}return Mr(n).filter(e=>e.trim().length>0)}function Ap(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&jp(n)?t.slice(0,-1):t}function jp(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Mp(e){let t=Np({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 Np(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Pp({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Pp(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 Fp(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Ip(n))return`manual`;let i=Lp(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Ip(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&Rp(e.scrollRegion)}function Lp(e,t){let n=T(t),r=Bp(e.ancestry,n,t),i=e.scrollRegion;return i&&Rp(i)?r&&zp(i,n,t):r}function Rp(e){return e.id!==void 0||e.label!==void 0}function zp(e,t,n){return n.some(n=>At(kt(n,t),e))}function Bp(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=l(n,t,e.length);return!r.broken&&g(r.chain,e)})}const Vp=new WeakMap;function Hp(e){return{store:t=>Up(e,t),finalize:(t,n)=>Wp({...e,evidence:t,projection:n})}}function Up(e,t){let{sessionStore:n,sessionName:r}=e,i=n.get(r);if(!i)throw Error(`Internal observation session is no longer available.`);Er(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 Vp.set(o,{sessionName:r,session:i,sessionCreatedAt:i.createdAt,snapshot:t,snapshotGeneration:a,runtimeRevision:dr(i),refFrame:Kp(i)}),{evidence:o,refsGeneration:a}}function Wp(e){let t=Vp.get(e.evidence);Vp.delete(e.evidence);let n=Jp(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Gp(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Yp(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Or(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Gp(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&&dr(n)===t.runtimeRevision&&qp(Kp(n),t.refFrame)}function Kp(e){return{state:e.refFrameState,scope:e.refFrameScope,tree:e.refFrameTree,generation:e.refFrameGeneration}}function qp(e,t){return e.state===t.state&&e.scope===t.scope&&e.tree===t.tree&&e.generation===t.generation}function Jp(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 Yp(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Xp(t){let{sessionStore:n,sessionName:r,divergence:i,responseLevel:a}=t,o,s,c=ue({divergence:i,level:a,writeOverflowArtifact:t=>{let i=e(t),a=$p(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&&Hp({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 Qp(s),Zp(c,`missing-evidence`);let u=Hp({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:(Qp(s),Zp(c,u.reason))}function Zp(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 Qp(e){if(e)try{W.unlinkSync(e)}catch{}}function $p(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 em={id:0,"role-label":1,label:2,other:3};function tm(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||nm(n.basis)<nm(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>nm(e.basis)-nm(t.basis)||e.nodeIndex-t.nodeIndex)}function nm(e){return em[e]}async function rm(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,port:g}=e,_=se(f),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await om({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.`},b=um(y,_),x=y.state===`available`&&o?hm({action:n,session:o,nodes:y.nodes,sanitize:_,port:g}):[],S=Fp({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:im(y)}),C=Mp({failedIndex:r+1,actions:p,planDigest:m,repairHint:S,resumeStamper:l});return Xp({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(Pe(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:C,repairHint:S},responseLevel:d,evidence:y.state===`available`?y.evidence:void 0,...h?{signal:h}:{}})}function im(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const am=[300,500,800,1200,2e3,3e3,4e3];async function om(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=cm(a),c=Date.now()+12e3,l=await sm({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of am){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await Kt(Math.min(e,a)),l=await sm({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s})}return l.observation}async function sm(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(_(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=Hp({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:y(e)}}}function cm(e){return{snapshotInteractiveOnly:lm(e)}}function lm(e){return gm(e.command)?_m(e).requiresRect:!0}function um(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=mm(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function dm(e){return!!ae(e,fe(e.type??`Element`))||e.hittable===!0}function fm(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function pm(e,t){let n=oe(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&dm(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=>fm(e,t)),...o.filter(e=>!fm(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function mm(e,t,n){let{nodes:r,truncated:i}=pm(e,n);return{refs:r.map(e=>{let n=fe(e.type??`Element`),r=ae(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function hm(e){let{action:t,session:n,nodes:r,sanitize:i,port:a}=e;if(!gm(t.command))return[];let o=kp(t,a);return o.length===0?[]:vm({candidates:o,nodes:r,session:n,action:t,matching:_m(t),sanitize:i,port:a})}function gm(e){return qe(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function _m(e){let t=qe(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function vm(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o,port:s}=e,c=[];for(let e of t){let t=ym({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o,port:s});t&&c.push(t)}return tm(c).map(e=>e.suggestion)}function ym(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o,port:s}=e,c=Jf(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(c)return{suggestion:bm({node:c.node,nodes:n,session:r,action:i,basis:c.basis,sanitize:o,port:s}),basis:c.basis,nodeIndex:c.node.index}}function bm(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o,port:s}=e,c=s.buildSelectorCandidates(t,r.device.platform,{action:i.command===`fill`?`fill`:qe(i.command)?`click`:`get`,nodes:n}),l=fe(t.type??`Element`),u=ae(t,l);return{selector:o(c.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(l),...u?{label:o(u)}:{}}}function xm(e){return{...e,hint:e.hint??wm(e.details,`hint`),diagnosticId:e.diagnosticId??wm(e.details,`diagnosticId`),logPath:e.logPath??wm(e.details,`logPath`)}}function Sm(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return Cm({error:t,actionLabel:Pe(n),action:n.command,positionals:je(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function Cm(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:ne(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:ne(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Em(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function wm(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const Tm=[`reason`,`retriable`,`supportedOn`];function Em(e){if(!e)return{};let t={};for(let n of Tm)e[n]!==void 0&&(t[n]=e[n]);return t}async function Dm(e){return await Om({...e,snapshotDiagnostics:Me(e.snapshotDiagnosticSamples)})}async function Om(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,port:_}=e;if(t.ok)return t;let v=km(t.error.details?.replaySource),y=xm(t.error),b=await rm({error:y,action:n,index:r,sourcePath:v?.path??a,sourceLine:v?.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),port:_});return Sm({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function km(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 Am(t,n){if(t)try{W.appendFileSync(t,`${JSON.stringify(e(n))}\n`)}catch(e){P({level:`warn`,phase:`replay_trace_write_failed`,data:{path:t,error:e instanceof Error?e.message:String(e)}})}}async function jm(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();Am(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:je(o)??[]});let m;try{m=await Nm({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 Am(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?Fm(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Mm(m,u??s,c)}function Mm(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 Nm(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Im(t.flags,r.flags),s=i.command===`fill`?Re(We(i)):void 0;return s&&(o.recordAs=s),await a(Pm({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??nr(t)}:{}}},r))}function Pm(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:ge(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ve(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Fm(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 Im(e,t){return ke(e,{...t??{}})}function Lm(e){return Wm(e.ok?zm(e.data):Rm(e.error.details?.artifactPaths))}function Rm(e){return Array.isArray(e)?e.filter(Um):[]}function zm(e){return e?[Hm(e.path),Hm(e.outPath),...Bm(e.artifacts)].filter(Um):[]}function Bm(e){return Array.isArray(e)?e.map(Vm).filter(Um):[]}function Vm(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Hm(t.localPath)??Hm(t.path)}function Hm(e){return typeof e==`string`?e:void 0}function Um(e){return typeof e==`string`}function Wm(e){return[...new Set(e.filter(Gm))]}function Gm(e){try{return W.statSync(e).isFile()}catch{return!1}}function Km(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s,port:c}=e,l=qm({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s,port:c}),u=T(r),d=C(t),p=f(l.matchedNodes,u,d,t.ancestry),m=p.filter(e=>jt(r,e)===t.sibling),h=p.filter(e=>At(kt(e,u),t.scrollRegion)),g=Ot(h)[t.viewportOrder]?.ref,_=Mt({winnerRef:l.winnerRef,matchedRefs:l.matchedNodes.map(e=>e.ref),identitySetRefs:p.map(e=>e.ref),siblingMatchRefs:m.map(e=>e.ref),regionMemberRefs:h.map(e=>e.ref),viewportCandidateRef:g}),v=l.matchedNodes.find(e=>e.ref===l.winnerRef);return _.outcome===`verified`&&v?{verified:!0,winnerNode:v,matchCount:l.matchedNodes.length}:_.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:l.matchedNodes.length,observedNode:void 0,candidateNodes:p.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,...Xm({classification:_,matchCount:l.matchedNodes.length,winnerNode:v,identitySet:p,byIndex:u,recorded:t})}}function qm(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o,port:s}=e;return t.startsWith(`@`)?Jm(n,t,i,a):Ym(n,t,r,a,o,s)}function Jm(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?Dt(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Ym(e,t,n,r,i,a){let o=a.resolveRecordedTarget(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return o.kind===`resolved`?{matchedNodes:[...o.matchedNodes],winnerRef:o.winner.ref}:{matchedNodes:[...o.matchedNodes],winnerRef:``}}function Xm(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?Zm(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?Zm(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?Zm(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 Zm(e,t,n){let r=Nt(t),i=l(t,n,Math.max(e.ancestry.length,1)).chain;return[...d(e,r),...ee(e.ancestry,i)].slice(0,5)}function Qm(e,t){let n=e.positionals??[];if(e.command===`get`)return n[1];if(e.command===`is`){let e=t.readSelectorExpression(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!qe(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(eh(r)&&eh(n[1])))return r}function $m(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function eh(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function th(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=se(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:dh(C(n),g),...t.observed?{observed:dh(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>fh(e,g))},v=Fp({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Mp({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b=Xp({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(Pe(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 Sm({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:p})}function nh(e,t,n){let r=se(e.scrubVars);return th(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:um(n,r),publicationEvidence:oh(n),repairCapture:im(n)})}async function rh(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await om({session:t,sessionName:n,sessionStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function ih(e,t){return nh(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 rh({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function ah(e,t,n){return nh(e,t,await rh({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function oh(e){return e.state===`available`?e.evidence:void 0}function sh(e){let{action:t,resolvedAction:n,sessionName:r,sessionStore:i,port:a}=e,o=i.get(r);return o?be(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:xe(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Qm(n,a),platform:o.device.platform}:{kind:`inactive`}}function ch(e){let{recorded:t,token:n,action:r,nodes:i,platform:a,port:o}=e,s=_m(r),c=Km({recorded:t,token:n,nodes:i,platform:a,refLabel:$m(r),requireRect:s.requiresRect,allowDisambiguation:s.allowDisambiguation,port:o});return c.verified?{verified:!0,guard:{expected:{identity:Nt(c.winnerNode),structural:xt(c.winnerNode,i)},matchCount:c.matchCount}}:{verified:!1,kind:c.kind,matchCount:c.matchCount,observed:c.observedNode?Nt(c.observedNode):void 0,candidateNodes:c.candidateNodes,mismatches:c.mismatches,causeCode:c.causeCode,causeMessage:c.causeMessage}}function lh(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function uh(e){return!e.ok&&e.error.details?.reason===`wait_landmark_identity_mismatch`}function dh(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function fh(e,t){let n=fe(e.type??`Element`),r=ae(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function ph(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function mh(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 hh(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 gh(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 _h(e){return{observed:mh(e?.observed),expectedStructural:gh(e?.expectedStructural),observedStructural:gh(e?.observedStructural)}}function vh(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:mh(e?.observed),observedAncestry:hh(e?.observedAncestry)}}function yh(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function bh(e,t,n){let r=yh(e,n);return t?.kind===`target`&&lh(e)?{status:`guard-mismatch`,evidence:_h(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&uh(e)?{status:`landmark-mismatch`,evidence:vh(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function xh(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,yh(Sh(e),Lm(e)));return{runtime:{port:t.port,beginTargetVerification(e,n,r){return sh({action:e,resolvedAction:n,sessionName:t.sessionName,sessionStore:t.sessionStore,port:t.port})},async captureObservation(e,n,r){let i=t.sessionStore.get(t.sessionName),a=i?await om({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 ch({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform,port:t.port})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await jm({req:ph(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;let u=Lm(l);return u.forEach(e=>r.add(e)),l.ok?{status:`ok`,artifactPaths:u}:bh(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await ih(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=nh(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await ah(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=Sh(o),u=await Ch(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=>wh(e),onStep:i,diagnosticsMarker:()=>Eh(t.sessionStore,t.sessionName),diagnosticsSince:e=>Dh(t.sessionStore,t.sessionName,e)},readLastResponse:()=>o}}function Sh(e){return e&&!e.ok?e:z(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Ch(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Th(i)?c(i):c(await Dm({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,port:e.port}))}function wh(e){let t=e.positionals??[],n=Xf(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Th(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 Eh(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function Dh(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function Oh(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:kh(t,i)};return jh(o,`AD_PLATFORM`,a.platform??r.platform),jh(o,`AD_TARGET`,a.target??r.target),jh(o,`AD_DEVICE`,a.device),jh(o,`AD_DEVICE_ID`,Ah(a)),Mh(o,`AD_SHARD_INDEX`,a.shardIndex),Mh(o,`AD_SHARD_COUNT`,a.shardCount),jh(o,`AD_ARTIFACTS`,a.artifactsDir),o}function kh(e,t){let n=e.meta?.cwd??process.cwd();return U.relative(n,t)||t}function Ah(e){return typeof e.serial==`string`?e.serial:e.udid}function jh(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Mh(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Nh=3e4,Ph=1e3;function Fh(e){let{scriptPath:r,env:i}=e,a=W.readFileSync(r,`utf8`),o=Object.create(null);try{Yi.runInNewContext(a,Ih(i,o),{filename:r,timeout:Nh})}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 Bh(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Vh(t)]))}function Ih(e,t){return{...e,output:t,json:Lh,http:{post:(e,t)=>zh(`POST`,e,t)}}}function Lh(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,Rh)}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,Ph)},t instanceof Error?t:void 0)}}function Rh(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function zh(e,t,r){let i=zt(process.execPath,[`-e`,`
4
5
  const fs = require('node:fs');
5
6
  const input = JSON.parse(fs.readFileSync(0, 'utf8'));
6
7
  if (typeof fetch !== 'function') {
@@ -21,8 +22,8 @@ fetch(input.url, {
21
22
  console.error(error && error.stack ? error.stack : String(error));
22
23
  process.exit(1);
23
24
  });
24
- `],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??``}),timeoutMs:Jm,allowFailure:!0});if(i.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${rh(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,Ym),stderr:i.stderr.slice(0,Ym)},r instanceof Error?r:void 0)}}function th(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 nh(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function rh(e){let t=e.trim();return t.length>0?t.slice(0,Ym):`request process exited without stderr`}async function ih(e){return await ah(`tap`,async t=>{let n=U.join(t,`before.png`),r=U.join(t,`after.png`),i=await sh(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await sh(e,r)))return await oh(n,r,e.signal,`tap`)}})})}async function ah(e,t){let n=await Hi.mkdtemp(U.join(Ui.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await Hi.rm(n,{recursive:!0,force:!0})}catch{}}}async function oh(e,t,n,r){try{let[i,a]=await Promise.all([Hi.readFile(e),Hi.readFile(t)]);dh(n);let o=await Ct(i,a,`Maestro screenshot`);return dh(n),ch(o,r)}catch(e){uh(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 sh(e,t){try{return await Hi.rm(t,{force:!0}),dh(e.signal),await e.capture(t),dh(e.signal),!0}catch(t){return uh(t,e.signal),!1}}function ch(e,t){if(e.status!==`compared`)return lh(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return lh(t,n?`stable`:`changed`,e),n}function lh(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 uh(e,t){if(t?.aborted||tn(e))throw Zt()}function dh(e){if(e?.aborted)throw Zt()}async function fh(e){mh(e.timeoutMs),dh(e.signal);let t=e.now()+e.timeoutMs;return await ah(`animation`,async n=>{let r=U.join(n,`first.png`),i=U.join(n,`second.png`);for(;;){if(dh(e.signal),await ph(e,r,i))return!0;if(e.now()>=t)return!1}})}async function ph(e,t,n){let r=[await sh(e,t),await sh(e,n)];return!r[0]||!r[1]?!1:await oh(t,n,e.signal,`animation`)===!0}function mh(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const hh=q.observationPollMs;async function gh(e,t){for(;;){Q(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!Mh(n)||(Q(e.context.signal),!await Ah(e.dependencies,t,hh,e.context.signal)))throw n}}}function _h(e){return vh({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function vh(e){let t=Qn(e.snapshot),n=e.platform===`ios`?jr(e.snapshot.nodes):void 0;return Ch(Ka(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 yh(e){jh(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Q(e.context.signal);let r=await gh(e,n),i=vh({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Xi(e.condition,i))return i;if(e.dependencies.now()>=n)break;await Ah(e.dependencies,n,hh,e.context.signal)}return Q(e.context.signal),Fh(t)}async function bh(e){jh(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Q(e.context.signal);let i=r??await gh(e,t);if(r=void 0,n=vh({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),Fh(n)}async function xh(e){jh(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await gh(e,t),r=Nh(n);for(;;){Q(e.context.signal),await Ah(e.dependencies,t,hh,e.context.signal);let i=await gh(e,t),a=Nh(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function Sh(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function Ch(e,t,n,r,i,a,o){if(!e.ok){let t=Sh(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=Th({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=Sh(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:wh(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:Nh(t)}:{}}}function wh(e,t){return!gt(e)||!gt(t)?0:mt(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 Th(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!Eh(t,n,r)||i!==1))return Dh(t.selector)}function Eh(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function Dh(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!Oh(n)||typeof r!=`string`)return;let i=wi(r)?.trim();return i?{key:n,value:i}:void 0}function Oh(e){return e===`id`||e===`label`||e===`text`}async function kh(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?Zt():e}Q(n)}async function Ah(e,t,n,r){let i=t-e.now();return i<=0?!1:(await kh(e,Math.min(n,i),r),!0)}function Q(e){if(e?.aborted)throw Zt()}function jh(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function Mh(e){return e instanceof n&&e.details?.retriable===!0}function Nh(e){return Ii(`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:Ph(e.rect)})))).digest(`hex`)}function Ph(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 Fh(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function Ih(e){return Lh(e)?Rh(e):Jh(e)?Yh(e):Hh(e)}function Lh(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Rh(e){switch(e.kind){case`launchApp`:return zh(e);case`stopApp`:return Bh(e);case`openLink`:return Vh(e)}}function zh(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 Bh(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function Vh(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Hh(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Uh(e);case`clickPoint`:return Wh(e);case`swipe`:return Gh(e);case`scroll`:return Kh(e);case`pressKey`:return qh(e)}}function Uh(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Wh(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Gh(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 Kh(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function qh(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Jh(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Yh(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 Xh(e,t){let n=Ih(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=Zh(i,n.flags??{}),c=k({...a,...n.internal,...t.kind===`snapshot`?{observationOnly:!0}:{}}),l=await e.invoke(k({...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 rg(l);return l.data}function Zh(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=k({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Qh(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 $h(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 eg(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 tg(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 ng(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function rg(e){let t=e.error,r=k({...t.details??{},hint:t.hint??ig(t.details,`hint`),diagnosticId:t.diagnosticId??ig(t.details,`diagnosticId`),logPath:t.logPath??ig(t.details,`logPath`),retriable:t.retriable??ag(t.details,`retriable`),supportedOn:t.supportedOn??ig(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function ig(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function ag(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function og(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Xh(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 xh({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 sg(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 gh({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=_h({query:t,context:n,snapshot:o,platform:i.platform});if(pg(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await Ah(i.dependencies,a,hh,n.signal)}}}async function cg(e,t,n,r,i,a){let o=async()=>await dg(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await ih({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Xh(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await lg(e,t,n,r,i,a.click,o)});return}await lg(e,t,n,r,i,a.click)}async function lg(e,t,n,r,i,a,o){let s=async()=>await dg(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:Nh(await t.capture(i))),l=async()=>await xh({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await ug({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 ug(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 dg(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await mg(e,o,n.point,i);return}catch(n){if(!hg(n))throw n;let o=await sg({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!fg(o))throw n;t.invalidate(r.generation),await gg(e,_(o.rect),i);return}}t.invalidate(r.generation),await gg(e,n.point,i)}function fg(e){return e.matched&&e.visible&&e.rect!==void 0}function pg(e,t){return fg(e)?!t||e.dispatchSelector!==void 0:!1}async function mg(e,t,n,r){F({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Xh(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function hg(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function gg(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 Xh(e,{kind:`clickPoint`,point:t,options:r})}function _g(e){let t=og(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),Xh(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)=>{Et(n),await s({kind:`typeText`,text:n},r);let i=await xh({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 sg({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await yh({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=[...Qh(e.arguments),...Qh(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 cg(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>gg(e,t.target.point,k({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>gg(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 bh({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=aa(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 xh({timeoutMs:Math.min(q.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==q.scrollUntilVisiblePercentage)throw ur(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation($h(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 fh({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:eg(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Xm({scriptPath:tg(t.file,n,e.sourcePath),env:{...n.env,...t.env?ng(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r})}}function vg(e){let{operations:t,snapshots:n,readMetrics:r}=_g(e);return Za(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 yg(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),bg(()=>Cg(r,e)),bg(()=>wg(n,t,e))},actionCompleted:e=>{let r=xg(i,e.stepIndex);bg(()=>Tg(n,t,Sg(r,e),!0))},actionFailed:e=>{let r=xg(i,e.stepIndex);bg(()=>Tg(n,t,Sg(r,e),!1))}}}function bg(e){try{e()}catch{}}function xg(e,t){let n=e.get(t);return e.delete(t),n}function Sg(e,t){return k({...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 Cg(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function wg(e,t,n){Uf(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 Tg(e,t,r,i){let a=Eg(r);Uf(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 Eg(e){let t=`data`in e?e.data:void 0,n=Dg(t?.timing)?t.timing:void 0;return k({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function Dg(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Og(e,t){return oi(e,t)}function kg(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:Ng(e.action),positionals:Pg(e.action,e.value),flags:t.flags??{}}}}async function Ag(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,logPath:o}=e,s=an(r.meta?.requestId),c=kg(t,r),l=$p(e.error),u=[...t.redactions],d=D(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(i),m=p?await Lp({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?jg({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Mg(t.value)].filter(Boolean).join(` `),_=Ap({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:Vp(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:hp({kind:`action-failure`,targetEvidence:void 0,capture:Fp(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return tm({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 jg(e){let t={createdAt:Date.now(),nodes:e.nodes};return pp(Og(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>Qp({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Mg(e){return!e||e===`<text>`?e??``:zi(e)}function Ng(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Pg(e,t){return!t||e===`inputText`?[]:[t]}function Fg(e){let{outcome:t,startedAt:n,sessionName:r,sessionStore:i,snapshotStart:a}=e,o=Lg(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:zg(s,Date.now()-n)}}}async function Ig(e){let{failure:n}=e.outcome,r=t(e.outcome.error);return n?await Ag({error:r,failure:n,replayPath:A.expandHome(e.requestedPath,e.req.meta?.cwd),req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,snapshotDiagnostics:Lg(e.sessionStore,e.sessionName,e.state.snapshotStart)}):z(r.code,r.message,{...r.details??{},...Rg(n)})}function Lg(e,t,n){return je(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function Rg(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function zg(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Bg(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 Vg({...e,requestedPath:n,startedAt:r,state:i})}catch(t){return await Ig({...e,requestedPath:n,state:i,outcome:{ok:!1,error:t}})}}async function Vg(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,onStep:a,invoke:o,state:s}=e,c=await Hg(e),l=Jg({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 $r(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:yg({filePath:c.filePath,tracePath:i,onStep:a})});return u.ok?Fg({outcome:u,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:s.snapshotStart}):await Ig({...e,requestedPath:e.requestedPath,state:s,outcome:u})}async function Hg(e){let{req:t,requestedPath:n,sessionName:r,sessionStore:i}=e,a=A.expandHome(n,t.meta?.cwd),o=Vr(W.readFileSync(a,`utf8`),a),s=i.get(r);s&&Gr(s,t.flags);let c=await Ug({req:t,sessionStore:i,sessionName:r,session:s,flow:o});return{filePath:a,flow:o,...c,defaults:Kg({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:qg(t),signal:an(t.meta?.requestId)}}async function Ug(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 fn(t.flags??{},fi(a.appTarget,o))),c=$g(t,s),l=ps({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Wg({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:e_(t,s),runtimeHints:l,flow:a})}async function Wg(e){if(e.device||!Gg(e.runtimeHints))return e;let t=await fn(e.req.flags??{},fi(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:e_(e.req,t),runtimeHints:ps({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Gg(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Kg(e){return{...Um({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function qg(e){return{...Pf(Lf(e.flags?.replayShellEnv)),...Ff(If(e.flags?.replayEnv))}}function Jg(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 vg({baseReq:k({...h,flags:Yg(s,c,t.flags),runtime:l}),invoke:r,platform:c,sourcePath:u,dependencies:{now:Date.now,sleep:async(e,t)=>{await Gi(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 mn(e.device,B(i,t.flags,e.appBundleId,e.trace?.outPath))}}})}function Yg(e,t,n){if(!e)return Xg(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 Xg(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Zg(n,t):Qg(n,t)}function Zg(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Qg(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function $g(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 e_(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}function t_(e){let{sessionStore:t,sessionName:n}=e,r=()=>t.get(n);return{view(){let e=r();if(e)return{repairBoundary:Le(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){let i=r();i&&(Ae(i,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:n_(e.sourcePath),firstArm:e.firstArm}),t.set(n,i))},demoteForRerunIfArmed(){let e=r();!e||Le(e)===void 0||tt(e)},markCompleteIfArmed(){let e=r();!e||Le(e)===void 0||(Ue(e),t.set(n,e))},markSessionHeldIfArmed(e){if(e.ok||!Ve(r()))return e;let t=r_(e);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){t.clearRepairTombstone(n)},clearCorrectiveWatermarkIfExpected(e){let i=r();!i||i.pendingRecordAndHeal?.expectedFrom!==e||(o_(i),t.set(n,i))},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){let i=r();i&&(a_({session:i,...e}),t.set(n,i))}}}}function n_(e){let t=U.dirname(e),n=U.basename(e,U.extname(e));return U.join(t,`${n}.healed.ad`)}function r_(e){let t=e.error.details?.divergence;if(!(!Te(t)||!i_(t.resume)))return t.resume}function i_(e){return!Te(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function a_(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=s_({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function o_(e){e.pendingRecordAndHeal=void 0}function s_(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 c_(e){return!!(e&&e.command!==`replay`)}function l_(e){if(!(!e.keepSession&&!e.saveScript&&!e.repairActive))for(let t=e.actions.length-1;t>=0;--t){let n=e.actions[t];if(c_(n))return n.command===`close`?t:void 0}}function u_(e){let t=0;for(let n=e.entryIndex;n<e.actions.length;n+=1)n!==e.suppressedTerminalCloseIndex&&c_(e.actions[n])&&(t+=1);return t}function d_(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.size>0?{artifactPaths:[...i]}:void 0)}async function f_(e,t,n,r){let i=e.actionSourcePaths?.[n]??e.resolved,a=e.actionLines[n]??1,o=await Am({action:t,scope:e.scope,sourcePath:i,sourceLine:a,replayPath:e.resolved,step:n+1,sessionName:e.sessionName,sessionStore:e.sessionStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,artifactPaths:r,responseLevel:e.responseLevel,planActions:e.actions,planDigest:e.planDigest,signal:e.signal});if(!o.verified)return o.response;let s=o.guard,c=o.deferredLandmark,l=s?{replayTargetGuard:s.expected}:c?{replayLandmarkGuard:c}:void 0;return await p_({ctx:e,action:t,index:n,artifactPaths:r,sourcePath:i,sourceLine:a,response:await Wf({req:l?{...e.replayReq,internal:{...e.replayReq.internal,...l}}:e.replayReq,sessionName:e.sessionName,action:t,scope:e.scope,filePath:e.resolved,line:a,sourcePath:e.actionSourcePaths?.[n],step:n+1,tracePath:e.actionTracePath,invoke:e.invoke}),guard:s,deferredLandmark:c})}async function p_(e){let{ctx:t,action:n,index:r,artifactPaths:i,sourcePath:a,sourceLine:o,response:s}=e,c={action:n,scope:t.scope,failedResponse:s,sourcePath:a,sourceLine:o,replayPath:t.resolved,step:r+1,sessionName:t.sessionName,sessionStore:t.sessionStore,resumeStamper:t.coordinator.resumeStamper,logPath:t.logPath,artifactPaths:i,responseLevel:t.responseLevel,planActions:t.actions,planDigest:t.planDigest,signal:t.signal};return e.guard&&jm(s)?await Pm({...c,guard:e.guard}):e.deferredLandmark&&Fm(s)?await Im(c):s}async function m_(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=t_({sessionStore:i,sessionName:n});try{if(f=A.expandHome(l,t.meta?.cwd),Xr(f)&&t.flags?.replayBackend!==`maestro`)return z(`INVALID_ARGS`,_i(`replay`,l));if(Ar(f,t.flags?.replayBackend)===`maestro`)return d?z(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):m.view()?.repairBoundary===void 0?await Bg(e):z(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`);let s=x_({req:t,sessionName:n,sessionStore:i,tracePath:a,resolved:f,coordinator:m,keepSession:d});if(!s.ok)return s.response;let{replayReq:h,actions:g,actionLines:_,actionSourcePaths:v,planDigest:y,entryIndex:b,scope:x,actionTracePath:S,snapshotDiagnosticSamples:C,suppressedTerminalCloseIndex:w}=s.value,T=T_({req:t,entryIndex:b,sessionStore:i,sessionName:n,sourcePath:f,coordinator:m});if(!T.ok)return T.response;let E={scope:x,replayReq:h,sessionName:n,sessionStore:i,logPath:r,resolved:f,actions:g,actionLines:_,actionSourcePaths:v,planDigest:y,actionTracePath:S,responseLevel:t.meta?.responseLevel,invoke:c,signal:an(t.meta?.requestId),coordinator:m};return await h_({req:t,sessionName:n,sessionStore:i,logPath:r,resolved:f,actions:g,actionLines:_,actionSourcePaths:v,planDigest:y,entryIndex:b,scope:x,stepContext:E,artifactPaths:p,snapshotDiagnosticSamples:C,onStep:o,armSaveScript:T.armSaveScript,suppressedTerminalCloseIndex:w})||__({startedAt:u,sessionName:n,sessionStore:i,actions:g,entryIndex:b,artifactPaths:p,snapshotDiagnosticSamples:C,armSaveScript:T.armSaveScript,coordinator:m,keepSession:d,suppressedTerminalCloseIndex:w})}catch(e){let t=s(e);return z(t.code,t.message,p.size>0?{artifactPaths:[...p]}:void 0)}}async function h_(e){let{sessionName:t,sessionStore:n,actions:r,entryIndex:i,stepContext:a,artifactPaths:o,snapshotDiagnosticSamples:s,onStep:c,armSaveScript:l,suppressedTerminalCloseIndex:u}=e;for(let d=i;d<r.length;d+=1){let i=r[d];if(!c_(i)||(l(),d===u))continue;c?.(v_(d,r.length,i));let f=F_(n,t),p=await f_(a,i,d,[...o]);if(s.push(...I_(n,t,f)),Xf(p).forEach(e=>o.add(e)),!p.ok)return await g_(e,i,d,p)}}async function g_(e,t,n,r){let i=t=>e.stepContext.coordinator.markSessionHeldIfArmed(t);return P_(r)?i(r):i(await am({response:r,action:t,index:n,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[n]??e.resolved,sourceLine:e.actionLines[n]??1,artifactPaths:[...e.artifactPaths],snapshotDiagnosticSamples:e.snapshotDiagnosticSamples,scope:e.scope,req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,resumeStamper:e.stepContext.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function __(e){let{startedAt:t,sessionName:n,sessionStore:r,actions:i,entryIndex:a,artifactPaths:o,snapshotDiagnosticSamples:s,armSaveScript:c,coordinator:l,keepSession:u,suppressedTerminalCloseIndex:d}=e;c(),l.markCompleteIfArmed();let f=r.get(n),p=d_({keepSession:u,sessionName:n,completedSession:f,artifactPaths:o});if(p)return p;let m=u_({actions:i,entryIndex:a,suppressedTerminalCloseIndex:d}),h=je(s);return{ok:!0,data:{replayed:m,healed:0,session:n,sessionActive:f!==void 0,artifactPaths:[...o],...h?{snapshotDiagnostics:h}:{},message:N_(m,Date.now()-t)}}}function v_(e,t,n){return{index:e+1,total:t,command:n.command,...y_(n)}}function y_(e){let t=e.positionals??[],n=b_(t[0]);return n?{value:n}:t.length===0?{}:{value:t.join(` `)}}function b_(e){if(!e)return;let t=xe(e);if(!t)return;let n=t.selectors.flatMap(e=>e.terms.flatMap(e=>(e.key===`label`||e.key===`text`||e.key===`id`)&&typeof e.value==`string`?[e.value]:[]));if(n.length===0)return;let r=n[0];return r&&n.every(e=>e===r)?r:void 0}function x_(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,coordinator:o,keepSession:s}=e,c=S_(a,t);if(!c.ok)return c;let{metadata:l,actions:u,actionLines:d,actionSourcePaths:f}=c.value,p=C_({...t,flags:Dr(t.flags,u)},l),m=Df({actions:u,actionLines:d,actionSourcePaths:f,metadata:lm(p.flags)}),h=r.get(n),g=um(t.flags,u.length,m,o.view()?.pendingRecordAndHeal,h?.actions.length??0);return g.ok?{ok:!0,value:{replayReq:p,actions:u,actionLines:d,actionSourcePaths:f,planDigest:m,preEntrySession:h,entryIndex:g.value,scope:w_({req:t,replayReq:p,sessionName:n,resolved:a,metadata:l}),actionTracePath:i??h?.trace?.outPath,snapshotDiagnosticSamples:[],suppressedTerminalCloseIndex:l_({actions:u,keepSession:s,saveScript:t.flags?.saveScript,repairActive:o.view()?.repairBoundary!==void 0})}}:g}function S_(e,t){let n=W.readFileSync(e,`utf8`),r=n.trimStart()[0];return r!==`{`&&r!==`[`?{ok:!0,value:Fr(n,t.flags)}:{ok:!1,response:z(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`)}}function C_(e,t){return!t.platform&&!t.target?e:{...e,flags:cm(e.flags,t)}}function w_(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return Nf({builtins:Um({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Pf(Lf(t.flags?.replayShellEnv)),cliEnv:Ff(If(t.flags?.replayEnv))})}function T_(e){let{req:t,entryIndex:n,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}=e,s=E_({entryIndex:n,sessionStore:r,sessionName:i,coordinator:o});return s?{ok:!1,response:s}:(k_({req:t,coordinator:o}),O_({req:t,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}))}function E_(e){let t=A_(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return un()}function D_(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.`):j_({saveScript:t,liveForce:n,persistedForce:qe(r)||void 0,sourcePath:i,existingSaveScriptPath:et(r)})}function O_(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i,coordinator:a}=e,o=n.get(r),{saveScript:s,force:c}=t.flags??{},l=D_({saveScript:s,force:c,preRunState:o?.scriptPublication??Qe,sourcePath:i});return l?{ok:!1,response:l}:(a.demoteForRerunIfArmed(),{ok:!0,armSaveScript:M_({saveScript:s,force:c,coordinator:a,sourcePath:i})})}function k_(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function A_(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 j_(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?$e(t):a??n_(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 M_(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}}function N_(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function P_(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 F_(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function I_(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}const L_=/[*?[\]{}]/;function R_(e){let t=e.replayBackend===`maestro`?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`]),n=[],r=[];for(let i of e.inputs){let a=z_(i,e.cwd,t);if(a.source===`file`){n.push(...a.paths);continue}r.push(a.source===`directory`?W_(a.paths):H_(a.paths))}return W_([...n,...r.flat()])}function z_(e,t,r){let i=A.expandHome(e,t);if(W.existsSync(i)){let t=W.statSync(i);return t.isDirectory()?{paths:V_(i,r),source:`directory`}:t.isFile()?(B_(e,i,r),{paths:[i],source:`file`}):{paths:[],source:`file`}}if(!G_(e)&&!G_(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())&&K_(e))}}function B_(e,t,r){if(!r.has(U.extname(t).toLowerCase()))throw Xr(t)&&!r.has(`.yaml`)?new n(`INVALID_ARGS`,_i(`test`,e)):new n(`INVALID_ARGS`,`test does not support this file type: ${e}`)}function V_(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(...V_(r,t)):i.isFile()&&t.has(U.extname(i.name).toLowerCase())&&n.push(r)}}finally{r.closeSync()}return n}function H_(e){return e.map(e=>U.normalize(e)).sort((e,t)=>{let n=U_(e)-U_(t);return n===0?e.localeCompare(t):n})}function U_(e){return+(U.extname(e).toLowerCase()===`.ad`)}function W_(e){return[...new Set(e.map(e=>U.normalize(e)))]}function G_(e){return L_.test(e)}function K_(e){try{return W.statSync(e).isFile()}catch{return!1}}function q_(e){return({inputs:t,cwd:n})=>R_({inputs:t,cwd:n??process.cwd(),replayBackend:e}).map(t=>J_(t,e))}function J_(e,t){let n=W.readFileSync(e,`utf8`),r=Ar(e,t)===`maestro`,i=Vi(n);return{path:e,manifest:{...r?{title:Vr(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 Y_(e){return async t=>(await Q_(e,t)).map(X_)}function X_(e){if(e.platform===`web`||!st(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 Z_(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 Q_(e,t){let r=nv(e),i=ev(await pn($_(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${tv(t)}, but only ${i.length} matched`);return i.slice(0,t)}function $_(e){let t=zt(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:at({simulatorSetPath:Bt(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function ev(e,t,n){return t.length>0?rv(e,t,n):e.filter(e=>iv(e,n)).sort(sv)}function tv(e){return`${e} device${e===1?``:`s`}`}function nv(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function rv(e,t,r){return t.map(t=>{let i=ov(t),a=e.find(e=>av(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 iv(e,t){return!av(e,t)||!st(e)?!1:e.booted!==!1}function av(e,t){return!(!ct(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function ov(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function sv(e,t){return e.id.localeCompare(t.id)}function cv(e){let t=lv(e?.shardAll,`--shard-all`),r=lv(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 lv(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 uv=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function dv(e){let t=fv(e);return t?pv(t.details)||mv(t.code,t.message):!1}function fv(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function pv(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?Vt(t):!1}function mv(e,t){let n=`${e}\n${t}`.toLowerCase();return uv.some(e=>n.includes(e))}function hv(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:vv(e.error.details?.artifactPaths),infrastructure:dv(e),...yv(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:_v(t?.warnings),artifactPaths:vv(t?.artifactPaths),...yv(t?.snapshotDiagnostics)}}function gv(e){if(!e||e.ok)return;let t=hv(e);return t.status===`failed`?t:void 0}function _v(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function vv(e){return[...new Set(_v(e))]}function yv(e){let t=Je(e);return t?{snapshotDiagnostics:t}:{}}const bv=1e3,xv=3e3;function Sv(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Cv(e)}}async function Cv(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=Ze(s.device.platform),l=a?U.join(a,`recording${c}`):Ye(s.device.platform);Tv(o,{type:`video_recording_start`,session:n,videoPath:l}),F({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let u=await Tr({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 Tv(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:u.error.code}),u;let d=Date.now();return await jt(bv),Tv(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-d,requestedDurationMs:bv}),F({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-d,data:{session:n,requestedDurationMs:bv}}),u}async function wv(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;Tv(o,{type:`video_tail_start`,session:n,requestedDurationMs:xv});let s=Date.now();await jt(xv);let c=Date.now(),l=await Tr({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return Xf(l).forEach(e=>a.add(e)),Tv(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 Tv(e,t){e({...t,ts:new Date().toISOString()})}const Ev=[{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.`}],Dv=({attemptId:e,parentAttemptId:t})=>{$t(e);let n=Ov(e,t);return{cancel:()=>nn(e),release:()=>{n(),on(e)}}};function Ov(e,t){if(!t||t===e)return()=>{};let n=an(t);if(!n)return()=>{};let r=()=>{nn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function kv(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=Av(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:Z_({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function Av(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function jv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;if(t.command===`replay`)return await m_({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o});if(t.command===`test`){let e=t.flags??{};for(let t of Ev)if(t.requested(e))return z(`INVALID_ARGS`,t.message);let c;try{c=Mv(t,n)}catch(e){let t=s(e);return z(t.code,t.message)}let l=await uf({request:c,emitProgress:Qt,isCanceled:()=>en(t.meta?.requestId),emitDiagnostic:F,bindAttemptCancellation:Dv,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&&Xf(e).forEach(e=>u.add(e)),e),g=kv({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=Sv(_);return hv(await m_({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 Cv(_);return t&&!t.ok?t:h(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o,appendTimingEvent:s})=>gv(await wv({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,appendTimingEvent:s,artifactPaths:n})),discoverSources:q_(t.flags?.replayBackend),resolveShardTargets:Y_(t.flags),cleanupSession:async e=>{i.get(e)&&await Pc({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 Mv(e,t){let n=e.flags??{},r=e.meta?.cwd,i=Pv(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:A.expandHome(i,r),failFast:n.failFast===!0,retries:Nv(n.retries),timeoutMs:Nv(n.timeoutMs),shard:cv(n)}}function Nv(e){return typeof e==`number`?e:void 0}function Pv(e){return typeof e==`string`?e:void 0}function Fv(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==w.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return zv(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return zv(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=Rv(a);if(o)return zv(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return zv(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));nt(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:We(a,t.flags?.force),publication:`active`});return c.written?(Oe(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...O(`Published script: ${c.path}`)}}):zv(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 Iv(e){if(Fe(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Ke(e)&&e.recordSession?void 0:`not-armed`}const Lv={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 Rv(e){let t=Iv(e);return t?Lv[t]():void 0}function zv(e){return{ok:!1,error:t(e)}}function Bv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Vv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Hv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Uv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Qt({type:`command`,status:`progress`,message:Wv(t)})}function Wv(e){return[ue(e),...se(e)].join(`
25
- `)}const Gv=2e3;async function Kv(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=Ot(n,a);i&&$(e,await Qv(o,n.id,r)),$(e,await qv(o,n))}async function qv(e,t){try{let n=await Wt(e),r=qt(t);return n===await Jv()&&!r?await Yv(e,t,n):Xv(t,n,r)}catch(e){return Zv(e)}}async function Jv(){try{return(await Gt()).manifest.serviceComponent}catch{return}}async function Yv(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,Jt.previousIme],{allowFailure:!0,timeoutMs:Gv})).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 Xv(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 Zv(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 Qv(e,n,r){try{let t=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:Gv}),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 $v(e,n){let{device:r,targetApp:i,session:a}=n;if(i)try{let t=await ey(r,i);if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${M(r)}.`,evidence:{requested:i,platform:M(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 ${M(r)} --all`,evidence:{code:i.code,message:i.message}})}}async function ey(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return ty(t,(await n(e,`all`)).map(e=>({id:e.package,name:e.name})))?.id}if(P(e)||j(e)){let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return ty(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function ty(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 ny(e,n,r){let i=iy(n,r);try{let t=await oy(i),n=ay(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:uy(n,i,t.failures),hint:n.length===0?py(t.failures):void 0,command:n.length===0?vy(i):void 0,evidence:yy(n,t.failures)}),n.length>0&&sy(e,t.failures),{devices:n,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 ry(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:M(e),id:e.id,name:e.name}))}})}function iy(e,t){let n=e.flags??{};return hn({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 ay(e,t){return e.filter(e=>lt(e,t,{includeExplicitSelectors:!0}))}async function oy(e){if(e.platform)return{devices:await pn(e),failures:[]};let t=[],n=[];for(let r of St)try{t.push(...await pn({...e,platform:r}))}catch(e){n.push(ly(r,e))}return{devices:t,failures:n}}function sy(e,t){for(let n of t)$(e,cy(n))}function cy(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${gy(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${gy(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function ly(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function uy(e,t,n){if(e.length===0)return n.length>0?`No ${dy(t)} devices found; ${fy(n)}.`:`No ${dy(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${dy(t)} ${_y(e.length,`device`)} available; ${r} booted`,a=my(e,t);return a?`${i} (${a}).`:`${i}.`}function dy(e){let t=e.platform?gy(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function fy(e){return e.slice(0,2).map(e=>`${gy(e.platform)} inventory failed: ${e.message}`).join(`; `)}function py(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function my(e,t){if(t.platform||t.target)return;let n=yt(e),r=hy();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 hy(){return{android:`Android`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function gy(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function _y(e,t){return e===1?t:`${t}s`}function vy(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function yy(e,t){let n=new Map;for(let t of e){let e=M(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const by=1500;async function xy(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await Sy(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Cy(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function Sy(e,t,n){try{return await(n.resolveProcessInfo??wy)(e,t)}catch{return}}function Cy(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function wy(e,t){if(!Ty(e))return;let n=await Ey(t);if(n!==void 0)return{pid:n,cwd:await Dy(n)}}function Ty(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Ey(e){let t=await kt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:by});if(t.exitCode===0)return t.stdout.split(`
26
- `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Dy(e){let t=await kt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:by});if(t.exitCode===0)return t.stdout.split(`
27
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Oy=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],ky=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Ay(e,t){let n=Nt(e.meta?.cwd);return{targetApp:Fy(e.flags?.targetApp)??t?.appBundleId,metroHost:Fy(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Iy(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Ny(e,n)}}function jy(e,t={}){let n=Py(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function My(e,t,n,r={}){let i=n?e.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 ${M(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 Ny(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Py(e){let t={...Object.fromEntries([...Oy,...ky].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function Fy(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Iy(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}const Ly=3e3;async function Ry(e,t){if(t===`android`){$(e,await By());return}if(t===`vega`){$(e,await zy());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await Gy())}async function zy(){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:Ly}),i=await n.listDevices({allowFailure:!0,timeoutMs:Ly}),a=Qy(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 By(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await Xy(e),n=await Zy(`adb`,[`version`]);return n?Vy({license:t,sdkRoot:e,versionLine:n}):Wy(e,t)}function Vy(e){return{id:`toolchain`,status:Hy(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${Uy(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 Hy(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function Uy(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function Wy(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 Gy(){let e=await Zy(`xcodebuild`,[`-version`]);return e?Ky({selectedPath:await Zy(`xcode-select`,[`-p`]),versionLine:e}):Yy()}function Ky(e){return{id:`toolchain`,status:qy(e),summary:Jy(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function qy(e){return e.versionLine?`pass`:`info`}function Jy(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 Yy(){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 Xy(e){if(!e)return`unknown`;try{return await Wi(U.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function Zy(e,t){try{let n=await kt(e,t,{allowFailure:!0,timeoutMs:Ly});return n.exitCode===0?Qy(n.stdout):void 0}catch{return}}function Qy(e){return e.split(`
28
- `).map(e=>e.trim()).find(Boolean)}async function $y(e,t){$(e,await eb(t))}async function eb(e){let t=Mn({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 Nn(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 tb(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==g.doctor)return null;let a=r.get(n),o=Ay(t,a),s=ib(r,n),c=[];if(Uv(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${At()} using ${s}`,evidence:{version:At(),stateDir:s}},...jy(t,{required:o.remote}),...My(r,n,a,{remote:o.remote})),o.remote)return sb(c,o);let l=await ny(c,t,a);await Ry(c,a?.device.platform??l?.platform);let u=await ab({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await rb(c,u??nb(l)),sb(c,o,{device:u,includeMetro:!0,inventory:l})}function nb(e){let t=(e?.devices??[]).filter(e=>P(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function rb(e,t){if(!(!t||!P(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||L(t))){if(Qt({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await sn(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}kn(t,{}),Qt({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 ib(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function ab(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??ry(t,n,r.targetApp);return s&&await ob(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await xy(r.metroHost,r.metroPort,r.kind)),await $y(t,o),s}async function ob(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await $v(e,{device:r,session:a,targetApp:i.targetApp}),await Kv(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function sb(e,t,n={}){let r=Bv(e);return{ok:!0,data:{status:r,summary:Vv(r),kind:t.kind,platform:n.device?M(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:Hv(e)}}}async function cb(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(g.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s,ensureReady:!0}),u=R(g.prepare,l);if(u)return u;let d=Date.now(),f=await On(l,lb(t,o,r,d));return{ok:!0,data:db(a,l,Math.max(0,Date.now()-d),f)}}function lb(e,t,n,r){let i=ub(e);return{...hi({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:Ht.fromTimeoutMs(i,r),startupTimeoutMs:i}}function ub(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:_e}function db(e,t,n,r){return{action:e,platform:M(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:fb(n,r),message:`Prepared Apple runner: ${t.name}`}}function fb(e,t){let n=pb(t.buildMs),r=mb(t.connectMs),i=mb(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 pb(e){return e===void 0?void 0:mb(e)}function mb(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function hb(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&&kr(t)===`may-invalidate`&&Yn(l);let m=await gn(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;zr(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function gb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=Y(g.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(g.clipboard,l);if(u)return u;let d=await gn(l,g.clipboard,t.positionals??[],t.flags?.out,{...B(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return zr(i,a,t,t.command,d??{}),{ok:!0,data:{platform:M(l),...d??{}}}}const _b=async({req:e,sessionName:t,sessionStore:n})=>await Yc({req:e,sessionName:t,sessionStore:n}),vb=async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await rl({req:e,sessionName:t,logPath:n,sessionStore:r}),yb=async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await Yu({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),bb=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:a,invokeReplayAction:o})=>await jv({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:o??a});async function xb(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 hb({req:t,sessionName:n,logPath:r,sessionStore:i,command:g.keyboard,positionals:t.positionals??[]})}async function Sb(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 hb({req:t,sessionName:n,logPath:r,sessionStore:i,command:g.push,positionals:[a,Eb(o,t.meta?.cwd)],recordPositionals:[a,o]})}async function Cb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;return await hb({req:t,sessionName:n,logPath:r,sessionStore:i,command:g.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await Vs(e.device,n,e.appBundleId,Rs)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}const wb={session_list:_b,devices:_b,capabilities:_b,apps:_b,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await tb({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),boot:vb,shutdown:vb,appstate:vb,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Fv({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,sessionStore:n})=>await gs({req:e,sessionName:t,sessionStore:n}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await gb({req:e,sessionName:t,logPath:n,sessionStore:r}),keyboard:xb,perf:yb,logs:yb,events:yb,network:yb,audio:yb,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await cb({req:e,sessionName:t,logPath:n,sessionStore:r}),install:async({req:e,sessionName:t,sessionStore:n})=>await Uc({req:e,command:`install`,sessionName:t,sessionStore:n,deployOps:Hc}),reinstall:async({req:e,sessionName:t,sessionStore:n})=>await Uc({req:e,command:`reinstall`,sessionName:t,sessionStore:n,deployOps:Vc}),install_source:async({req:e,sessionName:t,sessionStore:n})=>await so({req:e,sessionName:t,sessionStore:n}),release_materialized_paths:async({req:e})=>await _o({req:e}),push:Sb,"trigger-app-event":Cb,open:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await dc({req:e,sessionName:t,logPath:n,sessionStore:r}),replay:bb,test:bb,batch:async({req:e,sessionName:t,invoke:n})=>await Jc(e,t,n),close:async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})=>await Pc({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})};async function Tb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Br,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}=e,u=wb[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 Eb(e,t){let n=cn(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{Tb as handleSessionCommands};
25
+ `],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??``}),timeoutMs:Nh,allowFailure:!0});if(i.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Hh(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,Ph),stderr:i.stderr.slice(0,Ph)},r instanceof Error?r:void 0)}}function Bh(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 Vh(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Hh(e){let t=e.trim();return t.length>0?t.slice(0,Ph):`request process exited without stderr`}async function Uh(e){return await Wh(`tap`,async t=>{let n=U.join(t,`before.png`),r=U.join(t,`after.png`),i=await Kh(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Kh(e,r)))return await Gh(n,r,e.signal,`tap`)}})})}async function Wh(e,t){let n=await Gi.mkdtemp(U.join(Ki.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await Gi.rm(n,{recursive:!0,force:!0})}catch{}}}async function Gh(e,t,n,r){try{let[i,a]=await Promise.all([Gi.readFile(e),Gi.readFile(t)]);Xh(n);let o=await Rt(i,a,`Maestro screenshot`);return Xh(n),qh(o,r)}catch(e){Yh(e,n),P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Kh(e,t){try{return await Gi.rm(t,{force:!0}),Xh(e.signal),await e.capture(t),Xh(e.signal),!0}catch(t){return Yh(t,e.signal),!1}}function qh(e,t){if(e.status!==`compared`)return Jh(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return Jh(t,n?`stable`:`changed`,e),n}function Jh(e,t,n){P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Yh(e,t){if(t?.aborted||_n(e))throw pn()}function Xh(e){if(e?.aborted)throw pn()}async function Zh(e){$h(e.timeoutMs),Xh(e.signal);let t=e.now()+e.timeoutMs;return await Wh(`animation`,async n=>{let r=U.join(n,`first.png`),i=U.join(n,`second.png`);for(;;){if(Xh(e.signal),await Qh(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Qh(e,t,n){let r=[await Kh(e,t),await Kh(e,n)];return!r[0]||!r[1]?!1:await Gh(t,n,e.signal,`animation`)===!0}function $h(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const eg=q.observationPollMs;async function tg(e,t){for(;;){Q(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!_g(n)||(Q(e.context.signal),!await hg(e.dependencies,t,eg,e.context.signal)))throw n}}}function ng(e){return rg({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function rg(e){let t=lr(e.snapshot),n=e.platform===`ios`?Yn(e.snapshot.nodes):void 0;return cg(fo(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 ig(e){gg(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Q(e.context.signal);let r=await tg(e,n),i=rg({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ha(e.condition,i))return i;if(e.dependencies.now()>=n)break;await hg(e.dependencies,n,eg,e.context.signal)}return Q(e.context.signal),bg(t)}async function ag(e){gg(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Q(e.context.signal);let i=r??await tg(e,t);if(r=void 0,n=rg({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),bg(n)}async function og(e){gg(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await tg(e,t),r=vg(n);for(;;){Q(e.context.signal),await hg(e.dependencies,t,eg,e.context.signal);let i=await tg(e,t),a=vg(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function sg(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function cg(e,t,n,r,i,a,o){if(!e.ok){let t=sg(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=ug({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=sg(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:lg(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:vg(t)}:{}}}function lg(e,t){return!St(e)||!St(t)?0:wt(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 ug(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!dg(t,n,r)||i!==1))return fg(t.selector)}function dg(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function fg(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!pg(n)||typeof r!=`string`)return;let i=zr(r)?.trim();return i?{key:n,value:i}:void 0}function pg(e){return e===`id`||e===`label`||e===`text`}async function mg(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?pn():e}Q(n)}async function hg(e,t,n,r){let i=t-e.now();return i<=0?!1:(await mg(e,Math.min(n,i),r),!0)}function Q(e){if(e?.aborted)throw pn()}function gg(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function _g(e){return e instanceof n&&e.details?.retriable===!0}function vg(e){return Wi(`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:yg(e.rect)})))).digest(`hex`)}function yg(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 bg(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function xg(e){return Sg(e)?Cg(e):Ng(e)?Pg(e):Dg(e)}function Sg(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Cg(e){switch(e.kind){case`launchApp`:return wg(e);case`stopApp`:return Tg(e);case`openLink`:return Eg(e)}}function wg(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 Tg(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function Eg(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Dg(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Og(e);case`clickPoint`:return kg(e);case`swipe`:return Ag(e);case`scroll`:return jg(e);case`pressKey`:return Mg(e)}}function Og(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function kg(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Ag(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 jg(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Mg(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Ng(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Pg(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 Fg(e,t){let n=xg(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=Ig(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 Hg(l);return l.data}function Ig(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 Lg(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 Rg(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 zg(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 Bg(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 Vg(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Hg(e){let t=e.error,r=O({...t.details??{},hint:t.hint??Ug(t.details,`hint`),diagnosticId:t.diagnosticId??Ug(t.details,`diagnosticId`),logPath:t.logPath??Ug(t.details,`logPath`),retriable:t.retriable??Wg(t.details,`retriable`),supportedOn:t.supportedOn??Ug(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function Ug(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Wg(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Gg(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Fg(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 og({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 Kg(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 tg({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=ng({query:t,context:n,snapshot:o,platform:i.platform});if(Qg(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await hg(i.dependencies,a,eg,n.signal)}}}async function qg(e,t,n,r,i,a){let o=async()=>await Xg(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Uh({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Fg(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await Jg(e,t,n,r,i,a.click,o)});return}await Jg(e,t,n,r,i,a.click)}async function Jg(e,t,n,r,i,a,o){let s=async()=>await Xg(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:vg(await t.capture(i))),l=async()=>await og({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await Yg({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 Yg(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 Xg(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await $g(e,o,n.point,i);return}catch(n){if(!e_(n))throw n;let o=await Kg({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Zg(o))throw n;t.invalidate(r.generation),await t_(e,te(o.rect),i);return}}t.invalidate(r.generation),await t_(e,n.point,i)}function Zg(e){return e.matched&&e.visible&&e.rect!==void 0}function Qg(e,t){return Zg(e)?!t||e.dispatchSelector!==void 0:!1}async function $g(e,t,n,r){P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Fg(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function e_(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function t_(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Fg(e,{kind:`clickPoint`,point:t,options:r})}function n_(e){let t=Gg(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),Fg(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)=>{Vt(n),await s({kind:`typeText`,text:n},r);let i=await og({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 Kg({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await ig({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=[...Lg(e.arguments),...Lg(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 qg(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>t_(e,t.target.point,O({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>t_(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 ag({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 og({timeoutMs:Math.min(q.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==q.scrollUntilVisiblePercentage)throw Li(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Rg(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 Zh({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:zg(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Fh({scriptPath:Bg(t.file,n,e.sourcePath),env:{...n.env,...t.env?Vg(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r})}}function r_(e){let{operations:t,snapshots:n,readMetrics:r}=n_(e);return _o(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 i_(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),a_(()=>c_(r,e)),a_(()=>l_(n,t,e))},actionCompleted:e=>{let r=o_(i,e.stepIndex);a_(()=>u_(n,t,s_(r,e),!0))},actionFailed:e=>{let r=o_(i,e.stepIndex);a_(()=>u_(n,t,s_(r,e),!1))}}}function a_(e){try{e()}catch{}}function o_(e,t){let n=e.get(t);return e.delete(t),n}function s_(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 c_(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function l_(e,t,n){Am(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 u_(e,t,r,i){let a=d_(r);Am(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 d_(e){let t=`data`in e?e.data:void 0,n=f_(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 f_(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function p_(e,t){return Yr(e,t)}function m_(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:v_(e.action),positionals:y_(e.action,e.value),flags:t.flags??{}}}}async function h_(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,logPath:o}=e,s=bn(r.meta?.requestId),c=m_(t,r),l=xm(e.error),u=[...t.redactions],d=se(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(i),m=p?await om({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?g_({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,__(t.value)].filter(Boolean).join(` `),_=Xp({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:um(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Fp({kind:`action-failure`,targetEvidence:void 0,capture:im(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return Cm({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 g_(e){let t=Wf(),n={createdAt:Date.now(),nodes:e.nodes};return tm(p_(e.failure,n).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:n,basis:r})=>bm({node:n,nodes:e.nodes,session:e.session,action:e.action,basis:r,sanitize:e.sanitize,port:t}))}function __(e){return!e||e===`<text>`?e??``:ut(e)}function v_(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function y_(e,t){return!t||e===`inputText`?[]:[t]}function b_(e){let{outcome:t,startedAt:n,sessionName:r,sessionStore:i,snapshotStart:a}=e,o=S_(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:w_(s,Date.now()-n)}}}async function x_(e){let{failure:n}=e.outcome,r=t(e.outcome.error);return n?await h_({error:r,failure:n,replayPath:k.expandHome(e.requestedPath,e.req.meta?.cwd),req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,snapshotDiagnostics:S_(e.sessionStore,e.sessionName,e.state.snapshotStart)}):z(r.code,r.message,{...r.details??{},...C_(n)})}function S_(e,t,n){return Me(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function C_(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function w_(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function T_(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 E_({...e,requestedPath:n,startedAt:r,state:i})}catch(t){return await x_({...e,requestedPath:n,state:i,outcome:{ok:!1,error:t}})}}async function E_(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,onStep:a,invoke:o,state:s}=e,c=await D_(e),l=N_({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 bi(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:i_({filePath:c.filePath,tracePath:i,onStep:a})});return u.ok?b_({outcome:u,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:s.snapshotStart}):await x_({...e,requestedPath:e.requestedPath,state:s,outcome:u})}async function D_(e){let{req:t,requestedPath:n,sessionName:r,sessionStore:i}=e,a=k.expandHome(n,t.meta?.cwd),o=fi(W.readFileSync(a,`utf8`),a),s=i.get(r);s&&Zn(s,t.flags);let c=await O_({req:t,sessionStore:i,sessionName:r,session:s,flow:o});return{filePath:a,flow:o,...c,defaults:j_({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:M_(t),signal:bn(t.meta?.requestId)}}async function O_(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 Dn(t.flags??{},Di(a.appTarget,o))),c=R_(t,s),l=Ms({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await k_({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:z_(t,s),runtimeHints:l,flow:a})}async function k_(e){if(e.device||!A_(e.runtimeHints))return e;let t=await Dn(e.req.flags??{},Di(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:z_(e.req,t),runtimeHints:Ms({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function A_(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function j_(e){return{...Oh({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function M_(e){return{...$i(na(e.flags?.replayShellEnv)),...ea(ta(e.flags?.replayEnv))}}function N_(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 r_({baseReq:O({...h,flags:P_(s,c,t.flags),runtime:l}),invoke:r,platform:c,sourcePath:u,dependencies:{now:Date.now,sleep:async(e,t)=>{await Ji(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 kn(e.device,B(i,t.flags,e.appBundleId,e.trace?.outPath))}}})}function P_(e,t,n){if(!e)return F_(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 F_(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?I_(n,t):L_(n,t)}function I_(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function L_(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function R_(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 z_(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function B_(e){let{resolved:t,req:n,keepSession:r,coordinator:i,maestroParams:a}=e;if(Gr(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 T_(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 V_(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,coordinator:o}=e,s=H_(t);if(s)return{ok:!1,response:s};let{manifest:c,replayReq:l}=U_(t,a),{metadata:u,actions:d,actionLines:f,actionSourcePaths:p,planDigest:m}=c,h=r.get(n),g=W_({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:K_({req:t,replayReq:l,sessionName:n,resolved:a,metadata:u}),actionTracePath:i??h?.trace?.outPath}}:{ok:!1,response:g.response}}function H_(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return z(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function U_(e,t){let n=sp(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:G_({...e,flags:Hr(e.flags,n.actions)},n.metadata)}}function W_(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 G_(e,t){return!t.platform&&!t.target?e:{...e,flags:q_(e.flags,t)}}function K_(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Oh({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:$i(na(t.flags?.replayShellEnv)),cliEnv:ea(ta(t.flags?.replayEnv))}}function q_(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 J_(e){let{req:t,entryIndex:n,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}=e,s=Y_({entryIndex:n,sessionStore:r,sessionName:i,coordinator:o});return s?{ok:!1,response:s}:(Q_({req:t,coordinator:o}),Z_({req:t,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}))}function Y_(e){let t=$_(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return Tn()}function X_(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.`):ev({saveScript:t,liveForce:n,persistedForce:et(r)||void 0,sourcePath:i,existingSaveScriptPath:st(r)})}function Z_(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i,coordinator:a}=e,o=n.get(r),{saveScript:s,force:c}=t.flags??{},l=X_({saveScript:s,force:c,preRunState:o?.scriptPublication??at,sourcePath:i});return l?{ok:!1,response:l}:(a.demoteForRerunIfArmed(),{ok:!0,armSaveScript:tv({saveScript:s,force:c,coordinator:a,sourcePath:i})})}function Q_(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function $_(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 ev(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?ot(t):a??Sp(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 tv(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 nv(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=xp({sessionStore:i,sessionName:n}),h=Wf();try{if(f=k.expandHome(l,t.meta?.cwd),li(f)&&t.flags?.replayBackend!==`maestro`)return z(`INVALID_ARGS`,Mi(`replay`,l));let s=await B_({resolved:f,req:t,keepSession:d,coordinator:m,maestroParams:e});if(s)return s;let g=V_({req:t,sessionName:n,sessionStore:i,tracePath:a,resolved:f,coordinator:m});if(!g.ok)return g.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=g.value,T=J_({req:t,entryIndex:S,sessionStore:i,sessionName:n,sourcePath:f,coordinator:m});if(!T.ok)return T.response;let{runtime:ee,readLastResponse:te}=xh({ctx:{replayReq:_,sessionName:n,sessionStore:i,logPath:r,resolved:f,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:c,signal:bn(t.meta?.requestId),coordinator:m,port:h},req:t,artifactPaths:p,onStep:o,armSaveScript:T.armSaveScript}),E=await gp({actions:v,entryIndex:S,keepSession:d,actionLines:y,actionSourcePaths:b,resolvedPath:f,varSources:C},ee);return E.status===`failed`?te()??z(`COMMAND_FAILED`,`replay step failed with no recorded response`):rv({startedAt:u,sessionName:n,sessionStore:i,replayed:E.replayed,artifactPaths:E.artifactPaths,snapshotDiagnosticSamples:E.snapshotDiagnosticSamples,armSaveScript:T.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 rv(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=av({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=Me([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:iv(i,Date.now()-t)}}}function iv(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function av(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 ov=/[*?[\]{}]/;function sv(e){let t=e.replayBackend===`maestro`?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`]),n=[],r=[];for(let i of e.inputs){let a=cv(i,e.cwd,t);if(a.source===`file`){n.push(...a.paths);continue}r.push(a.source===`directory`?pv(a.paths):dv(a.paths))}return pv([...n,...r.flat()])}function cv(e,t,r){let i=k.expandHome(e,t);if(W.existsSync(i)){let t=W.statSync(i);return t.isDirectory()?{paths:uv(i,r),source:`directory`}:t.isFile()?(lv(e,i,r),{paths:[i],source:`file`}):{paths:[],source:`file`}}if(!mv(e)&&!mv(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())&&hv(e))}}function lv(e,t,r){if(!r.has(U.extname(t).toLowerCase()))throw li(t)&&!r.has(`.yaml`)?new n(`INVALID_ARGS`,Mi(`test`,e)):new n(`INVALID_ARGS`,`test does not support this file type: ${e}`)}function uv(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(...uv(r,t)):i.isFile()&&t.has(U.extname(i.name).toLowerCase())&&n.push(r)}}finally{r.closeSync()}return n}function dv(e){return e.map(e=>U.normalize(e)).sort((e,t)=>{let n=fv(e)-fv(t);return n===0?e.localeCompare(t):n})}function fv(e){return+(U.extname(e).toLowerCase()===`.ad`)}function pv(e){return[...new Set(e.map(e=>U.normalize(e)))]}function mv(e){return ov.test(e)}function hv(e){try{return W.statSync(e).isFile()}catch{return!1}}function gv(e){return({inputs:t,cwd:n})=>sv({inputs:t,cwd:n??process.cwd(),replayBackend:e}).map(t=>_v(t,e))}function _v(e,t){let n=W.readFileSync(e,`utf8`),r=Gr(e,t)===`maestro`,i=dt(n);return{path:e,manifest:{...r?{title:fi(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 vv(e){return async t=>(await xv(e,t)).map(yv)}function yv(e){if(e.platform===`web`||!gt(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 bv(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 xv(e,t){let r=Tv(e),i=Cv(await On(Sv(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${wv(t)}, but only ${i.length} matched`);return i.slice(0,t)}function Sv(e){let t=en(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:mt({simulatorSetPath:tn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Cv(e,t,n){return t.length>0?Ev(e,t,n):e.filter(e=>Dv(e,n)).sort(Av)}function wv(e){return`${e} device${e===1?``:`s`}`}function Tv(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Ev(e,t,r){return t.map(t=>{let i=kv(t),a=e.find(e=>Ov(e,r)&&(e.id===t||kv(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Dv(e,t){return!Ov(e,t)||!gt(e)?!1:e.booted!==!1}function Ov(e,t){return!(!_t(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function kv(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function Av(e,t){return e.id.localeCompare(t.id)}function jv(e){let t=Mv(e?.shardAll,`--shard-all`),r=Mv(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 Mv(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 Nv=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Pv(e){let t=Fv(e);return t?Iv(t.details)||Lv(t.code,t.message):!1}function Fv(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Iv(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?nn(t):!1}function Lv(e,t){let n=`${e}\n${t}`.toLowerCase();return Nv.some(e=>n.includes(e))}function Rv(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Vv(e.error.details?.artifactPaths),infrastructure:Pv(e),...Hv(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:Bv(t?.warnings),artifactPaths:Vv(t?.artifactPaths),...Hv(t?.snapshotDiagnostics)}}function zv(e){if(!e||e.ok)return;let t=Rv(e);return t.status===`failed`?t:void 0}function Bv(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Vv(e){return[...new Set(Bv(e))]}function Hv(e){let t=Fe(e);return t?{snapshotDiagnostics:t}:{}}const Uv=1e3,Wv=3e3;function Gv(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Kv(e)}}async function Kv(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=it(s.device.platform),l=a?U.join(a,`recording${c}`):nt(s.device.platform);Jv(o,{type:`video_recording_start`,session:n,videoPath:l}),P({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let u=await Br({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 Jv(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:u.error.code}),u;let d=Date.now();return await Kt(Uv),Jv(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-d,requestedDurationMs:Uv}),P({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-d,data:{session:n,requestedDurationMs:Uv}}),u}async function qv(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;Jv(o,{type:`video_tail_start`,session:n,requestedDurationMs:Wv});let s=Date.now();await Kt(Wv);let c=Date.now(),l=await Br({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return Lm(l).forEach(e=>a.add(e)),Jv(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}),P({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-c,data:{session:n,ok:l.ok,tailDurationMs:c-s}}),l}function Jv(e,t){e({...t,ts:new Date().toISOString()})}const Yv=[{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.`}],Xv=({attemptId:e,parentAttemptId:t})=>{hn(e);let n=Zv(e,t);return{cancel:()=>vn(e),release:()=>{n(),xn(e)}}};function Zv(e,t){if(!t||t===e)return()=>{};let n=bn(t);if(!n)return()=>{};let r=()=>{vn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function Qv(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=$v(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:bv({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function $v(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function ey(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;if(t.command===`replay`)return await nv({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o});if(t.command===`test`){let e=t.flags??{};for(let t of Yv)if(t.requested(e))return z(`INVALID_ARGS`,t.message);let c;try{c=ty(t,n)}catch(e){let t=s(e);return z(t.code,t.message)}let l=await kf({request:c,emitProgress:mn,isCanceled:()=>gn(t.meta?.requestId),emitDiagnostic:P,bindAttemptCancellation:Xv,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&&Lm(e).forEach(e=>u.add(e)),e),g=Qv({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=Gv(_);return Rv(await nv({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 Kv(_);return t&&!t.ok?t:h(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o,appendTimingEvent:s})=>zv(await qv({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,appendTimingEvent:s,artifactPaths:n})),discoverSources:gv(t.flags?.replayBackend),resolveShardTargets:vv(t.flags),cleanupSession:async e=>{i.get(e)&&await $c({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 ty(e,t){let n=e.flags??{},r=e.meta?.cwd,i=ry(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:k.expandHome(i,r),failFast:n.failFast===!0,retries:ny(n.retries),timeoutMs:ny(n.timeoutMs),shard:jv(n)}}function ny(e){return typeof e==`number`?e:void 0}function ry(e){return typeof e==`string`?e:void 0}function iy(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==p.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return cy(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return cy(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=sy(a);if(o)return cy(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return cy(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));lt(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:Ze(a,t.flags?.force),publication:`active`});return c.written?(Ae(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...D(`Published script: ${c.path}`)}}):cy(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 ay(e){if(Be(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:$e(e)&&e.recordSession?void 0:`not-armed`}const oy={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 sy(e){let t=ay(e);return t?oy[t]():void 0}function cy(e){return{ok:!1,error:t(e)}}function ly(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function uy(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function dy(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function fy(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),mn({type:`command`,status:`progress`,message:py(t)})}function py(e){return[pe(e),...de(e)].join(`
26
+ `)}const my=2e3;async function hy(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=Ut(n,a);i&&$(e,await xy(o,n.id,r)),$(e,await gy(o,n))}async function gy(e,t){try{let n=await on(e),r=ln(t);return n===await _y()&&!r?await vy(e,t,n):yy(t,n,r)}catch(e){return by(e)}}async function _y(){try{return(await sn()).manifest.serviceComponent}catch{return}}async function vy(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,un.previousIme],{allowFailure:!0,timeoutMs:my})).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 yy(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 by(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 xy(e,n,r){try{let t=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:my}),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 Sy(e,n){let{device:r,targetApp:i,session:a}=n;if(i)try{let t=await Cy(r,i);if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${j(r)}.`,evidence:{requested:i,platform:j(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 ${j(r)} --all`,evidence:{code:i.code,message:i.message}})}}async function Cy(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return wy(t,(await n(e,`all`)).map(e=>({id:e.package,name:e.name})))?.id}if(N(e)||A(e)){let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return wy(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function wy(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 Ty(e,n,r){let i=Dy(n,r);try{let t=await ky(i),n=Oy(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Ny(n,i,t.failures),hint:n.length===0?Iy(t.failures):void 0,command:n.length===0?Vy(i):void 0,evidence:Hy(n,t.failures)}),n.length>0&&Ay(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 Ey(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:j(e),id:e.id,name:e.name}))}})}function Dy(e,t){let n=e.flags??{};return An({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function Oy(e,t){return e.filter(e=>vt(e,t,{includeExplicitSelectors:!0}))}async function ky(e){if(e.platform)return{devices:await On(e),failures:[]};let t=[],n=[];for(let r of Lt)try{t.push(...await On({...e,platform:r}))}catch(e){n.push(My(r,e))}return{devices:t,failures:n}}function Ay(e,t){for(let n of t)$(e,jy(n))}function jy(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${zy(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${zy(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function My(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Ny(e,t,n){if(e.length===0)return n.length>0?`No ${Py(t)} devices found; ${Fy(n)}.`:`No ${Py(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Py(t)} ${By(e.length,`device`)} available; ${r} booted`,a=Ly(e,t);return a?`${i} (${a}).`:`${i}.`}function Py(e){let t=e.platform?zy(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Fy(e){return e.slice(0,2).map(e=>`${zy(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Iy(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Ly(e,t){if(t.platform||t.target)return;let n=Pt(e),r=Ry();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 Ry(){return{android:`Android`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function zy(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function By(e,t){return e===1?t:`${t}s`}function Vy(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Hy(e,t){let n=new Map;for(let t of e){let e=j(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Uy=1500;async function Wy(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 Gy(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Ky(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 Gy(e,t,n){try{return await(n.resolveProcessInfo??qy)(e,t)}catch{return}}function Ky(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 qy(e,t){if(!Jy(e))return;let n=await Yy(t);if(n!==void 0)return{pid:n,cwd:await Xy(n)}}function Jy(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Yy(e){let t=await Wt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Uy});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 Xy(e){let t=await Wt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Uy});if(t.exitCode===0)return t.stdout.split(`
28
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Zy=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Qy=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function $y(e,t){let n=Jt(e.meta?.cwd);return{targetApp:ib(e.flags?.targetApp)??t?.appBundleId,metroHost:ib(e.runtime?.metroHost)??`127.0.0.1`,metroPort:ab(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:nb(e,n)}}function eb(e,t={}){let n=rb(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 tb(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 ${j(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 nb(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function rb(e){let t={...Object.fromEntries([...Zy,...Qy].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 ib(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function ab(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}const ob=3e3;async function sb(e,t){if(t===`android`){$(e,await lb());return}if(t===`vega`){$(e,await cb());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await mb())}async function cb(){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:ob}),i=await n.listDevices({allowFailure:!0,timeoutMs:ob}),a=xb(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 lb(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await yb(e),n=await bb(`adb`,[`version`]);return n?ub({license:t,sdkRoot:e,versionLine:n}):pb(e,t)}function ub(e){return{id:`toolchain`,status:db(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${fb(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 db(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function fb(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function pb(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 mb(){let e=await bb(`xcodebuild`,[`-version`]);return e?hb({selectedPath:await bb(`xcode-select`,[`-p`]),versionLine:e}):vb()}function hb(e){return{id:`toolchain`,status:gb(e),summary:_b(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function gb(e){return e.versionLine?`pass`:`info`}function _b(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 vb(){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 yb(e){if(!e)return`unknown`;try{return await qi(U.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function bb(e,t){try{let n=await Wt(e,t,{allowFailure:!0,timeoutMs:ob});return n.exitCode===0?xb(n.stdout):void 0}catch{return}}function xb(e){return e.split(`
29
+ `).map(e=>e.trim()).find(Boolean)}async function Sb(e,t){$(e,await Cb(t))}async function Cb(e){let t=Kn({stateDir:e});if(!t.installed)return{id:`web-agent-browser-processes`,status:`info`,summary:`Managed web backend is not installed; no agent-device-owned browser processes counted.`,evidence:{stateDir:e,installed:!1}};try{let n=await qn(t);return{id:`web-agent-browser-processes`,status:n.count>0?`info`:`pass`,summary:n.count>0?`${n.count} live agent-device-owned Chrome process${n.count===1?``:`es`} detected.`:`No live agent-device-owned Chrome processes detected.`,evidence:{stateDir:e,installed:!0,count:n.count,pids:n.pids,matchReasons:n.processes.map(e=>e.reason)}}}catch(t){return{id:`web-agent-browser-processes`,status:`info`,summary:`Could not inspect live agent-device-owned Chrome processes.`,hint:`Run doctor again from a shell with permission to inspect local processes.`,evidence:{stateDir:e,error:t instanceof Error?t.message:String(t)}}}}async function wb(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==w.doctor)return null;let a=r.get(n),o=$y(t,a),s=Db(r,n),c=[];if(fy(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${Gt()} using ${s}`,evidence:{version:Gt(),stateDir:s}},...eb(t,{required:o.remote}),...tb(r,n,a,{remote:o.remote})),o.remote)return Ab(c,o);let l=await Ty(c,t,a);await sb(c,a?.device.platform??l?.platform);let u=await Ob({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await Eb(c,u??Tb(l)),Ab(c,o,{device:u,includeMetro:!0,inventory:l})}function Tb(e){let t=(e?.devices??[]).filter(e=>N(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function Eb(e,t){if(!(!t||!N(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||I(t))){if(mn({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await Sn(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}Un(t,{}),mn({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 Db(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function Ob(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??Ey(t,n,r.targetApp);return s&&await kb(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await Wy(r.metroHost,r.metroPort,r.kind)),await Sb(t,o),s}async function kb(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await Sy(e,{device:r,session:a,targetApp:i.targetApp}),await hy(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function Ab(e,t,n={}){let r=ly(e);return{ok:!0,data:{status:r,summary:uy(r),kind:t.kind,platform:n.device?j(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:dy(e)}}}async function jb(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(w.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s,ensureReady:!0}),u=L(w.prepare,l);if(u)return u;let d=Date.now(),f=await Hn(l,Mb(t,o,r,d));return{ok:!0,data:Pb(a,l,Math.max(0,Date.now()-d),f)}}function Mb(e,t,n,r){let i=Nb(e);return{...Ai({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:rn.fromTimeoutMs(i,r),startupTimeoutMs:i}}function Nb(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:ye}function Pb(e,t,n,r){return{action:e,platform:j(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Fb(n,r),message:`Prepared Apple runner: ${t.name}`}}function Fb(e,t){let n=Ib(t.buildMs),r=Lb(t.connectMs),i=Lb(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 Ib(e){return e===void 0?void 0:Lb(e)}function Lb(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function Rb(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&&ji(t)===`may-invalidate`&&Si(l);let m=await R(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;Qr(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function zb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=Y(w.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=L(w.clipboard,l);if(u)return u;let d=await R(l,w.clipboard,t.positionals??[],t.flags?.out,{...B(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return Qr(i,a,t,t.command,d??{}),{ok:!0,data:{platform:j(l),...d??{}}}}const Bb=async({req:e,sessionName:t,sessionStore:n})=>await ml({req:e,sessionName:t,sessionStore:n}),Vb=async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Sl({req:e,sessionName:t,logPath:n,sessionStore:r}),Hb=async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await md({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),Ub=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:a,invokeReplayAction:o})=>await ey({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:o??a});async function Wb(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 Rb({req:t,sessionName:n,logPath:r,sessionStore:i,command:w.keyboard,positionals:t.positionals??[]})}async function Gb(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 Rb({req:t,sessionName:n,logPath:r,sessionStore:i,command:w.push,positionals:[a,Yb(o,t.meta?.cwd)],recordPositionals:[a,o]})}async function Kb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;return await Rb({req:t,sessionName:n,logPath:r,sessionStore:i,command:w.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await oc(e.device,n,e.appBundleId,rc)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}const qb={session_list:Bb,devices:Bb,capabilities:Bb,apps:Bb,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r})=>await wb({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r}),boot:Vb,shutdown:Vb,appstate:Vb,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>iy({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,sessionStore:n})=>await Fs({req:e,sessionName:t,sessionStore:n}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await zb({req:e,sessionName:t,logPath:n,sessionStore:r}),keyboard:Wb,perf:Hb,logs:Hb,events:Hb,network:Hb,audio:Hb,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await jb({req:e,sessionName:t,logPath:n,sessionStore:r}),install:async({req:e,sessionName:t,sessionStore:n})=>await cl({req:e,command:`install`,sessionName:t,sessionStore:n,deployOps:sl}),reinstall:async({req:e,sessionName:t,sessionStore:n})=>await cl({req:e,command:`reinstall`,sessionName:t,sessionStore:n,deployOps:ol}),install_source:async({req:e,sessionName:t,sessionStore:n})=>await Do({req:e,sessionName:t,sessionStore:n}),release_materialized_paths:async({req:e})=>await Io({req:e}),push:Gb,"trigger-app-event":Kb,open:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await Ac({req:e,sessionName:t,logPath:n,sessionStore:r}),replay:Ub,test:Ub,batch:async({req:e,sessionName:t,invoke:n})=>await pl(e,t,n),close:async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})=>await $c({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a})};async function Jb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new di,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}=e,u=qb[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 Yb(e,t){let n=Cn(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>k.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{Jb as handleSessionCommands};