agent-device 0.21.5 → 0.21.6
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.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.5.apk → agent-device-android-ime-helper-0.21.6.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.6.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.5.manifest.json → agent-device-android-ime-helper-0.21.6.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.5.apk → agent-device-android-snapshot-helper-0.21.6.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.6.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.5.manifest.json → agent-device-android-snapshot-helper-0.21.6.manifest.json} +6 -6
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +8 -1
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-transport.js +1 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-lifecycle.js +3 -3
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/device-input-state.d.ts +3 -4
- package/dist/src/device-session.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/run-script-http-child.d.ts +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/mechanics.js +16 -16
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/platform-runtime-android-adb-host.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/semantic-index.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/tree.js +1 -1
- package/dist/src/video.js +2 -2
- package/package.json +2 -2
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.5.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.5.apk.sha256 +0 -1
- package/dist/src/adb-host.js +0 -1
package/dist/src/session2.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{B as e,C as t,N as n,T as r,d as i,g as a,j as o,m as s,t as c,w as l}from"./sdk-contracts.js";import"./capture.js";import{D as u,n as d,r as f,t as p}from"./sdk-batch-runner.js";import{a as m,n as h,t as g}from"./snapshot-diagnostics.js";import{f as _}from"./android-input-ownership.js";import{_ as v,b as y,c as b,d as x,g as S,l as C,m as w,u as T,v as E}from"./sdk-device.js";import{A as ee,B as D,Cr as O,F as te,G as ne,I as re,In as ie,Ir as ae,J as oe,K as se,L as ce,N as le,P as ue,R as de,Rn as fe,Sr as pe,St as me,T as he,U as ge,Ur as _e,Vn as ve,Vr as ye,W as be,Wn as xe,X as Se,Y as Ce,Z as we,at as Te,bt as Ee,d as De,dn as Oe,dt as ke,en as Ae,f as je,fn as Me,ft as Ne,hn as Pe,j as Fe,jt as Ie,mn as Le,nn as Re,nr as ze,nt as Be,pn as Ve,q as He,rr as Ue,rt as We,tr as Ge,v as Ke,xt as qe,z as Je,zn as Ye,zr as Xe,zt as Ze}from"./sdk-batch.js";import{u as Qe}from"./scroll-gesture.js";import{a as $e,b as et,f as tt,g as nt,n as rt,p as it,r as at,w as ot,y as st}from"./script.js";import{_ as ct,a as lt,c as k,d as ut,f as dt,g as ft,h as pt,l as mt,m as ht,p as gt,t as _t,u as vt}from"./session-store.js";import{a as yt,c as bt,n as xt,o as St,r as Ct,t as wt}from"./session-target-evidence.js";import{a as Tt,i as Et,n as Dt,o as Ot,r as kt,s as At,t as jt}from"./vars.js";import{n as Mt,r as Nt,t as Pt}from"./format.js";import{A as Ft,_ as It,d as Lt,g as Rt,h as zt,j as Bt,k as Vt,l as Ht,m as Ut,o as Wt,p as Gt,s as Kt,u as qt}from"./parameterized-recorded-fill.js";import{F as Jt,N as Yt,P as Xt,c as Zt,f as Qt,j as $t,v as en}from"./runtime.js";import{$ as tn,A as nn,B as rn,C as an,D as on,F as sn,G as cn,H as ln,I as un,J as dn,K as fn,L as pn,M as mn,N as hn,Q as gn,R as _n,S as vn,T as yn,U as bn,V as xn,W as Sn,X as Cn,Y as wn,Z as Tn,_ as En,b as Dn,c as On,d as kn,dt as An,et as jn,f as Mn,ft as Nn,g as Pn,h as Fn,it as In,j as Ln,k as Rn,l as zn,m as Bn,mt as Vn,n as Hn,nt as Un,o as Wn,p as Gn,q as Kn,r as qn,rt as Jn,t as Yn,tt as A,u as Xn,v as Zn,w as Qn,x as $n,y as er,z as tr}from"./device-claim-rule.js";import{n as nr,t as rr}from"./catalog.js";import{g as ir,i as ar}from"./observability.js";import{i as or,n as sr,r as j}from"./success-text.js";import{d as cr,i as lr,u as ur}from"./absence-observation-errors.js";import{t as dr}from"./app-inventory.js";import{r as fr,t as pr}from"./device.js";import{a as mr,o as hr,r as M}from"./diagnostics.js";import{a as gr,i as _r,r as vr}from"./verified-file.js";import{c as yr,p as br}from"./exec.js";import{t as xr}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Sr,r as Cr}from"./output-path.js";import"./command.js";import{a as wr,i as Tr,n as Er,t as Dr}from"./replay-divergence.js";import"./retry.js";import{r as Or}from"./version.js";import{t as kr}from"./session-paths.js";import{i as Ar,r as jr}from"./session-artifact-paths.js";import{t as Mr}from"./project-runtime.js";import{r as Nr}from"./rect-center.js";import{o as Pr}from"./android-system-chrome.js";import{t as Fr}from"./keyed-lock.js";import{n as Ir,t as Lr}from"./deploy-result-target.js";import{t as Rr}from"./keyboard-actions.js";import{a as zr,i as Br,n as Vr,o as Hr,r as N}from"./request-cancel.js";import{t as Ur}from"./request.js";import{i as Wr,s as Gr}from"./provider-session-ownership.js";import{a as Kr,i as P,s as qr}from"./request-runtime-binding.js";import{C as Jr,E as F,O as Yr,g as I,h as Xr,i as Zr,k as Qr,m as $r,n as ei,s as ti,v as ni,x as ri}from"./session-snapshot.js";import{c as ii,i as ai,t as oi}from"./device-claim-inspection.js";import{t as si}from"./audio-probe-result.js";import{T as ci,_ as li,a as ui,b as di,c as fi,d as pi,f as mi,g as hi,h as gi,i as _i,l as vi,m as yi,n as bi,o as xi,r as Si,s as Ci,t as wi,u as Ti,v as Ei,x as Di}from"./perf-runtime-plan.js";import{i as Oi,n as ki}from"./lease-context.js";import{h as Ai}from"./screenshot-runtime.js";import{n as L,r as ji}from"./device-isolation.js";import{a as Mi,n as Ni,r as Pi}from"./device-inventory-context.js";import{n as Fi,r as Ii,t as Li}from"./dispatch-resolve.js";import{t as Ri}from"./touch-reference-frame.js";import{a as zi,i as Bi,l as Vi,n as Hi,o as Ui,s as Wi,u as Gi}from"./session-routing.js";import{d as R}from"./src8.js";import{i as Ki,n as z,r as qi}from"./compatibility-policy.js";import{o as Ji,p as Yi}from"./quality-warnings.js";import{a as Xi,i as B,n as Zi,r as Qi,t as $i}from"./session-runtime-admission.js";import{t as ea}from"./semantic-index.js";import{n as ta,r as na}from"./device-selection-resolver.js";import{n as ra,r as ia}from"./doctor-output.js";import{t as aa}from"./record-runtime.js";import{n as oa}from"./gesture-runtime.js";import{i as sa,n as ca,r as la}from"./platform-runtime-open-target.js";import{t as ua}from"./snapshot-runtime.js";import{t as da}from"./app-log-files.js";import V from"node:path";import H,{promises as U}from"node:fs";import{createHash as fa}from"node:crypto";import pa from"node:os";import{fileURLToPath as ma}from"node:url";import{setTimeout as ha}from"node:timers/promises";import ga from"node:vm";function W(e,t){return R({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function _a(e){return R({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function va(e,t){let n=Ca(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},_a(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:ya(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ya(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function ba(e,t,n,r){let i=Ca(await r.resolveTarget({selector:e,...t},W(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw jn(`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 xa(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function Sa(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 Ca(e,t){return wa(e,t),Ta(e),Ea(e),Da(e),e}function wa(e,n){if(e.generation!==n)throw new t(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${n}.`)}function Ta(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Ea(e){if(e.rect!==void 0&&!Sa(e.rect)||e.viewport!==void 0&&!Sa(e.viewport))throw new t(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Da(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Oa(e,t,n,r,i,a={}){let o=ka(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Pa(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function ka(e,t,n,r,i){let a=n===`up`||n===`down`,o=rn(e,dn(e,r),i),s=o.visibility,c=Tn({visibility:s,matches:e.nodes.filter(e=>ae(e)),platform:r}),l=ye(s.viewportRects)??ja(c);if(!l||!Xe(l))return;let u=c.flatMap(e=>{if(!Xe(e.rect))return[];let t=Ma(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=Aa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(Na)[0]?.viewport}function Aa(e,t){return ae(e)?e:O(e,t)}function ja(e){let t;for(let n of e)Xe(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ma(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 Na(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=z.scrollUntilVisibleSwipe.nearEdgeFraction,i=z.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 Fa(e,n,r){let i=A(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new t(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(W(n,n.command)):void 0;return{authored:e,gesture:La(await Ia(e.start,n,r,a),await Ia(e.end,n,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let t=await r.resolveGestureViewport(W(n,n.command)),{start:a,end:o}=Ra(t,e.direction,r.platform);return{authored:e,gesture:La(a,o,i),viewport:t}}let a=await ba(e.from,{purpose:`swipe`,timeoutMs:`optional`in n.command&&n.command.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs},n,r),o=a.viewport??await r.resolveGestureViewport(W(n,n.command)),{start:s,end:c}=za(a,e.direction,o);return{authored:e,gesture:La(s,c,i),target:a,viewport:o}}async function Ia(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(W(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 La(e,t,n){return{from:e,to:t,durationMs:n??z.command.swipeDurationMs}}function Ra(e,t,n){if(t===`left`||t===`right`){let n=Qe(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=z.screenSwipe,i=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 za(e,t,n){let r=Nr(e.rect),i=n.x+Math.trunc(n.width*z.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*z.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*z.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*z.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const Ba={launchApp:Ga,stopApp:Ga,clearState:Ga,openLink:Ga,tapOn:qa,doubleTapOn:qa,longPressOn:qa,swipe:Qa,inputText:$a,eraseText:$a,scroll:K,scrollUntilVisible:K,hideKeyboard:K,pressKey:K,back:K,waitForAnimationToEnd:K,takeScreenshot:no,runScript:no,evalScript:io,assertVisible:ro,assertNotVisible:ro,assertTrue:ro,extendedWaitUntil:ro},Va={launchApp:!0,stopApp:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ha(e){return Va[e.kind]}async function Ua(e,t){let n=e.command;return await Wa(n,e,t,W(e,n))}function Wa(e,t,n,r){let i=Ba[e.kind];return i(e,t,n,r)}async function Ga(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,Ka(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`clearState`:return await q(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function Ka(e,t){return R({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function qa(e,t,n,r){switch(e.kind){case`tapOn`:return await Ja(e,t,n,r);case`doubleTapOn`:{let i=await po(e.target,{purpose:`doubleTap`,timeoutMs:Xa(e)},t,n),a=A(e.delay,`doubleTapOn.delay`)??z.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}case`longPressOn`:{let i=await po(e.target,{purpose:`longPress`,timeoutMs:Xa(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}}}async function Ja(e,t,n,r){let i=await Ya(e,t,n);return await q(n.tapOn,Za(e,i),r,`invalidate`,i.resolution?xa(i.resolution):void 0)}async function Ya(e,t,n){let r={purpose:`tap`,timeoutMs:Xa(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await po(e.target,r,t,n)}function Xa(e){return e.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs}function Za(e,t){let n=A(e.repeat,`tapOn.repeat`),r=A(e.delay,`tapOn.delay`),i=n===void 0?r:r??z.command.repeatDelayMs;return R({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Qa(e,t,n,r){let i=await Fa(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?xa(i.target):void 0)}async function $a(e,t,n,r){switch(e.kind){case`inputText`:return await q(n.inputText,R({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await q(n.eraseText,R({charactersToErase:A(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function K(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,eo(e),r,`invalidate`);case`hideKeyboard`:return await q(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await q(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await q(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await q(n.waitForAnimationToEnd,to(e),r,`preserve`)}}function eo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:A(e.timeout,`scrollUntilVisible.timeout`)??z.command.scrollUntilVisibleTimeoutMs,durationMs:Ki(z.command.scrollUntilVisibleSpeed)}}function to(e){return R({timeoutMs:A(e.timeout,`waitForAnimationToEnd.timeout`)})}async function no(e,t,n,r){switch(e.kind){case`takeScreenshot`:return oo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await q(n.runScript,R({file:e.file,env:e.env}),r,`preserve`)}}async function ro(e){throw new t(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function io(e){throw new t(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function q(e,t,n,r,i){let a=ao(n,r);return oo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function ao(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function oo(e,t,n,r){let i=e?.observation;return so(i,r),{...co(n??i),...lo(e?.outputEnv),...uo(t,e?.artifactPaths),...fo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function so(e,n){if(!(!e||n===void 0||e.generation===n))throw new t(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${n}.`)}function co(e){return e?{observation:e}:{}}function lo(e){return e?{outputEnv:{...e}}:{}}function uo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function fo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function po(e,t,n,r){if(e.space===`target`){let i=await ba(e.selector,t,n,r);return{authored:e,point:Nr(i.rect),resolution:i}}return{authored:e,point:await Ia(e,n,r)}}function mo(e,t,n,r={}){let i=n===`ios`&&r.presentation?go(r.presentation):void 0,a=i?_o(e,t,i):ln(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:xo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?cn(s,t.selector.index):Sn(s,t.selector.index)?.node,l=xo(t,o,s,c);if(!c)return vo(t,o,s,l);let u=i?Sn(i.visibleForSource(c),void 0):null,d=fn(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!ho(t.selector)&&i?yo(d,s,u):0,evidence:l}:vo(t,o,s,l)}const ho=Cn;function go(e){let t=pe(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>gn(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function _o(e,t,n){let r=dn(e,`ios`),i=wn(e,{},{orderUnindexed:e=>Kn(e,r)}),a=xn(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:bn(o,t.selector,`ios`,i.visibility,r)}}function vo(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function yo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&bo(n.rect,e)?1:0:t.length}function bo(e,t){let n=Nr(e),r=Nr(t);return n.x===r.x&&n.y===r.y}function xo(e,t,n,r){return R({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:qi,retryTapMaxAttempts:z.command.retryTapMaxAttempts,longPressDurationMs:z.command.longPressDurationMs,eraseTextMaxCharacters:z.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:z.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:z.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:z.command.waitForAnimationToEndDifferencePercent,observationPollMs:z.observation.pollIntervalMs};function So(e,t={}){return{execute:async n=>{let r=W(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ha(n.command)&&!i,visualStabilityBarrier:i});let a=await Ua(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await va(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Co(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function wo(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Co(n)}}function To(e){let t=wo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Gr(n,e.meta?.tenantId)},cleanup:()=>{Wr(n)}}}function Y(e,t,n){return t||Jn(n)?null:P(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function Eo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function X(e){return In(e.flags)||!e.session?await Fi(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Do(e.session.device)}async function Do(e){if(qr(e)||!C(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ni.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Fi(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Fi({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Oo(e,t){return t?Vi(t,e).length===0:!1}async function ko(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=To(t);let n=No(t),l=await jo(a,t.flags),u=await Qi(e.inspectFacts)(l),d=B(`install_from_source`,u.operations.ensureReady)??B(`install_from_source`,u.operations.materializeAppSource)??B(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Zi(e.bindDevice)(l,Se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Po({artifact:s,retention:n,req:t,session:a,sessionName:r}),a&&F(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Fo(l,s,p,c),h=or(m,`Installed: ${Ir(m)}`);return k(i,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Rn(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:n(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function Ao(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Rn(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:n(e)}}}async function jo(e,n){let r=Mo(n?.platform);if(e&&r&&e.device.platform!==r)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await X({session:e,flags:n})}function Mo(e){return e===`ios`||e===`android`?e:void 0}function No(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Po(e){if(e.retention.enabled)return await Ln({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Fo(e,t,n,r){return C(e)?Io(t,n,r):Lo(t,n,r)}function Io(e,n,r){let i=n.bundleId??e.bundleId;if(!i)throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...zo(r),bundleId:i,...Ro(n,e),launchTarget:n.launchTarget??i}}function Lo(e,n,r){let i=n.packageName??n.launchTarget??e.packageName;if(!i)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...zo(r),packageName:i,...Ro(n,e),launchTarget:n.launchTarget??i}}function Ro(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function zo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Bo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Vo(t);if(!a.ok)return a.response;let o=Y(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await X({session:n,flags:t.flags}),c=await I({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:D});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return P(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:P(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Vo(e){let t=Ho(e);if(!t.ok)return t;let n=Uo(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Ho(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Uo(e){let t=Wo(e.flags?.devicePort),n=Wo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Wo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Go(e){return await I({...e,command:`runtime clear`,use:ce})}async function Ko(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Bo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await qo({...e,session:r.get(n)});if(!Jo(i))return P(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Yo({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Xo(n,o):Qo({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function qo(e){if(!e.session)return P(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await oa({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Jr(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function Jo(e){return e===`set`||e===`show`||e===`clear`}async function Yo(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(kn(i)&&r?.appBundleId){let e=await Go({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;F(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Fn(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Xo(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Zo(e){return e?E(e.device):void 0}function Qo(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Zo(i),s=Zn(t.flags?.platform??a?.platform??o);if(!s)return P(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(o!==void 0&&o!==s)return P(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Gn(a,zn(t.flags,s));return Xn(c)===0?P(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const $o=/^[A-Za-z0-9_.:-]{1,64}$/,es=8192,ts=4096;function ns(e){let n=e[0]?.trim(),r=e[1]?.trim();if(!n)throw new t(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!$o.test(n))throw new t(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new t(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:is(r,n)}}function rs(e,n,r){let i=E(e),a=as(e);if(!a)throw new t(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>ts)throw new t(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:ts});return s}function is(e,n){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>es)throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${es} bytes`);return r}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function as(e){return((C(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function os(e,t,n,r){let{eventName:i,payload:a}=ns([...r]),o=rs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:$r(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...j(`Triggered app event: ${i}`)}}async function ss(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await I({command:`trigger-app-event`,device:t,use:Be,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>os(s,t,e,n)}}function cs(e){let n=(e[0]??`status`).toLowerCase();if(!Rr(n))throw new t(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new t(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return ls(n)}function ls(e){return e===`get`?`status`:e===`return`?`enter`:e}const us={"ime-probe":`android`},ds={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},fs={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ps(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$r(e)}}async function ms(e,t){let n=await I(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function hs(e,t){return e.operations.keyboardStatus(ps(t)).then(e=>({platform:us[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function gs(e,t){let n=await e.operations.keyboardDismiss(ps(t)),r=ds[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...j(ys(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...j(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function _s(e,t){let n=await e.operations.keyboardEnter(ps(t)),r=fs[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...j(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...j(`Keyboard enter pressed`)}}async function vs(e){let t=cs(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ms({command:`keyboard status`,device:n,use:me,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>hs(e,t)):t===`dismiss`?await ms({command:`keyboard dismiss`,device:n,use:Ee,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>gs(e,t)):await ms({command:`keyboard enter`,device:n,use:qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>_s(e,t))}function ys(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function bs(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=Y(i,l,u);if(d)return d;let f=await X({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Ai(t)===`may-invalidate`&&F(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function xs(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return P(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Ss(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await bs({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Jr(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Cs(e){return xs(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Ss({...e,command:nr.keyboard,resolveRuntime:e=>vs(e)})}async function ws(e){return await Ss({...e,command:nr.triggerAppEvent,resolveRuntime:e=>ss(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await la(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function Ts(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Es(e,n){let r=n?.subject??`Payload`,i=e.trim();if(!i)throw new t(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!H.statSync(a).isFile())throw new t(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof t)throw e;let n=e.code;if(n===`EACCES`||n===`EPERM`)throw new t(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new t(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(Ts(i))return{kind:`inline`,text:i};throw new t(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Ds(e){let n=Es(e,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await Os(n.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Os(e){try{return await U.readFile(e,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new t(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new t(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new t(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new t(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function ks(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=Y(n,a,o);if(s)return s;let c=Fs(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Gr(l,t.meta?.tenantId):_t.expandHome(c.appPathInput);if(!H.existsSync(s))return P(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await X({session:a,flags:o}),d=await Qi(e.inspectFacts)(u),f=B(n,d.operations.deployApp);if(f)return f;let p=await Zi(e.bindDevice)(u,Ce);a&&F(a);let m=await p.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),h=js(u,c.app,s,m),g=or(h,`Installed: ${h.appName??Lr(h)}`),_=Ps(a,h);return _&&_!==a&&i.set(r,_),k(i,_,t,n,g),{ok:!0,data:g}}finally{l&&Wr(l)}}async function As(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=Y(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return P(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Ds(Is(c,t.meta?.cwd)),u=await X({session:i,flags:a}),d=await Qi(e.inspectFacts)(u),f=B(`push`,d.operations.ensureReady)??B(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Zi(e.bindDevice)(u,we);await p.operations.ensureReady({}),i&&F(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=C(u)?or({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):or({platform:E(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function js(e,t,n,r){return C(e)?Ms(t,n,r):Ns(e,t,n,r)}function Ms(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 Ns(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function Ps(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Fs(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:P(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:P(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Is(e,t){let n=Es(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>_t.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Ls(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await ks({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await ko({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await As({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Rs(e,t,n){return await d(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const zs=new Set(`acceptAlert.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Bs(e){return zs.has(e)}const Vs=new Map(De.map(e=>[e.name,e]));function Hs(e){let t=new Set;for(let n of e){let e=Us(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Us(e){let t=Vs.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(Bs)?n:void 0}function Ws(e){if(e!==void 0&&e.remainingSteps.length!==0)return Hs(e.remainingSteps)}function Gs(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(e),plannedOperations:Ws(e.internal?.executionPlan)}}function Ks(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...j(`Closed: ${t.name}`)}})}function qs(e,t,n){if(!dt(t))return{kind:`not-armed`};let r=t.actions.length;Ks(e,t,n);let i=Gt(t),a=e.writeSessionLog(t,{force:qt(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`}:(mt(t),{kind:`aborted`})}function Js(e,t){let r=n(t),i=Ft(e.scriptPublication??It);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ys(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Ks(r,n,t);try{let e=r.writeSessionLog(n,{force:qt(n,t.flags?.force)});e.written&&zt(n,e.path);return}catch(e){return Xs(e)}}function Xs(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof t?new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n(e).message}`,r)}async function Zs(e){let t=e.clearRuntimeHints?Je:de,n=await Xr({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,de)};let r=await n.bind(e.device,Je);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Qs(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await $s(n,a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&kn(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Fn(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>nn(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function $s(e,t,n,r){let i=t.get(e.name)??e;i.screenRecording&&await n(`recording`,()=>$n({session:i,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>an({session:e,sessionName:e.name,sessionStore:t})),await n(`audio_probe`,()=>Dn({session:e,sessionName:e.name,sessionStore:t})),await n(`perf_capture`,()=>Qn({session:e,sessionName:e.name,sessionStore:t})),await n(`platform_snapshot_helper`,()=>yn(e,r))}function ec(e,t){return vn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function tc(e){if(e instanceof t)return e;let n=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const nc=(e,t)=>(e.positionals?.length??0)>0||on(t);async function rc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=dt(n),s=JSON.stringify(t.positionals??[]);if(o&&!ut(n,s)){let e=await ac({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Js(n,tc(e))};pt(n,s)}let c=qs(i,n,t);return c.kind===`failed`?{response:Js(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function ic(e){try{return{providerData:await An(e)}}catch(t){let r=n(t);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,lifecycle:i}=e;if(nc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Gs(t,r,n.trace?.outPath)});return}catch(e){return e}}function oc(e,n){if(!e.flags?.saveScript||Lt(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new t(`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 t(`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 sc(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.get(r);if(!c)return await dc({req:n,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});oc(n,c);let l=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!l)return P(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let u=e.platformResourceCleanup,d=await Zs({device:c.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!c.appBundleId&&kn(a.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;if(F(c),n.internal?.closeAppOnly===!0&&l)return await uc({req:n,session:c,logPath:i,lifecycle:d.runtime,app:l});let f=await rc({req:n,session:c,logPath:i,sessionStore:a,lifecycle:d.runtime});if(`response`in f)return f.response;let p=await cc({req:n,session:c,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:d.runtime,clearRuntimeHints:d.clearRuntimeHints,repairArmed:f.repairArmed,platformResourceCleanup:u});return p.kind===`response`?p.response:lc({session:c,repair:f,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:p.shutdownResult,providerData:p.providerData})}async function cc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Qs({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:ac,finalizeOrdinaryCloseScript:Ys,platformResourceCleanup:e.platformResourceCleanup}),m=await ic({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ec(r,u),g=d??h;if(g?n.deviceClaim&&M({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await di(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function lc(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:or({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...j(c),...o,...s}}}async function uc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await ac({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...j(`Closed: ${a}`)}}}async function dc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return P(`SESSION_NOT_FOUND`,`No active session`);let a=await Zs({device:await X({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Gs(t,n)}),{ok:!0,data:{app:t.positionals[0],...j(`Closed: ${t.positionals[0]}`)}})}function fc(e,t){return e.operations.ensureReady(t)}function pc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function mc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return hc(t,r);case`devices`:return await _c(t);case`capabilities`:return await Tc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await jc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function hc(e,t){let n=zi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ui(e.session,n)).map(e=>gc(e,t))}}}function gc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Ar(r),platform:E(t.device),...b(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...b(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function _c(e){try{let t=vc();return{ok:!0,data:{devices:(await bc(e)).map(e=>({...Rc(e),...yc(e,t)}))}}}catch(e){let t=l(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function vc(){let e=new Map;for(let t of ai({})){let n=t.claim;!n||oi(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function yc(e,t){let n=t.get(ii(Di(e)));return n?{claimedBy:n}:{}}async function bc(e){let t=e.flags?.platform;return wc(await Ni(xc(e,t)),e.flags?.platform,e.flags?.target)}function xc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Sc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Cc(n?.androidDeviceAllowlist)}}function Sc(e,t,n){return y({simulatorSetPath:ji(e),platform:t,target:n})}function Cc(e){let t=L(e);return t?Array.from(t).sort():void 0}function wc(e,t,n){let r=t?e.filter(e=>zc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Tc(e){let t=await Lc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Ec(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Pc(n,e.inspectFacts);return{ok:!0,data:{device:Rc(n),availableCommands:Ke().filter(e=>e===`appstate`&&r?!0:kc(e,i))}}}function Ec(e,t,n){return!t||!C(e)&&!T(e)||!Oo(n,t)?!1:Dc(t)||Oc(e,t)}function Dc(e){return!!(e.appName||e.appBundleId)}function Oc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function kc(e,t){let n=je(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Ac(t,e)))}function Ac(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function jc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Mc(t,e.providerAppCatalog);if(o)return o;let s=await Lc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=dr(t.flags?.appsFilter),u=L(t.flags?.androidDeviceAllowlist),d=await Fc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ic(await pc(f,await fc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Mc(e,t){let n=Nc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,N(e.meta?.requestId))]}}}function Nc(e){let t=ki(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Pc(e,t){if(t)try{return await t(e)}catch{return}}async function Fc(e){if(!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await e.inspectFacts(e.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Te)}}function Ic(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Lc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=Y(t.command,a,o);return s?{response:s}:{device:await X({session:a,flags:o,androidAvdSelection:i})}}function Rc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...b(r.platform)&&n?{appleOs:n}:{}}}function zc(e,t){return v(e,t)}function Bc(e){return P(`INVALID_ARGS`,e)}function Vc(e,n,r,i){try{return ca({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return P(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}async function Hc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await sa({target:n,platform:i.platform,surface:r});return a?Bc(a):null}async function Uc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await sa({target:n,platform:r});return i?Bc(i):null}function Wc(e){let t=er(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:kn(n),clearRemovedRuntimeHints:En({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Gc(e){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!f(a??``),execution:{startupDeadlineAtMs:qc(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(n)}});let{appBundleId:d,appName:p}=await Kc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new t(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Mn({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:p,runtime:c.runtime}}}async function Kc(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function qc(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Jc(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function Yc(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let n=await ua({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.ok?{ok:!0,data:{...o.data,snapshot:n.data}}:Xc(o.data,n.error)}catch(e){return Xc(o.data,n(e))}}function Xc(e,t){return{ok:!0,data:{...e,warnings:[...sr(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Zc(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...Qc(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=E(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,w(d.platform)&&(g.serial=d.id)),d&&C(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...j(`Opened: ${o??s??t}`)}}function Qc(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function $c(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const el=Object.freeze({async observeBootTimeMs(e){if(C(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function tl(e,t){e.warnings=[...sr(e),t]}function nl(e){return e.internal?.resolvedSessionScope??zi(e)}function rl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Ht(t,{});return}Lt(n)&&(Kt(t),tl(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function il(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function al(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function ol(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function sl(e,t){if(!t)return;let n=await ci(t);if(n.status!==`renewed`)return n.conflict?qn(e,n.conflict):P(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function cl(e){let{req:t,sessionName:n,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:u,appBundleId:d,runtimeHints:f,lifecycle:p,applyRuntimeHints:m,existingSession:h,deviceClaim:g,tookOverDeviceClaim:_,selection:v}=e,y=t.flags?.relaunch===!0,b=d,x=Date.now(),S=await ll({req:t,sessionName:n,sessionStore:i,device:o,surface:u,sessionAppBundleId:b,appName:l,existingSession:h});if(S.type===`response`)return S.response;let C=S.session??h,w=Date.now(),T=await p.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:b,surface:u,hasExistingSession:h!==void 0,relaunch:y,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:al(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Fn(f),applyRuntimeHints:m,execution:Gs(t,a,h?.trace?.outPath)});b=T.appBundleId??b;let E={...T.timing},ee=ta(v),D=s?ol(w,s,b):void 0;if(Br(t.meta?.requestId)){let e=r();return P(e.code,e.message,e.details)}h&&ri({session:h,command:`open`,positionals:[],flags:void 0});let O=$c({existingSession:C,sessionName:h?.name??Bi(t),sessionScope:h?.sessionScope??nl(t),device:o,surface:u,appBundleId:b,appName:l});O.lease=Nn({req:t,existingLease:h?.lease}),g&&(O.deviceClaim=g),t.runtime!==void 0&&Pn(i,n,f);let te=i.ensureSessionDir(n),ne=jr(te,t.meta?.requestId??mr().requestId);E.totalDurationMs=Math.max(0,Date.now()-x),M({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let re=Zc({sessionName:O.name,sessionStateDir:te,runnerLogPath:Ar(te),requestLogPath:ne,eventLogPath:i.resolveEventLogPath(n),appName:l,appBundleId:b,surface:u,startup:D,timing:E,device:o,runtime:f,runtimeHintCount:Xn,sessionReused:h!==void 0,selection:ee});return _&&tl(re,il(_)),rl({session:O,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:re}),i.set(n,O),i.recordAction(O,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:re}),{ok:!0,data:re}}async function ll(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=ul(e);r.set(n,o);let s=await a(o);return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function ul(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=$c({existingSession:o,sessionName:o?.name??Bi(t),sessionScope:o?.sessionScope??nl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=Nn({req:t,existingLease:o?.lease}),s}function dl(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(i)return Hi(t,i.session)?P(`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.`}):Gi(i,n)}async function fl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Yn(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Hn(n,r,On({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Ei({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:el})}}async function pl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=dl({req:t,device:a,sessionStore:i});if(m)return m;let h=await fl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return qn(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await ml({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Gc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await sl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await cl({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function ml(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await di(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await li(t);M({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const hl=new Map;async function gl(e){let t=oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Xr({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ge)};case`open-apply-runtime-hints`:{let t=await r(e.device,ne);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,be);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function _l(e){let t=Wc(e);if(t.type===`response`)return t;let n=await gl({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function vl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Jc({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return P(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Vc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return Bc(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let u=await Hc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await sl(i.device,i.deviceClaim);if(d)return d;let f=await Do(i.device),p=na(f);await o.internal?.retainDeviceExecutionLock?.(f.id);let m=await _l({req:o,sessionStore:r,sessionName:t,device:f,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;F(i);let _=await Gc({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:h.runtime,runtimeHintPlan:g,clearRuntimeHints:h.clearRuntimeHints,foreground:!1});return _.type===`response`?_.response:await sl(f,i.deviceClaim)||await cl({req:o,sessionName:t,sessionStore:r,logPath:n,device:f,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:_.details.appBundleId,appName:_.details.appName,runtimeHints:_.details.runtime,lifecycle:h.runtime,applyRuntimeHints:h.applyRuntimeHints,surface:l,existingSession:i,selection:p})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return Bc(`open --relaunch requires an app argument.`);let l=await Uc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await Ii(o.flags??{},Un(c)),d=u.device;await o.internal?.retainDeviceExecutionLock?.(d.id);let f=Vc(d,o.flags?.surface,c);if(typeof f!=`string`)return f;let p=await Hc({shouldRelaunch:s,openTarget:c,surface:f,device:d});if(p)return p;let m=await _l({req:o,sessionStore:r,sessionName:t,device:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;return await Fr(hl,d.id,async()=>await pl({req:o,sessionName:t,logPath:n,sessionStore:r,device:d,surface:f,openTarget:c,lifecycle:h.runtime,runtimeHintPlan:g,applyRuntimeHints:h.applyRuntimeHints,clearRuntimeHints:h.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:u}))}async function yl(e){let t=await vl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Yc({...e,inspectFacts:Qi(e.inspectFacts),bindDevice:Zi(e.bindDevice),openResponse:t})}const bl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,xl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Sl(e){return t=>P(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function Cl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function wl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Tl(e){return e.available?null:P(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function El(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Dl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Eo(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return P(`SESSION_NOT_FOUND`,e)}let s=Y(`appstate`,i,a);if(s)return s;let c=b(i?.device.platform)&&Oo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return P(`SESSION_NOT_FOUND`,bl);if(u&&!c)return P(`SESSION_NOT_FOUND`,xl);if(c&&i){let e=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return P(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:E(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...C(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a});if(C(d))return P(`SESSION_NOT_FOUND`,bl);if(T(d))return P(`SESSION_NOT_FOUND`,xl);let f=await I({command:`appstate`,device:d,use:We,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>P(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:kl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:E(d),package:m.package,activity:m.activity}}}async function Ol(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=L(a.androidDeviceAllowlist),c=s?[...s].sort():void 0,u=Ie({headless:a.headless===!0}),d;try{d=await X({session:i,flags:a,androidAvdSelection:`include-stopped`})}catch(e){let t=l(e);if(u.kind===`boot-target-headless`&&!El(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return P(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(a.target&&(d.target??`mobile`)!==a.target)return P(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await Xr({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Sl(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:a.serial,androidSerialAllowlist:c};return d=u.kind===`boot-target-headless`?await(await f.bind(d,u.use)).operations.bootTargetHeadless(p):await(await f.bind(d,u.use)).operations.bootTarget(p),{ok:!0,data:{platform:E(d),target:d.target??`mobile`,device:d.name,id:d.id,kind:d.kind,booted:!0,...b(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=await X({flags:a,session:i,androidAvdSelection:`include-stopped`}),c=Tl((await Cl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return P(`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:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await wl(e.bindDevice)(s,Ze)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...b(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:P(l.error?.code??`COMMAND_FAILED`,Al(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Dl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function kl(e){let t=L(e);return t?[...t].sort():void 0}function Al(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function jl(e){let t=_r(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=H.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{H.closeSync(t)}}function Ml(e,t){da(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=vr(e);try{H.writeFileSync(r,n,`utf8`)}finally{H.closeSync(r)}}function Nl(e){let t=V.dirname(e),n=V.basename(e);H.existsSync(t)||H.mkdirSync(t,{recursive:!0});let r=gr(e);try{H.fsyncSync(r)}finally{H.closeSync(r)}let i=0;for(let e of H.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{H.unlinkSync(V.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Pl(e){return Ti.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Fl(e){try{return await Il(e)}catch(e){return{ok:!1,error:n(e)}}}async function Il(e){let t=Ll(e);if(!t.ok)return t;let n=t.session,r=le(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Rl(a,o);let c=ue({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await zl(e,n,r,c.use);case`capture-status`:return await Bl(e,n);case`capture-stop`:return await Vl(e,n)}}function Ll(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:P(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Rl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return P(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function zl(e,t,n,r){if(t.audioProbe){await fi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return P(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=Ci.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=Ci.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=V.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),c=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await xi({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...c,throwIfCanceled:e.throwIfCanceled});let l=e.sessionStore.get(e.sessionName)?.audioProbe;if(!l)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await l.handle.status()}}async function Bl(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Hl()};let r=await n.handle.status();return r.state===`stopped`&&await fi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Vl(e,t){return t.audioProbe?{ok:!0,data:await fi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Hl()}}function Hl(){return si({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Ul(e){let r=e.sessionStore.get(e.sessionName);if(!r)return P(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(ir(e.req.positionals?.[0]))throw new t(`INVALID_ARGS`,ar);uu(e.req);let n=wi({positionals:e.req.positionals,kind:fu(e.req.flags?.kind),outPath:fu(e.req.flags?.out)}),i=bi(n);if(i.kind===`capture-stop`)return Wl(e,await Jl(e,r,i.request));let a=await $i({device:r.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Wl(e,await Gl(e,r,a)):B(`perf`,a.fact)??P(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:n(e)}}}function Wl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,au(t.data)?{...t.data}:{}),t}async function Gl(e,n,r){let{device:i,plan:a}=Xi(r),o=Zi(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:eu(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:ou(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:su(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?_t.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:V.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Kl(e,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=lu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:_t.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Kl(e,t,n,r){if(t.perfCapture)return P(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return P(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=lu(e,r.outPath,i),o=ui.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=ui.createNextFence({admissionLedger:ql(e),resourcePath:o,device:t.device}),c=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await Si({admissionLedger:ql(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:c.pendingHandle,envelope:c.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:c.response}}function ql(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new t(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Jl(e,t,n){let r=t.perfCapture;if(!r)return P(`INVALID_ARGS`,`no active native perf capture`);let i=$l(r.handle.inspect(),n);if(i)return P(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(_t.expandHome(n.outPath,e.req.meta?.cwd));let a=await _i({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Yl(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function Yl(e){if(Xl(e)||Zl(e))return e;throw new t(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Xl(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Zl(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ql(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ql(e,t){return t.every(t=>typeof e[t]==`string`)}function $l(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function eu(e,t){return{...cu(e),metrics:{fps:tu(t.metric,e)},sampling:{fps:t.sampling}}}function tu(e,t){if(!au(e)||e.available!==!0)return e;let n=nu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function nu(e,t){let n=ru(t.windowStartedAt),r=ru(t.windowEndedAt)??ru(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:iu(e)})).slice(-12)}function ru(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function iu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function au(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ou(e,t){return{...cu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function su(e,t){return{...cu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function cu(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id}}function lu(e,t,n){return t?_t.expandHome(t,e.req.meta?.cwd):V.join(e.sessionStore.ensureSessionDir(e.sessionName),`${du()}-${n}`)}function uu(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new t(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function du(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function fu(e){return typeof e==`string`&&e.length>0?e:void 0}const pu=[`dump`,`log`],mu=`network requires ${pu.join(` or `)}`,hu=`network include mode must be one of: ${c.join(`, `)}`,gu=2048;async function _u(e){let t=e.sessionStore.get(e.sessionName);if(!t)return P(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=vu(e.bindDevice),r=(await n(t.device,ee)).facts.networkDump;if(!r.available)return Cu(r.hint);let i=yu(e.req);if(!i.ok)return i;let a=Fe({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return wu(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:gu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:n(e)}}}function vu(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function yu(e){let t=bu(e);if(!t.ok)return t;let n=xu(e);if(!n.ok)return n;let r=Su(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function bu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return pu.includes(t)?{ok:!0,action:t}:P(`INVALID_ARGS`,mu)}function xu(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?P(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Su(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return P(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return c.includes(r)?{ok:!0,include:r}:P(`INVALID_ARGS`,hu)}function Cu(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function wu(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:gu,maxScanLines:e.entries.length},notes:e.notes}}}function Tu(e,t){let n=yi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Eu(e.appLogFailure)]:Du(n.state)}}function Eu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Du(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function Ou(e,t){return Ue([...e,...t.notes??[]])}async function ku(e){let{req:t}=e;return t.command===`perf`?await Ul({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?ju(e):t.command===`events`?await Au(e):t.command===`network`?await _u(e):t.command===`audio`?await Fl(Uu(e)):null}async function Au(e){let{req:t,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:n(e)}}}async function ju(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return P(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Wu({...e,session:a}),r=(await n.bindDevice(a.device,te)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=Pu(re({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Mu(n,i)}catch(e){return{ok:!1,error:n(e)}}}async function Mu(e,t){switch(t.kind){case`path`:return Fu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Iu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Nu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Vu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Lu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ru(e)}}async function Nu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Bu(e,t.appBundleId,n.owner,n.operations.appLogStart):await zu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Pu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):P(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Fu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=jl(a),s=Tu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Iu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Tu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:Ou(t.notes,o)}}}function Lu(e,t,n){let r=n.resolveAppLogPath(t);return Ml(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ru(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return P(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Nl(r.resolveAppLogPath(n));return pi({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function zu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await mi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:hi.resolvePath(o.resolveSessionDir(a))});let s=Nl(o.resolveAppLogPath(a)),c=await Hu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Bu(e,t,n,r){let{session:i}=e;return i.appLog?P(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Hu(e,t,r,n)}async function Vu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return P(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await mi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:hi.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Hu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=hi.resolvePath(o.resolveSessionDir(a));try{let l=Pl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await vi({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:gi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Uu(e){if(!e.bindDevice||!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new t(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Wu(e){if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new t(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Gu(e){let t=Ku(e),n=Ge(t);return fa(`sha256`).update(n,`utf8`).digest(`hex`)}function Ku(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)=>qu(e,n[t]??null,r?.[t]??null))}}function qu(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function Ju(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=Yu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Yu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Xu({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Zu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Qu(n,r)];for(let e of s){let t=e();if(t)return t}}function Xu(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 Zu(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 Qu(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 $u(e,n){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new t(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=rt(e),a=at(e),o=Gu({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??$e(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>Ju(e,s,o)}}function ed(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function td(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ve(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function nd(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 rd(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=nd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ye(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 id(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ye(e,r),...fe(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 ad(e,t,n,r,i,a){if(n.targetEvidences)return od(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return cd(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return cd(e,n,r,i,a);if(s.kind===`post-resolution`){let c=ed({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return cd(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return ld(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=td({recorded:o,token:s.token});if(c.kind===`skip`)return cd(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,sd(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?ld(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 od(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return cd(e,n,r,i,a);let d=td({recorded:o[c],token:u.token});if(d.kind===`skip`)return cd(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,sd(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return ld(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function sd(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function cd(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 ld(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=ud(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=dd(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function ud(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function dd(e,t,n){return n.status===`guard-mismatch`?rd(e,n.evidence,t):id(e,n.evidence)}async function fd(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=jt(e.varSources),o=[],s=[],c=gd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!hd(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(_d(u,n.length,r,e))}let d=At(r,a,md(e,u)),f=Dt(a),p=t.diagnosticsMarker(),m=await ad(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:pd(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function pd(e,t){return t.length===0?e:[...new Set([...e,...t])]}function md(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function hd(e){return!!(e&&e.command!==`replay`)}function gd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(hd(n))return n.command===`close`?t:void 0}}function _d(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function vd(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:ft(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){n.update(t=>{vt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:yd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){ft(r())!==void 0&&n.update(ct)},markCompleteIfArmed(){ft(r())!==void 0&&n.update(ht)},markSessionHeldIfArmed(e){if(e.ok||!gt(r()))return e;let t=Tr(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&xd(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{bd({session:t,...e})})}}}}function yd(e){let t=V.dirname(e),n=V.basename(e,V.extname(e));return V.join(t,`${n}.healed.ad`)}function bd(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Sd({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function xd(e){e.pendingRecordAndHeal=void 0}function Sd(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 Cd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Ve(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function wd(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),nt(e.command)){let n=Td(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Ve(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Cd([...e.positionals]);n&&t.push(n)}return Ue(t).filter(e=>e.trim().length>0)}function Td(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Ed(n)?t.slice(0,-1):t}function Ed(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Dd(e){let t=Od({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 Od(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=kd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function kd(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 Ad(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!jd(n))return`manual`;let i=Md(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function jd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Nd(e.scrollRegion)}function Md(e,t){let n=Xt(t),r=Fd(e.ancestry,n,t),i=e.scrollRegion;return i&&Nd(i)?r&&Pd(i,n,t):r}function Nd(e){return e.id!==void 0||e.label!==void 0}function Pd(e,t,n){return n.some(n=>St(xt(n,t),e))}function Fd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Yt(n,t,e.length);return!r.broken&&ve(r.chain,e)})}const Id=new WeakMap;function Ld(e){return{store:t=>Rd(e,t),finalize:(t,n)=>zd({...e,evidence:t,projection:n})}}function Rd(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Zr(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Id.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Yr(a),refFrame:Qr(a)}),{evidence:s,refsGeneration:o}}function zd(e){let t=Id.get(e.evidence);Id.delete(e.evidence);let n=Vd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Bd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Hd(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ei(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Bd(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Yr(n)===t.runtimeRevision&&Qr(n)===t.refFrame}function Vd(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 Hd(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Ud(t){let{sessionStore:n,observationStore:r,sessionName:i,divergence:a,responseLevel:o}=t,s,c,l=Dr({divergence:a,level:o,writeOverflowArtifact:t=>{let r=e(t),i=Kd(n,r);return`artifactPath`in i&&(s=r,c=i.artifactPath),i}}),u=(s??l).screen;if(u.state!==`available`||u.refs.length===0)return t.evidence&&Ld({sessionStore:r,sessionName:i,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:u.state===`available`?u.refsGeneration:void 0,refs:[]}),l;if(!t.evidence)return Gd(c),Wd(l,`missing-evidence`);let d=Ld({sessionStore:r,sessionName:i,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:u.refsGeneration,refs:u.refs.map(e=>e.ref)});return d.published===!0?l:(Gd(c),Wd(l,d.reason))}function Wd(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 Gd(e){if(e)try{H.unlinkSync(e)}catch{}}function Kd(e,t){try{let n=V.join(e.ensureSessionDir(),`replay-divergence`);H.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=V.join(n,r);return H.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const qd={id:0,"role-label":1,label:2,other:3};function Jd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Yd(n.basis)<Yd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Yd(e.basis)-Yd(t.basis)||e.nodeIndex-t.nodeIndex)}function Yd(e){return qd[e]}async function Xd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,observationStore:l,resumeStamper:u,logPath:d,responseLevel:f,scrubVars:p=[],planActions:m,planDigest:h,signal:g}=e,_=Er(p),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await $d({session:o,sessionName:s,observationStore:l,logPath:d,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},b=rf(y,_),x=y.state===`available`&&o?lf({action:n,session:o,nodes:y.nodes,sanitize:_}):[],S=Ad({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Zd(y)}),C=Dd({failedIndex:r+1,actions:m,planDigest:h,repairHint:S,resumeStamper:u});return Ud({sessionStore:c,observationStore:l,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(tt(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:C,repairHint:S},responseLevel:f,evidence:y.state===`available`?y.evidence:void 0,...g?{signal:g}:{}})}function Zd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Qd=[300,500,800,1200,2e3,3e3,4e3];async function $d(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=tf(a),c=Date.now()+12e3,l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Qd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await xr(Math.min(e,a)),l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s})}return l.observation}async function ef(e){let{session:t,sessionName:n,observationStore:r,logPath:i,flags:a}=e;try{let e=(await ti({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(Yi(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=Ld({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:Pr(e)}}}function tf(e){return{snapshotInteractiveOnly:nf(e)}}function nf(e){return!uf(e.command)||df(e).requiresRect}function rf(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=cf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function af(e){return!!ur(e,cr(e.type??`Element`))||e.hittable===!0}function of(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function sf(e,t){let n=$t(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&af(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=>of(e,t)),...o.filter(e=>!of(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function cf(e,t,n){let{nodes:r,truncated:i}=sf(e,n);return{refs:r.map(e=>{let n=cr(e.type??`Element`),r=ur(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function lf(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!uf(t.command))return[];let a=wd(t);return a.length===0?[]:ff({candidates:a,nodes:r,session:n,action:t,matching:df(t),sanitize:i})}function uf(e){return nt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function df(e){let t=nt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function ff(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=pf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Jd(s).map(e=>e.suggestion)}function pf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Pe(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:mf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function mf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Oe(t,r.device.platform,{action:i.command===`fill`?`fill`:nt(i.command)?`click`:`get`,nodes:n}),c=cr(t.type??`Element`),l=ur(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function hf(e){return{...e,hint:e.hint??vf(e.details,`hint`),diagnosticId:e.diagnosticId??vf(e.details,`diagnosticId`),logPath:e.logPath??vf(e.details,`logPath`)}}function gf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return _f({error:t,actionLabel:tt(n),action:n.command,positionals:lt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function _f(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:wr(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:wr(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...bf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>wr(e,u))}:{},divergence:l}}}}function vf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const yf=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function bf(e){if(!e)return{};let t={};for(let n of yf)e[n]!==void 0&&(t[n]=e[n]);return t}async function xf(e){return await Sf({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function Sf(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,observationStore:p,resumeStamper:m,logPath:h,planActions:g,planDigest:_}=e;if(t.ok)return t;let v=Cf(t.error.details?.replaySource),y=hf(t.error),b=await Xd({error:y,action:n,index:r,sourcePath:v?.path??a,sourceLine:v?.line??o,session:p.get(),sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:g,planDigest:_,signal:N(u.meta?.requestId)});return gf({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function Cf(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 wf(t,n){if(t)try{H.appendFileSync(t,`${JSON.stringify(e(n))}\n`)}catch(e){M({level:`warn`,phase:`replay_trace_write_failed`,data:{path:t,error:e instanceof Error?e.message:String(e)}})}}async function Tf(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();wf(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:lt(o)??[]});let m;try{m=await Df({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(e){if(!(e instanceof t))throw e;m={ok:!1,error:n(e)}}let h=Date.now();return wf(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?kf(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Ef(m,u??s,c)}function Ef(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 Df(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Af(t.flags,r.flags),s=i.command===`fill`?Bt(Wt(i)):void 0;return s&&(o.recordAs=s),await a(Of({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??zi(t)}:{}}},r))}function Of(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:et(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ot(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function kf(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 Af(e,t){return p(e,{...t??{}})}function jf(e){return Rf(e.ok?Nf(e.data):Mf(e.error.details?.artifactPaths))}function Mf(e){return Array.isArray(e)?e.filter(Lf):[]}function Nf(e){return e?[If(e.path),If(e.outPath),...Pf(e.artifacts)].filter(Lf):[]}function Pf(e){return Array.isArray(e)?e.map(Ff).filter(Lf):[]}function Ff(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return If(t.localPath)??If(t.path)}function If(e){return typeof e==`string`?e:void 0}function Lf(e){return typeof e==`string`}function Rf(e){return[...new Set(e.filter(zf))]}function zf(e){try{return H.statSync(e).isFile()}catch{return!1}}function Bf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Vf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Xt(r),u=ie(t),d=Jt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Ct(r,e)===t.sibling),p=d.filter(e=>St(xt(e,l),t.scrollRegion)),m=yt(p)[t.viewportOrder]?.ref,h=bt({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Wf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Vf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Hf(n,t,i,a):Uf(n,t,r,a,o)}function Hf(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),o=a(t),c=o?s(e,o):null;if(i(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Qt(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Uf(e,t,n,r,i){let a=Le(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=en(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Wf(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?Gf(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?Gf(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?Gf(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 Gf(e,t,n){let r=wt(t),i=Yt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ye(e,r),...fe(e.ancestry,i)].slice(0,5)}function Kf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=st(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ve(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!nt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Jf(r)&&Jf(n[1])))return r}function qf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Jf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Yf(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=Er(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:ap(ie(n),g),...t.observed?{observed:ap(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>op(e,g))},v=Ad({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Dd({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b={version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(tt(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:_},x=Ud({sessionStore:u,observationStore:e.observationStore,sessionName:l,divergence:b,responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return gf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:x,scrubVars:p})}function Xf(e,t,n){let r=Er(e.scrubVars);return Yf(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:rf(n,r),publicationEvidence:ep(n),repairCapture:Zd(n)})}async function Zf(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await $d({session:t,sessionName:n,observationStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function Qf(e,t){return Xf(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 Zf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function $f(e,t,n){return Xf(e,t,await Zf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ep(e){return e.state===`available`?e.evidence:void 0}function tp(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?he(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Re(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Kf(n,i),platform:a.device.platform}:{kind:`inactive`}}function np(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=df(r),s=Bf({recorded:t,token:n,nodes:i,platform:a,refLabel:qf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:wt(s.winnerNode),structural:xe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?wt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function rp(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function ip(e){return!e.ok&&e.error.details?.reason===Zt}function ap(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function op(e,t){let n=cr(e.type??`Element`),r=ur(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function sp(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function cp(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 lp(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 up(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 dp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:cp(e?.observed),expectedStructural:up(e?.expectedStructural),observedStructural:up(e?.observedStructural)}}function fp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:cp(e?.observed),observedAncestry:lp(e?.observedAncestry)}}function pp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function mp(e,t,n){let r=pp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&rp(e)?{status:`guard-mismatch`,evidence:dp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&ip(e)?{status:`landmark-mismatch`,evidence:fp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function hp(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,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,pp(gp(e),jf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return tp({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await $d({session:i,sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return np({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Tf({req:sp(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,jf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:mp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await Qf(c(e,n,r,i),{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Xf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await $f(c(e,n,i,a),r,{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=gp(o),u=await _p(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=>vp(e),onStep:i,diagnosticsMarker:()=>bp(t.sessionStore),diagnosticsSince:e=>xp(t.sessionStore,e)},readLastResponse:()=>o}}function gp(e){return e&&!e.ok?e:P(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function _p(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return yp(i)?c(i):c(await xf({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,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function vp(e){let t=e.positionals??[],n=Me(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function yp(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 bp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function xp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Sp(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Cp(t,i)};return Tp(o,`AD_PLATFORM`,a.platform??r.platform),Tp(o,`AD_TARGET`,a.target??r.target),Tp(o,`AD_DEVICE`,a.device),Tp(o,`AD_DEVICE_ID`,wp(a)),Ep(o,`AD_SHARD_INDEX`,a.shardIndex),Ep(o,`AD_SHARD_COUNT`,a.shardCount),Tp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Cp(e,t){let n=e.meta?.cwd??process.cwd();return V.relative(n,t)||t}function wp(e){return typeof e.serial==`string`?e.serial:e.udid}function Tp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Ep(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Dp=3e4,Op=1e3;function kp(e){let{scriptPath:r,env:i,publicNetworkOnly:a}=e,o=H.readFileSync(r,`utf8`),s=Object.create(null);try{ga.runInNewContext(o,Ap(i,s,a),{filename:r,timeout:Dp})}catch(e){let i=n(e);throw new t(i.code,`Maestro runScript failed: ${i.message}`,u({...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 Lp(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Rp(t)]))}function Ap(e,t,n){return{...e,output:t,json:jp,http:{post:(e,t)=>Np(`POST`,e,n,t)}}}function jp(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`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,Mp)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,Op)},n instanceof Error?n:void 0)}}function Mp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Np(e,n,r,i){let a=br(process.execPath,Pp(),{stdin:JSON.stringify(Ip(e,n,i,r)),timeoutMs:Dp,allowFailure:!0});if(a.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${zp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:a.stdout.slice(0,Op),stderr:a.stderr.slice(0,Op)},r instanceof Error?r:void 0)}}function Pp(){let e=Fp(import.meta.url);if(!e)throw new t(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Fp(e){try{let t=ma(e),n=V.extname(t)||`.js`;return[V.join(V.dirname(t),`run-script-http-child`+n),V.join(V.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>H.existsSync(e))??null}catch{return null}}function Ip(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Lp(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function Rp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function zp(e){let t=e.trim();return t.length>0?t.slice(0,Op):`request process exited without stderr`}async function Bp(e){return await Vp(`tap`,async t=>{let n=V.join(t,`before.png`),r=V.join(t,`after.png`),i=await Up(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Up(e,r)))return await Hp(n,r,e.signal,`tap`)}})})}async function Vp(e,t){let n=await U.mkdtemp(V.join(pa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await U.rm(n,{recursive:!0,force:!0})}catch{}}}async function Hp(e,t,n,r){try{let[i,a]=await Promise.all([U.readFile(e),U.readFile(t)]);qp(n);let o=await Ji(i,a,`Maestro screenshot`);return qp(n),Wp(o,r)}catch(e){Kp(e,n),M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Up(e,t){try{return await U.rm(t,{force:!0}),qp(e.signal),await e.capture(t),qp(e.signal),!0}catch(t){return Kp(t,e.signal),!1}}function Wp(e,t){if(e.status!==`compared`)return Gp(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return Gp(t,n?`stable`:`changed`,e),n}function Gp(e,t,n){M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Kp(e,t){if(t?.aborted||o(e))throw r()}function qp(e){if(e?.aborted)throw r()}async function Jp(e){Xp(e.timeoutMs),qp(e.signal);let t=e.now()+e.timeoutMs;return await Vp(`animation`,async n=>{let r=V.join(n,`first.png`),i=V.join(n,`second.png`);for(;;){if(qp(e.signal),await Yp(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Yp(e,t,n){let r=[await Up(e,t),await Up(e,n)];return!r[0]||!r[1]?!1:await Hp(t,n,e.signal,`animation`)===!0}function Xp(e){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Zp=J.observationPollMs;async function Qp(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!mm(n)||(Z(e.context.signal),!await fm(e.dependencies,t,Zp,e.context.signal)))throw n}}}function $p(e){return em({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function em(e){let t=Ri(e.snapshot),n=e.platform===`ios`?ea(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:i(n.nodes)}:e.snapshot;return am(mo(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function tm(e){pm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await Qp(e,n),i=em({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ya(e.condition,i))return i;if(e.dependencies.now()>=n)break;await fm(e.dependencies,n,Zp,e.context.signal)}return Z(e.context.signal),_m(t)}async function nm(e){pm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await Qp(e,t);if(r=void 0,n=em({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===J.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),_m(n)}async function rm(e){pm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Qp(e,t),r=hm(n);for(;;){Z(e.context.signal),await fm(e.dependencies,t,Zp,e.context.signal);let i=await Qp(e,t),a=hm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function im(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function am(e,t,n,r,i,a,o){if(!e.ok){let t=im(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=sm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=im(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:om(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:hm(t)}:{}}}function om(e,t){return!Xe(e)||!Xe(t)?0:_e(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 sm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!cm(t,n,r)||i!==1))return lm(t.selector)}function cm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!ho(e.selector)}function lm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!um(n)||typeof r!=`string`)return;let i=tn(r)?.trim();return i?{key:n,value:i}:void 0}function um(e){return e===`id`||e===`label`||e===`text`}async function dm(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?r():e}Z(n)}async function fm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await dm(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw r()}function pm(e,n){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function mm(e){return e instanceof t&&e.details?.retriable===!0}function hm(e){return fa(`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:gm(e.rect)})))).digest(`hex`)}function gm(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 _m(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function vm(e){return e.kind===`clearState`?Cm(e):ym(e)?bm(e):jm(e)?Mm(e):Tm(e)}function ym(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function bm(e){switch(e.kind){case`launchApp`:return xm(e);case`stopApp`:return Sm(e);case`openLink`:return wm(e)}}function xm(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 Sm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function Cm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function wm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Tm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Em(e);case`clickPoint`:return Dm(e);case`swipe`:return Om(e);case`scroll`:return km(e);case`pressKey`:return Am(e)}}function Em(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Dm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Om(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 km(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Am(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function jm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Mm(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 Nm(e,n){let r=vm(n),{input:i,flags:a,internal:o,...s}=e.baseReq,c=Pm(a,r.flags??{}),l=u({...o,...r.internal,...n.kind===`snapshot`?{observationOnly:!0}:{}}),d=await e.invoke(u({...s,command:r.command,positionals:r.positionals,input:r.input,flags:c,internal:Object.keys(l).length>0?l:void 0}));if(!d.ok)throw Bm(d);if(n.kind===`gestureViewport`){let e=d.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new t(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return d.data}function Pm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=u({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Fm(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 Im(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 Lm(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 Rm(e,n,r){if(V.isAbsolute(e))return e;let i=n.source?.path??r;if(!i)throw new t(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return V.resolve(V.dirname(i),e)}function zm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Bm(e){let n=e.error,r=u({...n.details??{},hint:n.hint??Vm(n.details,`hint`),diagnosticId:n.diagnosticId??Vm(n.details,`diagnosticId`),logPath:n.logPath??Vm(n.details,`logPath`),retriable:n.retriable??Hm(n.details,`retriable`),supportedOn:n.supportedOn??Vm(n.details,`supportedOn`)});return new t(n.code,n.message,Object.keys(r).length?r:void 0)}function Vm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Hm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Um(e){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Nm(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new t(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=_(i,i);return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=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 t(`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 t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function Wm(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 Qp({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=$p({query:t,context:n,snapshot:o,platform:i.platform});if(Xm(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await fm(i.dependencies,a,Zp,n.signal)}}}async function Gm(e,t,n,r,i,a){let o=async()=>await Jm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Bp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Nm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await Km(e,t,n,r,i,a.click,o)});return}await Km(e,t,n,r,i,a.click)}async function Km(e,t,n,r,i,a,o){let s=async()=>await Jm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:hm(await t.capture(i))),l=async()=>{let r=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await qm({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 qm(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<J.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Jm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Zm(e,o,n.point,i);return}catch(n){if(!Qm(n))throw n;let o=await Wm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Ym(o))throw n;t.invalidate(r.generation),await $m(e,Nr(o.rect),i);return}}t.invalidate(r.generation),await $m(e,n.point,i)}function Ym(e){return e.matched&&e.visible&&e.rect!==void 0}function Xm(e,t){return Ym(e)?!t||e.dispatchSelector!==void 0:!1}async function Zm(e,t,n,r){M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Nm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Qm(e){let t=l(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===lr.selectorNotFound}async function $m(e,n,r){if(!n)throw new t(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await Nm(e,{kind:`clickPoint`,point:n,options:r})}function eh(e){let t=Um(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},r=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},i=e.platform,a=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Nm(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,i)=>{hr(n),await s({kind:`typeText`,text:n},i);let a=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});r(a),t.prime(i.generation,a.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await Wm({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await tm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async()=>await a({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Fm(e.arguments),...Fm(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)},clearState:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`clearState`,...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(r,i)=>await Gm(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>$m(e,t.target.point,u({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>$m(e,t.target.point,{holdMs:J.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??J.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await nm({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=Oa(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 rm({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw jn(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Im(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 Jp({timeoutMs:t.timeoutMs??J.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Lm(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:kp({scriptPath:Rm(t.file,n,e.sourcePath),publicNetworkOnly:e.baseReq.internal?.publicNetworkOnly===!0,env:{...n.env,...t.env?zm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function th(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=eh(e);return So(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function nh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),rh(()=>oh(r,e)),rh(()=>sh(n,t,e))},actionCompleted:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!0))},actionFailed:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!1))}}}function rh(e){try{e()}catch{}}function ih(e,t){let n=e.get(t);return e.delete(t),n}function ah(e,t){return u({...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 oh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function sh(e,t,n){wf(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 ch(e,n,r,i){let a=lh(r);wf(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{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 t?{errorCode:r.error.code}:{}})}function lh(e){let t=`data`in e?e.data:void 0,n=uh(t?.timing)?t.timing:void 0;return u({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function uh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function dh(e,t){return pn(e,t)}function fh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:gh(e.action),positionals:_h(e.action,e.value),flags:t.flags??{}}}}async function ph(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,observationStore:o,logPath:s}=e,c=N(r.meta?.requestId),l=fh(t,r),u=hf(e.error),d=[...t.redactions],f=Er(d),p={...u,message:f(u.message),...u.hint?{hint:f(u.hint)}:{}},m=o.get(),h=m?await $d({session:m,sessionName:i,observationStore:o,logPath:s,action:l.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},g=m&&h.state===`available`&&!t.isControl?mh({failure:t,action:l.action,session:m,nodes:h.nodes,sanitize:f}):[],_=[t.action,hh(t.value)].filter(Boolean).join(` `),v=Ud({sessionStore:a,observationStore:o,sessionName:i,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:f(t.source.path??n),line:t.source.line}},action:f(_),cause:{code:p.code,message:p.message,...p.hint?{hint:p.hint}:{}},screen:rf(h,f),suggestions:g.slice(0,5),suggestionCount:g.length,resume:t.resume,repairHint:Ad({kind:`action-failure`,targetEvidence:void 0,capture:Zd(h)})},responseLevel:r.meta?.responseLevel,evidence:h.state===`available`?h.evidence:void 0,...c?{signal:c}:{}});return _f({error:p,actionLabel:_,action:t.action,positionals:[...l.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:v,scrubVars:d,warnings:t.warnings})}function mh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Jd(dh(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>mf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function hh(e){return!e||e===`<text>`?e??``:it(e)}function gh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function _h(e,t){return!t||e===`inputText`?[]:[t]}function vh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=bh(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:xh(c,Date.now()-r)}}}async function yh(e){let{command:t,replayPath:r,state:i,outcome:a}=e,{request:o,session:{name:s,store:c,observationStore:l,logPath:u}}=t,{failure:d}=a,f=n(a.error);return d?await ph({error:f,failure:d,replayPath:r,req:o,sessionName:s,sessionStore:c,observationStore:l,logPath:u,snapshotDiagnostics:bh(c,i.snapshotStart)}):{ok:!1,error:f}}function bh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return m(n)}function xh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Sh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return P(`INVALID_ARGS`,sn);if(t.flags?.saveScript!==void 0)return P(`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 Ch({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await yh({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Ch(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c,invoke:l}=t,u=await wh({command:t,bundle:n}),d=jh({req:a,invoke:l,device:u.device,platform:u.platform,runtimeHints:u.runtimeHints,sourcePath:u.filePath});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await _n(u.flow,d,{defaults:u.defaults,env:u.env,platform:u.platform,target:u.target,runtimeHints:u.runtimeHints,signal:u.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:a.internal?.publicNetworkOnly!==!0,readSource:e=>un(n,e),observer:nh({filePath:u.filePath,tracePath:s,onStep:c})});return f.ok?vh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await yh({command:t,replayPath:n.entry,state:i,outcome:f})}async function wh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=tr(un(n,o),o),c=a.lookup(),l=c?.session;c&&Wi(c,r.flags);let u=await Th({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:kh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Ah(r),signal:N(r.meta?.requestId)}}async function Th(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 Fi(t.flags??{},mn(a.appTarget,o))),c=Ih(t,s),l=Dh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Eh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Lh(t,s),runtimeHints:l,flow:a})}async function Eh(e){if(e.device||!Oh(e.runtimeHints))return e;let t=await Fi(e.req.flags??{},mn(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Lh(e.req,t),runtimeHints:Dh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Dh(e){return Bn({req:e.req,sessionStore:{getRuntimeHints:t=>t===e.sessionName?e.sessionStore.getRuntimeHints():void 0},sessionName:e.sessionName,device:e.device,platform:e.platform})}function Oh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function kh(e){return{...Sp({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Ah(e){return{...kt(Ot(e.flags?.replayShellEnv)),...Et(Tt(e.flags?.replayEnv))}}function jh(e){let{req:t,invoke:n,device:r,platform:i,runtimeHints:a,sourcePath:o}=e,{command:s,positionals:c,input:l,flags:d,...f}=t;return th({baseReq:u({...f,flags:Mh(r,i,t.flags),runtime:a}),invoke:n,platform:i,sourcePath:o,dependencies:{now:Date.now,sleep:async(e,t)=>{await ha(e,void 0,{signal:t})}}})}function Mh(e,t,n){if(!e)return Nh(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 Nh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Ph(n,t):Fh(n,t)}function Ph(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Fh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Ih(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new t(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Lh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function Rh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(Nt(t,a.flags?.replayBackend)===`maestro`)return n?P(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Sh(i):P(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function zh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Bh(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=Vh(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(),_=Hh({req:t,coordinator:s,manifest:l,preEntrySession:g});return _.ok?{ok:!0,value:{replayReq:u,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h,preEntrySession:g,entryIndex:_.value,varSources:Wh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Bh(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return P(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Vh(e,t){let n=$u(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Uh({...e,flags:hn(e.flags,n.actions)},n.metadata)}}function Hh(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:P(`INVALID_ARGS`,a.message)}}function Uh(e,t){return!t.platform&&!t.target?e:{...e,flags:Gh(e.flags,t)}}function Wh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Sp({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:kt(Ot(t.flags?.replayShellEnv)),cliEnv:Et(Tt(t.flags?.replayEnv))}}function Gh(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 Kh(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=qh({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Xh({req:t,coordinator:a}),Yh({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function qh(e){let t=Zh(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return Kr()}function Jh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?P(`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.`):Qh({saveScript:t,liveForce:n,persistedForce:Vt(r)||void 0,sourcePath:i,existingSaveScriptPath:Ft(r)})}function Yh(e){let{req:t,sessionStore:n,sourcePath:r,coordinator:i}=e,a=n.get(),{saveScript:o,force:s}=t.flags??{},c=Jh({saveScript:o,force:s,preRunState:a?.scriptPublication??It,sourcePath:r});return c?{ok:!1,response:c}:(i.demoteForRerunIfArmed(),{ok:!0,armSaveScript:$h({saveScript:o,force:s,coordinator:i,sourcePath:r})})}function Xh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Zh(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return P(`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 Qh(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?kr(t):a??yd(i);if(!(n||r&&o===a)&&H.existsSync(o))return P(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function $h(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 eg(e){let{request:t,session:{name:n,logPath:r,store:i,mutationStore:a,observationStore:o},tracePath:s,onStep:c,invoke:u}=e,d=t.flags?.replayScriptSource;if(!d)return P(`INVALID_ARGS`,sn);let f=Date.now(),p=t.flags?.replayKeepSession===!0,m=``,h=new Set,g=vd({sessionStore:i,mutationStore:a});try{if(m=d.entry,Pt(m)&&t.flags?.replayBackend!==`maestro`)return P(`INVALID_ARGS`,Mt(`replay`,m));let a=await Rh({resolved:m,keepSession:p,coordinator:g,command:e});if(a)return a;let l=zh({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:m,script:un(d,m),coordinator:g});if(!l.ok)return l.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=l.value,T=Kh({req:t,entryIndex:S,sessionStore:i,sourcePath:m,coordinator:g});if(!T.ok)return T.response;let{runtime:E,readLastResponse:ee}=hp({ctx:{replayReq:_,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:m,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:u,signal:N(t.meta?.requestId),coordinator:g},req:t,artifactPaths:h,onStep:c,armSaveScript:T.armSaveScript}),D=await fd({actions:v,entryIndex:S,keepSession:p,actionLines:y,actionSourcePaths:b,resolvedPath:m,varSources:C},E);return D.status===`failed`?ee()??P(`COMMAND_FAILED`,`replay step failed with no recorded response`):tg({startedAt:f,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:g,keepSession:p})}catch(e){let t=l(e);return P(t.code,t.message,h.size>0?{artifactPaths:[...h]}:void 0)}}function tg(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=rg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=m([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:ng(i,Date.now()-t)}}}function ng(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function rg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return P(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function ig(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=V.resolve(n??`.`,t??`.agent-device/test-artifacts`);return V.join(i,r)}function ag(e,t){let n=t?V.relative(t,e):V.basename(e),r=n.length===0||n.startsWith(`..`)?V.basename(e):n;return ze(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function og(e,t){H.mkdirSync(t,{recursive:!0}),lg(e,t)}function sg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=V.join(o,`result.txt`),u=V.join(o,`failure.txt`),d=cg([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>V.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
-
`)}\n`;H.writeFileSync(l,p),s||H.writeFileSync(u,p)}function cg(e,t,n){let r=[],i=new Set(n.map(e=>V.basename(e).toLowerCase()));for(let n of e){if(!dg(n))continue;let e=V.basename(n);if(V.resolve(n)===V.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=ug(e,t,i),o=V.join(t,a);H.copyFileSync(n,o),r.push(o)}return r}function lg(e,t){let n=V.join(t,`replay.ad`);if(H.copyFileSync(e,n),V.extname(e).toLowerCase()===`.ad`)return;let r=V.join(t,V.basename(e));V.resolve(r)!==V.resolve(n)&&H.copyFileSync(e,r)}function ug(e,t,n){let r=V.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||H.existsSync(V.join(t,a));)a=`${i}-${o++}${r}`;return a}function dg(e){try{return H.statSync(e).isFile()}catch{return!1}}function fg(e){let{platformFilter:n,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}vg(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=n?` for --platform ${n}`:``;throw new t(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function pg(e,t,n,r,i=0){let a=V.basename(n,V.extname(n)),o=ze(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function mg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return ze(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function hg(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,V.basename(r),`attempt`,a+1].join(`:`)}function gg(e,t){return typeof e==`number`?e:t}function _g(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function vg(e,t){return e===`apple`?b(t):t===e}function yg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const bg=2e3;async function xg(e){let{filePath:t,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=Og({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>yg({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(kg(o,[...v]))},o)})]):await w,Q(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 Cg(w)||(x=Eg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:bg}}),wg({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await Tg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Dg(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=Sg(x,i,v)}}return x??yg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Sg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:yg({error:t,artifactPaths:[...n],infrastructure:!0})}async function Cg(e){return await Promise.race([e.then(()=>!0),ha(bg).then(()=>!1)])}async function wg(e){let{replayPromise:t,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:n(e).message}})}}}async function Tg(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Q(o,e)});return Q(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 t=n(e);return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:t.message}}),yg({error:t})}}function Eg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Dg(e,t){return{...e,warnings:[...e.warnings,t]}}function Og(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=V.join(t,`replay-timing.ndjson`);return H.mkdirSync(V.dirname(l),{recursive:!0}),H.writeFileSync(l,``),n.add(l),Q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Q(e,t){e&&H.appendFileSync(e,`${JSON.stringify(t)}\n`)}function kg(e,t=[]){return yg({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 Ag(e){let t=jg(e),n=await Mg(e,t);return{result:Rg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function jg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:V.join(i,...a?[`shard-${a.shardIndex+1}`]:[],ag(t.path,n)),maxAttempts:r+1}}async function Mg(e,t){Pg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Ng(e,t,r);if(Fg(n,i),Ig(e,i.outcome,r))break;Lg(e,t,i)}return n}async function Ng(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=pg(i,a,r.path,o,n),h=V.join(t.testArtifactsDir,`attempt-${f}`);og(r.path,h);let g=hg({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,...Ug(d)},v=await xg({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 sg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Pg(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:pg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Ug(c)})}function Fg(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 Ig(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Lg(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,...Ug(e.shard)})}function Rg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?zg(e,t,n,r):Bg(e,t,n,r)}function zg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Ug(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}:{},...Hg(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Bg(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,...Ug(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...Vg(c),...Hg(s)}}function Vg(e){let t=e?.status===`failed`?e:void 0;return{...t&&t.warnings.length>0?{warnings:[...t.warnings]}:{},...t?.infrastructure?{infrastructure:!0}:{},...e?.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function Hg(e){return Ug(e)}function Ug(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Wg(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 Gg(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c,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(),l=await Kg(t,u,d);Xg(l,a);let p=l.shardPlan?Zg({entries:l.entries,total:l.total,emitProgress:a}):[];return l.shardPlan?p.push(...await Qg({shards:l.shardPlan.shards,sessionName:f,suiteInvocationId:l.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:l.suiteArtifactsDir,suiteTotal:l.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c})):p.push(...await n_({discoveryEntries:l.entries,sessionName:f,suiteInvocationId:l.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:l.suiteArtifactsDir,suiteTotal:l.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c})),{status:`completed`,data:a_(l.total,p,Date.now()-e,l.suiteArtifactsDir)}}catch(e){let t=l(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Kg(e,t,n){let r=qg(e,t),i=Jg(r),a=r.length-i.length,o=mg(e.requestId),s=await Wg(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:Yg(e,o),total:s?.total??r.length}}function qg(e,t){return fg({platformFilter:e.platformFilter,discoverSources:t})}function Jg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Yg(e,t){return ig({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Xg(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 Zg(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 Qg(e){return(await Promise.allSettled(e.shards.map(async t=>await e_({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[$g(r,e.sessionName,t.reason)]:[]})}function $g(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:t_(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function e_(e){let{shard:t,sessionName:n}=e;return await r_({...e,entries:t.entries,sessionName:t_(n,t),shard:t})}function t_(e,t){return`${e}:shard-${t.shardIndex+1}`}async function n_(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 Ag({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:_g(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:gg(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),i_(t,o,p))break}return g}async function r_(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 Ag({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:_g(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:gg(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),i_(b,o,m))break}return _}function i_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function a_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=g(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function o_(e,t){return()=>e.map(e=>s_(e,t))}function s_(e,t){let n=e.entry,r=un(e,n),i=Nt(n,t)===`maestro`,a=at(r);return{path:n,manifest:{...i?{title:tr(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function c_(e){return async t=>(await d_(e,t)).map(l_)}function l_(e){if(e.platform===`web`||!x(e))throw new t(`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 u_(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 d_(e,n){let r=h_(e),i=p_(await Ni(f_(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${m_(n)}, but only ${i.length} matched`);return i.slice(0,n)}function f_(e){let t=L(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:y({simulatorSetPath:ji(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function p_(e,t,n){return t.length>0?g_(e,t,n):e.filter(e=>__(e,n)).sort(b_)}function m_(e){return`${e} device${e===1?``:`s`}`}function h_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function g_(e,n,r){return n.map(n=>{let i=y_(n),a=e.find(e=>v_(e,r)&&(e.id===n||y_(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function __(e,t){return!v_(e,t)||!x(e)?!1:e.booted!==!1}function v_(e,t){return!(!v(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function y_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function b_(e,t){return e.id.localeCompare(t.id)}function x_(e){let n=S_(e?.shardAll,`--shard-all`),r=S_(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function S_(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}const C_=new Set([`IOS_BOOT_TIMEOUT`,`IOS_RUNNER_CONNECT_TIMEOUT`,`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,`IOS_TOOL_MISSING`,`ANDROID_BOOT_TIMEOUT`,`ADB_TRANSPORT_UNAVAILABLE`,`CI_RESOURCE_STARVATION_SUSPECTED`]);function w_(e){return C_.has(e.toUpperCase())}const T_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function E_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=D_(e);return t?O_(t.details)||k_(t.code,t.message):!1}function D_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function O_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||Wn(t)?!0:t?w_(t):!1}function k_(e,t){let n=`${e}\n${t}`.toLowerCase();return T_.some(e=>n.includes(e))}function A_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:N_(e.error.details?.artifactPaths),warnings:sr(e.error.details),infrastructure:E_(e),...P_(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:sr(t),artifactPaths:N_(t?.artifactPaths),...P_(t?.snapshotDiagnostics)}}function j_(e){if(!e||e.ok)return;let t=A_(e);return t.status===`failed`?t:void 0}function M_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function N_(e){return[...new Set(M_(e))]}function P_(e){let t=h(e);return t?{snapshotDiagnostics:t}:{}}const F_=1e3,I_=3e3;function L_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await R_(e)}}async function R_(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=Cr(o.device.platform),c=i?V.join(i,`recording${s}`):Sr(o.device.platform);B_(a,{type:`video_recording_start`,session:n,videoPath:c}),M({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(V_({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return B_(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await xr(F_),B_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:F_}),M({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:F_}}),l}async function z_(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;B_(a,{type:`video_tail_start`,session:n,requestedDurationMs:I_});let o=Date.now();await xr(I_);let s=Date.now(),c=await e.video.record(V_({req:t,sessionName:n,phase:`stop`}));return jf(c).forEach(e=>i.add(e)),B_(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),M({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function B_(e,t){e({...t,ts:new Date().toISOString()})}function V_(e){let t={token:e.req.token,meta:e.req.meta};return e.phase===`start`?{request:t,sessionName:e.sessionName,phase:`start`,outputPath:e.outputPath}:{request:t,sessionName:e.sessionName,phase:`stop`}}const H_=[{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.`}],U_=({attemptId:e,parentAttemptId:t})=>{Hr(e);let n=W_(e,t);return{cancel:()=>zr(e),release:()=>{n(),Vr(e)}}};function W_(e,t){if(!t||t===e)return()=>{};let n=N(t);if(!n)return()=>{};let r=()=>{zr(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function G_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=K_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:u_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function K_(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function q_(e){let{request:t,session:{name:n,logPath:r},createSession:i,invoke:a,cleanupSession:o,video:s}=e;if(t.flags?.recordVideo===!0&&s===void 0)return P(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let c=t.flags??{};for(let e of H_)if(e.requested(c))return P(`INVALID_ARGS`,e.message);let u,d;try{u=X_(t,n),d=Y_(t)}catch(e){let t=l(e);return P(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Gg({request:u,emitProgress:Ur,isCanceled:()=>Br(t.meta?.requestId),emitDiagnostic:M,bindAttemptCancellation:U_,runReplay:async({filePath:e,sessionName:n,platform:o,target:c,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&jf(e).forEach(e=>d.add(e)),e),v=G_({parentFlags:t.flags,platform:o,target:c,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=i(n,r),b=s?{req:t,sessionName:n,sessionStore:y.store,artifactsDir:u,appendTimingEvent:m,video:s}:void 0,x=b?L_(b):void 0;return A_(await eg({request:{...t,command:`replay`,session:n,positionals:[e],flags:v,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||x?{internal:{...t.internal??{},...x?{openLifecycle:x}:{}}}:{}},session:y,tracePath:p,onStep:g,invoke:async e=>{let t=b?await R_(b):void 0;return t&&!t.ok?t:_(await a(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,appendTimingEvent:o})=>{if(s)return j_(await z_({req:t,sessionName:e,sessionStore:i(e,r).store,artifactsDir:a,appendTimingEvent:o,artifactPaths:n,video:s}))},discoverSources:o_(d,t.flags?.replayBackend),resolveShardTargets:c_(t.flags),cleanupSession:o});return p.status===`completed`?{ok:!0,data:J_(p.data,t)}:P(p.error.code,p.error.message)}function J_(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=V.join(n,V.basename(r)),a=e=>e===r||e.startsWith(r+V.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return H.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:V.basename(r)}]}:o}function Y_(e){let n=e.flags?.replayScriptSources;if(!n)throw new t(`INVALID_ARGS`,sn);return n}function X_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=Q_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:kr(i,r),failFast:n.failFast===!0,retries:Z_(n.retries),timeoutMs:Z_(n.timeoutMs),shard:x_(n)}}function Z_(e){return typeof e==`number`?e:void 0}function Q_(e){return typeof e==`string`?e:void 0}function $_(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await aa({req:ev(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function ev(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const tv=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await eg({request:e,session:rv(t,n,r),invoke:a??i}),nv=async({req:e,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=$_({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await q_({request:e,session:rv(n,r,i),createSession:(e,t)=>rv(e,t,i),invoke:s??o,cleanupSession:async t=>await iv({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function rv(e,t,n){let r=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1};return{name:e,logPath:t,store:{get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)},mutationStore:{update:r,clearRepairTombstone:()=>n.clearRepairTombstone(e)},observationStore:{get:()=>n.get(e),update:r}}}async function iv(e){let{req:n,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await sc({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new t(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function av(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command!==rr.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return lv(new t(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return lv(new t(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=cv(a);if(o)return lv(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return lv(new t(`INVALID_ARGS`,`session save-script path cannot be empty.`));Rt(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:qt(a,n.flags?.force),publication:`active`});return c.written?(Ut(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...j(`Published script: ${c.path}`)}}):lv(c.error??new t(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function ov(e){if(dt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Lt(e)?void 0:`not-armed`}const sv={repair:()=>new t(`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 t(`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 t(`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 t(`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 cv(e){let t=ov(e);return t?sv[t]():void 0}function lv(e){return{ok:!1,error:n(e)}}function uv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function dv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$r(e)}}async function fv(e,n,r){if(r.length!==1)throw new t(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(dv(n))}}async function pv(e,n,r){if(r.length<2)throw new t(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...dv(n),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...j(`Clipboard updated`)}}async function mv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await I({command:`clipboard`,device:t,use:ke,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>fv(n,e,r)}}let o=await I({command:`clipboard`,device:t,use:Ne,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>pv(s,e,r)}}async function hv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=Y(nr.clipboard,s,c);if(l)return l;let u=t.positionals??[],d=uv(u);if(!d)return P(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let f=await X({session:s,flags:c}),p=await mv({device:f,action:d,positionals:u,inspectFacts:a,bindDevice:o});if(!p.ok)return p.response;let m=await p.execute(Jr(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,m),{ok:!0,data:{platform:E(f),...m}}}function gv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function _v(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function vv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function yv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Ur({type:`command`,status:`progress`,message:bv(t)})}function bv(e){return[ia(e),...ra(e)].join(`
|
|
3
|
-
`)}async function
|
|
4
|
-
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function
|
|
5
|
-
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Yv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Xv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Zv(e,t){let n=Mr(e.meta?.cwd);return{targetApp:ny(e.flags?.targetApp)??t?.appBundleId,metroHost:ny(e.runtime?.metroHost)??`127.0.0.1`,metroPort:ry(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:ey(e,n)}}function Qv(e,t={}){let n=ty(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 $v(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${E(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function ey(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function ty(e){let t={...Object.fromEntries([...Yv,...Xv].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 ny(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function ry(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function iy(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==nr.doctor)return null;let s=ay(e.hostDiagnostics),c=r.get(n),l=Zv(t,c),u=cy(r,n),d=[];if(yv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Or()} using ${u}`,evidence:{version:Or(),stateDir:u}},...Qv(t,{required:l.remote}),...$v(r,n,c,{remote:l.remote})),l.remote)return py(d,l);let f=oy(l,u,i),p=await Cv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await ly({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??sy(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return py(d,l,{device:h,includeMetro:!0,inventory:p})}function ay(e){if(!e)throw new t(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function oy(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>qr(e),emitProgress:e=>Ur({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Pi(e),shouldPropagateInventoryProbeError:Mi,transportOverrides:Object.freeze({androidAdb:n})})}function sy(e){let t=(e?.devices??[]).filter(e=>C(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function cy(e,t){let n=V.dirname(e.resolveSessionDir(t));return V.basename(n)===`sessions`?V.dirname(n):n}async function ly(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??wv(t,i,a.targetApp);return u&&await uy(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await Hv(a.metroHost,a.metroPort,a.kind)),yv(t,...await r.ambientChecks(n)),u}async function uy(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await dy({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await xv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),yv(e,...await r.deviceChecks(i,n))}async function dy(e){if(e.device.platform!==`harmonyos`)return fy(e)}async function fy(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Te),u=L(n.flags?.androidDeviceAllowlist),d=await fc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await pc(l,d,e)}function py(e,t,n={}){let r=gv(e);return{ok:!0,data:{status:r,summary:_v(r),kind:t.kind,platform:n.device?E(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:vv(e)}}}async function my(e){return await I({...e,command:`prepare`,use:He})}async function hy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return P(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(nr.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s}),u=await my({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let d=Date.now(),f=await u.runtime.operations.prepareAppleRunner({timeoutMs:gy(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(t)}});return{ok:!0,data:_y(a,l,Math.max(0,Date.now()-d),f)}}function gy(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ae}function _y(e,t,n,r){return{action:e,platform:E(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:vy(n,r),message:`Prepared Apple runner: ${t.name}`}}function vy(e,t){let n=yy(t.buildMs),r=by(t.connectMs),i=by(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 yy(e){return e===void 0?void 0:by(e)}function by(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const xy=e=>mc(e),Sy=e=>yl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Cy=e=>sc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),wy=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Ol({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),Ty=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ku({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),Ey={session_list:xy,devices:xy,capabilities:xy,apps:xy,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await iy({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:wy,shutdown:wy,appstate:wy,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>av({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ko({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await hv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Cs,perf:Ty,logs:Ty,events:Ty,network:Ty,audio:Ty,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await hy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Ls,reinstall:Ls,install_source:Ls,release_materialized_paths:async({req:e})=>await Ao({req:e}),push:Ls,"trigger-app-event":ws,open:Sy,replay:tv,test:nv,batch:async({req:e,sessionName:t,invoke:n})=>await Rs(e,t,n),close:Cy};async function Dy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Vn,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=Ey[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{Dy as handleSessionCommands};
|
|
1
|
+
import{B as e,C as t,N as n,T as r,d as i,g as a,j as o,m as s,t as c,w as l}from"./sdk-contracts.js";import"./capture.js";import{D as u,n as d,r as f,t as p}from"./sdk-batch-runner.js";import{a as m,n as h,t as g}from"./snapshot-diagnostics.js";import{f as _}from"./android-input-ownership.js";import{_ as v,b as y,c as b,d as x,g as S,l as C,m as w,u as T,v as E}from"./sdk-device.js";import{A as ee,B as D,Cr as O,F as te,G as ne,I as re,In as ie,Ir as ae,J as oe,K as se,L as ce,N as le,P as ue,R as de,Rn as fe,Sr as pe,St as me,T as he,U as ge,Ur as _e,Vn as ve,Vr as ye,W as be,Wn as xe,X as Se,Y as Ce,Z as we,at as Te,bt as Ee,d as De,dn as Oe,dt as ke,en as Ae,f as je,fn as Me,ft as Ne,hn as Pe,j as Fe,jt as Ie,mn as Le,nn as Re,nr as ze,nt as Be,pn as Ve,q as He,rr as Ue,rt as We,tr as Ge,v as Ke,xt as qe,z as Je,zn as Ye,zr as Xe,zt as Ze}from"./sdk-batch.js";import{u as Qe}from"./scroll-gesture.js";import{a as $e,b as et,f as tt,g as nt,n as rt,p as it,r as at,w as ot,y as st}from"./script.js";import{_ as ct,a as lt,c as k,d as ut,f as dt,g as ft,h as pt,l as mt,m as ht,p as gt,t as _t,u as vt}from"./session-store.js";import{a as yt,c as bt,n as xt,o as St,r as Ct,t as wt}from"./session-target-evidence.js";import{a as Tt,i as Et,n as Dt,o as Ot,r as kt,s as At,t as jt}from"./vars.js";import{n as Mt,r as Nt,t as Pt}from"./format.js";import{A as Ft,_ as It,d as Lt,g as Rt,h as zt,j as Bt,k as Vt,l as Ht,m as Ut,o as Wt,p as Gt,s as Kt,u as qt}from"./parameterized-recorded-fill.js";import{F as Jt,N as Yt,P as Xt,c as Zt,f as Qt,j as $t,v as en}from"./runtime.js";import{$ as tn,A as nn,B as rn,C as an,D as on,F as sn,G as cn,H as ln,I as un,J as dn,K as fn,L as pn,M as mn,N as hn,Q as gn,R as _n,S as vn,T as yn,U as bn,V as xn,W as Sn,X as Cn,Y as wn,Z as Tn,_ as En,b as Dn,c as On,d as kn,dt as An,et as jn,f as Mn,ft as Nn,g as Pn,h as Fn,it as In,j as Ln,k as Rn,l as zn,m as Bn,mt as Vn,n as Hn,nt as Un,o as Wn,p as Gn,q as Kn,r as qn,rt as Jn,t as Yn,tt as A,u as Xn,v as Zn,w as Qn,x as $n,y as er,z as tr}from"./device-claim-rule.js";import{n as nr,t as rr}from"./catalog.js";import{g as ir,i as ar}from"./observability.js";import{i as or,n as sr,r as j}from"./success-text.js";import{d as cr,i as lr,u as ur}from"./absence-observation-errors.js";import{t as dr}from"./app-inventory.js";import{r as fr,t as pr}from"./device.js";import{a as mr,o as hr,r as M}from"./diagnostics.js";import{a as gr,i as _r,r as vr}from"./verified-file.js";import{c as yr,p as br}from"./exec.js";import{t as xr}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Sr,r as Cr}from"./output-path.js";import"./command.js";import{a as wr,i as Tr,n as Er,t as Dr}from"./replay-divergence.js";import"./retry.js";import{r as Or}from"./version.js";import{t as kr}from"./session-paths.js";import{i as Ar,r as jr}from"./session-artifact-paths.js";import{t as Mr}from"./project-runtime.js";import{r as Nr}from"./rect-center.js";import{o as Pr}from"./android-system-chrome.js";import{t as Fr}from"./keyed-lock.js";import{n as Ir,t as Lr}from"./deploy-result-target.js";import{t as Rr}from"./keyboard-actions.js";import{a as zr,i as Br,n as Vr,o as Hr,r as N}from"./request-cancel.js";import{t as Ur}from"./request.js";import{i as Wr,s as Gr}from"./provider-session-ownership.js";import{a as Kr,i as P,s as qr}from"./request-runtime-binding.js";import{C as Jr,E as F,O as Yr,g as I,h as Xr,i as Zr,k as Qr,m as $r,n as ei,s as ti,v as ni,x as ri}from"./session-snapshot.js";import{c as ii,i as ai,t as oi}from"./device-claim-inspection.js";import{t as si}from"./audio-probe-result.js";import{T as ci,_ as li,a as ui,b as di,c as fi,d as pi,f as mi,g as hi,h as gi,i as _i,l as vi,m as yi,n as bi,o as xi,r as Si,s as Ci,t as wi,u as Ti,v as Ei,x as Di}from"./perf-runtime-plan.js";import{i as Oi,n as ki}from"./lease-context.js";import{h as Ai}from"./screenshot-runtime.js";import{n as L,r as ji}from"./device-isolation.js";import{a as Mi,n as Ni,r as Pi}from"./device-inventory-context.js";import{n as Fi,r as Ii,t as Li}from"./dispatch-resolve.js";import{t as Ri}from"./touch-reference-frame.js";import{a as zi,i as Bi,l as Vi,n as Hi,o as Ui,s as Wi,u as Gi}from"./session-routing.js";import{d as R}from"./src8.js";import{i as Ki,n as z,r as qi}from"./compatibility-policy.js";import{o as Ji,p as Yi}from"./quality-warnings.js";import{a as Xi,i as B,n as Zi,r as Qi,t as $i}from"./session-runtime-admission.js";import{t as ea}from"./semantic-index.js";import{n as ta,r as na}from"./device-selection-resolver.js";import{n as ra,r as ia}from"./doctor-output.js";import{t as aa}from"./record-runtime.js";import{n as oa}from"./gesture-runtime.js";import{i as sa,n as ca,r as la}from"./platform-runtime-open-target.js";import{t as ua}from"./snapshot-runtime.js";import{t as da}from"./app-log-files.js";import V from"node:path";import H,{promises as U}from"node:fs";import{createHash as fa}from"node:crypto";import pa from"node:os";import{fileURLToPath as ma}from"node:url";import{setTimeout as ha}from"node:timers/promises";import ga from"node:vm";function W(e,t){return R({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function _a(e){return R({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function va(e,t){let n=Ca(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},_a(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:ya(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ya(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function ba(e,t,n,r){let i=Ca(await r.resolveTarget({selector:e,...t},W(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw jn(`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 xa(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function Sa(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 Ca(e,t){return wa(e,t),Ta(e),Ea(e),Da(e),e}function wa(e,n){if(e.generation!==n)throw new t(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${n}.`)}function Ta(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Ea(e){if(e.rect!==void 0&&!Sa(e.rect)||e.viewport!==void 0&&!Sa(e.viewport))throw new t(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Da(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Oa(e,t,n,r,i,a={}){let o=ka(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Pa(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function ka(e,t,n,r,i){let a=n===`up`||n===`down`,o=rn(e,dn(e,r),i),s=o.visibility,c=Tn({visibility:s,matches:e.nodes.filter(e=>ae(e)),platform:r}),l=ye(s.viewportRects)??ja(c);if(!l||!Xe(l))return;let u=c.flatMap(e=>{if(!Xe(e.rect))return[];let t=Ma(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=Aa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(Na)[0]?.viewport}function Aa(e,t){return ae(e)?e:O(e,t)}function ja(e){let t;for(let n of e)Xe(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ma(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 Na(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=z.scrollUntilVisibleSwipe.nearEdgeFraction,i=z.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 Fa(e,n,r){let i=A(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new t(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(W(n,n.command)):void 0;return{authored:e,gesture:La(await Ia(e.start,n,r,a),await Ia(e.end,n,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let t=await r.resolveGestureViewport(W(n,n.command)),{start:a,end:o}=Ra(t,e.direction,r.platform);return{authored:e,gesture:La(a,o,i),viewport:t}}let a=await ba(e.from,{purpose:`swipe`,timeoutMs:`optional`in n.command&&n.command.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs},n,r),o=a.viewport??await r.resolveGestureViewport(W(n,n.command)),{start:s,end:c}=za(a,e.direction,o);return{authored:e,gesture:La(s,c,i),target:a,viewport:o}}async function Ia(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(W(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 La(e,t,n){return{from:e,to:t,durationMs:n??z.command.swipeDurationMs}}function Ra(e,t,n){if(t===`left`||t===`right`){let n=Qe(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=z.screenSwipe,i=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 za(e,t,n){let r=Nr(e.rect),i=n.x+Math.trunc(n.width*z.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*z.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*z.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*z.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const Ba={launchApp:Ga,stopApp:Ga,clearState:Ga,openLink:Ga,tapOn:qa,doubleTapOn:qa,longPressOn:qa,swipe:Qa,inputText:$a,eraseText:$a,scroll:K,scrollUntilVisible:K,hideKeyboard:K,pressKey:K,back:K,waitForAnimationToEnd:K,takeScreenshot:no,runScript:no,evalScript:io,assertVisible:ro,assertNotVisible:ro,assertTrue:ro,extendedWaitUntil:ro},Va={launchApp:!0,stopApp:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ha(e){return Va[e.kind]}async function Ua(e,t){let n=e.command;return await Wa(n,e,t,W(e,n))}function Wa(e,t,n,r){let i=Ba[e.kind];return i(e,t,n,r)}async function Ga(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,Ka(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`clearState`:return await q(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function Ka(e,t){return R({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function qa(e,t,n,r){switch(e.kind){case`tapOn`:return await Ja(e,t,n,r);case`doubleTapOn`:{let i=await po(e.target,{purpose:`doubleTap`,timeoutMs:Xa(e)},t,n),a=A(e.delay,`doubleTapOn.delay`)??z.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}case`longPressOn`:{let i=await po(e.target,{purpose:`longPress`,timeoutMs:Xa(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}}}async function Ja(e,t,n,r){let i=await Ya(e,t,n);return await q(n.tapOn,Za(e,i),r,`invalidate`,i.resolution?xa(i.resolution):void 0)}async function Ya(e,t,n){let r={purpose:`tap`,timeoutMs:Xa(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await po(e.target,r,t,n)}function Xa(e){return e.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs}function Za(e,t){let n=A(e.repeat,`tapOn.repeat`),r=A(e.delay,`tapOn.delay`),i=n===void 0?r:r??z.command.repeatDelayMs;return R({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Qa(e,t,n,r){let i=await Fa(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?xa(i.target):void 0)}async function $a(e,t,n,r){switch(e.kind){case`inputText`:return await q(n.inputText,R({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await q(n.eraseText,R({charactersToErase:A(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function K(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,eo(e),r,`invalidate`);case`hideKeyboard`:return await q(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await q(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await q(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await q(n.waitForAnimationToEnd,to(e),r,`preserve`)}}function eo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:A(e.timeout,`scrollUntilVisible.timeout`)??z.command.scrollUntilVisibleTimeoutMs,durationMs:Ki(z.command.scrollUntilVisibleSpeed)}}function to(e){return R({timeoutMs:A(e.timeout,`waitForAnimationToEnd.timeout`)})}async function no(e,t,n,r){switch(e.kind){case`takeScreenshot`:return oo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await q(n.runScript,R({file:e.file,env:e.env}),r,`preserve`)}}async function ro(e){throw new t(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function io(e){throw new t(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function q(e,t,n,r,i){let a=ao(n,r);return oo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function ao(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function oo(e,t,n,r){let i=e?.observation;return so(i,r),{...co(n??i),...lo(e?.outputEnv),...uo(t,e?.artifactPaths),...fo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function so(e,n){if(!(!e||n===void 0||e.generation===n))throw new t(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${n}.`)}function co(e){return e?{observation:e}:{}}function lo(e){return e?{outputEnv:{...e}}:{}}function uo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function fo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function po(e,t,n,r){if(e.space===`target`){let i=await ba(e.selector,t,n,r);return{authored:e,point:Nr(i.rect),resolution:i}}return{authored:e,point:await Ia(e,n,r)}}function mo(e,t,n,r={}){let i=n===`ios`&&r.presentation?go(r.presentation):void 0,a=i?_o(e,t,i):ln(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:xo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?cn(s,t.selector.index):Sn(s,t.selector.index)?.node,l=xo(t,o,s,c);if(!c)return vo(t,o,s,l);let u=i?Sn(i.visibleForSource(c),void 0):null,d=fn(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!ho(t.selector)&&i?yo(d,s,u):0,evidence:l}:vo(t,o,s,l)}const ho=Cn;function go(e){let t=pe(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>gn(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function _o(e,t,n){let r=dn(e,`ios`),i=wn(e,{},{orderUnindexed:e=>Kn(e,r)}),a=xn(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:bn(o,t.selector,`ios`,i.visibility,r)}}function vo(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function yo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&bo(n.rect,e)?1:0:t.length}function bo(e,t){let n=Nr(e),r=Nr(t);return n.x===r.x&&n.y===r.y}function xo(e,t,n,r){return R({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:qi,retryTapMaxAttempts:z.command.retryTapMaxAttempts,longPressDurationMs:z.command.longPressDurationMs,eraseTextMaxCharacters:z.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:z.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:z.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:z.command.waitForAnimationToEndDifferencePercent,observationPollMs:z.observation.pollIntervalMs};function So(e,t={}){return{execute:async n=>{let r=W(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ha(n.command)&&!i,visualStabilityBarrier:i});let a=await Ua(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await va(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Co(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function wo(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Co(n)}}function To(e){let t=wo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Gr(n,e.meta?.tenantId)},cleanup:()=>{Wr(n)}}}function Y(e,t,n){return t||Jn(n)?null:P(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function Eo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function X(e){return In(e.flags)||!e.session?await Fi(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Do(e.session.device)}async function Do(e){if(qr(e)||!C(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ni.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Fi(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Fi({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Oo(e,t){return t?Vi(t,e).length===0:!1}async function ko(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=To(t);let n=No(t),l=await jo(a,t.flags),u=await Qi(e.inspectFacts)(l),d=B(`install_from_source`,u.operations.ensureReady)??B(`install_from_source`,u.operations.materializeAppSource)??B(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Zi(e.bindDevice)(l,Se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Po({artifact:s,retention:n,req:t,session:a,sessionName:r}),a&&F(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Fo(l,s,p,c),h=or(m,`Installed: ${Ir(m)}`);return k(i,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Rn(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:n(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function Ao(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Rn(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:n(e)}}}async function jo(e,n){let r=Mo(n?.platform);if(e&&r&&e.device.platform!==r)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await X({session:e,flags:n})}function Mo(e){return e===`ios`||e===`android`?e:void 0}function No(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Po(e){if(e.retention.enabled)return await Ln({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Fo(e,t,n,r){return C(e)?Io(t,n,r):Lo(t,n,r)}function Io(e,n,r){let i=n.bundleId??e.bundleId;if(!i)throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...zo(r),bundleId:i,...Ro(n,e),launchTarget:n.launchTarget??i}}function Lo(e,n,r){let i=n.packageName??n.launchTarget??e.packageName;if(!i)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...zo(r),packageName:i,...Ro(n,e),launchTarget:n.launchTarget??i}}function Ro(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function zo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Bo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Vo(t);if(!a.ok)return a.response;let o=Y(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await X({session:n,flags:t.flags}),c=await I({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:D});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return P(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:P(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Vo(e){let t=Ho(e);if(!t.ok)return t;let n=Uo(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Ho(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Uo(e){let t=Wo(e.flags?.devicePort),n=Wo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Wo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Go(e){return await I({...e,command:`runtime clear`,use:ce})}async function Ko(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Bo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await qo({...e,session:r.get(n)});if(!Jo(i))return P(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Yo({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Xo(n,o):Qo({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function qo(e){if(!e.session)return P(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await oa({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Jr(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function Jo(e){return e===`set`||e===`show`||e===`clear`}async function Yo(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(kn(i)&&r?.appBundleId){let e=await Go({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;F(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Fn(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Xo(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Zo(e){return e?E(e.device):void 0}function Qo(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Zo(i),s=Zn(t.flags?.platform??a?.platform??o);if(!s)return P(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(o!==void 0&&o!==s)return P(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Gn(a,zn(t.flags,s));return Xn(c)===0?P(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const $o=/^[A-Za-z0-9_.:-]{1,64}$/,es=8192,ts=4096;function ns(e){let n=e[0]?.trim(),r=e[1]?.trim();if(!n)throw new t(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!$o.test(n))throw new t(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new t(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:is(r,n)}}function rs(e,n,r){let i=E(e),a=as(e);if(!a)throw new t(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>ts)throw new t(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:ts});return s}function is(e,n){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>es)throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${es} bytes`);return r}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function as(e){return((C(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function os(e,t,n,r){let{eventName:i,payload:a}=ns([...r]),o=rs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:$r(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...j(`Triggered app event: ${i}`)}}async function ss(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await I({command:`trigger-app-event`,device:t,use:Be,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>os(s,t,e,n)}}function cs(e){let n=(e[0]??`status`).toLowerCase();if(!Rr(n))throw new t(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new t(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return ls(n)}function ls(e){return e===`get`?`status`:e===`return`?`enter`:e}const us={"ime-probe":`android`},ds={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},fs={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ps(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$r(e)}}async function ms(e,t){let n=await I(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function hs(e,t){return e.operations.keyboardStatus(ps(t)).then(e=>({platform:us[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function gs(e,t){let n=await e.operations.keyboardDismiss(ps(t)),r=ds[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...j(ys(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...j(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function _s(e,t){let n=await e.operations.keyboardEnter(ps(t)),r=fs[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...j(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...j(`Keyboard enter pressed`)}}async function vs(e){let t=cs(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ms({command:`keyboard status`,device:n,use:me,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>hs(e,t)):t===`dismiss`?await ms({command:`keyboard dismiss`,device:n,use:Ee,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>gs(e,t)):await ms({command:`keyboard enter`,device:n,use:qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>_s(e,t))}function ys(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function bs(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=Y(i,l,u);if(d)return d;let f=await X({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Ai(t)===`may-invalidate`&&F(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function xs(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return P(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Ss(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await bs({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Jr(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Cs(e){return xs(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Ss({...e,command:nr.keyboard,resolveRuntime:e=>vs(e)})}async function ws(e){return await Ss({...e,command:nr.triggerAppEvent,resolveRuntime:e=>ss(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await la(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function Ts(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Es(e,n){let r=n?.subject??`Payload`,i=e.trim();if(!i)throw new t(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!H.statSync(a).isFile())throw new t(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof t)throw e;let n=e.code;if(n===`EACCES`||n===`EPERM`)throw new t(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new t(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(Ts(i))return{kind:`inline`,text:i};throw new t(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Ds(e){let n=Es(e,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await Os(n.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Os(e){try{return await U.readFile(e,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new t(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new t(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new t(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new t(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function ks(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=Y(n,a,o);if(s)return s;let c=Fs(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Gr(l,t.meta?.tenantId):_t.expandHome(c.appPathInput);if(!H.existsSync(s))return P(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await X({session:a,flags:o}),d=await Qi(e.inspectFacts)(u),f=B(n,d.operations.deployApp);if(f)return f;let p=await Zi(e.bindDevice)(u,Ce);a&&F(a);let m=await p.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),h=js(u,c.app,s,m),g=or(h,`Installed: ${h.appName??Lr(h)}`),_=Ps(a,h);return _&&_!==a&&i.set(r,_),k(i,_,t,n,g),{ok:!0,data:g}}finally{l&&Wr(l)}}async function As(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=Y(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return P(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Ds(Is(c,t.meta?.cwd)),u=await X({session:i,flags:a}),d=await Qi(e.inspectFacts)(u),f=B(`push`,d.operations.ensureReady)??B(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Zi(e.bindDevice)(u,we);await p.operations.ensureReady({}),i&&F(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=C(u)?or({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):or({platform:E(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function js(e,t,n,r){return C(e)?Ms(t,n,r):Ns(e,t,n,r)}function Ms(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 Ns(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function Ps(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Fs(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:P(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:P(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Is(e,t){let n=Es(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>_t.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Ls(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await ks({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await ko({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await As({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Rs(e,t,n){return await d(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const zs=new Set(`acceptAlert.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Bs(e){return zs.has(e)}const Vs=new Map(De.map(e=>[e.name,e]));function Hs(e){let t=new Set;for(let n of e){let e=Us(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Us(e){let t=Vs.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(Bs)?n:void 0}function Ws(e){if(e!==void 0&&e.remainingSteps.length!==0)return Hs(e.remainingSteps)}function Gs(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(e),plannedOperations:Ws(e.internal?.executionPlan)}}function Ks(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...j(`Closed: ${t.name}`)}})}function qs(e,t,n){if(!dt(t))return{kind:`not-armed`};let r=t.actions.length;Ks(e,t,n);let i=Gt(t),a=e.writeSessionLog(t,{force:qt(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`}:(mt(t),{kind:`aborted`})}function Js(e,t){let r=n(t),i=Ft(e.scriptPublication??It);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ys(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Ks(r,n,t);try{let e=r.writeSessionLog(n,{force:qt(n,t.flags?.force)});e.written&&zt(n,e.path);return}catch(e){return Xs(e)}}function Xs(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof t?new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n(e).message}`,r)}async function Zs(e){let t=e.clearRuntimeHints?Je:de,n=await Xr({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,de)};let r=await n.bind(e.device,Je);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Qs(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await $s({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&kn(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Fn(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>nn(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function $s(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>$n({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>an({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>Dn({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Qn({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>yn(a,r))}function ec(e,t){return vn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function tc(e){if(e instanceof t)return e;let n=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const nc=(e,t)=>(e.positionals?.length??0)>0||on(t);async function rc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=dt(n),s=JSON.stringify(t.positionals??[]);if(o&&!ut(n,s)){let e=await ac({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Js(n,tc(e))};pt(n,s)}let c=qs(i,n,t);return c.kind===`failed`?{response:Js(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function ic(e){try{return{providerData:await An(e)}}catch(t){let r=n(t);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,lifecycle:i}=e;if(nc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Gs(t,r,n.trace?.outPath)});return}catch(e){return e}}function oc(e,n){if(!e.flags?.saveScript||Lt(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new t(`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 t(`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 sc(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.get(r);if(!c)return await dc({req:n,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});oc(n,c);let l=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!l)return P(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let u=e.platformResourceCleanup,d=await Zs({device:c.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!c.appBundleId&&kn(a.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;if(F(c),n.internal?.closeAppOnly===!0&&l)return await uc({req:n,session:c,logPath:i,lifecycle:d.runtime,app:l});let f=await rc({req:n,session:c,logPath:i,sessionStore:a,lifecycle:d.runtime});if(`response`in f)return f.response;let p=await cc({req:n,session:c,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:d.runtime,clearRuntimeHints:d.clearRuntimeHints,repairArmed:f.repairArmed,platformResourceCleanup:u});return p.kind===`response`?p.response:lc({session:c,repair:f,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:p.shutdownResult,providerData:p.providerData})}async function cc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Qs({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:ac,finalizeOrdinaryCloseScript:Ys,platformResourceCleanup:e.platformResourceCleanup}),m=await ic({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ec(r,u),g=d??h;if(g?n.deviceClaim&&M({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await di(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function lc(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:or({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...j(c),...o,...s}}}async function uc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await ac({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...j(`Closed: ${a}`)}}}async function dc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return P(`SESSION_NOT_FOUND`,`No active session`);let a=await Zs({device:await X({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Gs(t,n)}),{ok:!0,data:{app:t.positionals[0],...j(`Closed: ${t.positionals[0]}`)}})}function fc(e,t){return e.operations.ensureReady(t)}function pc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function mc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return hc(t,r);case`devices`:return await _c(t);case`capabilities`:return await Tc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await jc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function hc(e,t){let n=zi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ui(e.session,n)).map(e=>gc(e,t))}}}function gc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Ar(r),platform:E(t.device),...b(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...b(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function _c(e){try{let t=vc();return{ok:!0,data:{devices:(await bc(e)).map(e=>({...Rc(e),...yc(e,t)}))}}}catch(e){let t=l(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function vc(){let e=new Map;for(let t of ai({})){let n=t.claim;!n||oi(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function yc(e,t){let n=t.get(ii(Di(e)));return n?{claimedBy:n}:{}}async function bc(e){let t=e.flags?.platform;return wc(await Ni(xc(e,t)),e.flags?.platform,e.flags?.target)}function xc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Sc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Cc(n?.androidDeviceAllowlist)}}function Sc(e,t,n){return y({simulatorSetPath:ji(e),platform:t,target:n})}function Cc(e){let t=L(e);return t?Array.from(t).sort():void 0}function wc(e,t,n){let r=t?e.filter(e=>zc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Tc(e){let t=await Lc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Ec(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Pc(n,e.inspectFacts);return{ok:!0,data:{device:Rc(n),availableCommands:Ke().filter(e=>e===`appstate`&&r?!0:kc(e,i))}}}function Ec(e,t,n){return!t||!C(e)&&!T(e)||!Oo(n,t)?!1:Dc(t)||Oc(e,t)}function Dc(e){return!!(e.appName||e.appBundleId)}function Oc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function kc(e,t){let n=je(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Ac(t,e)))}function Ac(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function jc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Mc(t,e.providerAppCatalog);if(o)return o;let s=await Lc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=dr(t.flags?.appsFilter),u=L(t.flags?.androidDeviceAllowlist),d=await Fc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ic(await pc(f,await fc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Mc(e,t){let n=Nc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,N(e.meta?.requestId))]}}}function Nc(e){let t=ki(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Pc(e,t){if(t)try{return await t(e)}catch{return}}async function Fc(e){if(!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await e.inspectFacts(e.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Te)}}function Ic(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Lc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=Y(t.command,a,o);return s?{response:s}:{device:await X({session:a,flags:o,androidAvdSelection:i})}}function Rc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...b(r.platform)&&n?{appleOs:n}:{}}}function zc(e,t){return v(e,t)}function Bc(e){return P(`INVALID_ARGS`,e)}function Vc(e,n,r,i){try{return ca({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return P(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}async function Hc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await sa({target:n,platform:i.platform,surface:r});return a?Bc(a):null}async function Uc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await sa({target:n,platform:r});return i?Bc(i):null}function Wc(e){let t=er(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:kn(n),clearRemovedRuntimeHints:En({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Gc(e){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!f(a??``),execution:{startupDeadlineAtMs:qc(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(n)}});let{appBundleId:d,appName:p}=await Kc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new t(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Mn({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:p,runtime:c.runtime}}}async function Kc(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function qc(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Jc(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function Yc(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let n=await ua({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.ok?{ok:!0,data:{...o.data,snapshot:n.data}}:Xc(o.data,n.error)}catch(e){return Xc(o.data,n(e))}}function Xc(e,t){return{ok:!0,data:{...e,warnings:[...sr(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Zc(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...Qc(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=E(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,w(d.platform)&&(g.serial=d.id)),d&&C(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...j(`Opened: ${o??s??t}`)}}function Qc(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function $c(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const el=Object.freeze({async observeBootTimeMs(e){if(C(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function tl(e,t){e.warnings=[...sr(e),t]}function nl(e){return e.internal?.resolvedSessionScope??zi(e)}function rl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Ht(t,{});return}Lt(n)&&(Kt(t),tl(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function il(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function al(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function ol(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function sl(e,t){if(!t)return;let n=await ci(t);if(n.status!==`renewed`)return n.conflict?qn(e,n.conflict):P(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function cl(e){let{req:t,sessionName:n,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:u,appBundleId:d,runtimeHints:f,lifecycle:p,applyRuntimeHints:m,existingSession:h,deviceClaim:g,tookOverDeviceClaim:_,selection:v}=e,y=t.flags?.relaunch===!0,b=d,x=Date.now(),S=await ll({req:t,sessionName:n,sessionStore:i,device:o,surface:u,sessionAppBundleId:b,appName:l,existingSession:h});if(S.type===`response`)return S.response;let C=S.session??h,w=Date.now(),T=await p.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:b,surface:u,hasExistingSession:h!==void 0,relaunch:y,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:al(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Fn(f),applyRuntimeHints:m,execution:Gs(t,a,h?.trace?.outPath)});b=T.appBundleId??b;let E={...T.timing},ee=ta(v),D=s?ol(w,s,b):void 0;if(Br(t.meta?.requestId)){let e=r();return P(e.code,e.message,e.details)}h&&ri({session:h,command:`open`,positionals:[],flags:void 0});let O=$c({existingSession:C,sessionName:h?.name??Bi(t),sessionScope:h?.sessionScope??nl(t),device:o,surface:u,appBundleId:b,appName:l});O.lease=Nn({req:t,existingLease:h?.lease}),g&&(O.deviceClaim=g),t.runtime!==void 0&&Pn(i,n,f);let te=i.ensureSessionDir(n),ne=jr(te,t.meta?.requestId??mr().requestId);E.totalDurationMs=Math.max(0,Date.now()-x),M({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let re=Zc({sessionName:O.name,sessionStateDir:te,runnerLogPath:Ar(te),requestLogPath:ne,eventLogPath:i.resolveEventLogPath(n),appName:l,appBundleId:b,surface:u,startup:D,timing:E,device:o,runtime:f,runtimeHintCount:Xn,sessionReused:h!==void 0,selection:ee});return _&&tl(re,il(_)),rl({session:O,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:re}),i.set(n,O),i.recordAction(O,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:re}),{ok:!0,data:re}}async function ll(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=ul(e);r.set(n,o);let s=await a(o);return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function ul(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=$c({existingSession:o,sessionName:o?.name??Bi(t),sessionScope:o?.sessionScope??nl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=Nn({req:t,existingLease:o?.lease}),s}function dl(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(i)return Hi(t,i.session)?P(`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.`}):Gi(i,n)}async function fl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Yn(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Hn(n,r,On({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Ei({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:el})}}async function pl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=dl({req:t,device:a,sessionStore:i});if(m)return m;let h=await fl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return qn(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await ml({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Gc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await sl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await cl({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function ml(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await di(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await li(t);M({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const hl=new Map;async function gl(e){let t=oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Xr({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ge)};case`open-apply-runtime-hints`:{let t=await r(e.device,ne);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,be);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function _l(e){let t=Wc(e);if(t.type===`response`)return t;let n=await gl({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function vl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Jc({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return P(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Vc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return Bc(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let u=await Hc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await sl(i.device,i.deviceClaim);if(d)return d;let f=await Do(i.device),p=na(f);await o.internal?.retainDeviceExecutionLock?.(f.id);let m=await _l({req:o,sessionStore:r,sessionName:t,device:f,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;F(i);let _=await Gc({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:h.runtime,runtimeHintPlan:g,clearRuntimeHints:h.clearRuntimeHints,foreground:!1});return _.type===`response`?_.response:await sl(f,i.deviceClaim)||await cl({req:o,sessionName:t,sessionStore:r,logPath:n,device:f,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:_.details.appBundleId,appName:_.details.appName,runtimeHints:_.details.runtime,lifecycle:h.runtime,applyRuntimeHints:h.applyRuntimeHints,surface:l,existingSession:i,selection:p})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return Bc(`open --relaunch requires an app argument.`);let l=await Uc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await Ii(o.flags??{},Un(c)),d=u.device;await o.internal?.retainDeviceExecutionLock?.(d.id);let f=Vc(d,o.flags?.surface,c);if(typeof f!=`string`)return f;let p=await Hc({shouldRelaunch:s,openTarget:c,surface:f,device:d});if(p)return p;let m=await _l({req:o,sessionStore:r,sessionName:t,device:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;return await Fr(hl,d.id,async()=>await pl({req:o,sessionName:t,logPath:n,sessionStore:r,device:d,surface:f,openTarget:c,lifecycle:h.runtime,runtimeHintPlan:g,applyRuntimeHints:h.applyRuntimeHints,clearRuntimeHints:h.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:u}))}async function yl(e){let t=await vl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Yc({...e,inspectFacts:Qi(e.inspectFacts),bindDevice:Zi(e.bindDevice),openResponse:t})}const bl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,xl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Sl(e){return t=>P(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function Cl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function wl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Tl(e){return e.available?null:P(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function El(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Dl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Eo(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return P(`SESSION_NOT_FOUND`,e)}let s=Y(`appstate`,i,a);if(s)return s;let c=b(i?.device.platform)&&Oo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return P(`SESSION_NOT_FOUND`,bl);if(u&&!c)return P(`SESSION_NOT_FOUND`,xl);if(c&&i){let e=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return P(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:E(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...C(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a});if(C(d))return P(`SESSION_NOT_FOUND`,bl);if(T(d))return P(`SESSION_NOT_FOUND`,xl);let f=await I({command:`appstate`,device:d,use:We,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>P(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:kl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:E(d),package:m.package,activity:m.activity}}}async function Ol(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=L(a.androidDeviceAllowlist),c=s?[...s].sort():void 0,u=Ie({headless:a.headless===!0}),d;try{d=await X({session:i,flags:a,androidAvdSelection:`include-stopped`})}catch(e){let t=l(e);if(u.kind===`boot-target-headless`&&!El(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return P(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(a.target&&(d.target??`mobile`)!==a.target)return P(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await Xr({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Sl(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:a.serial,androidSerialAllowlist:c};return d=u.kind===`boot-target-headless`?await(await f.bind(d,u.use)).operations.bootTargetHeadless(p):await(await f.bind(d,u.use)).operations.bootTarget(p),{ok:!0,data:{platform:E(d),target:d.target??`mobile`,device:d.name,id:d.id,kind:d.kind,booted:!0,...b(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=await X({flags:a,session:i,androidAvdSelection:`include-stopped`}),c=Tl((await Cl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return P(`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:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await wl(e.bindDevice)(s,Ze)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...b(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:P(l.error?.code??`COMMAND_FAILED`,Al(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Dl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function kl(e){let t=L(e);return t?[...t].sort():void 0}function Al(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function jl(e){let t=_r(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=H.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{H.closeSync(t)}}function Ml(e,t){da(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=vr(e);try{H.writeFileSync(r,n,`utf8`)}finally{H.closeSync(r)}}function Nl(e){let t=V.dirname(e),n=V.basename(e);H.existsSync(t)||H.mkdirSync(t,{recursive:!0});let r=gr(e);try{H.fsyncSync(r)}finally{H.closeSync(r)}let i=0;for(let e of H.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{H.unlinkSync(V.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Pl(e){return Ti.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Fl(e){try{return await Il(e)}catch(e){return{ok:!1,error:n(e)}}}async function Il(e){let t=Ll(e);if(!t.ok)return t;let n=t.session,r=le(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Rl(a,o);let c=ue({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await zl(e,n,r,c.use);case`capture-status`:return await Bl(e,n);case`capture-stop`:return await Vl(e,n)}}function Ll(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:P(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Rl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return P(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function zl(e,t,n,r){if(t.audioProbe){await fi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return P(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=Ci.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=Ci.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=V.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),c=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await xi({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...c,throwIfCanceled:e.throwIfCanceled});let l=e.sessionStore.get(e.sessionName)?.audioProbe;if(!l)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await l.handle.status()}}async function Bl(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Hl()};let r=await n.handle.status();return r.state===`stopped`&&await fi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Vl(e,t){return t.audioProbe?{ok:!0,data:await fi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Hl()}}function Hl(){return si({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Ul(e){let r=e.sessionStore.get(e.sessionName);if(!r)return P(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(ir(e.req.positionals?.[0]))throw new t(`INVALID_ARGS`,ar);uu(e.req);let n=wi({positionals:e.req.positionals,kind:fu(e.req.flags?.kind),outPath:fu(e.req.flags?.out)}),i=bi(n);if(i.kind===`capture-stop`)return Wl(e,await Jl(e,r,i.request));let a=await $i({device:r.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Wl(e,await Gl(e,r,a)):B(`perf`,a.fact)??P(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:n(e)}}}function Wl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,au(t.data)?{...t.data}:{}),t}async function Gl(e,n,r){let{device:i,plan:a}=Xi(r),o=Zi(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:eu(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:ou(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:su(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?_t.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:V.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Kl(e,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=lu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:_t.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Kl(e,t,n,r){if(t.perfCapture)return P(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return P(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=lu(e,r.outPath,i),o=ui.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=ui.createNextFence({admissionLedger:ql(e),resourcePath:o,device:t.device}),c=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await Si({admissionLedger:ql(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:c.pendingHandle,envelope:c.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:c.response}}function ql(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new t(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Jl(e,t,n){let r=t.perfCapture;if(!r)return P(`INVALID_ARGS`,`no active native perf capture`);let i=$l(r.handle.inspect(),n);if(i)return P(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(_t.expandHome(n.outPath,e.req.meta?.cwd));let a=await _i({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Yl(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function Yl(e){if(Xl(e)||Zl(e))return e;throw new t(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Xl(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Zl(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ql(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ql(e,t){return t.every(t=>typeof e[t]==`string`)}function $l(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function eu(e,t){return{...cu(e),metrics:{fps:tu(t.metric,e)},sampling:{fps:t.sampling}}}function tu(e,t){if(!au(e)||e.available!==!0)return e;let n=nu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function nu(e,t){let n=ru(t.windowStartedAt),r=ru(t.windowEndedAt)??ru(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:iu(e)})).slice(-12)}function ru(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function iu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function au(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ou(e,t){return{...cu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function su(e,t){return{...cu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function cu(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id}}function lu(e,t,n){return t?_t.expandHome(t,e.req.meta?.cwd):V.join(e.sessionStore.ensureSessionDir(e.sessionName),`${du()}-${n}`)}function uu(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new t(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function du(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function fu(e){return typeof e==`string`&&e.length>0?e:void 0}const pu=[`dump`,`log`],mu=`network requires ${pu.join(` or `)}`,hu=`network include mode must be one of: ${c.join(`, `)}`,gu=2048;async function _u(e){let t=e.sessionStore.get(e.sessionName);if(!t)return P(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=vu(e.bindDevice),r=(await n(t.device,ee)).facts.networkDump;if(!r.available)return Cu(r.hint);let i=yu(e.req);if(!i.ok)return i;let a=Fe({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return wu(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:gu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:n(e)}}}function vu(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function yu(e){let t=bu(e);if(!t.ok)return t;let n=xu(e);if(!n.ok)return n;let r=Su(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function bu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return pu.includes(t)?{ok:!0,action:t}:P(`INVALID_ARGS`,mu)}function xu(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?P(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Su(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return P(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return c.includes(r)?{ok:!0,include:r}:P(`INVALID_ARGS`,hu)}function Cu(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function wu(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:gu,maxScanLines:e.entries.length},notes:e.notes}}}function Tu(e,t){let n=yi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Eu(e.appLogFailure)]:Du(n.state)}}function Eu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Du(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function Ou(e,t){return Ue([...e,...t.notes??[]])}async function ku(e){let{req:t}=e;return t.command===`perf`?await Ul({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?ju(e):t.command===`events`?await Au(e):t.command===`network`?await _u(e):t.command===`audio`?await Fl(Uu(e)):null}async function Au(e){let{req:t,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:n(e)}}}async function ju(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return P(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Wu({...e,session:a}),r=(await n.bindDevice(a.device,te)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=Pu(re({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Mu(n,i)}catch(e){return{ok:!1,error:n(e)}}}async function Mu(e,t){switch(t.kind){case`path`:return Fu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Iu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Nu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Vu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Lu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ru(e)}}async function Nu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Bu(e,t.appBundleId,n.owner,n.operations.appLogStart):await zu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Pu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):P(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Fu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=jl(a),s=Tu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Iu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Tu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:Ou(t.notes,o)}}}function Lu(e,t,n){let r=n.resolveAppLogPath(t);return Ml(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ru(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return P(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Nl(r.resolveAppLogPath(n));return pi({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function zu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await mi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:hi.resolvePath(o.resolveSessionDir(a))});let s=Nl(o.resolveAppLogPath(a)),c=await Hu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Bu(e,t,n,r){let{session:i}=e;return i.appLog?P(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Hu(e,t,r,n)}async function Vu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return P(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await mi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:hi.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Hu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=hi.resolvePath(o.resolveSessionDir(a));try{let l=Pl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await vi({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:gi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Uu(e){if(!e.bindDevice||!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new t(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Wu(e){if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new t(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Gu(e){let t=Ku(e),n=Ge(t);return fa(`sha256`).update(n,`utf8`).digest(`hex`)}function Ku(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)=>qu(e,n[t]??null,r?.[t]??null))}}function qu(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function Ju(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=Yu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Yu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Xu({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Zu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Qu(n,r)];for(let e of s){let t=e();if(t)return t}}function Xu(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 Zu(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 Qu(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 $u(e,n){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new t(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=rt(e),a=at(e),o=Gu({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??$e(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>Ju(e,s,o)}}function ed(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function td(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ve(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function nd(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 rd(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=nd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ye(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 id(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ye(e,r),...fe(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 ad(e,t,n,r,i,a){if(n.targetEvidences)return od(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return cd(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return cd(e,n,r,i,a);if(s.kind===`post-resolution`){let c=ed({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return cd(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return ld(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=td({recorded:o,token:s.token});if(c.kind===`skip`)return cd(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,sd(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?ld(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 od(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return cd(e,n,r,i,a);let d=td({recorded:o[c],token:u.token});if(d.kind===`skip`)return cd(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,sd(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return ld(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function sd(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function cd(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 ld(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=ud(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=dd(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function ud(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function dd(e,t,n){return n.status===`guard-mismatch`?rd(e,n.evidence,t):id(e,n.evidence)}async function fd(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=jt(e.varSources),o=[],s=[],c=gd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!hd(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(_d(u,n.length,r,e))}let d=At(r,a,md(e,u)),f=Dt(a),p=t.diagnosticsMarker(),m=await ad(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:pd(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function pd(e,t){return t.length===0?e:[...new Set([...e,...t])]}function md(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function hd(e){return!!(e&&e.command!==`replay`)}function gd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(hd(n))return n.command===`close`?t:void 0}}function _d(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function vd(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:ft(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){n.update(t=>{vt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:yd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){ft(r())!==void 0&&n.update(ct)},markCompleteIfArmed(){ft(r())!==void 0&&n.update(ht)},markSessionHeldIfArmed(e){if(e.ok||!gt(r()))return e;let t=Tr(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&xd(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{bd({session:t,...e})})}}}}function yd(e){let t=V.dirname(e),n=V.basename(e,V.extname(e));return V.join(t,`${n}.healed.ad`)}function bd(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Sd({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function xd(e){e.pendingRecordAndHeal=void 0}function Sd(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 Cd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Ve(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function wd(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),nt(e.command)){let n=Td(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Ve(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Cd([...e.positionals]);n&&t.push(n)}return Ue(t).filter(e=>e.trim().length>0)}function Td(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Ed(n)?t.slice(0,-1):t}function Ed(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Dd(e){let t=Od({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 Od(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=kd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function kd(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 Ad(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!jd(n))return`manual`;let i=Md(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function jd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Nd(e.scrollRegion)}function Md(e,t){let n=Xt(t),r=Fd(e.ancestry,n,t),i=e.scrollRegion;return i&&Nd(i)?r&&Pd(i,n,t):r}function Nd(e){return e.id!==void 0||e.label!==void 0}function Pd(e,t,n){return n.some(n=>St(xt(n,t),e))}function Fd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Yt(n,t,e.length);return!r.broken&&ve(r.chain,e)})}const Id=new WeakMap;function Ld(e){return{store:t=>Rd(e,t),finalize:(t,n)=>zd({...e,evidence:t,projection:n})}}function Rd(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Zr(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Id.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Yr(a),refFrame:Qr(a)}),{evidence:s,refsGeneration:o}}function zd(e){let t=Id.get(e.evidence);Id.delete(e.evidence);let n=Vd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Bd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Hd(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ei(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Bd(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Yr(n)===t.runtimeRevision&&Qr(n)===t.refFrame}function Vd(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 Hd(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Ud(t){let{sessionStore:n,observationStore:r,sessionName:i,divergence:a,responseLevel:o}=t,s,c,l=Dr({divergence:a,level:o,writeOverflowArtifact:t=>{let r=e(t),i=Kd(n,r);return`artifactPath`in i&&(s=r,c=i.artifactPath),i}}),u=(s??l).screen;if(u.state!==`available`||u.refs.length===0)return t.evidence&&Ld({sessionStore:r,sessionName:i,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:u.state===`available`?u.refsGeneration:void 0,refs:[]}),l;if(!t.evidence)return Gd(c),Wd(l,`missing-evidence`);let d=Ld({sessionStore:r,sessionName:i,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:u.refsGeneration,refs:u.refs.map(e=>e.ref)});return d.published===!0?l:(Gd(c),Wd(l,d.reason))}function Wd(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 Gd(e){if(e)try{H.unlinkSync(e)}catch{}}function Kd(e,t){try{let n=V.join(e.ensureSessionDir(),`replay-divergence`);H.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=V.join(n,r);return H.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const qd={id:0,"role-label":1,label:2,other:3};function Jd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Yd(n.basis)<Yd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Yd(e.basis)-Yd(t.basis)||e.nodeIndex-t.nodeIndex)}function Yd(e){return qd[e]}async function Xd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,observationStore:l,resumeStamper:u,logPath:d,responseLevel:f,scrubVars:p=[],planActions:m,planDigest:h,signal:g}=e,_=Er(p),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await $d({session:o,sessionName:s,observationStore:l,logPath:d,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},b=rf(y,_),x=y.state===`available`&&o?lf({action:n,session:o,nodes:y.nodes,sanitize:_}):[],S=Ad({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Zd(y)}),C=Dd({failedIndex:r+1,actions:m,planDigest:h,repairHint:S,resumeStamper:u});return Ud({sessionStore:c,observationStore:l,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(tt(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:C,repairHint:S},responseLevel:f,evidence:y.state===`available`?y.evidence:void 0,...g?{signal:g}:{}})}function Zd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Qd=[300,500,800,1200,2e3,3e3,4e3];async function $d(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=tf(a),c=Date.now()+12e3,l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Qd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await xr(Math.min(e,a)),l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s})}return l.observation}async function ef(e){let{session:t,sessionName:n,observationStore:r,logPath:i,flags:a}=e;try{let e=(await ti({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(Yi(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=Ld({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:Pr(e)}}}function tf(e){return{snapshotInteractiveOnly:nf(e)}}function nf(e){return!uf(e.command)||df(e).requiresRect}function rf(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=cf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function af(e){return!!ur(e,cr(e.type??`Element`))||e.hittable===!0}function of(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function sf(e,t){let n=$t(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&af(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=>of(e,t)),...o.filter(e=>!of(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function cf(e,t,n){let{nodes:r,truncated:i}=sf(e,n);return{refs:r.map(e=>{let n=cr(e.type??`Element`),r=ur(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function lf(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!uf(t.command))return[];let a=wd(t);return a.length===0?[]:ff({candidates:a,nodes:r,session:n,action:t,matching:df(t),sanitize:i})}function uf(e){return nt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function df(e){let t=nt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function ff(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=pf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Jd(s).map(e=>e.suggestion)}function pf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Pe(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:mf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function mf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Oe(t,r.device.platform,{action:i.command===`fill`?`fill`:nt(i.command)?`click`:`get`,nodes:n}),c=cr(t.type??`Element`),l=ur(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function hf(e){return{...e,hint:e.hint??vf(e.details,`hint`),diagnosticId:e.diagnosticId??vf(e.details,`diagnosticId`),logPath:e.logPath??vf(e.details,`logPath`)}}function gf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return _f({error:t,actionLabel:tt(n),action:n.command,positionals:lt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function _f(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:wr(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:wr(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...bf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>wr(e,u))}:{},divergence:l}}}}function vf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const yf=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function bf(e){if(!e)return{};let t={};for(let n of yf)e[n]!==void 0&&(t[n]=e[n]);return t}async function xf(e){return await Sf({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function Sf(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,observationStore:p,resumeStamper:m,logPath:h,planActions:g,planDigest:_}=e;if(t.ok)return t;let v=Cf(t.error.details?.replaySource),y=hf(t.error),b=await Xd({error:y,action:n,index:r,sourcePath:v?.path??a,sourceLine:v?.line??o,session:p.get(),sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:g,planDigest:_,signal:N(u.meta?.requestId)});return gf({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function Cf(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 wf(t,n){if(t)try{H.appendFileSync(t,`${JSON.stringify(e(n))}\n`)}catch(e){M({level:`warn`,phase:`replay_trace_write_failed`,data:{path:t,error:e instanceof Error?e.message:String(e)}})}}async function Tf(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();wf(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:lt(o)??[]});let m;try{m=await Df({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(e){if(!(e instanceof t))throw e;m={ok:!1,error:n(e)}}let h=Date.now();return wf(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?kf(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Ef(m,u??s,c)}function Ef(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 Df(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Af(t.flags,r.flags),s=i.command===`fill`?Bt(Wt(i)):void 0;return s&&(o.recordAs=s),await a(Of({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??zi(t)}:{}}},r))}function Of(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:et(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ot(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function kf(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 Af(e,t){return p(e,{...t??{}})}function jf(e){return Rf(e.ok?Nf(e.data):Mf(e.error.details?.artifactPaths))}function Mf(e){return Array.isArray(e)?e.filter(Lf):[]}function Nf(e){return e?[If(e.path),If(e.outPath),...Pf(e.artifacts)].filter(Lf):[]}function Pf(e){return Array.isArray(e)?e.map(Ff).filter(Lf):[]}function Ff(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return If(t.localPath)??If(t.path)}function If(e){return typeof e==`string`?e:void 0}function Lf(e){return typeof e==`string`}function Rf(e){return[...new Set(e.filter(zf))]}function zf(e){try{return H.statSync(e).isFile()}catch{return!1}}function Bf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Vf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Xt(r),u=ie(t),d=Jt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Ct(r,e)===t.sibling),p=d.filter(e=>St(xt(e,l),t.scrollRegion)),m=yt(p)[t.viewportOrder]?.ref,h=bt({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Wf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Vf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Hf(n,t,i,a):Uf(n,t,r,a,o)}function Hf(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),o=a(t),c=o?s(e,o):null;if(i(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Qt(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Uf(e,t,n,r,i){let a=Le(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=en(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Wf(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?Gf(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?Gf(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?Gf(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 Gf(e,t,n){let r=wt(t),i=Yt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ye(e,r),...fe(e.ancestry,i)].slice(0,5)}function Kf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=st(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ve(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!nt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Jf(r)&&Jf(n[1])))return r}function qf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Jf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Yf(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=Er(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:ap(ie(n),g),...t.observed?{observed:ap(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>op(e,g))},v=Ad({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Dd({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b={version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(tt(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:_},x=Ud({sessionStore:u,observationStore:e.observationStore,sessionName:l,divergence:b,responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return gf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:x,scrubVars:p})}function Xf(e,t,n){let r=Er(e.scrubVars);return Yf(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:rf(n,r),publicationEvidence:ep(n),repairCapture:Zd(n)})}async function Zf(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await $d({session:t,sessionName:n,observationStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function Qf(e,t){return Xf(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 Zf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function $f(e,t,n){return Xf(e,t,await Zf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ep(e){return e.state===`available`?e.evidence:void 0}function tp(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?he(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Re(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Kf(n,i),platform:a.device.platform}:{kind:`inactive`}}function np(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=df(r),s=Bf({recorded:t,token:n,nodes:i,platform:a,refLabel:qf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:wt(s.winnerNode),structural:xe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?wt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function rp(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function ip(e){return!e.ok&&e.error.details?.reason===Zt}function ap(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function op(e,t){let n=cr(e.type??`Element`),r=ur(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function sp(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function cp(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 lp(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 up(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 dp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:cp(e?.observed),expectedStructural:up(e?.expectedStructural),observedStructural:up(e?.observedStructural)}}function fp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:cp(e?.observed),observedAncestry:lp(e?.observedAncestry)}}function pp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function mp(e,t,n){let r=pp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&rp(e)?{status:`guard-mismatch`,evidence:dp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&ip(e)?{status:`landmark-mismatch`,evidence:fp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function hp(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,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,pp(gp(e),jf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return tp({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await $d({session:i,sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return np({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Tf({req:sp(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,jf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:mp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await Qf(c(e,n,r,i),{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Xf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await $f(c(e,n,i,a),r,{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=gp(o),u=await _p(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=>vp(e),onStep:i,diagnosticsMarker:()=>bp(t.sessionStore),diagnosticsSince:e=>xp(t.sessionStore,e)},readLastResponse:()=>o}}function gp(e){return e&&!e.ok?e:P(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function _p(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return yp(i)?c(i):c(await xf({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,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function vp(e){let t=e.positionals??[],n=Me(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function yp(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 bp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function xp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Sp(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Cp(t,i)};return Tp(o,`AD_PLATFORM`,a.platform??r.platform),Tp(o,`AD_TARGET`,a.target??r.target),Tp(o,`AD_DEVICE`,a.device),Tp(o,`AD_DEVICE_ID`,wp(a)),Ep(o,`AD_SHARD_INDEX`,a.shardIndex),Ep(o,`AD_SHARD_COUNT`,a.shardCount),Tp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Cp(e,t){let n=e.meta?.cwd??process.cwd();return V.relative(n,t)||t}function wp(e){return typeof e.serial==`string`?e.serial:e.udid}function Tp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Ep(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Dp=3e4,Op=1e3;function kp(e){let{scriptPath:r,env:i,publicNetworkOnly:a}=e,o=H.readFileSync(r,`utf8`),s=Object.create(null);try{ga.runInNewContext(o,Ap(i,s,a),{filename:r,timeout:Dp})}catch(e){let i=n(e);throw new t(i.code,`Maestro runScript failed: ${i.message}`,u({...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 Lp(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Rp(t)]))}function Ap(e,t,n){return{...e,output:t,json:jp,http:{post:(e,t)=>Np(`POST`,e,n,t)}}}function jp(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`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,Mp)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,Op)},n instanceof Error?n:void 0)}}function Mp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Np(e,n,r,i){let a=br(process.execPath,Pp(),{stdin:JSON.stringify(Ip(e,n,i,r)),timeoutMs:Dp,allowFailure:!0});if(a.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${zp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:a.stdout.slice(0,Op),stderr:a.stderr.slice(0,Op)},r instanceof Error?r:void 0)}}function Pp(){let e=Fp(import.meta.url);if(!e)throw new t(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Fp(e){try{let t=ma(e),n=V.extname(t)||`.js`;return[V.join(V.dirname(t),`run-script-http-child`+n),V.join(V.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>H.existsSync(e))??null}catch{return null}}function Ip(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Lp(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function Rp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function zp(e){let t=e.trim();return t.length>0?t.slice(0,Op):`request process exited without stderr`}async function Bp(e){return await Vp(`tap`,async t=>{let n=V.join(t,`before.png`),r=V.join(t,`after.png`),i=await Up(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Up(e,r)))return await Hp(n,r,e.signal,`tap`)}})})}async function Vp(e,t){let n=await U.mkdtemp(V.join(pa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await U.rm(n,{recursive:!0,force:!0})}catch{}}}async function Hp(e,t,n,r){try{let[i,a]=await Promise.all([U.readFile(e),U.readFile(t)]);qp(n);let o=await Ji(i,a,`Maestro screenshot`);return qp(n),Wp(o,r)}catch(e){Kp(e,n),M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Up(e,t){try{return await U.rm(t,{force:!0}),qp(e.signal),await e.capture(t),qp(e.signal),!0}catch(t){return Kp(t,e.signal),!1}}function Wp(e,t){if(e.status!==`compared`)return Gp(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return Gp(t,n?`stable`:`changed`,e),n}function Gp(e,t,n){M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Kp(e,t){if(t?.aborted||o(e))throw r()}function qp(e){if(e?.aborted)throw r()}async function Jp(e){Xp(e.timeoutMs),qp(e.signal);let t=e.now()+e.timeoutMs;return await Vp(`animation`,async n=>{let r=V.join(n,`first.png`),i=V.join(n,`second.png`);for(;;){if(qp(e.signal),await Yp(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Yp(e,t,n){let r=[await Up(e,t),await Up(e,n)];return!r[0]||!r[1]?!1:await Hp(t,n,e.signal,`animation`)===!0}function Xp(e){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Zp=J.observationPollMs;async function Qp(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!mm(n)||(Z(e.context.signal),!await fm(e.dependencies,t,Zp,e.context.signal)))throw n}}}function $p(e){return em({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function em(e){let t=Ri(e.snapshot),n=e.platform===`ios`?ea(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:i(n.nodes)}:e.snapshot;return am(mo(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function tm(e){pm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await Qp(e,n),i=em({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ya(e.condition,i))return i;if(e.dependencies.now()>=n)break;await fm(e.dependencies,n,Zp,e.context.signal)}return Z(e.context.signal),_m(t)}async function nm(e){pm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await Qp(e,t);if(r=void 0,n=em({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===J.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),_m(n)}async function rm(e){pm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Qp(e,t),r=hm(n);for(;;){Z(e.context.signal),await fm(e.dependencies,t,Zp,e.context.signal);let i=await Qp(e,t),a=hm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function im(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function am(e,t,n,r,i,a,o){if(!e.ok){let t=im(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=sm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=im(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:om(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:hm(t)}:{}}}function om(e,t){return!Xe(e)||!Xe(t)?0:_e(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 sm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!cm(t,n,r)||i!==1))return lm(t.selector)}function cm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!ho(e.selector)}function lm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!um(n)||typeof r!=`string`)return;let i=tn(r)?.trim();return i?{key:n,value:i}:void 0}function um(e){return e===`id`||e===`label`||e===`text`}async function dm(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?r():e}Z(n)}async function fm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await dm(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw r()}function pm(e,n){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function mm(e){return e instanceof t&&e.details?.retriable===!0}function hm(e){return fa(`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:gm(e.rect)})))).digest(`hex`)}function gm(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 _m(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function vm(e){return e.kind===`clearState`?Cm(e):ym(e)?bm(e):jm(e)?Mm(e):Tm(e)}function ym(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function bm(e){switch(e.kind){case`launchApp`:return xm(e);case`stopApp`:return Sm(e);case`openLink`:return wm(e)}}function xm(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 Sm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function Cm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function wm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Tm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Em(e);case`clickPoint`:return Dm(e);case`swipe`:return Om(e);case`scroll`:return km(e);case`pressKey`:return Am(e)}}function Em(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Dm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Om(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function km(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Am(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function jm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Mm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Nm(e,n){let r=vm(n),i=await e.invoke(u({...r,flags:Pm(e.flags,r.flags??{})}));if(!i.ok)throw Bm(i);if(n.kind===`gestureViewport`){let e=i.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new t(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function Pm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=u({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Fm(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 Im(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 Lm(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 Rm(e,n,r){if(V.isAbsolute(e))return e;let i=n.source?.path??r;if(!i)throw new t(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return V.resolve(V.dirname(i),e)}function zm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Bm(e){let n=e.error,r=u({...n.details??{},hint:n.hint??Vm(n.details,`hint`),diagnosticId:n.diagnosticId??Vm(n.details,`diagnosticId`),logPath:n.logPath??Vm(n.details,`logPath`),retriable:n.retriable??Hm(n.details,`retriable`),supportedOn:n.supportedOn??Vm(n.details,`supportedOn`)});return new t(n.code,n.message,Object.keys(r).length?r:void 0)}function Vm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Hm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Um(e){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Nm(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new t(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=_(i,i);return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=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 t(`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 t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function Wm(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 Qp({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=$p({query:t,context:n,snapshot:o,platform:i.platform});if(Xm(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await fm(i.dependencies,a,Zp,n.signal)}}}async function Gm(e,t,n,r,i,a){let o=async()=>await Jm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Bp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Nm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await Km(e,t,n,r,i,a.click,o)});return}await Km(e,t,n,r,i,a.click)}async function Km(e,t,n,r,i,a,o){let s=async()=>await Jm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:hm(await t.capture(i))),l=async()=>{let r=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await qm({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 qm(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<J.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Jm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Zm(e,o,n.point,i);return}catch(n){if(!Qm(n))throw n;let o=await Wm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Ym(o))throw n;t.invalidate(r.generation),await $m(e,Nr(o.rect),i);return}}t.invalidate(r.generation),await $m(e,n.point,i)}function Ym(e){return e.matched&&e.visible&&e.rect!==void 0}function Xm(e,t){return Ym(e)?!t||e.dispatchSelector!==void 0:!1}async function Zm(e,t,n,r){M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Nm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Qm(e){let t=l(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===lr.selectorNotFound}async function $m(e,n,r){if(!n)throw new t(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await Nm(e,{kind:`clickPoint`,point:n,options:r})}function eh(e){let t=Um(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},r=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},i=e.platform,a=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Nm(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,i)=>{hr(n),await s({kind:`typeText`,text:n},i);let a=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});r(a),t.prime(i.generation,a.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await Wm({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await tm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async()=>await a({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Fm(e.arguments),...Fm(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)},clearState:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`clearState`,...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(r,i)=>await Gm(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>$m(e,t.target.point,u({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>$m(e,t.target.point,{holdMs:J.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??J.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await nm({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=Oa(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 rm({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw jn(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Im(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 Jp({timeoutMs:t.timeoutMs??J.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Lm(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:kp({scriptPath:Rm(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?zm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function th(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=eh(e);return So(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function nh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),rh(()=>oh(r,e)),rh(()=>sh(n,t,e))},actionCompleted:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!0))},actionFailed:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!1))}}}function rh(e){try{e()}catch{}}function ih(e,t){let n=e.get(t);return e.delete(t),n}function ah(e,t){return u({...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 oh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function sh(e,t,n){wf(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 ch(e,n,r,i){let a=lh(r);wf(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{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 t?{errorCode:r.error.code}:{}})}function lh(e){let t=`data`in e?e.data:void 0,n=uh(t?.timing)?t.timing:void 0;return u({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function uh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function dh(e,t){let n=u({...e.internal,...fh(t.dispatch)});return u({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,internal:Object.keys(n).length>0?n:void 0})}function fh(e){return u({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile})}function ph(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:_h(e.action),positionals:vh(e.action,e.value),flags:t.flags??{}}}}async function mh(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,observationStore:o,logPath:s}=e,c=N(r.meta?.requestId),l=ph(t,r),u=hf(e.error),d=[...t.redactions],f=Er(d),p={...u,message:f(u.message),...u.hint?{hint:f(u.hint)}:{}},m=o.get(),h=m?await $d({session:m,sessionName:i,observationStore:o,logPath:s,action:l.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},g=m&&h.state===`available`&&!t.isControl?hh({failure:t,action:l.action,session:m,nodes:h.nodes,sanitize:f}):[],_=[t.action,gh(t.value)].filter(Boolean).join(` `),v=Ud({sessionStore:a,observationStore:o,sessionName:i,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:f(t.source.path??n),line:t.source.line}},action:f(_),cause:{code:p.code,message:p.message,...p.hint?{hint:p.hint}:{}},screen:rf(h,f),suggestions:g.slice(0,5),suggestionCount:g.length,resume:t.resume,repairHint:Ad({kind:`action-failure`,targetEvidence:void 0,capture:Zd(h)})},responseLevel:r.meta?.responseLevel,evidence:h.state===`available`?h.evidence:void 0,...c?{signal:c}:{}});return _f({error:p,actionLabel:_,action:t.action,positionals:[...l.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:v,scrubVars:d,warnings:t.warnings})}function hh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Jd(pn(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>mf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function gh(e){return!e||e===`<text>`?e??``:it(e)}function _h(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function vh(e,t){return!t||e===`inputText`?[]:[t]}function yh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=xh(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:Sh(c,Date.now()-r)}}}async function bh(e){let{command:t,replayPath:r,state:i,outcome:a}=e,{request:o,session:{name:s,store:c,observationStore:l,logPath:u}}=t,{failure:d}=a,f=n(a.error);return d?await mh({error:f,failure:d,replayPath:r,req:o,sessionName:s,sessionStore:c,observationStore:l,logPath:u,snapshotDiagnostics:xh(c,i.snapshotStart)}):{ok:!1,error:f}}function xh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return m(n)}function Sh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Ch(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return P(`INVALID_ARGS`,sn);if(t.flags?.saveScript!==void 0)return P(`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 wh({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await bh({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function wh(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c,invoke:l}=t,u=await Th({command:t,bundle:n}),d=Mh({req:a,invoke:l,device:u.device,platform:u.platform,runtimeHints:u.runtimeHints,sourcePath:u.filePath});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await _n(u.flow,d,{defaults:u.defaults,env:u.env,platform:u.platform,target:u.target,runtimeHints:u.runtimeHints,signal:u.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:a.internal?.publicNetworkOnly!==!0,readSource:e=>un(n,e),observer:nh({filePath:u.filePath,tracePath:s,onStep:c})});return f.ok?yh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await bh({command:t,replayPath:n.entry,state:i,outcome:f})}async function Th(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=tr(un(n,o),o),c=a.lookup(),l=c?.session;c&&Wi(c,r.flags);let u=await Eh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Ah({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:jh(r),signal:N(r.meta?.requestId)}}async function Eh(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 Fi(t.flags??{},mn(a.appTarget,o))),c=Lh(t,s),l=Oh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Dh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Rh(t,s),runtimeHints:l,flow:a})}async function Dh(e){if(e.device||!kh(e.runtimeHints))return e;let t=await Fi(e.req.flags??{},mn(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Rh(e.req,t),runtimeHints:Oh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Oh(e){return Bn({req:e.req,sessionStore:{getRuntimeHints:t=>t===e.sessionName?e.sessionStore.getRuntimeHints():void 0},sessionName:e.sessionName,device:e.device,platform:e.platform})}function kh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Ah(e){return{...Sp({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function jh(e){return{...kt(Ot(e.flags?.replayShellEnv)),...Et(Tt(e.flags?.replayEnv))}}function Mh(e){let{req:t,invoke:n,device:r,platform:i,runtimeHints:a,sourcePath:o}=e,s={...t,runtime:a};return th({invoke:e=>n(dh(s,e)),flags:Nh(r,i,t.flags),publicNetworkOnly:t.internal?.publicNetworkOnly===!0,platform:i,sourcePath:o,dependencies:{now:Date.now,sleep:async(e,t)=>{await ha(e,void 0,{signal:t})}}})}function Nh(e,t,n){if(!e)return Ph(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 Ph(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Fh(n,t):Ih(n,t)}function Fh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Ih(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Lh(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new t(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Rh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function zh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(Nt(t,a.flags?.replayBackend)===`maestro`)return n?P(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Ch(i):P(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Bh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Vh(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=Hh(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(),_=Uh({req:t,coordinator:s,manifest:l,preEntrySession:g});return _.ok?{ok:!0,value:{replayReq:u,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h,preEntrySession:g,entryIndex:_.value,varSources:Gh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Vh(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return P(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Hh(e,t){let n=$u(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Wh({...e,flags:hn(e.flags,n.actions)},n.metadata)}}function Uh(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:P(`INVALID_ARGS`,a.message)}}function Wh(e,t){return!t.platform&&!t.target?e:{...e,flags:Kh(e.flags,t)}}function Gh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Sp({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:kt(Ot(t.flags?.replayShellEnv)),cliEnv:Et(Tt(t.flags?.replayEnv))}}function Kh(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 qh(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=Jh({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Zh({req:t,coordinator:a}),Xh({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function Jh(e){let t=Qh(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return Kr()}function Yh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?P(`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.`):$h({saveScript:t,liveForce:n,persistedForce:Vt(r)||void 0,sourcePath:i,existingSaveScriptPath:Ft(r)})}function Xh(e){let{req:t,sessionStore:n,sourcePath:r,coordinator:i}=e,a=n.get(),{saveScript:o,force:s}=t.flags??{},c=Yh({saveScript:o,force:s,preRunState:a?.scriptPublication??It,sourcePath:r});return c?{ok:!1,response:c}:(i.demoteForRerunIfArmed(),{ok:!0,armSaveScript:eg({saveScript:o,force:s,coordinator:i,sourcePath:r})})}function Zh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Qh(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return P(`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 $h(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?kr(t):a??yd(i);if(!(n||r&&o===a)&&H.existsSync(o))return P(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function eg(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 tg(e){let{request:t,session:{name:n,logPath:r,store:i,mutationStore:a,observationStore:o},tracePath:s,onStep:c,invoke:u}=e,d=t.flags?.replayScriptSource;if(!d)return P(`INVALID_ARGS`,sn);let f=Date.now(),p=t.flags?.replayKeepSession===!0,m=``,h=new Set,g=vd({sessionStore:i,mutationStore:a});try{if(m=d.entry,Pt(m)&&t.flags?.replayBackend!==`maestro`)return P(`INVALID_ARGS`,Mt(`replay`,m));let a=await zh({resolved:m,keepSession:p,coordinator:g,command:e});if(a)return a;let l=Bh({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:m,script:un(d,m),coordinator:g});if(!l.ok)return l.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=l.value,T=qh({req:t,entryIndex:S,sessionStore:i,sourcePath:m,coordinator:g});if(!T.ok)return T.response;let{runtime:E,readLastResponse:ee}=hp({ctx:{replayReq:_,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:m,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:u,signal:N(t.meta?.requestId),coordinator:g},req:t,artifactPaths:h,onStep:c,armSaveScript:T.armSaveScript}),D=await fd({actions:v,entryIndex:S,keepSession:p,actionLines:y,actionSourcePaths:b,resolvedPath:m,varSources:C},E);return D.status===`failed`?ee()??P(`COMMAND_FAILED`,`replay step failed with no recorded response`):ng({startedAt:f,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:g,keepSession:p})}catch(e){let t=l(e);return P(t.code,t.message,h.size>0?{artifactPaths:[...h]}:void 0)}}function ng(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=ig({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=m([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:rg(i,Date.now()-t)}}}function rg(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function ig(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return P(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function ag(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=V.resolve(n??`.`,t??`.agent-device/test-artifacts`);return V.join(i,r)}function og(e,t){let n=t?V.relative(t,e):V.basename(e),r=n.length===0||n.startsWith(`..`)?V.basename(e):n;return ze(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function sg(e,t){H.mkdirSync(t,{recursive:!0}),ug(e,t)}function cg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=V.join(o,`result.txt`),u=V.join(o,`failure.txt`),d=lg([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>V.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
+
`)}\n`;H.writeFileSync(l,p),s||H.writeFileSync(u,p)}function lg(e,t,n){let r=[],i=new Set(n.map(e=>V.basename(e).toLowerCase()));for(let n of e){if(!fg(n))continue;let e=V.basename(n);if(V.resolve(n)===V.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=dg(e,t,i),o=V.join(t,a);H.copyFileSync(n,o),r.push(o)}return r}function ug(e,t){let n=V.join(t,`replay.ad`);if(H.copyFileSync(e,n),V.extname(e).toLowerCase()===`.ad`)return;let r=V.join(t,V.basename(e));V.resolve(r)!==V.resolve(n)&&H.copyFileSync(e,r)}function dg(e,t,n){let r=V.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||H.existsSync(V.join(t,a));)a=`${i}-${o++}${r}`;return a}function fg(e){try{return H.statSync(e).isFile()}catch{return!1}}function pg(e){let{platformFilter:n,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}yg(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=n?` for --platform ${n}`:``;throw new t(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function mg(e,t,n,r,i=0){let a=V.basename(n,V.extname(n)),o=ze(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function hg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return ze(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function gg(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,V.basename(r),`attempt`,a+1].join(`:`)}function _g(e,t){return typeof e==`number`?e:t}function vg(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function yg(e,t){return e===`apple`?b(t):t===e}function bg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const xg=2e3;async function Sg(e){let{filePath:t,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=kg({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>bg({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Ag(o,[...v]))},o)})]):await w,Q(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 wg(w)||(x=Dg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:xg}}),Tg({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await Eg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Og(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=Cg(x,i,v)}}return x??bg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Cg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:bg({error:t,artifactPaths:[...n],infrastructure:!0})}async function wg(e){return await Promise.race([e.then(()=>!0),ha(xg).then(()=>!1)])}async function Tg(e){let{replayPromise:t,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:n(e).message}})}}}async function Eg(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Q(o,e)});return Q(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 t=n(e);return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:t.message}}),bg({error:t})}}function Dg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Og(e,t){return{...e,warnings:[...e.warnings,t]}}function kg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=V.join(t,`replay-timing.ndjson`);return H.mkdirSync(V.dirname(l),{recursive:!0}),H.writeFileSync(l,``),n.add(l),Q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Q(e,t){e&&H.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Ag(e,t=[]){return bg({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 jg(e){let t=Mg(e),n=await Ng(e,t);return{result:zg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Mg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:V.join(i,...a?[`shard-${a.shardIndex+1}`]:[],og(t.path,n)),maxAttempts:r+1}}async function Ng(e,t){Fg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Pg(e,t,r);if(Ig(n,i),Lg(e,i.outcome,r))break;Rg(e,t,i)}return n}async function Pg(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=mg(i,a,r.path,o,n),h=V.join(t.testArtifactsDir,`attempt-${f}`);sg(r.path,h);let g=gg({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,...Wg(d)},v=await Sg({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 cg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Fg(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:mg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Wg(c)})}function Ig(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 Lg(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Rg(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,...Wg(e.shard)})}function zg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Bg(e,t,n,r):Vg(e,t,n,r)}function Bg(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,...Wg(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}:{},...Ug(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Vg(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,...Wg(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...Hg(c),...Ug(s)}}function Hg(e){let t=e?.status===`failed`?e:void 0;return{...t&&t.warnings.length>0?{warnings:[...t.warnings]}:{},...t?.infrastructure?{infrastructure:!0}:{},...e?.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function Ug(e){return Wg(e)}function Wg(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Gg(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 Kg(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c,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(),l=await qg(t,u,d);Zg(l,a);let p=l.shardPlan?Qg({entries:l.entries,total:l.total,emitProgress:a}):[];return l.shardPlan?p.push(...await $g({shards:l.shardPlan.shards,sessionName:f,suiteInvocationId:l.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:l.suiteArtifactsDir,suiteTotal:l.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c})):p.push(...await r_({discoveryEntries:l.entries,sessionName:f,suiteInvocationId:l.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:l.suiteArtifactsDir,suiteTotal:l.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c})),{status:`completed`,data:o_(l.total,p,Date.now()-e,l.suiteArtifactsDir)}}catch(e){let t=l(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function qg(e,t,n){let r=Jg(e,t),i=Yg(r),a=r.length-i.length,o=hg(e.requestId),s=await Gg(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:Xg(e,o),total:s?.total??r.length}}function Jg(e,t){return pg({platformFilter:e.platformFilter,discoverSources:t})}function Yg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Xg(e,t){return ag({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Zg(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 Qg(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 $g(e){return(await Promise.allSettled(e.shards.map(async t=>await t_({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[e_(r,e.sessionName,t.reason)]:[]})}function e_(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:n_(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function t_(e){let{shard:t,sessionName:n}=e;return await i_({...e,entries:t.entries,sessionName:n_(n,t),shard:t})}function n_(e,t){return`${e}:shard-${t.shardIndex+1}`}async function r_(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 jg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:vg(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:_g(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),a_(t,o,p))break}return g}async function i_(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 jg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:vg(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:_g(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),a_(b,o,m))break}return _}function a_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function o_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=g(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function s_(e,t){return()=>e.map(e=>c_(e,t))}function c_(e,t){let n=e.entry,r=un(e,n),i=Nt(n,t)===`maestro`,a=at(r);return{path:n,manifest:{...i?{title:tr(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function l_(e){return async t=>(await f_(e,t)).map(u_)}function u_(e){if(e.platform===`web`||!x(e))throw new t(`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 d_(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 f_(e,n){let r=g_(e),i=m_(await Ni(p_(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${h_(n)}, but only ${i.length} matched`);return i.slice(0,n)}function p_(e){let t=L(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:y({simulatorSetPath:ji(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function m_(e,t,n){return t.length>0?__(e,t,n):e.filter(e=>v_(e,n)).sort(x_)}function h_(e){return`${e} device${e===1?``:`s`}`}function g_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function __(e,n,r){return n.map(n=>{let i=b_(n),a=e.find(e=>y_(e,r)&&(e.id===n||b_(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function v_(e,t){return!y_(e,t)||!x(e)?!1:e.booted!==!1}function y_(e,t){return!(!v(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function b_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function x_(e,t){return e.id.localeCompare(t.id)}function S_(e){let n=C_(e?.shardAll,`--shard-all`),r=C_(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function C_(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}const w_=new Set([`IOS_BOOT_TIMEOUT`,`IOS_RUNNER_CONNECT_TIMEOUT`,`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,`IOS_TOOL_MISSING`,`ANDROID_BOOT_TIMEOUT`,`ADB_TRANSPORT_UNAVAILABLE`,`CI_RESOURCE_STARVATION_SUSPECTED`]);function T_(e){return w_.has(e.toUpperCase())}const E_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function D_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=O_(e);return t?k_(t.details)||A_(t.code,t.message):!1}function O_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function k_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||Wn(t)?!0:t?T_(t):!1}function A_(e,t){let n=`${e}\n${t}`.toLowerCase();return E_.some(e=>n.includes(e))}function j_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:P_(e.error.details?.artifactPaths),warnings:sr(e.error.details),infrastructure:D_(e),...F_(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:sr(t),artifactPaths:P_(t?.artifactPaths),...F_(t?.snapshotDiagnostics)}}function M_(e){if(!e||e.ok)return;let t=j_(e);return t.status===`failed`?t:void 0}function N_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function P_(e){return[...new Set(N_(e))]}function F_(e){let t=h(e);return t?{snapshotDiagnostics:t}:{}}const I_=1e3,L_=3e3;function R_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await z_(e)}}async function z_(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=Cr(o.device.platform),c=i?V.join(i,`recording${s}`):Sr(o.device.platform);V_(a,{type:`video_recording_start`,session:n,videoPath:c}),M({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(H_({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return V_(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await xr(I_),V_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:I_}),M({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:I_}}),l}async function B_(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;V_(a,{type:`video_tail_start`,session:n,requestedDurationMs:L_});let o=Date.now();await xr(L_);let s=Date.now(),c=await e.video.record(H_({req:t,sessionName:n,phase:`stop`}));return jf(c).forEach(e=>i.add(e)),V_(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),M({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function V_(e,t){e({...t,ts:new Date().toISOString()})}function H_(e){let t={token:e.req.token,meta:e.req.meta};return e.phase===`start`?{request:t,sessionName:e.sessionName,phase:`start`,outputPath:e.outputPath}:{request:t,sessionName:e.sessionName,phase:`stop`}}const U_=[{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.`}],W_=({attemptId:e,parentAttemptId:t})=>{Hr(e);let n=G_(e,t);return{cancel:()=>zr(e),release:()=>{n(),Vr(e)}}};function G_(e,t){if(!t||t===e)return()=>{};let n=N(t);if(!n)return()=>{};let r=()=>{zr(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function K_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=q_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:d_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function q_(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function J_(e){let{request:t,session:{name:n,logPath:r},createSession:i,invoke:a,cleanupSession:o,video:s}=e;if(t.flags?.recordVideo===!0&&s===void 0)return P(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let c=t.flags??{};for(let e of U_)if(e.requested(c))return P(`INVALID_ARGS`,e.message);let u,d;try{u=Z_(t,n),d=X_(t)}catch(e){let t=l(e);return P(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Kg({request:u,emitProgress:Ur,isCanceled:()=>Br(t.meta?.requestId),emitDiagnostic:M,bindAttemptCancellation:W_,runReplay:async({filePath:e,sessionName:n,platform:o,target:c,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&jf(e).forEach(e=>d.add(e)),e),v=K_({parentFlags:t.flags,platform:o,target:c,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=i(n,r),b=s?{req:t,sessionName:n,sessionStore:y.store,artifactsDir:u,appendTimingEvent:m,video:s}:void 0,x=b?R_(b):void 0;return j_(await tg({request:{...t,command:`replay`,session:n,positionals:[e],flags:v,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||x?{internal:{...t.internal??{},...x?{openLifecycle:x}:{}}}:{}},session:y,tracePath:p,onStep:g,invoke:async e=>{let t=b?await z_(b):void 0;return t&&!t.ok?t:_(await a(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,appendTimingEvent:o})=>{if(s)return M_(await B_({req:t,sessionName:e,sessionStore:i(e,r).store,artifactsDir:a,appendTimingEvent:o,artifactPaths:n,video:s}))},discoverSources:s_(d,t.flags?.replayBackend),resolveShardTargets:l_(t.flags),cleanupSession:o});return p.status===`completed`?{ok:!0,data:Y_(p.data,t)}:P(p.error.code,p.error.message)}function Y_(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=V.join(n,V.basename(r)),a=e=>e===r||e.startsWith(r+V.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return H.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:V.basename(r)}]}:o}function X_(e){let n=e.flags?.replayScriptSources;if(!n)throw new t(`INVALID_ARGS`,sn);return n}function Z_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=$_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:kr(i,r),failFast:n.failFast===!0,retries:Q_(n.retries),timeoutMs:Q_(n.timeoutMs),shard:S_(n)}}function Q_(e){return typeof e==`number`?e:void 0}function $_(e){return typeof e==`string`?e:void 0}function ev(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await aa({req:tv(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function tv(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const nv=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await tg({request:e,session:iv(t,n,r),invoke:a??i}),rv=async({req:e,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=ev({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await J_({request:e,session:iv(n,r,i),createSession:(e,t)=>iv(e,t,i),invoke:s??o,cleanupSession:async t=>await av({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function iv(e,t,n){let r=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1};return{name:e,logPath:t,store:{get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)},mutationStore:{update:r,clearRepairTombstone:()=>n.clearRepairTombstone(e)},observationStore:{get:()=>n.get(e),update:r}}}async function av(e){let{req:n,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await sc({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new t(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function ov(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command!==rr.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return uv(new t(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return uv(new t(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=lv(a);if(o)return uv(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return uv(new t(`INVALID_ARGS`,`session save-script path cannot be empty.`));Rt(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:qt(a,n.flags?.force),publication:`active`});return c.written?(Ut(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...j(`Published script: ${c.path}`)}}):uv(c.error??new t(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function sv(e){if(dt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Lt(e)?void 0:`not-armed`}const cv={repair:()=>new t(`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 t(`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 t(`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 t(`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 lv(e){let t=sv(e);return t?cv[t]():void 0}function uv(e){return{ok:!1,error:n(e)}}function dv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function fv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$r(e)}}async function pv(e,n,r){if(r.length!==1)throw new t(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(fv(n))}}async function mv(e,n,r){if(r.length<2)throw new t(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...fv(n),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...j(`Clipboard updated`)}}async function hv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await I({command:`clipboard`,device:t,use:ke,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>pv(n,e,r)}}let o=await I({command:`clipboard`,device:t,use:Ne,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>mv(s,e,r)}}async function gv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=Y(nr.clipboard,s,c);if(l)return l;let u=t.positionals??[],d=dv(u);if(!d)return P(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let f=await X({session:s,flags:c}),p=await hv({device:f,action:d,positionals:u,inspectFacts:a,bindDevice:o});if(!p.ok)return p.response;let m=await p.execute(Jr(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,m),{ok:!0,data:{platform:E(f),...m}}}function _v(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 yv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function bv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Ur({type:`command`,status:`progress`,message:xv(t)})}function xv(e){return[ia(e),...ra(e)].join(`
|
|
3
|
+
`)}async function Sv(e,t){let{device:r,targetApp:i,session:a,listInstalledApps:o}=t;if(i)try{let t=o?Cv(i,await o(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${E(r)}.`,evidence:{requested:i,platform:E(r)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(t){let i=n(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${E(r)} --all`,evidence:{code:i.code,message:i.message}})}}function Cv(e,n){let r=e.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new t(`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 t(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function wv(e,t,r){let i=Ev(t,r);try{let t=await Ov(i),n=Dv(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Mv(n,i,t.failures),hint:n.length===0?Fv(t.failures):void 0,command:n.length===0?Bv(i):void 0,evidence:Vv(n,t.failures)}),n.length>0&&kv(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(t){let r=n(t);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 Tv(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:E(e),id:e.id,name:e.name}))}})}function Ev(e,t){let n=e.flags??{};return Li({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 Dv(e,t){return e.filter(e=>S(e,t,{includeExplicitSelectors:!0}))}async function Ov(e){if(e.platform)return{devices:await Ni(e),failures:[]};let t=[],n=[];for(let r of pr)try{t.push(...await Ni({...e,platform:r}))}catch(e){n.push(jv(r,e))}return{devices:t,failures:n}}function kv(e,t){for(let n of t)$(e,Av(n))}function Av(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Rv(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Rv(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function jv(e,t){let r=n(t);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Mv(e,t,n){if(e.length===0)return n.length>0?`No ${Nv(t)} devices found; ${Pv(n)}.`:`No ${Nv(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Nv(t)} ${zv(e.length,`device`)} available; ${r} booted`,a=Iv(e,t);return a?`${i} (${a}).`:`${i}.`}function Nv(e){let t=e.platform?Rv(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Pv(e){return e.slice(0,2).map(e=>`${Rv(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Fv(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Iv(e,t){if(t.platform||t.target)return;let n=fr(e),r=Lv();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function Lv(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Rv(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function zv(e,t){return e===1?t:`${t}s`}function Bv(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Vv(e,t){let n=new Map;for(let t of e){let e=E(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Hv=1500;async function Uv(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 Wv(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Gv(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 Wv(e,t,n){try{return await(n.resolveProcessInfo??Kv)(e,t)}catch{return}}function Gv(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 Kv(e,t){if(!qv(e))return;let n=await Jv(t);if(n!==void 0)return{pid:n,cwd:await Yv(n)}}function qv(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Jv(e){let t=await yr(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Hv});if(t.exitCode===0)return t.stdout.split(`
|
|
4
|
+
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Yv(e){let t=await yr(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Hv});if(t.exitCode===0)return t.stdout.split(`
|
|
5
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Xv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Zv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Qv(e,t){let n=Mr(e.meta?.cwd);return{targetApp:ry(e.flags?.targetApp)??t?.appBundleId,metroHost:ry(e.runtime?.metroHost)??`127.0.0.1`,metroPort:iy(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:ty(e,n)}}function $v(e,t={}){let n=ny(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 ey(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${E(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function ty(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function ny(e){let t={...Object.fromEntries([...Xv,...Zv].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 ry(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function iy(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function ay(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==nr.doctor)return null;let s=oy(e.hostDiagnostics),c=r.get(n),l=Qv(t,c),u=ly(r,n),d=[];if(bv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Or()} using ${u}`,evidence:{version:Or(),stateDir:u}},...$v(t,{required:l.remote}),...ey(r,n,c,{remote:l.remote})),l.remote)return my(d,l);let f=sy(l,u,i),p=await wv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await uy({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??cy(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return my(d,l,{device:h,includeMetro:!0,inventory:p})}function oy(e){if(!e)throw new t(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function sy(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>qr(e),emitProgress:e=>Ur({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Pi(e),shouldPropagateInventoryProbeError:Mi,transportOverrides:Object.freeze({androidAdb:n})})}function cy(e){let t=(e?.devices??[]).filter(e=>C(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function ly(e,t){let n=V.dirname(e.resolveSessionDir(t));return V.basename(n)===`sessions`?V.dirname(n):n}async function uy(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Tv(t,i,a.targetApp);return u&&await dy(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await Uv(a.metroHost,a.metroPort,a.kind)),bv(t,...await r.ambientChecks(n)),u}async function dy(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await fy({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await Sv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),bv(e,...await r.deviceChecks(i,n))}async function fy(e){if(e.device.platform!==`harmonyos`)return py(e)}async function py(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Te),u=L(n.flags?.androidDeviceAllowlist),d=await fc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await pc(l,d,e)}function my(e,t,n={}){let r=_v(e);return{ok:!0,data:{status:r,summary:vv(r),kind:t.kind,platform:n.device?E(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:yv(e)}}}async function hy(e){return await I({...e,command:`prepare`,use:He})}async function gy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return P(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(nr.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s}),u=await hy({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let d=Date.now(),f=await u.runtime.operations.prepareAppleRunner({timeoutMs:_y(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(t)}});return{ok:!0,data:vy(a,l,Math.max(0,Date.now()-d),f)}}function _y(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ae}function vy(e,t,n,r){return{action:e,platform:E(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:yy(n,r),message:`Prepared Apple runner: ${t.name}`}}function yy(e,t){let n=by(t.buildMs),r=xy(t.connectMs),i=xy(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 by(e){return e===void 0?void 0:xy(e)}function xy(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Sy=e=>mc(e),Cy=e=>yl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),wy=e=>sc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Ty=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Ol({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),Ey=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ku({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),Dy={session_list:Sy,devices:Sy,capabilities:Sy,apps:Sy,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await ay({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Ty,shutdown:Ty,appstate:Ty,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>ov({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ko({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await gv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Cs,perf:Ey,logs:Ey,events:Ey,network:Ey,audio:Ey,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await gy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Ls,reinstall:Ls,install_source:Ls,release_materialized_paths:async({req:e})=>await Ao({req:e}),push:Ls,"trigger-app-event":ws,open:Cy,replay:nv,test:rv,batch:async({req:e,sessionName:t,invoke:n})=>await Rs(e,t,n),close:wy};async function Oy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Vn,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=Dy[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{Oy as handleSessionCommands};
|