agent-device 0.21.26 → 0.21.27
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.26.apk → agent-device-android-ime-helper-0.21.27.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.27.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.26.manifest.json → agent-device-android-ime-helper-0.21.27.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.26.apk → agent-device-android-snapshot-helper-0.21.27.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.27.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.26.manifest.json → agent-device-android-snapshot-helper-0.21.27.manifest.json} +7 -7
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +11 -4
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/cli-help.js +1 -1
- package/dist/src/client-types.d.ts +3 -3
- package/dist/src/command-metadata.js +4 -4
- package/dist/src/connection.js +5 -5
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +4 -4
- package/dist/src/ios-snapshot-adapter.js +1 -1
- package/dist/src/limrun.js +1 -1
- package/dist/src/proxy.js +2 -2
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/src.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/package.json +4 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.26.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.26.apk.sha256 +0 -1
package/dist/src/session2.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{D as e,I as t,L as n,P as r,S as i,Y as a,f as o,n as s,q as c,s as l,tt as u,x as d}from"./sdk-contracts.js";import{C as f,D as p,H as m,T as h,U as g,V as _}from"./tv-remote.js";import{A as v,i as y,n as b,t as x,v as S}from"./sdk-batch-runner.js";import{a as C,n as w,t as T}from"./snapshot-diagnostics.js";import{$ as E,A as ee,E as D,F as O,G as k,I as te,M as ne,N as re,Q as ie,R as ae,T as oe,Y as se,j as ce,k as le,m as ue,rt as de}from"./back-mode.js";import{a as fe,r as A}from"./diagnostics.js";import"./diagnostics2.js";import{C as pe,E as j,O as me,_ as he,b as ge,f as M,g as N,h as P,w as _e}from"./sdk-device.js";import{B as ve,Bn as ye,Ct as be,E as xe,F as Se,G as Ce,Hn as we,I as Te,J as Ee,Jn as De,K as Oe,L as ke,M as Ae,P as je,Pt as Me,Q as Ne,R as Pe,Tt as Fe,Un as Ie,V as Le,W as Re,Wt as ze,X as Be,Y as Ve,Z as He,_n as Ue,ar as We,at as Ge,d as Ke,f as qe,gn as Je,in as Ye,it as Xe,j as Ze,mt as Qe,on as $e,or as et,p as tt,pt as nt,q as rt,sr as it,st as at,vn as ot,wt as st,y as ct,z as lt}from"./sdk-batch.js";import{a as ut,n as dt,o as ft,r as pt,s as mt,t as ht}from"./target-evidence.js";import{a as gt,i as _t,n as vt,o as yt,r as bt,s as xt,t as St}from"./vars.js";import{n as Ct,r as wt,t as Tt}from"./target-evidence-tree.js";import{g as Et,i as Dt}from"./observability.js";import{t as Ot}from"./app-inventory.js";import{l as kt}from"./exec.js";import{i as At}from"./retry.js";import{d as F,l as jt,u as Mt}from"./daemon-resolution.js";import{n as Nt,r as Pt}from"./output-path.js";import"./command.js";import{a as Ft}from"./version.js";import"./retry2.js";import{t as It}from"./project-runtime.js";import{t as Lt}from"./keyed-lock.js";import{i as Rt,n as zt}from"./replay-divergence.js";import{n as Bt,t as Vt}from"./deploy-result-target.js";import{i as Ht}from"./snapshot-chrome.js";import{a as Ut,d as Wt,f as Gt,g as Kt,l as qt,o as Jt,r as Yt,u as Xt}from"./replay-script-selection.js";import{a as Zt,i as Qt,n as $t,o as en,r as tn}from"./request-cancel.js";import{t as nn}from"./request.js";import{n as rn}from"./provider-device-admission.js";import{i as an,o as on,t as sn}from"./device-claim-inspection.js";import{t as cn}from"./audio-probe-result.js";import{A as ln,D as un,E as dn,N as fn,O as pn,P as mn,R as hn,T as gn,_ as _n,a as vn,c as yn,d as bn,f as xn,g as Sn,h as Cn,j as wn,k as Tn,l as En,m as Dn,o as On,p as kn,v as An,w as jn}from"./platform-request-scope.js";import{n as I,r as Mn}from"./device-isolation.js";import{a as Nn,i as Pn,n as Fn,r as In}from"./device-inventory-context.js";import{d as Ln}from"./selector-pipeline-policy.js";import{i as Rn,o as zn}from"./durable-capture-resource.js";import{$t as Bn,A as Vn,At as Hn,B as Un,Bt as Wn,C as Gn,D as Kn,E as qn,Et as Jn,F as Yn,Ft as Xn,G as Zn,Gt as Qn,H as $n,Ht as er,I as tr,It as nr,Jt as rr,K as ir,Kt as ar,L as or,Lt as sr,M as cr,Mt as lr,Nt as ur,O as dr,Ot as L,P as fr,Pt as pr,R as mr,Rt as hr,S as gr,T as _r,V as vr,Vt as yr,Wt as br,Xt as xr,Yt as Sr,Zt as Cr,_ as wr,_t as Tr,a as Er,at as Dr,b as Or,bt as kr,d as Ar,dt as jr,f as Mr,ft as Nr,g as Pr,gt as Fr,h as Ir,j as Lr,jt as Rr,k as zr,l as Br,m as Vr,mt as Hr,o as Ur,ot as Wr,p as Gr,pt as Kr,qt as qr,s as R,tt as z,u as Jr,ut as Yr,v as Xr,w as Zr,wt as Qr,x as $r,y as ei,z as ti,zt as ni}from"./internal/daemon.js";import{n as ri,r as ii}from"./device-selection-resolver.js";import{n as ai,r as oi}from"./doctor-lines.js";import{t as si}from"./replay-backend-registry.js";import{c as ci,d as li,f as ui,g as di,h as fi,i as pi,l as mi,o as hi,p as gi,r as _i,s as vi,t as yi,u as bi}from"./session-replay-runtime-failure-response.js";import{n as xi}from"./snapshot-node-lookup.js";import{n as Si}from"./replay2.js";import{c as Ci,f as wi,o as Ti,r as Ei}from"./runtime-session.js";import{t as Di}from"./record-runtime.js";import{a as Oi,i as B,n as V,r as H,t as ki}from"./session-runtime-admission.js";import{n as Ai}from"./gesture-runtime.js";import{t as ji}from"./snapshot-runtime.js";import{createHash as Mi}from"node:crypto";import U,{promises as Ni}from"node:fs";import W from"node:path";import{setTimeout as Pi}from"node:timers/promises";function Fi(e){throw new r(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Ii(e){let t=e.meta?.installSource;if(!t)throw new r(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new r(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Fi(t)}}function Li(e){let t=Ii(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Jn(n,e.meta?.tenantId)},cleanup:()=>{Qr(n)}}}function G(e,t,n){return t||Yr(n)?null:l(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`,u())}function Ri(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function K(e){return jr(e.flags)||!e.session?await Wt(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await zi(e.session.device,e.platformServices)}async function zi(e,t){if(rn(e)||!P(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await t.appleSessionObservation.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 Wt(n)}catch(e){if(!(e instanceof r)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Wt({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Bi(e,t){return t?ti(t,e).length===0:!1}async function Vi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),o=i?.session,s,c,l;try{s=Li(t);let a=Gi(t),u=await Ui(o,t.flags,e.platformServices),d=await H(e.inspectFacts)(u),f=B(`install_from_source`,d.operations.ensureReady)??B(`install_from_source`,d.operations.materializeAppSource)??B(`install_from_source`,d.operations.deployMaterializedApp);if(f)return f;let p=await V(e.bindDevice)(u,He);await p.operations.ensureReady({}),c=await p.operations.materializeAppSource({source:s.source}),l=await Ki({artifact:c,retention:a,req:t,session:o,sessionName:n}),i&&z(r.requireCurrent(i));let m=await p.operations.deployMaterializedApp({artifact:c}),h=qi(u,c,m,l),_=g(h,`Installed: ${Bt(h)}`);return L(r,i,t,`install_source`,_,{positionals:[]}),{ok:!0,data:_}}catch(e){return l&&await zr(l.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:a(e)}}finally{await c?.cleanup(),s?.cleanup()}}async function Hi(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new r(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await zr(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:a(e)}}}async function Ui(e,t,n){let i=Wi(t?.platform);if(e&&i&&!_e(e.device,i))throw new r(`INVALID_ARGS`,`install_from_source requested platform ${i}, but session is bound to ${j(e.device)}`);if(!e&&!i)throw new r(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await K({session:e,flags:t,platformServices:n})}function Wi(e){return e===`ios`||e===`android`?e:void 0}function Gi(e){let t=e.meta?.retainMaterializedPaths===!0,n=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(n!==void 0&&n<=0)throw new r(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...n===void 0?{}:{ttlMs:n}}}async function Ki(e){if(e.retention.enabled)return await Lr({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 qi(e,t,n,r){return P(e)?Ji(t,n,r):Yi(t,n,r)}function Ji(e,t,n){let i=t.bundleId??e.bundleId;if(!i)throw new r(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Zi(n),bundleId:i,...Xi(t,e),launchTarget:t.launchTarget??i}}function Yi(e,t,n){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new r(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Zi(n),packageName:i,...Xi(t,e),launchTarget:t.launchTarget??i}}function Xi(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Zi(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Qi(e){let{req:t,session:n,inspectFacts:r,bindDevice:i,platformServices:a}=e,o=$i(t);if(!o.ok)return o.response;let s=G(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await K({session:n,flags:t.flags,platformServices:e.platformServices}),u=await R({device:c,inspectFacts:r,bindDevice:i,platformServices:a,command:`runtime port-reverse`,use:Le});if(u.type===`response`)return u.response;if(u.runtime.owner.kind!==`provider-runtime`||u.runtime.owner.provider!==o.options.provider)return l(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:o.options.provider});let d=await u.runtime.operations.configureProviderPortReverse(o.options);return d?{ok:!0,data:{action:`port-reverse`,...d}}:l(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function $i(e){let t=ea(e);if(!t.ok)return t;let n=ta(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 ea(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function ta(e){let t=na(e.flags?.devicePort),n=na(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function na(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function ra(e){return await R({...e,command:`runtime clear`,use:Pe})}async function ia(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Qi({req:t,session:r.get(n),inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await aa({...e,session:r.get(n)});if(!oa(i))return l(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.lookup(n),o=a?.session,s=r.getRuntimeHints(n);return i===`clear`?await sa({sessionName:n,sessionStore:r,ref:a,current:s,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice}):i===`show`?ca(n,s):ua({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function aa(e){if(!e.session)return l(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await Ai({device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=$n(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 oa(e){return e===`set`||e===`show`||e===`clear`}async function sa(e){let{sessionName:t,sessionStore:n,ref:r,current:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=r?n.requireCurrent(r):void 0;if(Gr(i)&&c?.appBundleId){let e=await ra({device:c.device,inspectFacts:a,bindDevice:o,platformServices:s});if(e.type===`response`)return e.response;let t=n.requireCurrent(r);z(t),await e.runtime.operations.clearRuntimeHints({appId:t.appBundleId,values:wr(i)})}let l=r?n.clearRuntimeHints(r):!!i;return r||n.setRuntimeHints(t,void 0),{ok:!0,data:{session:t,cleared:l}}}function ca(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function la(e){return e?j(e.device):void 0}function ua(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=la(i),s=Or(t.flags?.platform??a?.platform??o);if(!s)return l(`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 l(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Ir(a,Ar(t.flags,s));return Mr(c)===0?l(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const da=/^[A-Za-z0-9_.:-]{1,64}$/,fa=8192,pa=4096;function ma(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new r(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!da.test(t))throw new r(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new r(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:ga(n,t)}}function ha(e,t,n){let i=j(e),a=_a(e);if(!a)throw new r(`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=n?JSON.stringify(n):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>pa)throw new r(`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:pa});return s}function ga(e,t){if(e)try{let n=JSON.parse(e);if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(n);if(Buffer.byteLength(i,`utf8`)>fa)throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${fa} bytes`);return n}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function _a(e){return((P(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:N(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 va(e,t,n,r){let{eventName:i,payload:a}=ma([...r]),o=ha(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Er(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...m(`Triggered app event: ${i}`)}}async function ya(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o}=e,s=await R({command:`trigger-app-event`,device:t,use:Xe,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>va(c,t,e,n)}}function ba(e){let t=(e[0]??`status`).toLowerCase();if(!Ht(t))throw new r(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new r(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return xa(t)}function xa(e){return e===`get`?`status`:e===`return`?`enter`:e}const Sa={"ime-probe":`android`},Ca={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},wa={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function Ta(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Er(e)}}async function Ea(e,t){let n=await R(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function Da(e,t){return e.operations.keyboardStatus(Ta(t)).then(e=>({platform:Sa[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 Oa(e,t){let n=await e.operations.keyboardDismiss(Ta(t)),r=Ca[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...m(ja(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...m(`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 ka(e,t){let n=await e.operations.keyboardEnter(Ta(t)),r=wa[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...m(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...m(`Keyboard enter pressed`)}}async function Aa(e){let t=ba(e.positionals),{device:n,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o}=e;return t===`status`?await Ea({command:`keyboard status`,device:n,use:Fe,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>Da(e,t)):t===`dismiss`?await Ea({command:`keyboard dismiss`,device:n,use:be,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>Oa(e,t)):await Ea({command:`keyboard enter`,device:n,use:st,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>ka(e,t))}function ja(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Ma(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,updateSession:s,prepare:c}=e,l=r.lookup(n),u=l?.session,d=t.flags??{},f=G(i,u,d);if(f)return f;let p=await K({session:u,flags:d,platformServices:e.platformServices});l&&r.requireCurrent(l);let m=await c(p,l);if(!m.ok)return m.response;let h=l?r.requireCurrent(l):void 0;h&&kr(t)===`may-invalidate`&&z(h);let g=await m.execute();return l&&(s&&await s(l,g),L(r,l,t,i,g??{},{positionals:o??a})),{ok:!0,data:g??{}}}function Na(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return l(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Pa(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=t.positionals??[];return await Ma({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:c,platformServices:s,...e.updateSession?{updateSession:e.updateSession}:{},prepare:async(n,l)=>{let u=await e.resolveRuntime({device:n,positionals:c,readiness:!0,inspectFacts:a,bindDevice:o,platformServices:s});if(!u.ok)return{ok:!1,response:u.response};let d=l?i.requireCurrent(l):void 0,f={...$n(r,t.flags,d?.appBundleId,d?.trace?.outPath),surface:d?.surface};return{ok:!0,execute:()=>u.execute(f)}}})}async function Fa(e){return Na(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Pa({...e,command:D.keyboard,resolveRuntime:e=>Aa(e)})}async function Ia(e){return await Pa({...e,command:D.triggerAppEvent,resolveRuntime:e=>ya(e),updateSession:async(t,n)=>{let r=typeof n?.eventUrl==`string`?n.eventUrl:void 0;if(!r)return;let i=e.sessionStore.requireCurrent(t),a=await e.platformServices.resolveSessionAppBundleIdForTarget(i.device,r,i.appBundleId);a!==void 0&&e.sessionStore.update(t,{appBundleId:a})}})}function La(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Ra(e,t){let n=t?.subject??`Payload`,i=e.trim();if(!i)throw new r(`INVALID_ARGS`,`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!U.statSync(a).isFile())throw new r(`INVALID_ARGS`,`${n} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof r)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new r(`INVALID_ARGS`,`${n} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new r(`COMMAND_FAILED`,`Unable to read ${n} file: ${a}`,{cause:String(e)})}if(La(i))return{kind:`inline`,text:i};throw new r(`INVALID_ARGS`,`${n} file not found: ${a}`)}async function za(e){let t=Ra(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ba(t.path);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ba(e){try{return await Ni.readFile(e,`utf8`)}catch(t){let n=t.code;throw n===`ENOENT`?new r(`INVALID_ARGS`,`Push payload file not found: ${e}`):n===`EISDIR`?new r(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):n===`EACCES`||n===`EPERM`?new r(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new r(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Va(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.lookup(r),o=a?.session,s=t.flags??{},c=G(n,o,s);if(c)return c;let u=qa(n,t.positionals??[]);if(!u.ok)return u.response;let d=t.meta?.uploadedArtifactId;try{let r=d?Jn(d,t.meta?.tenantId):F(u.appPathInput);if(!U.existsSync(r))return l(`INVALID_ARGS`,`App binary not found: ${r}`);let c=await K({session:o,flags:s,platformServices:e.platformServices}),f=await H(e.inspectFacts)(c),p=B(n,f.operations.deployApp);if(p)return p;let m=await V(e.bindDevice)(c,Be);a&&z(i.requireCurrent(a));let h=await m.operations.deployApp({app:u.app,appPath:r,replaceExisting:n===`reinstall`}),_=Ua(c,u.app,r,h),v=g(_,`Installed: ${_.appName??Vt(_)}`);return Ka(i,a,_),L(i,a,t,n,v),{ok:!0,data:v}}finally{d&&Qr(d)}}async function Ha(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),a=i?.session,o=t.flags??{},s=G(`push`,a,o);if(s)return s;let c=t.positionals?.[0]?.trim(),u=t.positionals?.[1]?.trim();if(!c||!u)return l(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let d=await za(Ja(u,t.meta?.cwd)),f=await K({session:a,flags:o,platformServices:e.platformServices}),p=await H(e.inspectFacts)(f),m=B(`push`,p.operations.ensureReady)??B(`push`,p.operations.sendPushNotification);if(m)return m;let h=await V(e.bindDevice)(f,Ne);await h.operations.ensureReady({}),i&&z(r.requireCurrent(i));let _=await h.operations.sendPushNotification({appId:c,payload:d}),v=P(f)?g({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):g({platform:j(f),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return L(r,i,t,`push`,v,{positionals:[c,u]}),{ok:!0,data:v}}function Ua(e,t,n,r){return P(e)?Wa(t,n,r):Ga(e,t,n,r)}function Wa(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 Ga(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 Ka(e,t,n){!t||n.platform!==`harmonyos`||!n.appId||e.update(t,{appBundleId:n.appId,appName:n.appName??n.app})}function qa(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:l(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:l(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ja(e,t){let n=Ra(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>F(e,t)});return n.kind===`file`?n.path:n.text}async function Ya(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}=e;return t.command===`install`||t.command===`reinstall`?await Va({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):t.command===`install_source`?await Vi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):t.command===`push`?await Ha({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):null}async function Xa(e,t,n){return await b(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Za=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.querySelector.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Qa(e){return Za.has(e)}const $a=new Map(qe.map(e=>[e.name,e]));function eo(e){let t=new Set;for(let n of e){let e=to(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function to(e){let t=$a.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(Qa)?n:void 0}function no(e){if(e!==void 0&&e.remainingSteps.length!==0)return eo(e.remainingSteps)}function ro(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:Fr(e),plannedOperations:no(e.internal?.executionPlan)}}function io(e,t,n){let r=e.requireCurrent(t);e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:r.name,...m(`Closed: ${r.name}`)}})}function ao(e,t,n){let r=e.requireCurrent(t);if(!ur(r))return{kind:`not-armed`};let i=r.actions.length;io(e,t,n);let a=br(r),o=e.writeSessionLog(t,{force:yr(r,n.flags?.force)});return o.written?{kind:`committed`,path:o.path}:o.error?(r.actions.length=i,{kind:`failed`,error:o.error}):a?{kind:`committed`}:(Hn(r),{kind:`aborted`})}function oo(e,t){let n=a(t),r=xr(e.scriptPublication??rr);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...r?{savedScript:r}:{}},retriable:!0}}}function so(e){let{req:t,ref:n,sessionStore:r,platformCloseError:i}=e,a=r.requireCurrent(n);i||io(r,n,t);try{let e=r.writeSessionLog(n,{force:yr(a,t.flags?.force)});e.written&&ar(a,e.path);return}catch(e){return co(e)}}function co(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof r?new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${a(e).message}`,t)}async function lo(e){let t=e.clearRuntimeHints?ve:lt,n=await Ur({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,lt)};let r=await n.bind(e.device,ve);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function uo(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a,clearRuntimeHints:o,cleanupFailures:s,repairArmed:c,dispatchTargetedPlatformClose:l,finalizeOrdinaryCloseScript:u}=e,{address:d}=n,f=i.requireCurrent(n),p=async(e,t)=>{try{return await t()}catch(t){s.push({step:e,error:t});return}},m=e.platformResourceCleanup.retainExecutionHostAfterClose({device:f.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!f.screenRecording,hasLease:!!f.lease}),h=i.getRuntimeHints(d);await fo(n,i,p,e.platformResourceCleanup),f=i.requireCurrent(n);let g=c?void 0:await l({req:t,session:f,logPath:r,lifecycle:a});o&&f.appBundleId&&Gr(h)&&await p(`runtime_hints`,async()=>{await o({appId:f.appBundleId,values:wr(h)})});let _=await p(`application_lifecycle`,async()=>await a.operations.finalizeApplicationClose({appBundleId:f.appBundleId,surface:f.surface??`app`,retainRunner:m,stateDir:i.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),v=c?void 0:u({req:t,ref:n,sessionStore:i,platformCloseError:g});return await p(`materialized_paths`,()=>Vn(d)),{platformCloseError:g,saveScriptError:v,shutdownResult:_?.shutdown}}async function fo(e,t,n,r){let i=t.resolveCurrent(e)??e.session;await n(`recording`,()=>Gn({ref:e,sessionStore:t})),await n(`app_log`,()=>_r({ref:e,sessionStore:t})),await n(`audio_probe`,()=>gr({ref:e,sessionStore:t})),await n(`perf_capture`,()=>qn({ref:e,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Kn(i,r))}function po(e,t){return Zr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function mo(e){if(e instanceof r)return e;let t=e instanceof Error?e.message:String(e);return new r(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const ho=(e,t)=>(e.positionals?.length??0)>0||dr(t);async function go(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=i.requireCurrent(n),s=ur(o),c=JSON.stringify(t.positionals??[]);if(s&&!lr(o,c)){let e=await vo({req:t,session:o,logPath:r,lifecycle:a});if(e)return{response:oo(o,mo(e))};nr(i.requireCurrent(n),c)}let l=ao(i,n,t);return l.kind===`failed`?{response:oo(o,l.error)}:{repairArmed:s,...l.kind===`committed`&&l.path?{healedScriptPath:l.path}:{},...l.kind===`aborted`?{aborted:!0}:{}}}async function _o(e){try{return{providerData:await Nr(e)}}catch(t){let n=a(t);return{response:{ok:!1,error:{...n,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...n.details,session:e.session.name},retriable:!0}}}}}async function vo(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(ho(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:ro(t,r,n.trace?.outPath)});return}catch(e){return e}}function yo(e,t){if(!e.flags?.saveScript||er(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new r(`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 r(`INVALID_ARGS`,`close --save-script cannot ${n.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function bo(e){let{req:t,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.lookup(n);if(!c)return await wo({req:t,logPath:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});let u=a.requireCurrent(c);yo(t,u);let d=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!d)return l(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let f=e.platformResourceCleanup,p=await lo({device:u.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!u.appBundleId&&Gr(a.getRuntimeHints(n)),inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(p.type===`response`)return p.response;if(u=a.requireCurrent(c),z(u),t.internal?.closeAppOnly===!0&&d)return await Co({req:t,session:u,logPath:i,lifecycle:p.runtime,app:d});let m=await go({req:t,ref:c,logPath:i,sessionStore:a,lifecycle:p.runtime});if(`response`in m)return m.response;let h=await xo({req:t,ref:c,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:p.runtime,clearRuntimeHints:p.clearRuntimeHints,repairArmed:m.repairArmed,platformResourceCleanup:f});return h.kind===`response`?h.response:So({session:u,repair:m,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:h.shutdownResult,providerData:h.providerData})}async function xo(e){let{req:t,ref:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,lifecycle:s,clearRuntimeHints:c}=e,{address:l}=n,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await uo({req:t,ref:n,logPath:r,sessionStore:i,lifecycle:s,clearRuntimeHints:c,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:vo,finalizeOrdinaryCloseScript:so,platformResourceCleanup:e.platformResourceCleanup}),m=i.requireCurrent(n),h=await _o({session:m,leaseRegistry:a,leaseLifecycleProvider:o});if(h.response)return{kind:`response`,response:h.response};m=i.resolveCurrent(n)??m;let g=po(l,u),_=d??g;if(_?m.deviceClaim&&A({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:m.deviceClaim.deviceKey,session:l}}):await fn(m.deviceClaim),i.retire(n),_)throw _;if(f)throw f;return{kind:`closed`,providerData:h.providerData,shutdownResult:p}}function So(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:g({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...m(c),...o,...s}}}async function Co(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await vo({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...m(`Closed: ${a}`)}}}async function wo(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i,platformServices:a}=e;if(!t.positionals||t.positionals.length===0)return l(`SESSION_NOT_FOUND`,`No active session`);let o=await lo({device:await K({session:void 0,flags:t.flags,platformServices:a}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i,platformServices:a});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:ro(t,n)}),{ok:!0,data:{app:t.positionals[0],...m(`Closed: ${t.positionals[0]}`)}})}function To(e,t){return e.operations.ensureReady(t)}function Eo(e,t,n){return e.operations.listApps({device:t,filter:n})}async function Do(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return Oo(t,r);case`devices`:return await Ao(t);case`capabilities`:return await Ro({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,platformServices:e.platformServices});case`apps`:return await Wo({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,platformServices:e.platformServices,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function Oo(e,t){let n=tr(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>or(e.session,n)).map(e=>ko(e,t))}}}function ko({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Mt(r),platform:j(t.device),...M(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,...M(t.device.platform)&&!N(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function Ao(e){try{let t=jo();return{ok:!0,data:{devices:(await No(e)).map(e=>({...Zo(e),...Mo(e,t)}))}}}catch(e){let n=t(e);return{ok:!1,error:{code:n.code,message:n.message,...n.details?{details:n.details}:{}}}}}function jo(){let e=new Map;for(let t of an({})){let n=t.claim;!n||sn(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function Mo(e,t){let n=t.get(on(mn(e)));return n?{claimedBy:n}:{}}async function No(e){let t=e.flags?.platform;return Lo(await Fn(Po(e,t)),e.flags?.platform,e.flags?.target)}function Po(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Fo(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Io(n?.androidDeviceAllowlist)}}function Fo(e,t,n){return me({simulatorSetPath:Mn(e),platform:t,target:n})}function Io(e){let t=I(e);return t?Array.from(t).sort():void 0}function Lo(e,t,n){let r=t?e.filter(e=>Qo(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Ro(e){let t=await Xo({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=zo(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await qo(n,e.inspectFacts);return{ok:!0,data:{device:Zo(n),availableCommands:ct().filter(e=>e===`appstate`&&r?!0:Ho(e,i))}}}function zo(e,t,n){return!t||!P(e)&&!N(e)||!Bi(n,t)?!1:Bo(t)||Vo(e,t)}function Bo(e){return!!(e.appName||e.appBundleId)}function Vo(e,t){return!!(N(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Ho(e,t){let n=tt(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Uo(t,e)))}function Uo(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Wo(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a,platformServices:o}=e,s=await Go(t,e.providerAppCatalog);if(s)return s;let c=await Xo({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`,platformServices:o});if(`response`in c)return c.response;let{device:l}=c,u=Ot(t.flags?.appsFilter),d=I(t.flags?.androidDeviceAllowlist),f=await Jo({device:l,inspectFacts:a,bindDevice:i,platformServices:o});if(`response`in f)return f.response;let p=f.runtime;return Yo(await Eo(p,await To(p,{serial:t.flags?.serial,androidSerialAllowlist:d?[...d].sort():void 0}),u))}async function Go(e,t){let n=Ko(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,tn(e.meta?.requestId))]}}}function Ko(e){let t=Hr(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 qo(e,t){if(t)try{return await t(e)}catch{return}}async function Jo(e){let t=await H(e.inspectFacts)(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);return n&&!n.available?{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}}:{runtime:await V(e.bindDevice)(e.device,at)}}function Yo(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Xo(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i,platformServices:a}=e,o=r.get(n),s=t.flags??{},c=G(t.command,o,s);return c?{response:c}:{device:await K({session:o,flags:s,platformServices:a,androidAvdSelection:i})}}function Zo({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:j({platform:r.platform,appleOs:n}),...M(r.platform)&&n?{appleOs:n}:{}}}function Qo(e,t){return _e(e,t)}function $o(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function es(e){return l(`INVALID_ARGS`,e)}function ts(e,t,n,i,a){try{return e.resolveRequestedOpenSurface({device:t,surfaceFlag:n,openTarget:i,existingSurface:a})}catch(e){return l(e instanceof r?e.code:`INVALID_ARGS`,String(e.message))}}async function ns(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i,platformServices:a}=e;if(!t)return null;let o=await a.validateOpenRelaunchTarget({target:n,platform:i.platform,surface:r});return o?es(o):null}async function rs(e){let{shouldRelaunch:t,openTarget:n,platform:r,platformServices:i}=e;if(!t)return null;let a=await i.validateOpenRelaunchTarget({target:n,platform:r});return a?es(a):null}function is(e){let t=$r(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:Gr(n),clearRemovedRuntimeHints:ei({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function as(e){let{req:t,logPath:n,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!y(a??``),execution:{startupDeadlineAtMs:ss(t),requestId:t.meta?.requestId,logPath:n,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Fr(t)}});let{appBundleId:d,appName:f}=await os({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new r(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Vr({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:f,runtime:c.runtime}}}async function os(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 ss(e){return $o(e.flags?.timeoutMs)}async function cs(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:l(`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:l(`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:l(`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 ls(e){let{req:t,ref:n,logPath:r,sessionStore:i,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let a=await ji({createCommandSurface:e.createCommandSurface,req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n.address,sessionRef:n,logPath:r,sessionStore:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return a.ok?{ok:!0,data:{...o.data,snapshot:a.data}}:us(o.data,a.error)}catch(e){return us(o.data,a(e))}}function us(e,t){return{ok:!0,data:{...e,warnings:[..._(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function ds(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:h,selection:g,launchConfirmation:_}=e,v={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:h,...fs(g)};return o&&(v.appName=o),s&&(v.appBundleId=s),l&&(v.startup=l),u&&(v.timing=u),_&&(v.launchConfirmation=_),f&&p(f)>0&&(v.runtime=f),d&&(v.platform=j(d),v.target=d.target??`mobile`,v.device=d.name,v.id=d.id,v.kind=d.kind,ge(d.platform)&&(v.serial=d.id)),d&&P(d)&&(v.device_udid=d.id,v.ios_simulator_device_set=d.simulatorSetPath??null),{...v,...m(`Opened: ${o??s??t}`)}}function fs(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function q(e,t,n){n?(e.assertAdmissionOpen(n.address),e.requireCurrent(n)):e.assertPublishable(t)}function ps(e){let{req:t,sessionStore:n,sessionName:r,existingRef:i,device:a,surface:o,appBundleId:s,appName:c,deviceClaim:l}=e;if(q(n,r,i),i){let e=n.update(i,{device:a,surface:o,appBundleId:s,appName:c});return e.lease=Kr({req:t,existingLease:e.lease}),l&&(e.deviceClaim=l),Ti(e),n.refresh(i)}return n.publish(r,{name:Yn(t),sessionScope:t.internal?.resolvedSessionScope??tr(t),device:a,surface:o,appBundleId:s,appName:c,createdAt:Date.now(),actions:[],lease:Kr({req:t}),deviceClaim:l})}function ms(e,t){e.warnings=[..._(e),t]}function hs(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Wn(t,{});return}er(n)&&(ni(t),ms(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 gs(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 _s(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function vs(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 ys(e,t){if(!t)return;let n=await hn(t);if(n.status!==`renewed`)return n.conflict?Jr(e,n.conflict):l(`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 bs(e){let{req:t,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingRef:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e;q(i,r,g);let b=g?i.requireCurrent(g):void 0,x=b?.snapshot,S=t.flags?.relaunch===!0,C=f,w=Date.now(),T=await xs({req:t,sessionName:r,sessionStore:i,device:o,surface:d,sessionAppBundleId:C,appName:u,existingRef:g});if(T.type===`response`)return T;let E=T.ref;q(i,r,E);let ee=E?i.requireCurrent(E):void 0,D=Date.now(),O=await m.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:C,surface:d,hasExistingSession:b!==void 0,relaunch:S,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:_s(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:wr(p),applyRuntimeHints:h,execution:ro(t,a,ee?.trace?.outPath)});C=O.appBundleId??C;let k={...O.timing},te=ri(y),ne=s?vs(D,s,C):void 0;if(Qt(t.meta?.requestId)){let e=n();return{type:`response`,response:l(e.code,e.message,e.details)}}q(i,r,E),g&&Zn({session:i.requireCurrent(g),command:`open`,positionals:[],flags:void 0,androidFreshnessBaseline:x});let re=i.ensureSessionDir(r),ie=jt(re,t.meta?.requestId??fe().requestId);k.totalDurationMs=Math.max(0,Date.now()-w),A({level:`info`,phase:`open_timing`,durationMs:k.totalDurationMs,data:k});let ae=ds({sessionName:ee?.name??Yn(t),sessionStateDir:re,runnerLogPath:Mt(re),requestLogPath:ie,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:C,surface:d,startup:ne,timing:k,device:o,runtime:p,runtimeHintCount:Mr,sessionReused:b!==void 0,selection:te,launchConfirmation:O.launchConfirmation});v&&ms(ae,gs(v));let oe=ps({req:t,sessionStore:i,sessionName:r,existingRef:E,device:o,surface:d,appBundleId:C,appName:u,deviceClaim:_}),se=i.requireCurrent(oe);return ir(se,k.postOpenObservation),t.runtime!==void 0&&Xr(i,r,p),hs({session:se,existingSession:g?se:void 0,saveScriptRequested:!!t.flags?.saveScript,responseData:ae}),i.recordAction(oe,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:ae}),{type:`opened`,ref:oe,response:{ok:!0,data:ae}}}async function xs(e){let{req:t,sessionName:n,sessionStore:r,existingRef:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,ref:i};let o=ps({req:t,sessionName:n,sessionStore:r,existingRef:i,device:e.device,surface:e.surface,appBundleId:e.sessionAppBundleId,appName:e.appName}),s=await a();return s&&!s.ok?{type:`response`,response:s}:(q(r,n,o),{type:`session`,ref:r.refresh(o)})}function Ss(e){return e.internal?.admittedLease?.backend===`macos-app`}function Cs(e){let{req:t,device:n,sessionStore:r}=e,i=Ss(t)?r.listRefs().find(e=>e.session.device.id===n.id&&e.session.lease?.leaseBackend!==`macos-app`):r.findByDevice(n.id);if(!i)return;let a=cr(t);return fr(t,i.session)?vr(i,n,a):Un(i,n,a)}async function ws(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o,platformServices:s}=e;switch(Br(r,t.internal?.admittedLease)){case`none`:return{status:`not-required`};case`ordinary`:return await wn({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:s.deviceBootObservation})}}async function Ts(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,platformServices:m}=e;q(i,n,void 0);let h=Cs({req:t,device:a,sessionStore:i});if(h)return{type:`response`,response:h};let g=await ws({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f,platformServices:m});if(g.status===`conflict`)return{type:`response`,response:Jr(a,g.conflict)};let _=g.status===`acquired`?g.ownership:void 0,v=g.status===`acquired`?g.tookOver:void 0,y={mayHaveStarted:!1},b=async()=>await Es({ownership:_,effects:y,sessionName:n,sessionStore:i});try{q(i,n,void 0);let e=await as({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 b(),{type:`response`,response:e.response};let f=await ys(a,_);if(f)return{type:`response`,response:f};y.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,g=await bs({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:_,tookOverDeviceClaim:v,selection:p});return g.response.ok||await b(),g}catch(e){throw await b(),e}}async function Es(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await fn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await ln(t);A({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const Ds=new Map;async function Os(e){let t=Ve({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Ur({...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,Re)};case`open-apply-runtime-hints`:{let t=await r(e.device,Oe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,rt);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,Ce);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ks(e){let t=is(e);if(t.type===`response`)return t;let n=await Os({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function As(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.lookup(t),a=await cs({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return{type:`response`,response:a.response};let o=a.type===`resolved`?a.req:e.req;if(q(r,t,i),i){let a=r.requireCurrent(i);if(o.flags?.saveScript)return{type:`response`,response:l(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`)};let s=o.flags?.relaunch===!0,c=o.positionals?.[0],u=c??(s?a.appName:void 0),d=ts(e.platformServices,a.device,o.flags?.surface,u,a.surface);if(typeof d!=`string`)return{type:`response`,response:d};if(!u&&d===`app`)return{type:`response`,response:es(s?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`)};let f=await ns({shouldRelaunch:s,openTarget:u,surface:d,device:a.device,platformServices:e.platformServices});if(f)return{type:`response`,response:f};let p=r.requireCurrent(i),m=await ys(p.device,p.deviceClaim);if(m)return{type:`response`,response:m};let h=await zi(a.device,e.platformServices),g=ii(h);await o.internal?.retainDeviceExecutionLock?.(h.id);let _=await ks({req:o,sessionStore:r,sessionName:t,device:h,existingSession:a,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(_.type===`response`)return{type:`response`,response:_.response};let{admission:v,runtimeHintPlan:y}=_;q(r,t,i);let b=r.requireCurrent(i);z(b);let x=await as({req:o,logPath:n,surface:d,openTarget:u,existingSession:b,runtime:v.runtime,runtimeHintPlan:y,clearRuntimeHints:v.clearRuntimeHints,foreground:!1});if(x.type===`response`)return{type:`response`,response:x.response};q(r,t,i);let S=await ys(h,r.requireCurrent(i).deviceClaim);return S?{type:`response`,response:S}:await bs({req:o,sessionName:t,sessionStore:r,logPath:n,device:h,openTarget:u,openPositionals:c?o.positionals??[]:u?[u]:[],appBundleId:x.details.appBundleId,appName:x.details.appName,runtimeHints:x.details.runtime,lifecycle:v.runtime,applyRuntimeHints:v.applyRuntimeHints,surface:d,existingRef:i,selection:g})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return{type:`response`,response:es(`open --relaunch requires an app argument.`)};let u=await rs({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0,platformServices:e.platformServices});if(u)return{type:`response`,response:u};let d=await Gt(o.flags??{},qt(c)),f=d.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=ts(e.platformServices,f,o.flags?.surface,c);if(typeof p!=`string`)return{type:`response`,response:p};let m=await ns({shouldRelaunch:s,openTarget:c,surface:p,device:f,platformServices:e.platformServices});if(m)return{type:`response`,response:m};let h=await ks({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(h.type===`response`)return{type:`response`,response:h.response};let{admission:g,runtimeHintPlan:_}=h;return await Lt(Ds,f.id,async()=>await Ts({req:o,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:c,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,platformServices:e.platformServices,selection:d}))}async function js(e){let t=await As(e),n=t.response;return t.type!==`opened`||e.req.flags?.foreground!==!0?n:await ls({...e,inspectFacts:H(e.inspectFacts),bindDevice:V(e.bindDevice),openResponse:n,ref:t.ref})}function Ms(e){return l(`SESSION_NOT_FOUND`,e===`macos`?`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`:`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`)}async function Ns(e,n){if(!n.appBundleId)return;let r=await R({command:`appstate`,device:n.device,use:Ge,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(r.type!==`response`)try{return(await r.runtime.operations.appState({appBundleId:n.appBundleId})).applicationState}catch(e){if(c(e))throw e;A({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:t(e).code,message:t(e).message}});return}}function Ps(e){if(!(!N(e.device)||!e.surface)&&e.surface!==`app`&&e.surface!==`frontmost-app`)return{ok:!0,data:{platform:j(e.device),appName:e.surface,appBundleId:e.appBundleId,source:`session`,surface:e.surface}}}async function Fs(e,t){if(!t.appName&&!t.appBundleId){let e=Ps(t);if(e)return e;let n=N(t.device)?`macOS`:`iOS`;return l(`COMMAND_FAILED`,`No foreground app is tracked for this ${n} session. Open an app in the session, then retry appstate.`)}let n=await Ns(e,t),r=t.appName??t.appBundleId;return{ok:!0,data:{platform:j(t.device),appName:r??`unknown`,appBundleId:t.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:t.surface??`app`,...P(t.device)?{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}:{}}}}function Is(e){let t=I(e);return t?[...t].sort():void 0}function Ls(e,t){return l(`UNSUPPORTED_OPERATION`,e.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,t?{hint:t}:void 0)}async function Rs(e,t){if(P(t))return Ms(`ios`);if(N(t))return Ms(`macos`);let n=e.req.flags??{},r=await R({command:`appstate`,device:t,use:Ge,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,unavailableResponse:e=>Ls(t,e.hint)});if(r.type===`response`)return r.response;let i=r.runtime;await i.operations.ensureReady({serial:n.serial,androidSerialAllowlist:Is(n.androidDeviceAllowlist)});let a=await i.operations.appState();return{ok:!0,data:{platform:j(t),package:a.package,activity:a.activity}}}function zs(e,t){return t===`ios`?l(`SESSION_NOT_FOUND`,`No active session "${e}". Run open with --session ${e} first.`):l(`SESSION_NOT_FOUND`,`No active session "${e}". Run open with --session ${e} first, or omit --session to query by device selector.`)}function Bs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Ri(a))return{refusal:zs(n,o)};let s=G(`appstate`,i,a);if(s)return{refusal:s};let c=M(i?.device.platform)&&Bi(a,i);return o===`ios`&&!c?{refusal:Ms(`ios`)}:o===`macos`&&!c?{refusal:Ms(`macos`)}:c&&i?{answeredBy:`apple-session`,session:i}:{answeredBy:`device-runtime`,session:i}}async function Vs(e){let t=Bs(e);return`refusal`in t?t.refusal:t.answeredBy===`apple-session`?await Fs(e,t.session):await Rs(e,await K({session:t.session,flags:e.req.flags??{},platformServices:e.platformServices}))}function Hs(e){return t=>l(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 Us(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Ws(e,n){let{sessionName:r,sessionStore:i,req:a,platformServices:o}=e,s=i.get(r),c=a.flags??{};try{let e=await K({session:s,flags:c,androidAvdSelection:`include-stopped`,platformServices:o});return c.target&&(e.target??`mobile`)!==c.target?{refusal:l(`DEVICE_NOT_FOUND`,`No ${e.platform} device found matching --target ${c.target}.`)}:e}catch(e){if(n&&!Us(c.device,s?.device)&&t(e).code===`DEVICE_NOT_FOUND`)return{refusal:l(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`)};throw e}}function Gs(e){return{ok:!0,data:{platform:j(e),target:e.target??`mobile`,device:e.name,id:e.id,kind:e.kind,booted:!0,...M(e.platform)&&e.appleOs?{appleOs:e.appleOs}:{}}}}async function Ks(e){let t=e.req.flags??{},n=G(e.req.command,e.sessionStore.get(e.sessionName),t);if(n)return n;let r=I(t.androidDeviceAllowlist),i=r?[...r].sort():void 0,a=Me({headless:t.headless===!0}),o=await Ws(e,a.kind===`boot-target-headless`);if(`refusal`in o)return o.refusal;let s=await Ur({command:`boot`,device:o,required:a.use.required,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,unavailableResponse:Hs(a.kind===`boot-target-headless`)});if(s.type===`response`)return s.response;let c={serial:t.serial,androidSerialAllowlist:i,deadlineAtMs:$o(t.timeoutMs)};return Gs(a.kind===`boot-target-headless`?await(await s.bind(o,a.use)).operations.bootTargetHeadless(c):await(await s.bind(o,a.use)).operations.bootTarget(c))}function qs(e){return e.available?null:l(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Js(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}async function Ys(e){let t=e.sessionStore.get(e.sessionName),n=e.req.flags??{},r=G(e.req.command,t,n);if(r)return r;let i=await K({flags:n,session:t,androidAvdSelection:`include-stopped`,platformServices:e.platformServices}),a=qs((await H(e.inspectFacts)(i)).operations.shutdownTarget);if(a)return a;if(t&&t.device.platform===i.platform&&t.device.id===i.id)return l(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${e.sessionName}`,session:e.sessionName,platform:j(i),target:i.target??`mobile`,device:i.name,id:i.id,kind:i.kind});let o=await(await V(e.bindDevice)(i,ze)).operations.shutdownTarget();return o.success?{ok:!0,data:{platform:j(i),target:i.target??`mobile`,device:i.name,id:i.id,kind:i.kind,shutdown:o,...M(i.platform)&&i.appleOs?{appleOs:i.appleOs}:{}}}:l(o.error?.code??`COMMAND_FAILED`,Js(o),{platform:j(i),target:i.target??`mobile`,device:i.name,id:i.id,kind:i.kind,shutdown:o})}async function Xs(e){return e.req.command===`boot`?await Ks(e):e.req.command===`shutdown`?await Ys(e):e.req.command===`appstate`?await Vs(e):null}function Zs(e){return En.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Qs(e){try{return await $s(e)}catch(e){return{ok:!1,error:a(e)}}}async function $s(e){let t=ec(e);if(!t.ok)return t;let n=t.ref,r=e.sessionStore.requireCurrent(n),i=je(e.req.positionals),a=await e.inspectFacts(r.device),o=a.operations.audioProbeStart,s=a.operations.audioProbeQuery,c=o.available?`capture`:s.available?`query`:void 0;if(c===void 0)return tc(o,s);let l=Se({probeAction:i.probeAction,mode:c});switch(l.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(r.device,l.use)).operations.audioProbeQuery({action:l.action,durationMs:i.durationMs,bucketMs:i.bucketMs})};case`capture-start`:return await nc(e,n,i,l.use);case`capture-status`:return await rc(e,n);case`capture-stop`:return await ic(e,n)}}function ec(e){let t=e.sessionStore.lookup(e.sessionName);return t?{ok:!0,ref:t}:l(`SESSION_NOT_FOUND`,`audio requires an active session`)}function tc(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return l(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function nc(e,t,n,r){let i=e.sessionStore.requireCurrent(t),a=Rn(e.sessionStore,t);i.audioProbe&&(await Tn({intent:`disposal`,binding:a}),i=e.sessionStore.requireCurrent(t));let o=await e.bindDevice(i.device,r),s=pn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=pn.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:s,device:i.device}),l=W.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`);a.assertAdoptable();let u=await o.operations.audioProbeStart({sessionId:e.sessionName,statusPath:l,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:c});await un({admissionLedger:e.audioProbeAdmissionLedger,binding:a,device:i.device,owner:o.owner,fence:c,...u,throwIfCanceled:e.throwIfCanceled});let d=a.read();if(!d)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await d.handle.status()}}async function rc(e,t){let n=Rn(e.sessionStore,t),r=n.read();if(!r)return{ok:!0,data:ac()};let i=await r.handle.status();return i.state===`stopped`&&await Tn({intent:`disposal`,binding:n}),{ok:!0,data:i}}async function ic(e,t){let n=Rn(e.sessionStore,t);return n.read()?{ok:!0,data:await Tn({intent:`capture`,binding:n})}:{ok:!0,data:ac()}}function ac(){return cn({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 oc(e){let t=e.sessionStore.lookup(e.sessionName);if(!t)return l(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let n=e.sessionStore.requireCurrent(t),i={...e,ref:t};try{if(Et(e.req.positionals?.[0]))throw new r(`INVALID_ARGS`,Dt);Ec(e.req);let t=vn({positionals:e.req.positionals,kind:Oc(e.req.flags?.kind),outPath:Oc(e.req.flags?.out)}),a=On(t);if(a.kind===`capture-stop`)return sc(i,await dc(i,n,a.request));let o=await ki({device:n.device,plan:a,inspectFacts:e.inspectFacts});return o.admitted?sc(i,await cc(i,n,o)):B(`perf`,o.fact)??l(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:a(e)}}}function sc(e,t){return t.ok&&L(e.sessionStore,e.ref,e.req,`perf`,S(t.data)?{...t.data}:{}),t}async function cc(e,t,n){let{device:i,plan:a}=Oi(n),o=V(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:_c(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:Sc(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Cc(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?F(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:W.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await lc(e,t,await o(i,a.use),a.request);case`profile-report`:{let n=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=Tc(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await n.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:F(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function lc(e,t,n,r){if(t.perfCapture)return l(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return l(`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=Tc(e,r.outPath,i),o=dn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=dn.createNextFence({admissionLedger:uc(e),resourcePath:o,device:t.device}),c=zn(e.sessionStore,e.ref);c.assertAdoptable();let u=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 jn({admissionLedger:uc(e),binding:c,device:t.device,owner:n.owner,fence:s,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:u.response}}function uc(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new r(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function dc(e,t,n){let r=t.perfCapture;if(!r)return l(`INVALID_ARGS`,`no active native perf capture`);let i=gc(r.handle.inspect(),n);if(i)return l(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(F(n.outPath,e.req.meta?.cwd));let a=await gn({intent:`capture`,binding:zn(e.sessionStore,e.ref)});if(n.area===`cpu`){let t=fc(a);e.sessionStore.update(e.ref,{lastPerfProfile:t})}return{ok:!0,data:a}}function fc(e){if(pc(e)||mc(e))return e;throw new r(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function pc(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function mc(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&hc(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function hc(e,t){return t.every(t=>typeof e[t]==`string`)}function gc(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 _c(e,t){return{...wc(e),metrics:{fps:vc(t.metric,e)},sampling:{fps:t.sampling}}}function vc(e,t){if(!S(e)||e.available!==!0)return e;let n=yc(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function yc(e,t){let n=bc(t.windowStartedAt),r=bc(t.windowEndedAt)??bc(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:xc(e)})).slice(-12)}function bc(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function xc(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Sc(e,t){return{...wc(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Cc(e,t){return{...wc(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function wc(e){return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id}}function Tc(e,t,n){return t?F(t,e.req.meta?.cwd):W.join(e.sessionStore.ensureSessionDir(e.sessionName),`${Dc()}-${n}`)}function Ec(e){let t=e.positionals?.[0]?.toLowerCase(),n=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||n!==`snapshot`))throw new r(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function Dc(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function Oc(e){return typeof e==`string`&&e.length>0?e:void 0}const kc=[`dump`,`log`],Ac=`network requires ${kc.join(` or `)}`,jc=`network include mode must be one of: ${s.join(`, `)}`,Mc=2048;async function Nc(e){let t=e.sessionStore.get(e.sessionName);if(!t)return l(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=Pc(e.bindDevice),r=(await n(t.device,Ze)).facts.networkDump;if(!r.available)return zc(r.hint);let i=Fc(e.req);if(!i.ok)return i;let a=Ae({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return Bc(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:Mc,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:a(e)}}}function Pc(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Fc(e){let t=Ic(e);if(!t.ok)return t;let n=Lc(e);if(!n.ok)return n;let r=Rc(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Ic(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return kc.includes(t)?{ok:!0,action:t}:l(`INVALID_ARGS`,Ac)}function Lc(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?l(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Rc(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return l(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return s.includes(r)?{ok:!0,include:r}:l(`INVALID_ARGS`,jc)}function zc(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function Bc(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:Mc,maxScanLines:e.entries.length},notes:e.notes}}}function Vc(e,t){let n=Dn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Hc(e.appLogFailure)]:Uc(n.state)}}function Hc(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Uc(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 Wc(e,t){return it([...e,...t.notes??[]])}async function Gc(e){let{req:t}=e;return t.command===`perf`?await oc({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?qc(e):t.command===`events`?await Kc(e):t.command===`network`?await Nc(e):t.command===`audio`?await Qs(al(e)):null}async function Kc(e){let{req:t,sessionName:n,sessionStore:r}=e;try{return await r.flushEvents(n),{ok:!0,data:r.readEvents(n,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:a(e)}}}async function qc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n);if(!i)return l(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=r.requireCurrent(i),a=ol({...e,session:n,ref:i}),o=(await a.bindDevice(n.device,Te)).facts.appLogInspect;if(!o.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:o.hint}};let s=Xc(ke({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),n);return`ok`in s?s:await Jc(a,s)}catch(e){return{ok:!1,error:a(e)}}}async function Jc(e,t){switch(t.kind){case`path`:return Zc(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Qc(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Yc(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await rl(e);case`mark`:return await e.bindDevice(e.session.device,t.use),$c(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),el(e)}}async function Yc(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await nl(e,t.appBundleId,n.owner,n.operations.appLogStart):await tl(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Xc(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):l(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Zc(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=_n(a),s=Vc(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 Qc(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Vc(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:Wc(t.notes,o)}}}function $c(e,t,n){let r=n.resolveAppLogPath(t);return Sn(r,e),{ok:!0,data:{path:r,marked:!0}}}function el(e){return{ok:!0,data:xn(e)}}async function tl(e,t,n,r){let{session:i,sessionStore:a}=e;i.appLog&&await kn({intent:`disposal`,ref:e.ref,sessionStore:a});let o=xn(e),s=await il(e,t,r,n);return s.ok?{ok:!0,data:{...o,restarted:!0}}:s}async function nl(e,t,n,r){let{session:i}=e;return i.appLog?l(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await il(e,t,r,n)}async function rl(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return l(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await kn({intent:`capture`,ref:e.ref,sessionStore:r}),{ok:!0,data:{path:i,stopped:!0}}}async function il(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=An.resolvePath(o.resolveSessionDir(a));try{let l=Zs({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device});bn(o,e.ref).assertAdoptable();let u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await yn({admissionLedger:e.appLogAdmissionLedger,ref:e.ref,sessionStore:o,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(t){return{ok:!1,error:Cn({ref:e.ref,sessionStore:o,error:t})}}}function al(e){if(!e.bindDevice||!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new r(`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,platformServices:e.platformServices,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function ol(e){if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new r(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,platformServices:e.platformServices,appLogAdmissionLedger:e.appLogAdmissionLedger}}const sl=new WeakMap;function cl(e){return{store:t=>ll(e,t),finalize:(t,n)=>ul({...e,evidence:t,projection:n})}}function ll(e,t){let{sessionStore:n,ref:r}=e;if(!r)throw Error(`Internal observation session is no longer available.`);let i=n.requireCurrent(r);wi(i,t);let a=i.snapshotGeneration;if(a===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let o={};return sl.set(o,{ref:r,snapshot:t,snapshotGeneration:a,runtimeRevision:Dr(i),refFrame:Wr(i)}),{evidence:o,refsGeneration:a}}function ul(e){let t=sl.get(e.evidence);sl.delete(e.evidence);let n=fl(e.projection.refs);if(n.size===0)return{published:!1,reason:`empty`};if(e.signal?.aborted===!0)return{published:!1,reason:`cancelled`};let r=t&&dl(e,t);return!t||!r?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!pl(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Ci(r,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function dl(e,t){if(!e.ref||e.ref.lifetime!==t.ref.lifetime)return;let n=e.sessionStore.resolveCurrent(e.ref);return n&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Dr(n)===t.runtimeRevision&&Wr(n)===t.refFrame?n:void 0}function fl(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 pl(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function ml(e){let t=hl(e),n=We(t);return Mi(`sha256`).update(n,`utf8`).digest(`hex`)}function hl(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)=>gl(e,n[t]??null,r?.[t]??null))}}function gl(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 _l(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=vl({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function vl(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>yl({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>bl({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>xl(n,r)];for(let e of s){let t=e();if(t)return t}}function yl(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 bl(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 xl(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 Sl(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new r(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=O(e),a=te(e),o=ml({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??ae(i.actions)??a.platform,target:t?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>_l(e,s,o)}}function Cl(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function wl(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ue(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Tl(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 El(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Tl(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ie(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 Dl(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ie(e,r),...we(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 Ol(e,t,n,r,i,a){if(n.targetEvidences)return kl(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return J(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return J(e,n,r,i,a);if(s.kind===`post-resolution`){let c=Cl({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return J(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return jl(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=wl({recorded:o,token:s.token});if(c.kind===`skip`)return J(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.observeTarget({action:n,index:i,token:l});if(u.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,Al(u),a,t)};let{classification:d}=u;return d.verified?jl(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 kl(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 J(e,n,r,i,a);let d=wl({recorded:o[c],token:u.token});if(d.kind===`skip`)return J(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.observeTarget({action:l,index:i,token:d.token});if(f.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,Al(f),a,t)};let{classification:p}=f;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 jl(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function Al(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 J(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 jl(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=Ml(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=Nl(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 Ml(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 Nl(e,t,n){return n.status===`guard-mismatch`?El(e,n.evidence,t):Dl(e,n.evidence)}async function Pl(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=St(e.varSources),o=[],s=[],c=Rl(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Ll(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(zl(u,n.length,r,e))}let d=xt(r,a,Il(e,u)),f=vt(a),p=t.diagnosticsMarker(),m=await Ol(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:Fl(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 Fl(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Il(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Ll(e){return!!(e&&e.command!==`replay`)}function Rl(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Ll(n))return n.command===`close`?t:void 0}}function zl(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}async function Bl(e){return await Vl({...e,snapshotDiagnostics:C(e.snapshotDiagnosticSamples)})}async function Vl(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Hl(t.error.details?.replaySource),v=_i(t.error),y=await hi({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:tn(u.meta?.requestId)});return yi({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Hl(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}}async function Ul(e){let{req:t,sessionName:n,action:i,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();fi(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:Kt(o)??[]});let g;try{g=await Gl({req:t,sessionName:n,resolved:o,sourceAction:i,invoke:f,resolvedSessionScope:p,dependencies:m,readinessTimeoutMs:e.readinessTimeoutMs})}catch(e){if(!(e instanceof r))throw e;g={ok:!1,error:a(e)}}let _=Date.now();return fi(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?ql(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Wl(g,u??s,c)}function Wl(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 Gl(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Yl(t.flags,r.flags,r.command);e.readinessTimeoutMs!==void 0&&(c.readinessTimeoutMs=e.readinessTimeoutMs);let l=i.command===`fill`?Bn(Cr(i)):void 0;return l&&(c.recordAs=l),await a(Kl({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Kl(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:E(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:de(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function ql(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`}))}async function Jl(e,t){let{readinessTimeoutMs:n}=Yl(e,t.flags,t.command);if(n===void 0)return;let{SELECTOR_PIPELINE_POLICIES:r,readinessScheduleFor:i}=await import(`./selector-pipeline-policy.js`).then(e=>e.r);return i(r.promotedTarget.poll,n)}function Yl(e,t,n){let r=x(e,{...t??{}});return Ke(n)&&r.readinessTimeoutMs===void 0&&(r.readinessTimeoutMs=2e3),r}function Xl(e){return ru(e.ok?Ql(e.data):Zl(e.error.details?.artifactPaths))}function Zl(e){return Array.isArray(e)?e.filter(nu):[]}function Ql(e){return e?[tu(e.path),tu(e.outPath),...$l(e.artifacts)].filter(nu):[]}function $l(e){return Array.isArray(e)?e.map(eu).filter(nu):[]}function eu(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return tu(t.localPath)??tu(t.path)}function tu(e){return typeof e==`string`?e:void 0}function nu(e){return typeof e==`string`}function ru(e){return[...new Set(e.filter(iu))]}function iu(e){try{return U.statSync(e).isFile()}catch{return!1}}function au(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=ou({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Ct(r),u=ye(t),d=wt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>pt(r,e)===t.sibling),p=d.filter(e=>ft(dt(e,l),t.scrollRegion)),m=ut(p)[t.viewportOrder]?.ref,h=mt({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,...lu({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function ou(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?su(n,t,i,a):cu(n,t,r,a,o)}function su(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),o=e(n),s=o?d(t,o):null;if(a(s))return{matchedNodes:[s],winnerRef:s.ref};let c=r?xi(t,r):null;return a(c)?{matchedNodes:[c],winnerRef:c.ref}:{matchedNodes:[],winnerRef:``}}function cu(e,t,n,r,i){let a=ot(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=Ln(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function lu(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?uu(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?uu(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?uu(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 uu(e,t,n){let r=ht(t),i=Tt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ie(e,r),...we(e.ancestry,i)].slice(0,5)}function du(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=ie(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ue(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!se(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(pu(r)&&pu(n[1])))return r}function fu(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function pu(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function mu(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=zt(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:wu(ye(n),h),...t.observed?{observed:wu(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>Tu(e,h))},_=li({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=ui({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(k(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=bi({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}}),x={code:t.causeCode,message:t.causeMessage};return yi({error:x,action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function hu(e,t,n){let r=zt(e.scrubVars);return mu(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:pi(n,r),publicationEvidence:yu(n),repairCapture:mi(n)})}async function gu(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await vi({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function _u(e,t){return hu(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 gu({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function vu(e,t,n){return hu(e,t,await gu({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function yu(e){return e.state===`available`?e.evidence:void 0}function bu(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?xe(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:$e(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:du(n,i),platform:a.device.platform}:{kind:`inactive`}}function xu(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=ci(r),s=au({recorded:t,token:n,nodes:i,platform:a,refLabel:fu(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:ht(s.winnerNode),structural:De(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?ht(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function Su(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function Cu(e){return!e.ok&&e.error.details?.reason===Si}function wu(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function Tu(e,t){let n=i(e.type??`Element`),r=ue(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function Eu(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function Du(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 Ou(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 ku(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 Au(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:Du(e?.observed),expectedStructural:ku(e?.expectedStructural),observedStructural:ku(e?.observedStructural)}}function ju(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:Du(e?.observed),observedAncestry:Ou(e?.observedAncestry)}}function Mu(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function Nu(e,t,n){let r=Mu(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&Su(e)?{status:`guard-mismatch`,evidence:Au(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&Cu(e)?{status:`landmark-mismatch`,evidence:ju(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function Pu(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c,l=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),u=e=>(o=e,Mu(Fu(e),Xl(e))),d=async e=>{let n=t.observationStore.get();return n?await vi({session:n,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:!0}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`}};return{runtime:{beginTargetVerification(e,n,r,i){return bu({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async observeTarget({action:e,token:n}){let r=async()=>{let r=await d(e);if(s=r,r.state!==`available`)return{state:`unavailable`,reason:r.reason,hint:r.hint};let i=t.sessionStore.get();return{state:`classified`,classification:xu({recorded:e.targetEvidence,token:n,action:e,nodes:[...r.nodes],platform:i.device.platform})}},i=n.startsWith(`@`)?void 0:await Jl(t.replayReq.flags,e);if(!i)return await r();let{observeUntil:a}=await import(`./selector-pipeline-policy.js`).then(e=>e.b),o=await a({capture:r,verdict:e=>Vu(e)?{kind:`continue`}:{kind:`done`,result:e},schedule:i,...t.signal?{signal:t.signal}:{},...t.dependencies.clock?{clock:t.dependencies.clock}:{}});if(o.polls.length>1&&(c={remainingBudgetMs:Math.max(0,i.budgetMs-Hu(o)),readiness:{polls:o.polls.length,waitedMs:o.waitedMs,end:o.kind}},A({level:`debug`,phase:`interaction_target_readiness`,data:{...c.readiness,command:e.command}})),o.kind===`done`)return o.result;if(o.last!==void 0)return o.last;throw o.kind===`expired`?o.lastError:o.error},async dispatchStep(e,n,i,a,s){let l=t.actionLines[i]??1,u=await Ul({...c?{readinessTimeoutMs:c.remainingBudgetMs}:{},req:Eu(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:l,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=u,Xl(u).forEach(e=>r.add(e));let d=[...r];return u.ok?{status:`ok`,artifactPaths:d}:Nu(u,s,d)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await _u(l(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(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=hu(l(e,t,r,i),n,a);return u(n.kind===`selector-miss`&&c?Uu(o,c.readiness):o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await vu(l(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=Fu(o),l=await Iu(t,n,e,r,c,[...i],[...a],s);return u(l)},armStep:()=>{s=void 0,c=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>Lu(e),onStep:i,diagnosticsMarker:()=>zu(t.sessionStore),diagnosticsSince:e=>Bu(t.sessionStore,e)},readLastResponse:()=>o}}function Fu(e){return e&&!e.ok?e:l(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Iu(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Ru(i)?c(i):c(await Bl({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function Lu(e){let t=e.positionals??[],n=Je(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Ru(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 zu(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function Bu(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Vu(e){return e.state===`classified`&&!e.classification.verified&&e.classification.kind===`selector-miss`}function Hu(e){let t=e.polls[0];return t?e.waitedMs-(t.startedMs+t.durationMs):0}function Uu(e,t){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,readiness:t}}}}async function Wu(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i,o=ne(t,a.flags?.replayBackend);if(o!==`ad`)return n?l(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await(await si(o)).runReplay(i):l(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Gu(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=Ku(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=qu(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=Ju({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:Xu({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function Ku(e){let t=e.flags?.replayBackend;if(t&&!ee(t))return l(`INVALID_ARGS`,re(t))}function qu(e,t,n){let r=Sl(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:Yu({...e,flags:Yt(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function Ju(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:l(`INVALID_ARGS`,a.message)}}function Yu(e,t){return!t.platform&&!t.target?e:{...e,flags:Zu(e.flags,t)}}function Xu(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:di({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:bt(yt(t.flags?.replayShellEnv)),cliEnv:_t(gt(t.flags?.replayEnv))}}function Zu(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const Qu={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function $u(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=ed({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(rd({req:t,coordinator:a}),nd({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function ed(e){let t=id(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return o()}function td(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?l(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):ad({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function nd(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=td({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??Qu,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:od({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function rd(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function id(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return l(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function ad(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?F(t):a??gi(i);if(!(n||r&&o===a)&&U.existsSync(o))return l(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function od(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 sd(e){let{request:t,session:{name:n,logPath:r,store:i,observationStore:o,coordinator:s},tracePath:c,onStep:u,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return l(`INVALID_ARGS`,Ut);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,le(h)&&t.flags?.replayBackend!==`maestro`)return l(`INVALID_ARGS`,ce(`replay`,h));let a=await Wu({resolved:h,keepSession:m,coordinator:s,command:e});if(a)return a;let _=Gu({req:t,sessionName:n,sessionStore:i,tracePath:c,resolved:h,script:Jt(f,h),coordinator:s,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:T}=_.value,E=$u({req:t,entryIndex:C,sessionStore:i,sourcePath:h,coordinator:s});if(!E.ok)return E.response;let{runtime:ee,readLastResponse:D}=Pu({ctx:{replayReq:v,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:T,responseLevel:t.meta?.responseLevel,invoke:d,signal:tn(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:u,armSaveScript:E.armSaveScript}),O=await Pl({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},ee);return O.status===`failed`?D()??l(`COMMAND_FAILED`,`replay step failed with no recorded response`):cd({startedAt:p,sessionName:n,sessionStore:i,replayed:O.replayed,artifactPaths:O.artifactPaths,snapshotDiagnosticSamples:O.snapshotDiagnosticSamples,armSaveScript:E.armSaveScript,coordinator:s,keepSession:m})}catch(e){let t=a(e);return g.size===0?{ok:!1,error:t}:{ok:!1,error:{...t,details:{...t.details,artifactPaths:[...g]}}}}}function cd(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=ud({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=C([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:ld(i,Date.now()-t)}}}function ld(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function ud(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return l(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function dd(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=W.resolve(n??`.`,t??`.agent-device/test-artifacts`);return W.join(i,r)}function fd(e,t){let n=t?W.relative(t,e):W.basename(e),r=n.length===0||n.startsWith(`..`)?W.basename(e):n;return et(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function pd(e,t){U.mkdirSync(t,{recursive:!0}),gd(e,t)}function md(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=W.join(o,`result.txt`),u=W.join(o,`failure.txt`),d=hd([...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=>W.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
-
`)}\n`;U.writeFileSync(l,p),s||U.writeFileSync(u,p)}function hd(e,t,n){let r=[],i=new Set(n.map(e=>W.basename(e).toLowerCase()));for(let n of e){if(!vd(n))continue;let e=W.basename(n);if(W.resolve(n)===W.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=_d(e,t,i),o=W.join(t,a);U.copyFileSync(n,o),r.push(o)}return r}function gd(e,t){let n=W.join(t,`replay.ad`);if(U.copyFileSync(e,n),W.extname(e).toLowerCase()===`.ad`)return;let r=W.join(t,W.basename(e));W.resolve(r)!==W.resolve(n)&&U.copyFileSync(e,r)}function _d(e,t,n){let r=W.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||U.existsSync(W.join(t,a));)a=`${i}-${o++}${r}`;return a}function vd(e){try{return U.statSync(e).isFile()}catch{return!1}}function yd(e){let{platformFilter:t,discoverSources:n}=e,i=n(),a=[],o={undeclared:0,declaredOther:0};for(let e of i){let{path:n,manifest:r}=e,i={kind:`run`,path:n,title:r.title,manifest:r};if(!t){a.push(i);continue}let s=r.device.platform;if(s.kind===`caller-bound`){a.push(i);continue}if(s.kind===`unspecified`){o.undeclared+=1,a.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}if(!kd(t,s.value)){o.declaredOther+=1;continue}a.push(i)}if(a.filter(e=>e.kind===`run`).length===0)throw new r(`INVALID_ARGS`,Sd({platformFilter:t,...o}));return a}const bd={web:!0};function xd(e){return!Object.hasOwn(bd,e)}function Sd(e){let{platformFilter:t,undeclared:n,declaredOther:r}=e,i=t?` for --platform ${t}`:``;return t===void 0||n===0&&r===0?`No replay tests matched${i}.`:`No replay tests matched${i}: ${[...n>0?[`${n} without a platform declaration`]:[],...r>0?[`${r} declaring another platform`]:[]].join(`, `)}. ${Cd(t,n)}`}function Cd(e,t){return xd(e)?t>0?`Add "context platform=${e}" to the first line of a script that has none, or drop --platform when the device is already selected.`:`Run a source that declares ${e}, or drop --platform.`:`No script can declare ${e} as its platform; run this suite without --platform.`}function wd(e,t,n,r,i=0){let a=W.basename(n,W.extname(n)),o=et(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Td(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return et(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function Ed(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,W.basename(r),`attempt`,a+1].join(`:`)}function Dd(e,t){return typeof e==`number`?e:t}function Od(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function kd(e,t){return e===`apple`?M(t):t===e}function Ad(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const jd=2e3;async function Md(e){let{filePath:t,sessionName:n,requestId:r,parentRequestId:i,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:r,parentAttemptId:i}),v=new Set,y,b=!1,x,S=Date.now(),C=zd({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:n,requestId:r,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:n,platform:s,target:c,requestId:r,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Y(C,e),shard:u,onStep:d}).catch(e=>Ad({error:a(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Bd(o,[...v]))},o)})]):await w,Y(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:n,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Pd(w)||(x=Ld(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:r,graceMs:jd}}),Fd({replayPromise:w,cleanupSession:p,sessionName:n,requestId:r,emitDiagnostic:h})));let e=await Id({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Rd(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Y(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:n}),await p(n),Y(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!0,durationMs:Date.now()-t})}catch(e){let r=a(e);Y(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-t,errorCode:r.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:n,error:r.message}}),x=Nd(x,r,v)}}return x??Ad({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Nd(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:Ad({error:t,artifactPaths:[...n],infrastructure:!0})}async function Pd(e){return await Promise.race([e.then(()=>!0),Pi(jd).then(()=>!1)])}async function Fd(e){let{replayPromise:t,cleanupSession:n,sessionName:r,requestId:i,emitDiagnostic:o}=e;try{await t}finally{try{await n(r)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:r,requestId:i,error:a(e).message}})}}}async function Id(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Y(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:n});try{let e=await t({sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:o,appendTimingEvent:e=>Y(o,e)});return Y(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=a(e);return Y(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:n,error:t.message}}),Ad({error:t})}}function Ld(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Rd(e,t){return{...e,warnings:[...e.warnings,t]}}function zd(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=W.join(t,`replay-timing.ndjson`);return U.mkdirSync(W.dirname(l),{recursive:!0}),U.writeFileSync(l,``),n.add(l),Y(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Y(e,t){e&&U.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Bd(e,t=[]){return Ad({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 Vd(e){let t=Hd(e),n=await Ud(e,t);return{result:Yd(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Hd(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:W.join(i,...a?[`shard-${a.shardIndex+1}`]:[],fd(t.path,n)),maxAttempts:r+1}}async function Ud(e,t){Gd(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Wd(e,t,r);if(Kd(n,i),qd(e,i.outcome,r))break;Jd(e,t,i)}return n}async function Wd(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=wd(i,a,r.path,o,n),h=W.join(t.testArtifactsDir,`attempt-${f}`);pd(r.path,h);let g=Ed({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,...X(d)},v=await Md({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 md({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Gd(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:wd(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...X(c)})}function Kd(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 qd(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Jd(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,...X(e.shard)})}function Yd(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Xd(e,t,n,r):Zd(e,t,n,r)}function Xd(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,...X(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}:{},...$d(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Zd(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,...X(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...Qd(c),...$d(s)}}function Qd(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 $d(e){return X(e)}function X(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function ef(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 tf(e){let{request:n,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=n.sessionName;if(n.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),t=await nf(n,u,d);sf(t,o);let p=t.shardPlan?cf({entries:t.entries,total:t.total,emitProgress:o}):[];return t.shardPlan?p.push(...await lf({shards:t.shardPlan.shards,sessionName:f,suiteInvocationId:t.suiteInvocationId,cwd:n.cwd,requestId:n.requestId,request:n,suiteArtifactsDir:t.suiteArtifactsDir,suiteTotal:t.total,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await pf({discoveryEntries:t.entries,sessionName:f,suiteInvocationId:t.suiteInvocationId,cwd:n.cwd,requestId:n.requestId,request:n,suiteArtifactsDir:t.suiteArtifactsDir,suiteTotal:t.total,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:gf(t.total,p,Date.now()-e,t.suiteArtifactsDir)}}catch(e){let n=t(e);return{status:`failed`,error:{code:n.code,message:n.message}}}}async function nf(e,t,n){let r=rf(e,t),i=af(r),a=r.length-i.length,o=Td(e.requestId),s=await ef(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:of(e,o),total:s?.total??r.length}}function rf(e,t){return yd({platformFilter:e.platformFilter,discoverSources:t})}function af(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function of(e,t){return dd({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function sf(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 cf(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function lf(e){return(await Promise.allSettled(e.shards.map(async t=>await df({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[uf(r,e.sessionName,t.reason)]:[]})}function uf(e,t,n){let r=a(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:ff(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:r.code,message:r.message,hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,details:r.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function df(e){let{shard:t,sessionName:n}=e;return await mf({...e,entries:t.entries,sessionName:ff(n,t),shard:t})}function ff(e,t){return`${e}:shard-${t.shardIndex+1}`}async function pf(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 Vd({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Od(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Dd(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),hf(t,o,p))break}return g}async function mf(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 Vd({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Od(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Dd(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),hf(b,o,m))break}return _}function hf(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function gf(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=T(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}:{}}}async function _f(e,t){let n=ee(t)&&e.some(e=>ne(e.entry,t)!==`ad`)?await si(t):void 0;return()=>e.map(e=>vf(e,t,n))}function vf(e,t,n){let r=e.entry,i=Jt(e,r),a=ne(r,t)!==`ad`,o=te(i);return{path:r,manifest:{...a?{title:n?.inspectSource(i,r).title}:{},device:{platform:o.platform?{kind:`declared`,value:o.platform}:a?{kind:`caller-bound`}:{kind:`unspecified`},...o.target===void 0?{}:{target:o.target}},...o.timeoutMs!==void 0||o.retries!==void 0?{attemptDefaults:{...o.timeoutMs===void 0?{}:{timeoutMs:o.timeoutMs},...o.retries===void 0?{}:{retries:o.retries}}}:{}}}}function yf(e){return async t=>(await Sf(e,t)).map(bf)}function bf(e){if(e.platform===`web`||!he(e))throw new r(`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 xf(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 Sf(e,t){let n=Ef(e),i=wf(await Fn(Cf(e)),n,e);if(i.length<t)throw new r(`DEVICE_NOT_FOUND`,`test sharding requires ${Tf(t)}, but only ${i.length} matched`);return i.slice(0,t)}function Cf(e){let t=I(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:me({simulatorSetPath:Mn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function wf(e,t,n){return t.length>0?Df(e,t,n):e.filter(e=>Of(e,n)).sort(jf)}function Tf(e){return`${e} device${e===1?``:`s`}`}function Ef(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Df(e,t,n){return t.map(t=>{let i=Af(t),a=e.find(e=>kf(e,n)&&(e.id===t||Af(e.name)===i));if(!a)throw new r(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Of(e,t){return!kf(e,t)||!he(e)?!1:e.booted!==!1}function kf(e,t){return!(!_e(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Af(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function jf(e,t){return e.id.localeCompare(t.id)}function Mf(e){let t=Nf(e?.shardAll,`--shard-all`),n=Nf(e?.shardSplit,`--shard-split`);if(t!==void 0&&n!==void 0)throw new r(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(n!==void 0)return{mode:`split`,count:n}}function Nf(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new r(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const Pf=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 Ff(e){return Pf.has(e.toUpperCase())}const If=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Lf(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=Rf(e);return t?zf(t.details)||Bf(t.code,t.message):!1}function Rf(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function zf(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||p(t)?!0:t?Ff(t):!1}function Bf(e,t){let n=`${e}\n${t}`.toLowerCase();return If.some(e=>n.includes(e))}function Vf(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Wf(e.error.details?.artifactPaths),warnings:_(e.error.details),infrastructure:Lf(e),...Gf(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:_(t),artifactPaths:Wf(t?.artifactPaths),...Gf(t?.snapshotDiagnostics)}}function Hf(e){if(!e||e.ok)return;let t=Vf(e);return t.status===`failed`?t:void 0}function Uf(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Wf(e){return[...new Set(Uf(e))]}function Gf(e){let t=w(e);return t?{snapshotDiagnostics:t}:{}}const Kf=1e3,qf=3e3;function Jf(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Yf(e)}}async function Yf(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=Pt(o.device.platform),c=i?W.join(i,`recording${s}`):Nt(o.device.platform);Z(a,{type:`video_recording_start`,session:n,videoPath:c}),A({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(Zf({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return Z(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await At(Kf),Z(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:Kf}),A({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:Kf}}),l}async function Xf(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;Z(a,{type:`video_tail_start`,session:n,requestedDurationMs:qf});let o=Date.now();await At(qf);let s=Date.now(),c=await e.video.record(Zf({req:t,sessionName:n,phase:`stop`}));return Xl(c).forEach(e=>i.add(e)),Z(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),A({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function Z(e,t){e({...t,ts:new Date().toISOString()})}function Zf(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 Qf=[{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.`}],$f=({attemptId:e,parentAttemptId:t})=>{en(e);let n=ep(e,t);return{cancel:()=>Zt(e),release:()=>{n(),$t(e)}}};function ep(e,t){if(!t||t===e)return()=>{};let n=tn(t);if(!n)return()=>{};let r=()=>{Zt(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function tp(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=np(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:xf({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function np(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 rp(e){let{request:n,session:{name:r,logPath:i},createSession:a,invoke:o,cleanupSession:s,video:c}=e;if(n.flags?.recordVideo===!0&&c===void 0)return l(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let u=n.flags??{};for(let e of Qf)if(e.requested(u))return l(`INVALID_ARGS`,e.message);let d,f;try{d=op(n,r),f=ap(n)}catch(e){let n=t(e);return l(n.code,n.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await tf({request:d,emitProgress:nn,isCanceled:()=>Qt(n.meta?.requestId),emitDiagnostic:A,bindAttemptCancellation:$f,runReplay:async({filePath:t,sessionName:r,platform:s,target:l,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&Xl(e).forEach(e=>f.add(e)),e),y=tp({parentFlags:n.flags,platform:s,target:l,artifactsDir:d,shard:g,sourceBundle:p.get(t)}),b=a(r,i),x=c?{req:n,sessionName:r,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:c}:void 0,S=x?Jf(x):void 0;return Vf(await sd({...sp(e,{request:{...n,command:`replay`,session:r,positionals:[t],flags:y,meta:{...n.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await Yf(x):void 0;return t&&!t.ok?t:v(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:t,artifactsDir:r,appendTimingEvent:o})=>{if(c)return Hf(await Xf({req:n,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:t,video:c}))},discoverSources:await _f(f,n.flags?.replayBackend),resolveShardTargets:yf(n.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:ip(m.data,n)}:l(m.error.code,m.error.message)}function ip(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=W.join(n,W.basename(r)),a=e=>e===r||e.startsWith(r+W.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 U.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:W.basename(r)}]}:o}function ap(e){let t=e.flags?.replayScriptSources;if(!t)throw new r(`INVALID_ARGS`,Ut);return t}function op(e,t){let n=e.flags??{},r=e.meta?.cwd,i=lp(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:F(i,r),failFast:n.failFast===!0,retries:cp(n.retries),timeoutMs:cp(n.timeoutMs),shard:Mf(n)}}function sp(e,t){let{publicNetworkOnly:n,resolvedSessionScope:r,dispatch:i,dependencies:a}=e,o=i||t.openLifecycle?{...i,...t.openLifecycle?{openLifecycle:t.openLifecycle}:{}}:void 0;return{request:t.request,...n?{publicNetworkOnly:n}:{},...r?{resolvedSessionScope:r}:{},...o?{dispatch:o}:{},dependencies:a}}function cp(e){return typeof e==`number`?e:void 0}function lp(e){return typeof e==`string`?e:void 0}function up(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority},coordinator:r.createCoordinator()}}function dp(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function fp(e,t){let n=v({...e,...t});return Object.keys(n).length>0?n:void 0}function pp(e,t){return async({dispatch:n,...r})=>{let i=fp(t.internal,n);return await e(i?{...r,internal:i}:r)}}function mp(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:sr(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:hp(e.scriptPublication??rr)}},armStep(e){n.update(t=>{Rr(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:gi(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){sr(r())!==void 0&&n.update(hr)},markCompleteIfArmed(){sr(r())!==void 0&&n.update(Xn)},markSessionHeldIfArmed(e){if(e.ok||!pr(r()))return e;let t=Rt(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&&_p(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{gp({session:t,...e})})}}}}function hp(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:xr(e),targetForce:Sr(e)}}function gp(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=vp({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function _p(e){e.pendingRecordAndHeal=void 0}function vp(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 yp(e){let{sessionStore:t,bindDevice:n,platformServices:r,bindExactDevice:i,screenRecordingAdmissionLedger:a,requestScope:o,retainDeviceExecutionLock:s,throwIfCanceled:c}=e;return!n||!i||!a||!o||!s||!c?void 0:{throwIfCanceled:c,record:async e=>await Di({req:bp(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,platformServices:r,bindExactDevice:i,admissionLedger:a,requestScope:o,retainDeviceExecutionLock:s,throwIfCanceled:c})}}function bp(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 xp={resolveSessionScope:tr},Sp=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await sd({...dp(e),session:wp(t,n,r),invoke:pp(a??i,e),dependencies:xp}),Cp=async({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,platformServices:l,inspectFacts:u,bindExactDevice:d,screenRecordingAdmissionLedger:f,requestScope:p,retainDeviceExecutionLock:m,throwIfCanceled:h,platformResourceCleanup:g})=>{if(!g)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let _=yp({sessionStore:i,bindDevice:c,platformServices:l,bindExactDevice:d,screenRecordingAdmissionLedger:f,requestScope:p,retainDeviceExecutionLock:m,throwIfCanceled:h});return await rp({...dp(e),session:wp(t,n,i),createSession:(e,t)=>wp(e,t,i),invoke:pp(s??o,e),dependencies:xp,cleanupSession:async t=>await Tp({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,inspectFacts:u,bindDevice:c,platformServices:l,platformResourceCleanup:g}),..._?{video:_}:{}})};function wp(e,t,n){let i=t=>{let r=n.get(e);return r?(t(r),!0):!1},a={get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)};return up(e,t,a,{createCoordinator:()=>mp({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>n.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let r=n.lookup(e);r&&mr(r,t)},resolveOpenRuntimeHints:({request:t,device:r,platform:i})=>Pr({req:t,sessionStore:{getRuntimeHints:t=>t===e?n.getRuntimeHints(e):void 0},sessionName:e,device:r,platform:i}),bindAuthority:t=>{let i=n.lookup(e);return{...cl({sessionStore:n,ref:i,signal:t}),capture:async({flags:a,logPath:o})=>{let s=i?n.requireCurrent(i):void 0;if(!s)throw new r(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await Ei({device:s.device,session:s,flags:a,logPath:o,signal:t})}}}})}async function Tp(e){let{req:t,sessionName:n,logPath:i,sessionStore:a}=e;if(!a.get(n))return;let o=await bo({req:{token:t.token,session:n,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:n,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new r(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function Ep(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command!==oe.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return Ap(new r(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.lookup(n);if(!a)return Ap(new r(`SESSION_NOT_FOUND`,`No active session "${n}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=i.requireCurrent(a),s=kp(o);if(s)return Ap(s);let c=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!c)return Ap(new r(`INVALID_ARGS`,`session save-script path cannot be empty.`));qr(o,{explicitPath:c,liveForce:t.flags?.force});let l=i.writeSessionLog(a,{force:yr(o,t.flags?.force),publication:`active`});return l.written?(Qn(o,l.path),{ok:!0,data:{session:o.name,savedScript:l.path,actionCount:l.actionCount,...m(`Published script: ${l.path}`)}}):Ap(l.error??new r(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Dp(e){if(ur(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:er(e)?void 0:`not-armed`}const Op={repair:()=>new r(`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 r(`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 r(`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 r(`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 kp(e){let t=Dp(e);return t?Op[t]():void 0}function Ap(e){return{ok:!1,error:a(e)}}function jp(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function Mp(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Er(e)}}async function Np(e,t,n){if(n.length!==1)throw new r(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(Mp(t))}}async function Pp(e,t,n){if(n.length<2)throw new r(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `),a={...Mp(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...m(`Clipboard updated`)}}async function Fp(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a,platformServices:o}=e;if(n===`read`){let e=await R({command:`clipboard`,device:t,use:nt,inspectFacts:i,bindDevice:a,platformServices:o,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>Np(n,e,r)}}let s=await R({command:`clipboard`,device:t,use:Qe,inspectFacts:i,bindDevice:a,platformServices:o,readiness:!0});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>Pp(c,e,r)}}async function Ip(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=i.lookup(n),u=c?.session,d=t.flags??{},f=G(D.clipboard,u,d);if(f)return f;let p=t.positionals??[],m=jp(p);if(!m)return l(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let h=await K({session:u,flags:d,platformServices:s});c&&i.requireCurrent(c);let g=await Fp({device:h,action:m,positionals:p,inspectFacts:a,bindDevice:o,platformServices:s});if(!g.ok)return g.response;let _=c?i.requireCurrent(c):void 0,v=await g.execute($n(r,t.flags,_?.appBundleId,_?.trace?.outPath));return L(i,c,t,t.command,v),{ok:!0,data:{platform:j(h),...v}}}function Lp(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Rp(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function zp(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Bp(e,...t){for(let n of t)Q(e,n)}function Q(e,t){e.push(t),nn({type:`command`,status:`progress`,message:Vp(t)})}function Vp(e){return[oi(e),...ai(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 _m=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],vm=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerDeviceType`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function ym(e,t){let n=It(e.meta?.cwd);return{targetApp:wm(e.flags?.targetApp)??t?.appBundleId,metroHost:wm(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Tm(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Sm(e,n)}}function bm(e,t={}){let n=Cm(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 xm(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 ${j(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 Sm(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Cm(e){let t={...Object.fromEntries([..._m,...vm].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 wm(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Tm(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Em(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==D.doctor)return null;let s=Dm(e.hostDiagnostics),c=r.get(n),l=ym(t,c),u=Am(r,n),d=[];if(Bp(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Ft()} using ${u}`,evidence:{version:Ft(),stateDir:u}},...bm(t,{required:l.remote}),...xm(r,n,c,{remote:l.remote})),l.remote)return Fm(d,l);let f=Om(l,u,i),p=await Wp(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&Q(d,m);let h=await jm({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=c?.device??km(p,h);if(g){let e=await s.warmupCheck(g,f);e&&Q(d,e)}return Fm(d,l,{device:h,includeMetro:!0,inventory:p})}function Dm(e){if(!e)throw new r(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function Om(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>rn(e),emitProgress:e=>nn({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await In(e),shouldPropagateInventoryProbeError:Nn,transportOverrides:Object.freeze({androidAdb:n})})}function km(e,t){let n=e?.hostDevices??[];if(t)return n.includes(t)?t:void 0;let r=n.filter(e=>P(e)&&e.kind===`simulator`);return r.find(e=>e.booted===!0)??r[0]}function Am(e,t){let n=W.dirname(e.resolveSessionDir(t));return W.basename(n)===`sessions`?W.dirname(n):n}async function jm(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Gp(t,i,a.targetApp);return u&&await Mm(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&Q(t,await um(a.metroHost,a.metroPort,a.kind)),Bp(t,...await r.ambientChecks(n)),u}async function Mm(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await Nm({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await Hp(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),Bp(e,...await r.deviceChecks(i,n))}async function Nm(e){if(e.device.platform!==`harmonyos`)return Pm(e)}async function Pm(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,at),u=I(n.flags?.androidDeviceAllowlist),d=await To(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await Eo(l,d,e)}function Fm(e,t,n={}){let r=Lp(e);return{ok:!0,data:{status:r,summary:Rp(r),kind:t.kind,platform:n.device?j(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:zp(e)}}}async function Im(e){return await R({...e,command:`prepare`,use:Ee})}async function Lm(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return l(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=G(D.prepare,o,s);if(c)return c;let u=await K({session:o,flags:s,platformServices:e.platformServices}),d=await Im({device:u,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:Rm(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:Fr(t)}});return{ok:!0,data:zm(a,u,Math.max(0,Date.now()-f),p)}}function Rm(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ye}function zm(e,t,n,r){return{action:e,platform:j(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Bm(n,r),message:`Prepared Apple runner: ${t.name}`}}function Bm(e,t){let n=Vm(t.buildMs),r=Hm(t.connectMs),i=Hm(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 Vm(e){return e===void 0?void 0:Hm(e)}function Hm(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Um=e=>Do(e),Wm=e=>js({req:e.req,createCommandSurface:e.createCommandSurface,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Gm=e=>bo({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Km=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a})=>await Xs({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a}),$=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,platformServices:i,inspectFacts:a,appLogAdmissionLedger:o,audioProbeAdmissionLedger:s,perfCaptureAdmissionLedger:c,throwIfCanceled:l})=>await Gc({req:e,sessionName:t,sessionStore:n,bindDevice:r,platformServices:i,inspectFacts:a,appLogAdmissionLedger:o,audioProbeAdmissionLedger:s,perfCaptureAdmissionLedger:c,throwIfCanceled:l}),qm={session_list:Um,devices:Um,capabilities:Um,apps:Um,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Em({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Km,shutdown:Km,appstate:Km,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Ep({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await ia({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await Ip({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),keyboard:Fa,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await Lm({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),install:Ya,reinstall:Ya,install_source:Ya,release_materialized_paths:async({req:e})=>await Hi({req:e}),push:Ya,"trigger-app-event":Ia,open:Wm,replay:Sp,test:Cp,batch:async({req:e,sessionName:t,invoke:n})=>await Xa(e,t,n),close:Gm};async function Jm(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Tr,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,platformServices:p,bindExactDevice:m,appLogAdmissionLedger:h,audioProbeAdmissionLedger:g,perfCaptureAdmissionLedger:_,screenRecordingAdmissionLedger:v,hostDiagnostics:y,requestScope:b,retainDeviceExecutionLock:x,throwIfCanceled:S,reconcileOrphanedDeviceClaim:C,platformResourceCleanup:w}=e,T=qm[t.command];return T?await T({req:t,createCommandSurface:e.createCommandSurface,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,platformServices:p,bindExactDevice:m,appLogAdmissionLedger:h,audioProbeAdmissionLedger:g,perfCaptureAdmissionLedger:_,screenRecordingAdmissionLedger:v,hostDiagnostics:y,requestScope:b,retainDeviceExecutionLock:x,throwIfCanceled:S,reconcileOrphanedDeviceClaim:C,platformResourceCleanup:w}):null}export{Jm as handleSessionCommands};
|
|
1
|
+
import{D as e,I as t,L as n,P as r,S as i,Y as a,f as o,n as s,q as c,s as l,tt as u,x as d}from"./sdk-contracts.js";import{C as f,D as p,H as m,T as h,U as g,V as _}from"./tv-remote.js";import{A as v,i as y,n as b,t as x,v as S}from"./sdk-batch-runner.js";import{a as C,n as w,t as T}from"./snapshot-diagnostics.js";import{$ as E,A as ee,E as D,F as O,G as k,I as te,M as ne,N as re,Q as ie,R as ae,T as oe,Y as se,j as ce,k as le,m as ue,rt as de}from"./back-mode.js";import{a as fe,r as A}from"./diagnostics.js";import"./diagnostics2.js";import{C as pe,E as j,O as me,_ as he,b as ge,f as M,g as N,h as P,w as _e}from"./sdk-device.js";import{B as ve,Bn as ye,Ct as be,E as xe,F as Se,G as Ce,Hn as we,I as Te,J as Ee,Jn as De,K as Oe,L as ke,M as Ae,P as je,Pt as Me,Q as Ne,R as Pe,Tt as Fe,Un as Ie,V as Le,W as Re,Wt as ze,X as Be,Y as Ve,Z as He,_n as Ue,ar as We,at as Ge,d as Ke,f as qe,gn as Je,in as Ye,it as Xe,j as Ze,mt as Qe,on as $e,or as et,p as tt,pt as nt,q as rt,sr as it,st as at,vn as ot,wt as st,y as ct,z as lt}from"./sdk-batch.js";import{a as ut,n as dt,o as ft,r as pt,s as mt,t as ht}from"./target-evidence.js";import{a as gt,i as _t,n as vt,o as yt,r as bt,s as xt,t as St}from"./vars.js";import{n as Ct,r as wt,t as Tt}from"./target-evidence-tree.js";import{g as Et,i as Dt}from"./observability.js";import{t as Ot}from"./app-inventory.js";import{l as kt}from"./exec.js";import{i as At}from"./retry.js";import{d as F,l as jt,u as Mt}from"./daemon-resolution.js";import{n as Nt,r as Pt}from"./output-path.js";import"./command.js";import{a as Ft}from"./version.js";import"./retry2.js";import{t as It}from"./project-runtime.js";import{t as Lt}from"./keyed-lock.js";import{i as Rt,n as zt}from"./replay-divergence.js";import{n as Bt,t as Vt}from"./deploy-result-target.js";import{i as Ht}from"./snapshot-chrome.js";import{a as Ut,d as Wt,f as Gt,g as Kt,l as qt,o as Jt,r as Yt,u as Xt}from"./replay-script-selection.js";import{a as Zt,i as Qt,n as $t,o as en,r as tn}from"./request-cancel.js";import{t as nn}from"./request.js";import{n as rn}from"./provider-device-admission.js";import{i as an,o as on,t as sn}from"./device-claim-inspection.js";import{t as cn}from"./audio-probe-result.js";import{A as ln,D as un,E as dn,N as fn,O as pn,P as mn,R as hn,T as gn,_ as _n,a as vn,c as yn,d as bn,f as xn,g as Sn,h as Cn,j as wn,k as Tn,l as En,m as Dn,o as On,p as kn,v as An,w as jn}from"./platform-request-scope.js";import{n as I,r as Mn}from"./device-isolation.js";import{a as Nn,i as Pn,n as Fn,r as In}from"./device-inventory-context.js";import{d as Ln}from"./selector-pipeline-policy.js";import{i as Rn,o as zn}from"./durable-capture-resource.js";import{$t as Bn,A as Vn,At as Hn,B as Un,Bt as Wn,C as Gn,D as Kn,E as qn,Et as Jn,F as Yn,Ft as Xn,G as Zn,Gt as Qn,H as $n,Ht as er,I as tr,It as nr,Jt as rr,K as ir,Kt as ar,L as or,Lt as sr,M as cr,Mt as lr,Nt as ur,O as dr,Ot as L,P as fr,Pt as pr,R as mr,Rt as hr,S as gr,T as _r,V as vr,Vt as yr,Wt as br,Xt as xr,Yt as Sr,Zt as Cr,_ as wr,_t as Tr,a as Er,at as Dr,b as Or,bt as kr,d as Ar,dt as jr,f as Mr,ft as Nr,g as Pr,gt as Fr,h as Ir,j as Lr,jt as Rr,k as zr,l as Br,m as Vr,mt as Hr,o as Ur,ot as Wr,p as Gr,pt as Kr,qt as qr,s as R,tt as z,u as Jr,ut as Yr,v as Xr,w as Zr,wt as Qr,x as $r,y as ei,z as ti,zt as ni}from"./internal/daemon.js";import{n as ri,r as ii}from"./device-selection-resolver.js";import{n as ai,r as oi}from"./doctor-lines.js";import{t as si}from"./replay-backend-registry.js";import{c as ci,d as li,f as ui,g as di,h as fi,i as pi,l as mi,o as hi,p as gi,r as _i,s as vi,t as yi,u as bi}from"./session-replay-runtime-failure-response.js";import{n as xi}from"./snapshot-node-lookup.js";import{n as Si}from"./replay2.js";import{c as Ci,f as wi,o as Ti,r as Ei}from"./runtime-session.js";import{t as Di}from"./record-runtime.js";import{a as Oi,i as B,n as V,r as H,t as ki}from"./session-runtime-admission.js";import{n as Ai}from"./gesture-runtime.js";import{t as ji}from"./snapshot-runtime.js";import{createHash as Mi}from"node:crypto";import U,{promises as Ni}from"node:fs";import W from"node:path";import{setTimeout as Pi}from"node:timers/promises";function Fi(e){throw new r(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Ii(e){let t=e.meta?.installSource;if(!t)throw new r(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new r(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Fi(t)}}function Li(e){let t=Ii(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Jn(n,e.meta?.tenantId)},cleanup:()=>{Qr(n)}}}function G(e,t,n){return t||Yr(n)?null:l(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`,u())}function Ri(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function K(e){return jr(e.flags)||!e.session?await Wt(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await zi(e.session.device,e.platformServices)}async function zi(e,t){if(rn(e)||!P(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await t.appleSessionObservation.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 Wt(n)}catch(e){if(!(e instanceof r)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Wt({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Bi(e,t){return t?ti(t,e).length===0:!1}async function Vi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),o=i?.session,s,c,l;try{s=Li(t);let a=Gi(t),u=await Ui(o,t.flags,e.platformServices),d=await H(e.inspectFacts)(u),f=B(`install_from_source`,d.operations.ensureReady)??B(`install_from_source`,d.operations.materializeAppSource)??B(`install_from_source`,d.operations.deployMaterializedApp);if(f)return f;let p=await V(e.bindDevice)(u,He);await p.operations.ensureReady({}),c=await p.operations.materializeAppSource({source:s.source}),l=await Ki({artifact:c,retention:a,req:t,session:o,sessionName:n}),i&&z(r.requireCurrent(i));let m=await p.operations.deployMaterializedApp({artifact:c}),h=qi(u,c,m,l),_=g(h,`Installed: ${Bt(h)}`);return L(r,i,t,`install_source`,_,{positionals:[]}),{ok:!0,data:_}}catch(e){return l&&await zr(l.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:a(e)}}finally{await c?.cleanup(),s?.cleanup()}}async function Hi(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new r(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await zr(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:a(e)}}}async function Ui(e,t,n){let i=Wi(t?.platform);if(e&&i&&!_e(e.device,i))throw new r(`INVALID_ARGS`,`install_from_source requested platform ${i}, but session is bound to ${j(e.device)}`);if(!e&&!i)throw new r(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await K({session:e,flags:t,platformServices:n})}function Wi(e){return e===`ios`||e===`android`?e:void 0}function Gi(e){let t=e.meta?.retainMaterializedPaths===!0,n=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(n!==void 0&&n<=0)throw new r(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...n===void 0?{}:{ttlMs:n}}}async function Ki(e){if(e.retention.enabled)return await Lr({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 qi(e,t,n,r){return P(e)?Ji(t,n,r):Yi(t,n,r)}function Ji(e,t,n){let i=t.bundleId??e.bundleId;if(!i)throw new r(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Zi(n),bundleId:i,...Xi(t,e),launchTarget:t.launchTarget??i}}function Yi(e,t,n){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new r(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Zi(n),packageName:i,...Xi(t,e),launchTarget:t.launchTarget??i}}function Xi(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Zi(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Qi(e){let{req:t,session:n,inspectFacts:r,bindDevice:i,platformServices:a}=e,o=$i(t);if(!o.ok)return o.response;let s=G(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await K({session:n,flags:t.flags,platformServices:e.platformServices}),u=await R({device:c,inspectFacts:r,bindDevice:i,platformServices:a,command:`runtime port-reverse`,use:Le});if(u.type===`response`)return u.response;if(u.runtime.owner.kind!==`provider-runtime`||u.runtime.owner.provider!==o.options.provider)return l(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:o.options.provider});let d=await u.runtime.operations.configureProviderPortReverse(o.options);return d?{ok:!0,data:{action:`port-reverse`,...d}}:l(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function $i(e){let t=ea(e);if(!t.ok)return t;let n=ta(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 ea(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function ta(e){let t=na(e.flags?.devicePort),n=na(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:l(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function na(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function ra(e){return await R({...e,command:`runtime clear`,use:Pe})}async function ia(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Qi({req:t,session:r.get(n),inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await aa({...e,session:r.get(n)});if(!oa(i))return l(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.lookup(n),o=a?.session,s=r.getRuntimeHints(n);return i===`clear`?await sa({sessionName:n,sessionStore:r,ref:a,current:s,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice}):i===`show`?ca(n,s):ua({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function aa(e){if(!e.session)return l(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await Ai({device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=$n(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 oa(e){return e===`set`||e===`show`||e===`clear`}async function sa(e){let{sessionName:t,sessionStore:n,ref:r,current:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=r?n.requireCurrent(r):void 0;if(Gr(i)&&c?.appBundleId){let e=await ra({device:c.device,inspectFacts:a,bindDevice:o,platformServices:s});if(e.type===`response`)return e.response;let t=n.requireCurrent(r);z(t),await e.runtime.operations.clearRuntimeHints({appId:t.appBundleId,values:wr(i)})}let l=r?n.clearRuntimeHints(r):!!i;return r||n.setRuntimeHints(t,void 0),{ok:!0,data:{session:t,cleared:l}}}function ca(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function la(e){return e?j(e.device):void 0}function ua(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=la(i),s=Or(t.flags?.platform??a?.platform??o);if(!s)return l(`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 l(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Ir(a,Ar(t.flags,s));return Mr(c)===0?l(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const da=/^[A-Za-z0-9_.:-]{1,64}$/,fa=8192,pa=4096;function ma(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new r(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!da.test(t))throw new r(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new r(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:ga(n,t)}}function ha(e,t,n){let i=j(e),a=_a(e);if(!a)throw new r(`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=n?JSON.stringify(n):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>pa)throw new r(`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:pa});return s}function ga(e,t){if(e)try{let n=JSON.parse(e);if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(n);if(Buffer.byteLength(i,`utf8`)>fa)throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${fa} bytes`);return n}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function _a(e){return((P(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:N(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 va(e,t,n,r){let{eventName:i,payload:a}=ma([...r]),o=ha(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Er(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...m(`Triggered app event: ${i}`)}}async function ya(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o}=e,s=await R({command:`trigger-app-event`,device:t,use:Xe,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>va(c,t,e,n)}}function ba(e){let t=(e[0]??`status`).toLowerCase();if(!Ht(t))throw new r(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new r(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return xa(t)}function xa(e){return e===`get`?`status`:e===`return`?`enter`:e}const Sa={"ime-probe":`android`},Ca={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},wa={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function Ta(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Er(e)}}async function Ea(e,t){let n=await R(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function Da(e,t){return e.operations.keyboardStatus(Ta(t)).then(e=>({platform:Sa[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 Oa(e,t){let n=await e.operations.keyboardDismiss(Ta(t)),r=Ca[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...m(ja(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...m(`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 ka(e,t){let n=await e.operations.keyboardEnter(Ta(t)),r=wa[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...m(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...m(`Keyboard enter pressed`)}}async function Aa(e){let t=ba(e.positionals),{device:n,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o}=e;return t===`status`?await Ea({command:`keyboard status`,device:n,use:Fe,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>Da(e,t)):t===`dismiss`?await Ea({command:`keyboard dismiss`,device:n,use:be,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>Oa(e,t)):await Ea({command:`keyboard enter`,device:n,use:st,inspectFacts:r,bindDevice:i,platformServices:a,readiness:o},(e,t)=>ka(e,t))}function ja(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Ma(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,updateSession:s,prepare:c}=e,l=r.lookup(n),u=l?.session,d=t.flags??{},f=G(i,u,d);if(f)return f;let p=await K({session:u,flags:d,platformServices:e.platformServices});l&&r.requireCurrent(l);let m=await c(p,l);if(!m.ok)return m.response;let h=l?r.requireCurrent(l):void 0;h&&kr(t)===`may-invalidate`&&z(h);let g=await m.execute();return l&&(s&&await s(l,g),L(r,l,t,i,g??{},{positionals:o??a})),{ok:!0,data:g??{}}}function Na(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return l(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Pa(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=t.positionals??[];return await Ma({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:c,platformServices:s,...e.updateSession?{updateSession:e.updateSession}:{},prepare:async(n,l)=>{let u=await e.resolveRuntime({device:n,positionals:c,readiness:!0,inspectFacts:a,bindDevice:o,platformServices:s});if(!u.ok)return{ok:!1,response:u.response};let d=l?i.requireCurrent(l):void 0,f={...$n(r,t.flags,d?.appBundleId,d?.trace?.outPath),surface:d?.surface};return{ok:!0,execute:()=>u.execute(f)}}})}async function Fa(e){return Na(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Pa({...e,command:D.keyboard,resolveRuntime:e=>Aa(e)})}async function Ia(e){return await Pa({...e,command:D.triggerAppEvent,resolveRuntime:e=>ya(e),updateSession:async(t,n)=>{let r=typeof n?.eventUrl==`string`?n.eventUrl:void 0;if(!r)return;let i=e.sessionStore.requireCurrent(t),a=await e.platformServices.resolveSessionAppBundleIdForTarget(i.device,r,i.appBundleId);a!==void 0&&e.sessionStore.update(t,{appBundleId:a})}})}function La(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Ra(e,t){let n=t?.subject??`Payload`,i=e.trim();if(!i)throw new r(`INVALID_ARGS`,`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!U.statSync(a).isFile())throw new r(`INVALID_ARGS`,`${n} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof r)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new r(`INVALID_ARGS`,`${n} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new r(`COMMAND_FAILED`,`Unable to read ${n} file: ${a}`,{cause:String(e)})}if(La(i))return{kind:`inline`,text:i};throw new r(`INVALID_ARGS`,`${n} file not found: ${a}`)}async function za(e){let t=Ra(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ba(t.path);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ba(e){try{return await Ni.readFile(e,`utf8`)}catch(t){let n=t.code;throw n===`ENOENT`?new r(`INVALID_ARGS`,`Push payload file not found: ${e}`):n===`EISDIR`?new r(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):n===`EACCES`||n===`EPERM`?new r(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new r(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Va(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.lookup(r),o=a?.session,s=t.flags??{},c=G(n,o,s);if(c)return c;let u=qa(n,t.positionals??[]);if(!u.ok)return u.response;let d=t.meta?.uploadedArtifactId;try{let r=d?Jn(d,t.meta?.tenantId):F(u.appPathInput);if(!U.existsSync(r))return l(`INVALID_ARGS`,`App binary not found: ${r}`);let c=await K({session:o,flags:s,platformServices:e.platformServices}),f=await H(e.inspectFacts)(c),p=B(n,f.operations.deployApp);if(p)return p;let m=await V(e.bindDevice)(c,Be);a&&z(i.requireCurrent(a));let h=await m.operations.deployApp({app:u.app,appPath:r,replaceExisting:n===`reinstall`}),_=Ua(c,u.app,r,h),v=g(_,`Installed: ${_.appName??Vt(_)}`);return Ka(i,a,_),L(i,a,t,n,v),{ok:!0,data:v}}finally{d&&Qr(d)}}async function Ha(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),a=i?.session,o=t.flags??{},s=G(`push`,a,o);if(s)return s;let c=t.positionals?.[0]?.trim(),u=t.positionals?.[1]?.trim();if(!c||!u)return l(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let d=await za(Ja(u,t.meta?.cwd)),f=await K({session:a,flags:o,platformServices:e.platformServices}),p=await H(e.inspectFacts)(f),m=B(`push`,p.operations.ensureReady)??B(`push`,p.operations.sendPushNotification);if(m)return m;let h=await V(e.bindDevice)(f,Ne);await h.operations.ensureReady({}),i&&z(r.requireCurrent(i));let _=await h.operations.sendPushNotification({appId:c,payload:d}),v=P(f)?g({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):g({platform:j(f),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return L(r,i,t,`push`,v,{positionals:[c,u]}),{ok:!0,data:v}}function Ua(e,t,n,r){return P(e)?Wa(t,n,r):Ga(e,t,n,r)}function Wa(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 Ga(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 Ka(e,t,n){!t||n.platform!==`harmonyos`||!n.appId||e.update(t,{appBundleId:n.appId,appName:n.appName??n.app})}function qa(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:l(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:l(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ja(e,t){let n=Ra(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>F(e,t)});return n.kind===`file`?n.path:n.text}async function Ya(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}=e;return t.command===`install`||t.command===`reinstall`?await Va({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):t.command===`install_source`?await Vi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):t.command===`push`?await Ha({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}):null}async function Xa(e,t,n){return await b(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Za=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.querySelector.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Qa(e){return Za.has(e)}const $a=new Map(qe.map(e=>[e.name,e]));function eo(e){let t=new Set;for(let n of e){let e=to(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function to(e){let t=$a.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(Qa)?n:void 0}function no(e){if(e!==void 0&&e.remainingSteps.length!==0)return eo(e.remainingSteps)}function ro(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:Fr(e),plannedOperations:no(e.internal?.executionPlan)}}function io(e,t,n){let r=e.requireCurrent(t);e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:r.name,...m(`Closed: ${r.name}`)}})}function ao(e,t,n){let r=e.requireCurrent(t);if(!ur(r))return{kind:`not-armed`};let i=r.actions.length;io(e,t,n);let a=br(r),o=e.writeSessionLog(t,{force:yr(r,n.flags?.force)});return o.written?{kind:`committed`,path:o.path}:o.error?(r.actions.length=i,{kind:`failed`,error:o.error}):a?{kind:`committed`}:(Hn(r),{kind:`aborted`})}function oo(e,t){let n=a(t),r=xr(e.scriptPublication??rr);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...r?{savedScript:r}:{}},retriable:!0}}}function so(e){let{req:t,ref:n,sessionStore:r,platformCloseError:i}=e,a=r.requireCurrent(n);i||io(r,n,t);try{let e=r.writeSessionLog(n,{force:yr(a,t.flags?.force)});e.written&&ar(a,e.path);return}catch(e){return co(e)}}function co(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof r?new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${a(e).message}`,t)}async function lo(e){let t=e.clearRuntimeHints?ve:lt,n=await Ur({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,lt)};let r=await n.bind(e.device,ve);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function uo(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a,clearRuntimeHints:o,cleanupFailures:s,repairArmed:c,dispatchTargetedPlatformClose:l,finalizeOrdinaryCloseScript:u}=e,{address:d}=n,f=i.requireCurrent(n),p=async(e,t)=>{try{return await t()}catch(t){s.push({step:e,error:t});return}},m=e.platformResourceCleanup.retainExecutionHostAfterClose({device:f.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!f.screenRecording,hasLease:!!f.lease}),h=i.getRuntimeHints(d);await fo(n,i,p,e.platformResourceCleanup),f=i.requireCurrent(n);let g=c?void 0:await l({req:t,session:f,logPath:r,lifecycle:a});o&&f.appBundleId&&Gr(h)&&await p(`runtime_hints`,async()=>{await o({appId:f.appBundleId,values:wr(h)})});let _=await p(`application_lifecycle`,async()=>await a.operations.finalizeApplicationClose({appBundleId:f.appBundleId,surface:f.surface??`app`,retainRunner:m,stateDir:i.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),v=c?void 0:u({req:t,ref:n,sessionStore:i,platformCloseError:g});return await p(`materialized_paths`,()=>Vn(d)),{platformCloseError:g,saveScriptError:v,shutdownResult:_?.shutdown}}async function fo(e,t,n,r){let i=t.resolveCurrent(e)??e.session;await n(`recording`,()=>Gn({ref:e,sessionStore:t})),await n(`app_log`,()=>_r({ref:e,sessionStore:t})),await n(`audio_probe`,()=>gr({ref:e,sessionStore:t})),await n(`perf_capture`,()=>qn({ref:e,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Kn(i,r))}function po(e,t){return Zr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function mo(e){if(e instanceof r)return e;let t=e instanceof Error?e.message:String(e);return new r(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const ho=(e,t)=>(e.positionals?.length??0)>0||dr(t);async function go(e){let{req:t,ref:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=i.requireCurrent(n),s=ur(o),c=JSON.stringify(t.positionals??[]);if(s&&!lr(o,c)){let e=await vo({req:t,session:o,logPath:r,lifecycle:a});if(e)return{response:oo(o,mo(e))};nr(i.requireCurrent(n),c)}let l=ao(i,n,t);return l.kind===`failed`?{response:oo(o,l.error)}:{repairArmed:s,...l.kind===`committed`&&l.path?{healedScriptPath:l.path}:{},...l.kind===`aborted`?{aborted:!0}:{}}}async function _o(e){try{return{providerData:await Nr(e)}}catch(t){let n=a(t);return{response:{ok:!1,error:{...n,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...n.details,session:e.session.name},retriable:!0}}}}}async function vo(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(ho(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:ro(t,r,n.trace?.outPath)});return}catch(e){return e}}function yo(e,t){if(!e.flags?.saveScript||er(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new r(`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 r(`INVALID_ARGS`,`close --save-script cannot ${n.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function bo(e){let{req:t,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.lookup(n);if(!c)return await wo({req:t,logPath:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});let u=a.requireCurrent(c);yo(t,u);let d=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!d)return l(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let f=e.platformResourceCleanup,p=await lo({device:u.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!u.appBundleId&&Gr(a.getRuntimeHints(n)),inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(p.type===`response`)return p.response;if(u=a.requireCurrent(c),z(u),t.internal?.closeAppOnly===!0&&d)return await Co({req:t,session:u,logPath:i,lifecycle:p.runtime,app:d});let m=await go({req:t,ref:c,logPath:i,sessionStore:a,lifecycle:p.runtime});if(`response`in m)return m.response;let h=await xo({req:t,ref:c,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:p.runtime,clearRuntimeHints:p.clearRuntimeHints,repairArmed:m.repairArmed,platformResourceCleanup:f});return h.kind===`response`?h.response:So({session:u,repair:m,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:h.shutdownResult,providerData:h.providerData})}async function xo(e){let{req:t,ref:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,lifecycle:s,clearRuntimeHints:c}=e,{address:l}=n,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await uo({req:t,ref:n,logPath:r,sessionStore:i,lifecycle:s,clearRuntimeHints:c,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:vo,finalizeOrdinaryCloseScript:so,platformResourceCleanup:e.platformResourceCleanup}),m=i.requireCurrent(n),h=await _o({session:m,leaseRegistry:a,leaseLifecycleProvider:o});if(h.response)return{kind:`response`,response:h.response};m=i.resolveCurrent(n)??m;let g=po(l,u),_=d??g;if(_?m.deviceClaim&&A({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:m.deviceClaim.deviceKey,session:l}}):await fn(m.deviceClaim),i.retire(n),_)throw _;if(f)throw f;return{kind:`closed`,providerData:h.providerData,shutdownResult:p}}function So(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:g({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...m(c),...o,...s}}}async function Co(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await vo({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...m(`Closed: ${a}`)}}}async function wo(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i,platformServices:a}=e;if(!t.positionals||t.positionals.length===0)return l(`SESSION_NOT_FOUND`,`No active session`);let o=await lo({device:await K({session:void 0,flags:t.flags,platformServices:a}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i,platformServices:a});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:ro(t,n)}),{ok:!0,data:{app:t.positionals[0],...m(`Closed: ${t.positionals[0]}`)}})}function To(e,t){return e.operations.ensureReady(t)}function Eo(e,t,n){return e.operations.listApps({device:t,filter:n})}async function Do(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return Oo(t,r);case`devices`:return await Ao(t);case`capabilities`:return await Ro({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,platformServices:e.platformServices});case`apps`:return await Wo({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,platformServices:e.platformServices,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function Oo(e,t){let n=tr(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>or(e.session,n)).map(e=>ko(e,t))}}}function ko({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Mt(r),platform:j(t.device),...M(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,...M(t.device.platform)&&!N(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function Ao(e){try{let t=jo();return{ok:!0,data:{devices:(await No(e)).map(e=>({...Zo(e),...Mo(e,t)}))}}}catch(e){let n=t(e);return{ok:!1,error:{code:n.code,message:n.message,...n.details?{details:n.details}:{}}}}}function jo(){let e=new Map;for(let t of an({})){let n=t.claim;!n||sn(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function Mo(e,t){let n=t.get(on(mn(e)));return n?{claimedBy:n}:{}}async function No(e){let t=e.flags?.platform;return Lo(await Fn(Po(e,t)),e.flags?.platform,e.flags?.target)}function Po(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Fo(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Io(n?.androidDeviceAllowlist)}}function Fo(e,t,n){return me({simulatorSetPath:Mn(e),platform:t,target:n})}function Io(e){let t=I(e);return t?Array.from(t).sort():void 0}function Lo(e,t,n){let r=t?e.filter(e=>Qo(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Ro(e){let t=await Xo({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=zo(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await qo(n,e.inspectFacts);return{ok:!0,data:{device:Zo(n),availableCommands:ct().filter(e=>e===`appstate`&&r?!0:Ho(e,i))}}}function zo(e,t,n){return!t||!P(e)&&!N(e)||!Bi(n,t)?!1:Bo(t)||Vo(e,t)}function Bo(e){return!!(e.appName||e.appBundleId)}function Vo(e,t){return!!(N(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Ho(e,t){let n=tt(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Uo(t,e)))}function Uo(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Wo(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a,platformServices:o}=e,s=await Go(t,e.providerAppCatalog);if(s)return s;let c=await Xo({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`,platformServices:o});if(`response`in c)return c.response;let{device:l}=c,u=Ot(t.flags?.appsFilter),d=I(t.flags?.androidDeviceAllowlist),f=await Jo({device:l,inspectFacts:a,bindDevice:i,platformServices:o});if(`response`in f)return f.response;let p=f.runtime;return Yo(await Eo(p,await To(p,{serial:t.flags?.serial,androidSerialAllowlist:d?[...d].sort():void 0}),u))}async function Go(e,t){let n=Ko(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,tn(e.meta?.requestId))]}}}function Ko(e){let t=Hr(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 qo(e,t){if(t)try{return await t(e)}catch{return}}async function Jo(e){let t=await H(e.inspectFacts)(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);return n&&!n.available?{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}}:{runtime:await V(e.bindDevice)(e.device,at)}}function Yo(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Xo(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i,platformServices:a}=e,o=r.get(n),s=t.flags??{},c=G(t.command,o,s);return c?{response:c}:{device:await K({session:o,flags:s,platformServices:a,androidAvdSelection:i})}}function Zo({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:j({platform:r.platform,appleOs:n}),...M(r.platform)&&n?{appleOs:n}:{}}}function Qo(e,t){return _e(e,t)}function $o(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function es(e){return l(`INVALID_ARGS`,e)}function ts(e,t,n,i,a){try{return e.resolveRequestedOpenSurface({device:t,surfaceFlag:n,openTarget:i,existingSurface:a})}catch(e){return l(e instanceof r?e.code:`INVALID_ARGS`,String(e.message))}}async function ns(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i,platformServices:a}=e;if(!t)return null;let o=await a.validateOpenRelaunchTarget({target:n,platform:i.platform,surface:r});return o?es(o):null}async function rs(e){let{shouldRelaunch:t,openTarget:n,platform:r,platformServices:i}=e;if(!t)return null;let a=await i.validateOpenRelaunchTarget({target:n,platform:r});return a?es(a):null}function is(e){let t=$r(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:Gr(n),clearRemovedRuntimeHints:ei({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function as(e){let{req:t,logPath:n,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!y(a??``),execution:{startupDeadlineAtMs:ss(t),requestId:t.meta?.requestId,logPath:n,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Fr(t)}});let{appBundleId:d,appName:f}=await os({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new r(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Vr({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:f,runtime:c.runtime}}}async function os(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 ss(e){return $o(e.flags?.timeoutMs)}async function cs(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:l(`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:l(`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:l(`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 ls(e){let{req:t,ref:n,logPath:r,sessionStore:i,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let a=await ji({createCommandSurface:e.createCommandSurface,req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n.address,sessionRef:n,logPath:r,sessionStore:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return a.ok?{ok:!0,data:{...o.data,snapshot:a.data}}:us(o.data,a.error)}catch(e){return us(o.data,a(e))}}function us(e,t){return{ok:!0,data:{...e,warnings:[..._(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function ds(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:h,selection:g,launchConfirmation:_}=e,v={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:h,...fs(g)};return o&&(v.appName=o),s&&(v.appBundleId=s),l&&(v.startup=l),u&&(v.timing=u),_&&(v.launchConfirmation=_),f&&p(f)>0&&(v.runtime=f),d&&(v.platform=j(d),v.target=d.target??`mobile`,v.device=d.name,v.id=d.id,v.kind=d.kind,ge(d.platform)&&(v.serial=d.id)),d&&P(d)&&(v.device_udid=d.id,v.ios_simulator_device_set=d.simulatorSetPath??null),{...v,...m(`Opened: ${o??s??t}`)}}function fs(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function q(e,t,n){n?(e.assertAdmissionOpen(n.address),e.requireCurrent(n)):e.assertPublishable(t)}function ps(e){let{req:t,sessionStore:n,sessionName:r,existingRef:i,device:a,surface:o,appBundleId:s,appName:c,deviceClaim:l}=e;if(q(n,r,i),i){let e=n.update(i,{device:a,surface:o,appBundleId:s,appName:c});return e.lease=Kr({req:t,existingLease:e.lease}),l&&(e.deviceClaim=l),Ti(e),n.refresh(i)}return n.publish(r,{name:Yn(t),sessionScope:t.internal?.resolvedSessionScope??tr(t),device:a,surface:o,appBundleId:s,appName:c,createdAt:Date.now(),actions:[],lease:Kr({req:t}),deviceClaim:l})}function ms(e,t){e.warnings=[..._(e),t]}function hs(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Wn(t,{});return}er(n)&&(ni(t),ms(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 gs(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 _s(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function vs(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 ys(e,t){if(!t)return;let n=await hn(t);if(n.status!==`renewed`)return n.conflict?Jr(e,n.conflict):l(`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 bs(e){let{req:t,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingRef:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e;q(i,r,g);let b=g?i.requireCurrent(g):void 0,x=b?.snapshot,S=t.flags?.relaunch===!0,C=f,w=Date.now(),T=await xs({req:t,sessionName:r,sessionStore:i,device:o,surface:d,sessionAppBundleId:C,appName:u,existingRef:g});if(T.type===`response`)return T;let E=T.ref;q(i,r,E);let ee=E?i.requireCurrent(E):void 0,D=Date.now(),O=await m.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:C,surface:d,hasExistingSession:b!==void 0,relaunch:S,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:_s(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:wr(p),applyRuntimeHints:h,execution:ro(t,a,ee?.trace?.outPath)});C=O.appBundleId??C;let k={...O.timing},te=ri(y),ne=s?vs(D,s,C):void 0;if(Qt(t.meta?.requestId)){let e=n();return{type:`response`,response:l(e.code,e.message,e.details)}}q(i,r,E),g&&Zn({session:i.requireCurrent(g),command:`open`,positionals:[],flags:void 0,androidFreshnessBaseline:x});let re=i.ensureSessionDir(r),ie=jt(re,t.meta?.requestId??fe().requestId);k.totalDurationMs=Math.max(0,Date.now()-w),A({level:`info`,phase:`open_timing`,durationMs:k.totalDurationMs,data:k});let ae=ds({sessionName:ee?.name??Yn(t),sessionStateDir:re,runnerLogPath:Mt(re),requestLogPath:ie,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:C,surface:d,startup:ne,timing:k,device:o,runtime:p,runtimeHintCount:Mr,sessionReused:b!==void 0,selection:te,launchConfirmation:O.launchConfirmation});v&&ms(ae,gs(v));let oe=ps({req:t,sessionStore:i,sessionName:r,existingRef:E,device:o,surface:d,appBundleId:C,appName:u,deviceClaim:_}),se=i.requireCurrent(oe);return ir(se,k.postOpenObservation),t.runtime!==void 0&&Xr(i,r,p),hs({session:se,existingSession:g?se:void 0,saveScriptRequested:!!t.flags?.saveScript,responseData:ae}),i.recordAction(oe,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:ae}),{type:`opened`,ref:oe,response:{ok:!0,data:ae}}}async function xs(e){let{req:t,sessionName:n,sessionStore:r,existingRef:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,ref:i};let o=ps({req:t,sessionName:n,sessionStore:r,existingRef:i,device:e.device,surface:e.surface,appBundleId:e.sessionAppBundleId,appName:e.appName}),s=await a();return s&&!s.ok?{type:`response`,response:s}:(q(r,n,o),{type:`session`,ref:r.refresh(o)})}function Ss(e){return e.internal?.admittedLease?.backend===`macos-app`}function Cs(e){let{req:t,device:n,sessionStore:r}=e,i=Ss(t)?r.listRefs().find(e=>e.session.device.id===n.id&&e.session.lease?.leaseBackend!==`macos-app`):r.findByDevice(n.id);if(!i)return;let a=cr(t);return fr(t,i.session)?vr(i,n,a):Un(i,n,a)}async function ws(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o,platformServices:s}=e;switch(Br(r,t.internal?.admittedLease)){case`none`:return{status:`not-required`};case`ordinary`:return await wn({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:s.deviceBootObservation})}}async function Ts(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,platformServices:m}=e;q(i,n,void 0);let h=Cs({req:t,device:a,sessionStore:i});if(h)return{type:`response`,response:h};let g=await ws({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f,platformServices:m});if(g.status===`conflict`)return{type:`response`,response:Jr(a,g.conflict)};let _=g.status===`acquired`?g.ownership:void 0,v=g.status===`acquired`?g.tookOver:void 0,y={mayHaveStarted:!1},b=async()=>await Es({ownership:_,effects:y,sessionName:n,sessionStore:i});try{q(i,n,void 0);let e=await as({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 b(),{type:`response`,response:e.response};let f=await ys(a,_);if(f)return{type:`response`,response:f};y.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,g=await bs({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:_,tookOverDeviceClaim:v,selection:p});return g.response.ok||await b(),g}catch(e){throw await b(),e}}async function Es(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await fn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await ln(t);A({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const Ds=new Map;async function Os(e){let t=Ve({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Ur({...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,Re)};case`open-apply-runtime-hints`:{let t=await r(e.device,Oe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,rt);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,Ce);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ks(e){let t=is(e);if(t.type===`response`)return t;let n=await Os({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function As(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.lookup(t),a=await cs({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return{type:`response`,response:a.response};let o=a.type===`resolved`?a.req:e.req;if(q(r,t,i),i){let a=r.requireCurrent(i);if(o.flags?.saveScript)return{type:`response`,response:l(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`)};let s=o.flags?.relaunch===!0,c=o.positionals?.[0],u=c??(s?a.appName:void 0),d=ts(e.platformServices,a.device,o.flags?.surface,u,a.surface);if(typeof d!=`string`)return{type:`response`,response:d};if(!u&&d===`app`)return{type:`response`,response:es(s?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`)};let f=await ns({shouldRelaunch:s,openTarget:u,surface:d,device:a.device,platformServices:e.platformServices});if(f)return{type:`response`,response:f};let p=r.requireCurrent(i),m=await ys(p.device,p.deviceClaim);if(m)return{type:`response`,response:m};let h=await zi(a.device,e.platformServices),g=ii(h);await o.internal?.retainDeviceExecutionLock?.(h.id);let _=await ks({req:o,sessionStore:r,sessionName:t,device:h,existingSession:a,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(_.type===`response`)return{type:`response`,response:_.response};let{admission:v,runtimeHintPlan:y}=_;q(r,t,i);let b=r.requireCurrent(i);z(b);let x=await as({req:o,logPath:n,surface:d,openTarget:u,existingSession:b,runtime:v.runtime,runtimeHintPlan:y,clearRuntimeHints:v.clearRuntimeHints,foreground:!1});if(x.type===`response`)return{type:`response`,response:x.response};q(r,t,i);let S=await ys(h,r.requireCurrent(i).deviceClaim);return S?{type:`response`,response:S}:await bs({req:o,sessionName:t,sessionStore:r,logPath:n,device:h,openTarget:u,openPositionals:c?o.positionals??[]:u?[u]:[],appBundleId:x.details.appBundleId,appName:x.details.appName,runtimeHints:x.details.runtime,lifecycle:v.runtime,applyRuntimeHints:v.applyRuntimeHints,surface:d,existingRef:i,selection:g})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return{type:`response`,response:es(`open --relaunch requires an app argument.`)};let u=await rs({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0,platformServices:e.platformServices});if(u)return{type:`response`,response:u};let d=await Gt(o.flags??{},qt(c)),f=d.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=ts(e.platformServices,f,o.flags?.surface,c);if(typeof p!=`string`)return{type:`response`,response:p};let m=await ns({shouldRelaunch:s,openTarget:c,surface:p,device:f,platformServices:e.platformServices});if(m)return{type:`response`,response:m};let h=await ks({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(h.type===`response`)return{type:`response`,response:h.response};let{admission:g,runtimeHintPlan:_}=h;return await Lt(Ds,f.id,async()=>await Ts({req:o,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:c,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,platformServices:e.platformServices,selection:d}))}async function js(e){let t=await As(e),n=t.response;return t.type!==`opened`||e.req.flags?.foreground!==!0?n:await ls({...e,inspectFacts:H(e.inspectFacts),bindDevice:V(e.bindDevice),openResponse:n,ref:t.ref})}function Ms(e){return t=>l(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 Ns(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Ps(e,n){let{sessionName:r,sessionStore:i,req:a,platformServices:o}=e,s=i.get(r),c=a.flags??{};try{let e=await K({session:s,flags:c,androidAvdSelection:`include-stopped`,platformServices:o});return c.target&&(e.target??`mobile`)!==c.target?{refusal:l(`DEVICE_NOT_FOUND`,`No ${e.platform} device found matching --target ${c.target}.`)}:e}catch(e){if(n&&!Ns(c.device,s?.device)&&t(e).code===`DEVICE_NOT_FOUND`)return{refusal:l(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`)};throw e}}function Fs(e){return{ok:!0,data:{platform:j(e),target:e.target??`mobile`,device:e.name,id:e.id,kind:e.kind,booted:!0,...M(e.platform)&&e.appleOs?{appleOs:e.appleOs}:{}}}}async function Is(e){let t=e.req.flags??{},n=G(e.req.command,e.sessionStore.get(e.sessionName),t);if(n)return n;let r=I(t.androidDeviceAllowlist),i=r?[...r].sort():void 0,a=Me({headless:t.headless===!0}),o=await Ps(e,a.kind===`boot-target-headless`);if(`refusal`in o)return o.refusal;let s=await Ur({command:`boot`,device:o,required:a.use.required,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,unavailableResponse:Ms(a.kind===`boot-target-headless`)});if(s.type===`response`)return s.response;let c={serial:t.serial,androidSerialAllowlist:i,deadlineAtMs:$o(t.timeoutMs)};return Fs(a.kind===`boot-target-headless`?await(await s.bind(o,a.use)).operations.bootTargetHeadless(c):await(await s.bind(o,a.use)).operations.bootTarget(c))}function Ls(e){return e.available?null:l(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Rs(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}async function zs(e){let t=e.sessionStore.get(e.sessionName),n=e.req.flags??{},r=G(e.req.command,t,n);if(r)return r;let i=await K({flags:n,session:t,androidAvdSelection:`include-stopped`,platformServices:e.platformServices}),a=Ls((await H(e.inspectFacts)(i)).operations.shutdownTarget);if(a)return a;if(t&&t.device.platform===i.platform&&t.device.id===i.id)return l(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${e.sessionName}`,session:e.sessionName,platform:j(i),target:i.target??`mobile`,device:i.name,id:i.id,kind:i.kind});let o=await(await V(e.bindDevice)(i,ze)).operations.shutdownTarget();return o.success?{ok:!0,data:{platform:j(i),target:i.target??`mobile`,device:i.name,id:i.id,kind:i.kind,shutdown:o,...M(i.platform)&&i.appleOs?{appleOs:i.appleOs}:{}}}:l(o.error?.code??`COMMAND_FAILED`,Rs(o),{platform:j(i),target:i.target??`mobile`,device:i.name,id:i.id,kind:i.kind,shutdown:o})}function Bs(e){return l(`SESSION_NOT_FOUND`,e===`macos`?`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`:`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`)}async function Vs(e,n){if(!n.appBundleId)return;let r=await R({command:`appstate`,device:n.device,use:Ge,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(r.type!==`response`)try{return(await r.runtime.operations.appState({appBundleId:n.appBundleId})).applicationState}catch(e){if(c(e))throw e;A({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:t(e).code,message:t(e).message}});return}}function Hs(e){if(!(!N(e.device)||!e.surface)&&e.surface!==`app`&&e.surface!==`frontmost-app`)return{ok:!0,data:{platform:j(e.device),appName:e.surface,appBundleId:e.appBundleId,source:`session`,surface:e.surface}}}async function Us(e,t){if(!t.appName&&!t.appBundleId){let e=Hs(t);if(e)return e;let n=N(t.device)?`macOS`:`iOS`;return l(`COMMAND_FAILED`,`No foreground app is tracked for this ${n} session. Open an app in the session, then retry appstate.`)}let n=await Vs(e,t),r=t.appName??t.appBundleId;return{ok:!0,data:{platform:j(t.device),appName:r??`unknown`,appBundleId:t.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:t.surface??`app`,...P(t.device)?{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}:{}}}}function Ws(e){let t=I(e);return t?[...t].sort():void 0}async function Gs(e,t){if(P(t))return Bs(`ios`);if(N(t))return Bs(`macos`);let n=e.req.flags??{},r=await R({command:`appstate`,device:t,use:Ge,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(r.type===`response`)return r.response;let i=r.runtime;await i.operations.ensureReady({serial:n.serial,androidSerialAllowlist:Ws(n.androidDeviceAllowlist)});let a=await i.operations.appState();return{ok:!0,data:{platform:j(t),package:a.package,activity:a.activity}}}function Ks(e,t){return M(t)?l(`SESSION_NOT_FOUND`,`No active session "${e}". Run open with --session ${e} first.`):l(`SESSION_NOT_FOUND`,`No active session "${e}". Run open with --session ${e} first, or omit --session to query by device selector.`)}function qs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Ri(a))return{refusal:Ks(n,o)};let s=G(`appstate`,i,a);if(s)return{refusal:s};let c=M(i?.device.platform)&&Bi(a,i);return o===`ios`&&!c?{refusal:Bs(`ios`)}:o===`macos`&&!c?{refusal:Bs(`macos`)}:c&&i?{answeredBy:`apple-session`,session:i}:{answeredBy:`device-runtime`,session:i}}async function Js(e){let t=qs(e);return`refusal`in t?t.refusal:t.answeredBy===`apple-session`?await Us(e,t.session):await Gs(e,await K({session:t.session,flags:e.req.flags??{},platformServices:e.platformServices}))}function Ys(e){return En.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Xs(e){try{return await Zs(e)}catch(e){return{ok:!1,error:a(e)}}}async function Zs(e){let t=Qs(e);if(!t.ok)return t;let n=t.ref,r=e.sessionStore.requireCurrent(n),i=je(e.req.positionals),a=await e.inspectFacts(r.device),o=a.operations.audioProbeStart,s=a.operations.audioProbeQuery,c=o.available?`capture`:s.available?`query`:void 0;if(c===void 0)return $s(o,s);let l=Se({probeAction:i.probeAction,mode:c});switch(l.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(r.device,l.use)).operations.audioProbeQuery({action:l.action,durationMs:i.durationMs,bucketMs:i.bucketMs})};case`capture-start`:return await ec(e,n,i,l.use);case`capture-status`:return await tc(e,n);case`capture-stop`:return await nc(e,n)}}function Qs(e){let t=e.sessionStore.lookup(e.sessionName);return t?{ok:!0,ref:t}:l(`SESSION_NOT_FOUND`,`audio requires an active session`)}function $s(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return l(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function ec(e,t,n,r){let i=e.sessionStore.requireCurrent(t),a=Rn(e.sessionStore,t);i.audioProbe&&(await Tn({intent:`disposal`,binding:a}),i=e.sessionStore.requireCurrent(t));let o=await e.bindDevice(i.device,r),s=pn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=pn.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:s,device:i.device}),l=W.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`);a.assertAdoptable();let u=await o.operations.audioProbeStart({sessionId:e.sessionName,statusPath:l,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:c});await un({admissionLedger:e.audioProbeAdmissionLedger,binding:a,device:i.device,owner:o.owner,fence:c,...u,throwIfCanceled:e.throwIfCanceled});let d=a.read();if(!d)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await d.handle.status()}}async function tc(e,t){let n=Rn(e.sessionStore,t),r=n.read();if(!r)return{ok:!0,data:rc()};let i=await r.handle.status();return i.state===`stopped`&&await Tn({intent:`disposal`,binding:n}),{ok:!0,data:i}}async function nc(e,t){let n=Rn(e.sessionStore,t);return n.read()?{ok:!0,data:await Tn({intent:`capture`,binding:n})}:{ok:!0,data:rc()}}function rc(){return cn({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 ic(e){let t=e.sessionStore.lookup(e.sessionName);if(!t)return l(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let n=e.sessionStore.requireCurrent(t),i={...e,ref:t};try{if(Et(e.req.positionals?.[0]))throw new r(`INVALID_ARGS`,Dt);wc(e.req);let t=vn({positionals:e.req.positionals,kind:Ec(e.req.flags?.kind),outPath:Ec(e.req.flags?.out)}),a=On(t);if(a.kind===`capture-stop`)return ac(i,await lc(i,n,a.request));let o=await ki({device:n.device,plan:a,inspectFacts:e.inspectFacts});return o.admitted?ac(i,await oc(i,n,o)):B(`perf`,o.fact)??l(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:a(e)}}}function ac(e,t){return t.ok&&L(e.sessionStore,e.ref,e.req,`perf`,S(t.data)?{...t.data}:{}),t}async function oc(e,t,n){let{device:i,plan:a}=Oi(n),o=V(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:hc(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:bc(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:xc(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?F(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:W.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await sc(e,t,await o(i,a.use),a.request);case`profile-report`:{let n=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=Cc(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await n.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:F(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function sc(e,t,n,r){if(t.perfCapture)return l(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return l(`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=Cc(e,r.outPath,i),o=dn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=dn.createNextFence({admissionLedger:cc(e),resourcePath:o,device:t.device}),c=zn(e.sessionStore,e.ref);c.assertAdoptable();let u=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 jn({admissionLedger:cc(e),binding:c,device:t.device,owner:n.owner,fence:s,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:u.response}}function cc(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new r(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function lc(e,t,n){let r=t.perfCapture;if(!r)return l(`INVALID_ARGS`,`no active native perf capture`);let i=mc(r.handle.inspect(),n);if(i)return l(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(F(n.outPath,e.req.meta?.cwd));let a=await gn({intent:`capture`,binding:zn(e.sessionStore,e.ref)});if(n.area===`cpu`){let t=uc(a);e.sessionStore.update(e.ref,{lastPerfProfile:t})}return{ok:!0,data:a}}function uc(e){if(dc(e)||fc(e))return e;throw new r(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function dc(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function fc(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&pc(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function pc(e,t){return t.every(t=>typeof e[t]==`string`)}function mc(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 hc(e,t){return{...Sc(e),metrics:{fps:gc(t.metric,e)},sampling:{fps:t.sampling}}}function gc(e,t){if(!S(e)||e.available!==!0)return e;let n=_c(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function _c(e,t){let n=vc(t.windowStartedAt),r=vc(t.windowEndedAt)??vc(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:yc(e)})).slice(-12)}function vc(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function yc(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function bc(e,t){return{...Sc(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function xc(e,t){return{...Sc(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Sc(e){return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id}}function Cc(e,t,n){return t?F(t,e.req.meta?.cwd):W.join(e.sessionStore.ensureSessionDir(e.sessionName),`${Tc()}-${n}`)}function wc(e){let t=e.positionals?.[0]?.toLowerCase(),n=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||n!==`snapshot`))throw new r(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function Tc(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function Ec(e){return typeof e==`string`&&e.length>0?e:void 0}const Dc=[`dump`,`log`],Oc=`network requires ${Dc.join(` or `)}`,kc=`network include mode must be one of: ${s.join(`, `)}`,Ac=2048;async function jc(e){let t=e.sessionStore.get(e.sessionName);if(!t)return l(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=Mc(e.bindDevice),r=(await n(t.device,Ze)).facts.networkDump;if(!r.available)return Lc(r.hint);let i=Nc(e.req);if(!i.ok)return i;let a=Ae({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return Rc(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:Ac,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:a(e)}}}function Mc(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Nc(e){let t=Pc(e);if(!t.ok)return t;let n=Fc(e);if(!n.ok)return n;let r=Ic(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Pc(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return Dc.includes(t)?{ok:!0,action:t}:l(`INVALID_ARGS`,Oc)}function Fc(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?l(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Ic(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return l(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return s.includes(r)?{ok:!0,include:r}:l(`INVALID_ARGS`,kc)}function Lc(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function Rc(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:Ac,maxScanLines:e.entries.length},notes:e.notes}}}function zc(e,t){let n=Dn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Bc(e.appLogFailure)]:Vc(n.state)}}function Bc(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Vc(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 Hc(e,t){return it([...e,...t.notes??[]])}async function Uc(e){let{req:t}=e;return t.command===`perf`?await ic({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Gc(e):t.command===`events`?await Wc(e):t.command===`network`?await jc(e):t.command===`audio`?await Xs(rl(e)):null}async function Wc(e){let{req:t,sessionName:n,sessionStore:r}=e;try{return await r.flushEvents(n),{ok:!0,data:r.readEvents(n,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:a(e)}}}async function Gc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n);if(!i)return l(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=r.requireCurrent(i),a=il({...e,session:n,ref:i}),o=(await a.bindDevice(n.device,Te)).facts.appLogInspect;if(!o.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:o.hint}};let s=Jc(ke({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),n);return`ok`in s?s:await Kc(a,s)}catch(e){return{ok:!1,error:a(e)}}}async function Kc(e,t){switch(t.kind){case`path`:return Yc(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Xc(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await qc(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await tl(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Zc(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Qc(e)}}async function qc(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await el(e,t.appBundleId,n.owner,n.operations.appLogStart):await $c(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Jc(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):l(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Yc(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=_n(a),s=zc(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 Xc(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=zc(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:Hc(t.notes,o)}}}function Zc(e,t,n){let r=n.resolveAppLogPath(t);return Sn(r,e),{ok:!0,data:{path:r,marked:!0}}}function Qc(e){return{ok:!0,data:xn(e)}}async function $c(e,t,n,r){let{session:i,sessionStore:a}=e;i.appLog&&await kn({intent:`disposal`,ref:e.ref,sessionStore:a});let o=xn(e),s=await nl(e,t,r,n);return s.ok?{ok:!0,data:{...o,restarted:!0}}:s}async function el(e,t,n,r){let{session:i}=e;return i.appLog?l(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await nl(e,t,r,n)}async function tl(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return l(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await kn({intent:`capture`,ref:e.ref,sessionStore:r}),{ok:!0,data:{path:i,stopped:!0}}}async function nl(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=An.resolvePath(o.resolveSessionDir(a));try{let l=Ys({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device});bn(o,e.ref).assertAdoptable();let u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await yn({admissionLedger:e.appLogAdmissionLedger,ref:e.ref,sessionStore:o,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(t){return{ok:!1,error:Cn({ref:e.ref,sessionStore:o,error:t})}}}function rl(e){if(!e.bindDevice||!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new r(`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,platformServices:e.platformServices,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function il(e){if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new r(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,platformServices:e.platformServices,appLogAdmissionLedger:e.appLogAdmissionLedger}}const al=new WeakMap;function ol(e){return{store:t=>sl(e,t),finalize:(t,n)=>cl({...e,evidence:t,projection:n})}}function sl(e,t){let{sessionStore:n,ref:r}=e;if(!r)throw Error(`Internal observation session is no longer available.`);let i=n.requireCurrent(r);wi(i,t);let a=i.snapshotGeneration;if(a===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let o={};return al.set(o,{ref:r,snapshot:t,snapshotGeneration:a,runtimeRevision:Dr(i),refFrame:Wr(i)}),{evidence:o,refsGeneration:a}}function cl(e){let t=al.get(e.evidence);al.delete(e.evidence);let n=ul(e.projection.refs);if(n.size===0)return{published:!1,reason:`empty`};if(e.signal?.aborted===!0)return{published:!1,reason:`cancelled`};let r=t&&ll(e,t);return!t||!r?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!dl(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Ci(r,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function ll(e,t){if(!e.ref||e.ref.lifetime!==t.ref.lifetime)return;let n=e.sessionStore.resolveCurrent(e.ref);return n&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Dr(n)===t.runtimeRevision&&Wr(n)===t.refFrame?n:void 0}function ul(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 dl(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function fl(e){let t=pl(e),n=We(t);return Mi(`sha256`).update(n,`utf8`).digest(`hex`)}function pl(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)=>ml(e,n[t]??null,r?.[t]??null))}}function ml(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 hl(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=gl({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function gl(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>_l({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>vl({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>yl(n,r)];for(let e of s){let t=e();if(t)return t}}function _l(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 vl(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 yl(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 bl(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new r(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=O(e),a=te(e),o=fl({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??ae(i.actions)??a.platform,target:t?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>hl(e,s,o)}}function xl(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function Sl(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ue(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Cl(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 wl(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Cl(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ie(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 Tl(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ie(e,r),...we(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 El(e,t,n,r,i,a){if(n.targetEvidences)return Dl(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return J(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return J(e,n,r,i,a);if(s.kind===`post-resolution`){let c=xl({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return J(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return kl(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=Sl({recorded:o,token:s.token});if(c.kind===`skip`)return J(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.observeTarget({action:n,index:i,token:l});if(u.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,Ol(u),a,t)};let{classification:d}=u;return d.verified?kl(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 Dl(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 J(e,n,r,i,a);let d=Sl({recorded:o[c],token:u.token});if(d.kind===`skip`)return J(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.observeTarget({action:l,index:i,token:d.token});if(f.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,Ol(f),a,t)};let{classification:p}=f;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 kl(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function Ol(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 J(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 kl(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=Al(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=jl(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 Al(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 jl(e,t,n){return n.status===`guard-mismatch`?wl(e,n.evidence,t):Tl(e,n.evidence)}async function Ml(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=St(e.varSources),o=[],s=[],c=Il(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Fl(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Ll(u,n.length,r,e))}let d=xt(r,a,Pl(e,u)),f=vt(a),p=t.diagnosticsMarker(),m=await El(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:Nl(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 Nl(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Pl(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Fl(e){return!!(e&&e.command!==`replay`)}function Il(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Fl(n))return n.command===`close`?t:void 0}}function Ll(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}async function Rl(e){return await zl({...e,snapshotDiagnostics:C(e.snapshotDiagnosticSamples)})}async function zl(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Bl(t.error.details?.replaySource),v=_i(t.error),y=await hi({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:tn(u.meta?.requestId)});return yi({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Bl(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}}async function Vl(e){let{req:t,sessionName:n,action:i,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();fi(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:Kt(o)??[]});let g;try{g=await Ul({req:t,sessionName:n,resolved:o,sourceAction:i,invoke:f,resolvedSessionScope:p,dependencies:m,readinessTimeoutMs:e.readinessTimeoutMs})}catch(e){if(!(e instanceof r))throw e;g={ok:!1,error:a(e)}}let _=Date.now();return fi(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?Gl(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Hl(g,u??s,c)}function Hl(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 Ul(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=ql(t.flags,r.flags,r.command);e.readinessTimeoutMs!==void 0&&(c.readinessTimeoutMs=e.readinessTimeoutMs);let l=i.command===`fill`?Bn(Cr(i)):void 0;return l&&(c.recordAs=l),await a(Wl({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Wl(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:E(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:de(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Gl(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`}))}async function Kl(e,t){let{readinessTimeoutMs:n}=ql(e,t.flags,t.command);if(n===void 0)return;let{SELECTOR_PIPELINE_POLICIES:r,readinessScheduleFor:i}=await import(`./selector-pipeline-policy.js`).then(e=>e.r);return i(r.promotedTarget.poll,n)}function ql(e,t,n){let r=x(e,{...t??{}});return Ke(n)&&r.readinessTimeoutMs===void 0&&(r.readinessTimeoutMs=2e3),r}function Jl(e){return tu(e.ok?Xl(e.data):Yl(e.error.details?.artifactPaths))}function Yl(e){return Array.isArray(e)?e.filter(eu):[]}function Xl(e){return e?[$l(e.path),$l(e.outPath),...Zl(e.artifacts)].filter(eu):[]}function Zl(e){return Array.isArray(e)?e.map(Ql).filter(eu):[]}function Ql(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return $l(t.localPath)??$l(t.path)}function $l(e){return typeof e==`string`?e:void 0}function eu(e){return typeof e==`string`}function tu(e){return[...new Set(e.filter(nu))]}function nu(e){try{return U.statSync(e).isFile()}catch{return!1}}function ru(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=iu({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Ct(r),u=ye(t),d=wt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>pt(r,e)===t.sibling),p=d.filter(e=>ft(dt(e,l),t.scrollRegion)),m=ut(p)[t.viewportOrder]?.ref,h=mt({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,...su({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function iu(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?au(n,t,i,a):ou(n,t,r,a,o)}function au(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),o=e(n),s=o?d(t,o):null;if(a(s))return{matchedNodes:[s],winnerRef:s.ref};let c=r?xi(t,r):null;return a(c)?{matchedNodes:[c],winnerRef:c.ref}:{matchedNodes:[],winnerRef:``}}function ou(e,t,n,r,i){let a=ot(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=Ln(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function su(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?cu(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?cu(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?cu(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 cu(e,t,n){let r=ht(t),i=Tt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ie(e,r),...we(e.ancestry,i)].slice(0,5)}function lu(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=ie(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ue(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!se(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(du(r)&&du(n[1])))return r}function uu(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function du(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function fu(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=zt(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:Su(ye(n),h),...t.observed?{observed:Su(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>Cu(e,h))},_=li({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=ui({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(k(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=bi({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}}),x={code:t.causeCode,message:t.causeMessage};return yi({error:x,action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function pu(e,t,n){let r=zt(e.scrubVars);return fu(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:pi(n,r),publicationEvidence:_u(n),repairCapture:mi(n)})}async function mu(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await vi({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function hu(e,t){return pu(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 mu({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function gu(e,t,n){return pu(e,t,await mu({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function _u(e){return e.state===`available`?e.evidence:void 0}function vu(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?xe(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:$e(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:lu(n,i),platform:a.device.platform}:{kind:`inactive`}}function yu(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=ci(r),s=ru({recorded:t,token:n,nodes:i,platform:a,refLabel:uu(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:ht(s.winnerNode),structural:De(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?ht(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function bu(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function xu(e){return!e.ok&&e.error.details?.reason===Si}function Su(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function Cu(e,t){let n=i(e.type??`Element`),r=ue(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function wu(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function Tu(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 Eu(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 Du(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 Ou(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:Tu(e?.observed),expectedStructural:Du(e?.expectedStructural),observedStructural:Du(e?.observedStructural)}}function ku(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:Tu(e?.observed),observedAncestry:Eu(e?.observedAncestry)}}function Au(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function ju(e,t,n){let r=Au(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&bu(e)?{status:`guard-mismatch`,evidence:Ou(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&xu(e)?{status:`landmark-mismatch`,evidence:ku(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function Mu(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c,l=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),u=e=>(o=e,Au(Nu(e),Jl(e))),d=async e=>{let n=t.observationStore.get();return n?await vi({session:n,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:!0}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`}};return{runtime:{beginTargetVerification(e,n,r,i){return vu({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async observeTarget({action:e,token:n}){let r=async()=>{let r=await d(e);if(s=r,r.state!==`available`)return{state:`unavailable`,reason:r.reason,hint:r.hint};let i=t.sessionStore.get();return{state:`classified`,classification:yu({recorded:e.targetEvidence,token:n,action:e,nodes:[...r.nodes],platform:i.device.platform})}},i=n.startsWith(`@`)?void 0:await Kl(t.replayReq.flags,e);if(!i)return await r();let{observeUntil:a}=await import(`./selector-pipeline-policy.js`).then(e=>e.b),o=await a({capture:r,verdict:e=>zu(e)?{kind:`continue`}:{kind:`done`,result:e},schedule:i,...t.signal?{signal:t.signal}:{},...t.dependencies.clock?{clock:t.dependencies.clock}:{}});if(o.polls.length>1&&(c={remainingBudgetMs:Math.max(0,i.budgetMs-Bu(o)),readiness:{polls:o.polls.length,waitedMs:o.waitedMs,end:o.kind}},A({level:`debug`,phase:`interaction_target_readiness`,data:{...c.readiness,command:e.command}})),o.kind===`done`)return o.result;if(o.last!==void 0)return o.last;throw o.kind===`expired`?o.lastError:o.error},async dispatchStep(e,n,i,a,s){let l=t.actionLines[i]??1,u=await Vl({...c?{readinessTimeoutMs:c.remainingBudgetMs}:{},req:wu(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:l,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=u,Jl(u).forEach(e=>r.add(e));let d=[...r];return u.ok?{status:`ok`,artifactPaths:d}:ju(u,s,d)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await hu(l(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(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=pu(l(e,t,r,i),n,a);return u(n.kind===`selector-miss`&&c?Vu(o,c.readiness):o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await gu(l(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=Nu(o),l=await Pu(t,n,e,r,c,[...i],[...a],s);return u(l)},armStep:()=>{s=void 0,c=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>Fu(e),onStep:i,diagnosticsMarker:()=>Lu(t.sessionStore),diagnosticsSince:e=>Ru(t.sessionStore,e)},readLastResponse:()=>o}}function Nu(e){return e&&!e.ok?e:l(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Pu(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Iu(i)?c(i):c(await Rl({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function Fu(e){let t=e.positionals??[],n=Je(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Iu(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 Lu(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function Ru(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function zu(e){return e.state===`classified`&&!e.classification.verified&&e.classification.kind===`selector-miss`}function Bu(e){let t=e.polls[0];return t?e.waitedMs-(t.startedMs+t.durationMs):0}function Vu(e,t){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,readiness:t}}}}async function Hu(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i,o=ne(t,a.flags?.replayBackend);if(o!==`ad`)return n?l(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await(await si(o)).runReplay(i):l(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Uu(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=Wu(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=Gu(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=Ku({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:Ju({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function Wu(e){let t=e.flags?.replayBackend;if(t&&!ee(t))return l(`INVALID_ARGS`,re(t))}function Gu(e,t,n){let r=bl(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:qu({...e,flags:Yt(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function Ku(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:l(`INVALID_ARGS`,a.message)}}function qu(e,t){return!t.platform&&!t.target?e:{...e,flags:Yu(e.flags,t)}}function Ju(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:di({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:bt(yt(t.flags?.replayShellEnv)),cliEnv:_t(gt(t.flags?.replayEnv))}}function Yu(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const Xu={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function Zu(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=Qu({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(td({req:t,coordinator:a}),ed({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function Qu(e){let t=nd(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return o()}function $u(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?l(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):rd({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function ed(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=$u({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??Xu,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:id({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function td(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function nd(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return l(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function rd(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?F(t):a??gi(i);if(!(n||r&&o===a)&&U.existsSync(o))return l(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function id(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 ad(e){let{request:t,session:{name:n,logPath:r,store:i,observationStore:o,coordinator:s},tracePath:c,onStep:u,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return l(`INVALID_ARGS`,Ut);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,le(h)&&t.flags?.replayBackend!==`maestro`)return l(`INVALID_ARGS`,ce(`replay`,h));let a=await Hu({resolved:h,keepSession:m,coordinator:s,command:e});if(a)return a;let _=Uu({req:t,sessionName:n,sessionStore:i,tracePath:c,resolved:h,script:Jt(f,h),coordinator:s,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:T}=_.value,E=Zu({req:t,entryIndex:C,sessionStore:i,sourcePath:h,coordinator:s});if(!E.ok)return E.response;let{runtime:ee,readLastResponse:D}=Mu({ctx:{replayReq:v,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:T,responseLevel:t.meta?.responseLevel,invoke:d,signal:tn(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:u,armSaveScript:E.armSaveScript}),O=await Ml({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},ee);return O.status===`failed`?D()??l(`COMMAND_FAILED`,`replay step failed with no recorded response`):od({startedAt:p,sessionName:n,sessionStore:i,replayed:O.replayed,artifactPaths:O.artifactPaths,snapshotDiagnosticSamples:O.snapshotDiagnosticSamples,armSaveScript:E.armSaveScript,coordinator:s,keepSession:m})}catch(e){let t=a(e);return g.size===0?{ok:!1,error:t}:{ok:!1,error:{...t,details:{...t.details,artifactPaths:[...g]}}}}}function od(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=cd({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=C([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:sd(i,Date.now()-t)}}}function sd(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function cd(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return l(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function ld(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=W.resolve(n??`.`,t??`.agent-device/test-artifacts`);return W.join(i,r)}function ud(e,t){let n=t?W.relative(t,e):W.basename(e),r=n.length===0||n.startsWith(`..`)?W.basename(e):n;return et(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function dd(e,t){U.mkdirSync(t,{recursive:!0}),md(e,t)}function fd(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=W.join(o,`result.txt`),u=W.join(o,`failure.txt`),d=pd([...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=>W.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
+
`)}\n`;U.writeFileSync(l,p),s||U.writeFileSync(u,p)}function pd(e,t,n){let r=[],i=new Set(n.map(e=>W.basename(e).toLowerCase()));for(let n of e){if(!gd(n))continue;let e=W.basename(n);if(W.resolve(n)===W.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=hd(e,t,i),o=W.join(t,a);U.copyFileSync(n,o),r.push(o)}return r}function md(e,t){let n=W.join(t,`replay.ad`);if(U.copyFileSync(e,n),W.extname(e).toLowerCase()===`.ad`)return;let r=W.join(t,W.basename(e));W.resolve(r)!==W.resolve(n)&&U.copyFileSync(e,r)}function hd(e,t,n){let r=W.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||U.existsSync(W.join(t,a));)a=`${i}-${o++}${r}`;return a}function gd(e){try{return U.statSync(e).isFile()}catch{return!1}}function _d(e){let{platformFilter:t,discoverSources:n}=e,i=n(),a=[],o={undeclared:0,declaredOther:0};for(let e of i){let{path:n,manifest:r}=e,i={kind:`run`,path:n,title:r.title,manifest:r};if(!t){a.push(i);continue}let s=r.device.platform;if(s.kind===`caller-bound`){a.push(i);continue}if(s.kind===`unspecified`){o.undeclared+=1,a.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}if(!Dd(t,s.value)){o.declaredOther+=1;continue}a.push(i)}if(a.filter(e=>e.kind===`run`).length===0)throw new r(`INVALID_ARGS`,bd({platformFilter:t,...o}));return a}const vd={web:!0};function yd(e){return!Object.hasOwn(vd,e)}function bd(e){let{platformFilter:t,undeclared:n,declaredOther:r}=e,i=t?` for --platform ${t}`:``;return t===void 0||n===0&&r===0?`No replay tests matched${i}.`:`No replay tests matched${i}: ${[...n>0?[`${n} without a platform declaration`]:[],...r>0?[`${r} declaring another platform`]:[]].join(`, `)}. ${xd(t,n)}`}function xd(e,t){return yd(e)?t>0?`Add "context platform=${e}" to the first line of a script that has none, or drop --platform when the device is already selected.`:`Run a source that declares ${e}, or drop --platform.`:`No script can declare ${e} as its platform; run this suite without --platform.`}function Sd(e,t,n,r,i=0){let a=W.basename(n,W.extname(n)),o=et(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Cd(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return et(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function wd(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,W.basename(r),`attempt`,a+1].join(`:`)}function Td(e,t){return typeof e==`number`?e:t}function Ed(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Dd(e,t){return e===`apple`?M(t):t===e}function Od(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const kd=2e3;async function Ad(e){let{filePath:t,sessionName:n,requestId:r,parentRequestId:i,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:r,parentAttemptId:i}),v=new Set,y,b=!1,x,S=Date.now(),C=Ld({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:n,requestId:r,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:n,platform:s,target:c,requestId:r,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Y(C,e),shard:u,onStep:d}).catch(e=>Od({error:a(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Rd(o,[...v]))},o)})]):await w,Y(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:n,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Md(w)||(x=Fd(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:r,graceMs:kd}}),Nd({replayPromise:w,cleanupSession:p,sessionName:n,requestId:r,emitDiagnostic:h})));let e=await Pd({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Id(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Y(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:n}),await p(n),Y(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!0,durationMs:Date.now()-t})}catch(e){let r=a(e);Y(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-t,errorCode:r.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:n,error:r.message}}),x=jd(x,r,v)}}return x??Od({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function jd(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:Od({error:t,artifactPaths:[...n],infrastructure:!0})}async function Md(e){return await Promise.race([e.then(()=>!0),Pi(kd).then(()=>!1)])}async function Nd(e){let{replayPromise:t,cleanupSession:n,sessionName:r,requestId:i,emitDiagnostic:o}=e;try{await t}finally{try{await n(r)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:r,requestId:i,error:a(e).message}})}}}async function Pd(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Y(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:n});try{let e=await t({sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:o,appendTimingEvent:e=>Y(o,e)});return Y(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=a(e);return Y(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:n,error:t.message}}),Od({error:t})}}function Fd(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Id(e,t){return{...e,warnings:[...e.warnings,t]}}function Ld(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=W.join(t,`replay-timing.ndjson`);return U.mkdirSync(W.dirname(l),{recursive:!0}),U.writeFileSync(l,``),n.add(l),Y(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Y(e,t){e&&U.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Rd(e,t=[]){return Od({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 zd(e){let t=Bd(e),n=await Vd(e,t);return{result:qd(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Bd(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:W.join(i,...a?[`shard-${a.shardIndex+1}`]:[],ud(t.path,n)),maxAttempts:r+1}}async function Vd(e,t){Ud(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Hd(e,t,r);if(Wd(n,i),Gd(e,i.outcome,r))break;Kd(e,t,i)}return n}async function Hd(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=Sd(i,a,r.path,o,n),h=W.join(t.testArtifactsDir,`attempt-${f}`);dd(r.path,h);let g=wd({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,...X(d)},v=await Ad({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 fd({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Ud(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:Sd(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...X(c)})}function Wd(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 Gd(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Kd(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,...X(e.shard)})}function qd(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Jd(e,t,n,r):Yd(e,t,n,r)}function Jd(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,...X(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}:{},...Zd(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Yd(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,...X(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...Xd(c),...Zd(s)}}function Xd(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 Zd(e){return X(e)}function X(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Qd(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 $d(e){let{request:n,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=n.sessionName;if(n.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),t=await ef(n,u,d);af(t,o);let p=t.shardPlan?of({entries:t.entries,total:t.total,emitProgress:o}):[];return t.shardPlan?p.push(...await sf({shards:t.shardPlan.shards,sessionName:f,suiteInvocationId:t.suiteInvocationId,cwd:n.cwd,requestId:n.requestId,request:n,suiteArtifactsDir:t.suiteArtifactsDir,suiteTotal:t.total,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await df({discoveryEntries:t.entries,sessionName:f,suiteInvocationId:t.suiteInvocationId,cwd:n.cwd,requestId:n.requestId,request:n,suiteArtifactsDir:t.suiteArtifactsDir,suiteTotal:t.total,runReplay:r,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:mf(t.total,p,Date.now()-e,t.suiteArtifactsDir)}}catch(e){let n=t(e);return{status:`failed`,error:{code:n.code,message:n.message}}}}async function ef(e,t,n){let r=tf(e,t),i=nf(r),a=r.length-i.length,o=Cd(e.requestId),s=await Qd(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:rf(e,o),total:s?.total??r.length}}function tf(e,t){return _d({platformFilter:e.platformFilter,discoverSources:t})}function nf(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function rf(e,t){return ld({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function af(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 of(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 sf(e){return(await Promise.allSettled(e.shards.map(async t=>await lf({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[cf(r,e.sessionName,t.reason)]:[]})}function cf(e,t,n){let r=a(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:uf(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:r.code,message:r.message,hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,details:r.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function lf(e){let{shard:t,sessionName:n}=e;return await ff({...e,entries:t.entries,sessionName:uf(n,t),shard:t})}function uf(e,t){return`${e}:shard-${t.shardIndex+1}`}async function df(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 zd({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Ed(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Td(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),pf(t,o,p))break}return g}async function ff(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 zd({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Ed(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Td(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),pf(b,o,m))break}return _}function pf(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function mf(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=T(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}:{}}}async function hf(e,t){let n=ee(t)&&e.some(e=>ne(e.entry,t)!==`ad`)?await si(t):void 0;return()=>e.map(e=>gf(e,t,n))}function gf(e,t,n){let r=e.entry,i=Jt(e,r),a=ne(r,t)!==`ad`,o=te(i);return{path:r,manifest:{...a?{title:n?.inspectSource(i,r).title}:{},device:{platform:o.platform?{kind:`declared`,value:o.platform}:a?{kind:`caller-bound`}:{kind:`unspecified`},...o.target===void 0?{}:{target:o.target}},...o.timeoutMs!==void 0||o.retries!==void 0?{attemptDefaults:{...o.timeoutMs===void 0?{}:{timeoutMs:o.timeoutMs},...o.retries===void 0?{}:{retries:o.retries}}}:{}}}}function _f(e){return async t=>(await bf(e,t)).map(vf)}function vf(e){if(e.platform===`web`||!he(e))throw new r(`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 yf(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 bf(e,t){let n=wf(e),i=Sf(await Fn(xf(e)),n,e);if(i.length<t)throw new r(`DEVICE_NOT_FOUND`,`test sharding requires ${Cf(t)}, but only ${i.length} matched`);return i.slice(0,t)}function xf(e){let t=I(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:me({simulatorSetPath:Mn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Sf(e,t,n){return t.length>0?Tf(e,t,n):e.filter(e=>Ef(e,n)).sort(kf)}function Cf(e){return`${e} device${e===1?``:`s`}`}function wf(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Tf(e,t,n){return t.map(t=>{let i=Of(t),a=e.find(e=>Df(e,n)&&(e.id===t||Of(e.name)===i));if(!a)throw new r(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Ef(e,t){return!Df(e,t)||!he(e)?!1:e.booted!==!1}function Df(e,t){return!(!_e(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Of(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function kf(e,t){return e.id.localeCompare(t.id)}function Af(e){let t=jf(e?.shardAll,`--shard-all`),n=jf(e?.shardSplit,`--shard-split`);if(t!==void 0&&n!==void 0)throw new r(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(n!==void 0)return{mode:`split`,count:n}}function jf(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new r(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const Mf=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 Nf(e){return Mf.has(e.toUpperCase())}const Pf=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Ff(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=If(e);return t?Lf(t.details)||Rf(t.code,t.message):!1}function If(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Lf(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||p(t)?!0:t?Nf(t):!1}function Rf(e,t){let n=`${e}\n${t}`.toLowerCase();return Pf.some(e=>n.includes(e))}function zf(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Hf(e.error.details?.artifactPaths),warnings:_(e.error.details),infrastructure:Ff(e),...Uf(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:_(t),artifactPaths:Hf(t?.artifactPaths),...Uf(t?.snapshotDiagnostics)}}function Bf(e){if(!e||e.ok)return;let t=zf(e);return t.status===`failed`?t:void 0}function Vf(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Hf(e){return[...new Set(Vf(e))]}function Uf(e){let t=w(e);return t?{snapshotDiagnostics:t}:{}}const Wf=1e3,Gf=3e3;function Kf(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await qf(e)}}async function qf(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=Pt(o.device.platform),c=i?W.join(i,`recording${s}`):Nt(o.device.platform);Z(a,{type:`video_recording_start`,session:n,videoPath:c}),A({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(Yf({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return Z(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await At(Wf),Z(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:Wf}),A({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:Wf}}),l}async function Jf(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;Z(a,{type:`video_tail_start`,session:n,requestedDurationMs:Gf});let o=Date.now();await At(Gf);let s=Date.now(),c=await e.video.record(Yf({req:t,sessionName:n,phase:`stop`}));return Jl(c).forEach(e=>i.add(e)),Z(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),A({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function Z(e,t){e({...t,ts:new Date().toISOString()})}function Yf(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 Xf=[{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.`}],Zf=({attemptId:e,parentAttemptId:t})=>{en(e);let n=Qf(e,t);return{cancel:()=>Zt(e),release:()=>{n(),$t(e)}}};function Qf(e,t){if(!t||t===e)return()=>{};let n=tn(t);if(!n)return()=>{};let r=()=>{Zt(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function $f(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=ep(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:yf({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function ep(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 tp(e){let{request:n,session:{name:r,logPath:i},createSession:a,invoke:o,cleanupSession:s,video:c}=e;if(n.flags?.recordVideo===!0&&c===void 0)return l(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let u=n.flags??{};for(let e of Xf)if(e.requested(u))return l(`INVALID_ARGS`,e.message);let d,f;try{d=ip(n,r),f=rp(n)}catch(e){let n=t(e);return l(n.code,n.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await $d({request:d,emitProgress:nn,isCanceled:()=>Qt(n.meta?.requestId),emitDiagnostic:A,bindAttemptCancellation:Zf,runReplay:async({filePath:t,sessionName:r,platform:s,target:l,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&Jl(e).forEach(e=>f.add(e)),e),y=$f({parentFlags:n.flags,platform:s,target:l,artifactsDir:d,shard:g,sourceBundle:p.get(t)}),b=a(r,i),x=c?{req:n,sessionName:r,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:c}:void 0,S=x?Kf(x):void 0;return zf(await ad({...ap(e,{request:{...n,command:`replay`,session:r,positionals:[t],flags:y,meta:{...n.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await qf(x):void 0;return t&&!t.ok?t:v(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:t,artifactsDir:r,appendTimingEvent:o})=>{if(c)return Bf(await Jf({req:n,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:t,video:c}))},discoverSources:await hf(f,n.flags?.replayBackend),resolveShardTargets:_f(n.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:np(m.data,n)}:l(m.error.code,m.error.message)}function np(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=W.join(n,W.basename(r)),a=e=>e===r||e.startsWith(r+W.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 U.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:W.basename(r)}]}:o}function rp(e){let t=e.flags?.replayScriptSources;if(!t)throw new r(`INVALID_ARGS`,Ut);return t}function ip(e,t){let n=e.flags??{},r=e.meta?.cwd,i=sp(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:F(i,r),failFast:n.failFast===!0,retries:op(n.retries),timeoutMs:op(n.timeoutMs),shard:Af(n)}}function ap(e,t){let{publicNetworkOnly:n,resolvedSessionScope:r,dispatch:i,dependencies:a}=e,o=i||t.openLifecycle?{...i,...t.openLifecycle?{openLifecycle:t.openLifecycle}:{}}:void 0;return{request:t.request,...n?{publicNetworkOnly:n}:{},...r?{resolvedSessionScope:r}:{},...o?{dispatch:o}:{},dependencies:a}}function op(e){return typeof e==`number`?e:void 0}function sp(e){return typeof e==`string`?e:void 0}function cp(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority},coordinator:r.createCoordinator()}}function lp(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function up(e,t){let n=v({...e,...t});return Object.keys(n).length>0?n:void 0}function dp(e,t){return async({dispatch:n,...r})=>{let i=up(t.internal,n);return await e(i?{...r,internal:i}:r)}}function fp(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:sr(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:pp(e.scriptPublication??rr)}},armStep(e){n.update(t=>{Rr(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:gi(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){sr(r())!==void 0&&n.update(hr)},markCompleteIfArmed(){sr(r())!==void 0&&n.update(Xn)},markSessionHeldIfArmed(e){if(e.ok||!pr(r()))return e;let t=Rt(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&&hp(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{mp({session:t,...e})})}}}}function pp(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:xr(e),targetForce:Sr(e)}}function mp(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=gp({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function hp(e){e.pendingRecordAndHeal=void 0}function gp(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 _p(e){let{sessionStore:t,bindDevice:n,platformServices:r,bindExactDevice:i,screenRecordingAdmissionLedger:a,requestScope:o,retainDeviceExecutionLock:s,throwIfCanceled:c}=e;return!n||!i||!a||!o||!s||!c?void 0:{throwIfCanceled:c,record:async e=>await Di({req:vp(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,platformServices:r,bindExactDevice:i,admissionLedger:a,requestScope:o,retainDeviceExecutionLock:s,throwIfCanceled:c})}}function vp(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 yp={resolveSessionScope:tr},bp=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await ad({...lp(e),session:Sp(t,n,r),invoke:dp(a??i,e),dependencies:yp}),xp=async({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,platformServices:l,inspectFacts:u,bindExactDevice:d,screenRecordingAdmissionLedger:f,requestScope:p,retainDeviceExecutionLock:m,throwIfCanceled:h,platformResourceCleanup:g})=>{if(!g)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let _=_p({sessionStore:i,bindDevice:c,platformServices:l,bindExactDevice:d,screenRecordingAdmissionLedger:f,requestScope:p,retainDeviceExecutionLock:m,throwIfCanceled:h});return await tp({...lp(e),session:Sp(t,n,i),createSession:(e,t)=>Sp(e,t,i),invoke:dp(s??o,e),dependencies:yp,cleanupSession:async t=>await Cp({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,inspectFacts:u,bindDevice:c,platformServices:l,platformResourceCleanup:g}),..._?{video:_}:{}})};function Sp(e,t,n){let i=t=>{let r=n.get(e);return r?(t(r),!0):!1},a={get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)};return cp(e,t,a,{createCoordinator:()=>fp({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>n.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let r=n.lookup(e);r&&mr(r,t)},resolveOpenRuntimeHints:({request:t,device:r,platform:i})=>Pr({req:t,sessionStore:{getRuntimeHints:t=>t===e?n.getRuntimeHints(e):void 0},sessionName:e,device:r,platform:i}),bindAuthority:t=>{let i=n.lookup(e);return{...ol({sessionStore:n,ref:i,signal:t}),capture:async({flags:a,logPath:o})=>{let s=i?n.requireCurrent(i):void 0;if(!s)throw new r(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await Ei({device:s.device,session:s,flags:a,logPath:o,signal:t})}}}})}async function Cp(e){let{req:t,sessionName:n,logPath:i,sessionStore:a}=e;if(!a.get(n))return;let o=await bo({req:{token:t.token,session:n,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:n,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new r(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function wp(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command!==oe.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return Op(new r(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.lookup(n);if(!a)return Op(new r(`SESSION_NOT_FOUND`,`No active session "${n}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=i.requireCurrent(a),s=Dp(o);if(s)return Op(s);let c=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!c)return Op(new r(`INVALID_ARGS`,`session save-script path cannot be empty.`));qr(o,{explicitPath:c,liveForce:t.flags?.force});let l=i.writeSessionLog(a,{force:yr(o,t.flags?.force),publication:`active`});return l.written?(Qn(o,l.path),{ok:!0,data:{session:o.name,savedScript:l.path,actionCount:l.actionCount,...m(`Published script: ${l.path}`)}}):Op(l.error??new r(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Tp(e){if(ur(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:er(e)?void 0:`not-armed`}const Ep={repair:()=>new r(`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 r(`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 r(`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 r(`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 Dp(e){let t=Tp(e);return t?Ep[t]():void 0}function Op(e){return{ok:!1,error:a(e)}}function kp(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function Ap(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Er(e)}}async function jp(e,t,n){if(n.length!==1)throw new r(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(Ap(t))}}async function Mp(e,t,n){if(n.length<2)throw new r(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `),a={...Ap(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...m(`Clipboard updated`)}}async function Np(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a,platformServices:o}=e;if(n===`read`){let e=await R({command:`clipboard`,device:t,use:nt,inspectFacts:i,bindDevice:a,platformServices:o,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>jp(n,e,r)}}let s=await R({command:`clipboard`,device:t,use:Qe,inspectFacts:i,bindDevice:a,platformServices:o,readiness:!0});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>Mp(c,e,r)}}async function Pp(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s}=e,c=i.lookup(n),u=c?.session,d=t.flags??{},f=G(D.clipboard,u,d);if(f)return f;let p=t.positionals??[],m=kp(p);if(!m)return l(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let h=await K({session:u,flags:d,platformServices:s});c&&i.requireCurrent(c);let g=await Np({device:h,action:m,positionals:p,inspectFacts:a,bindDevice:o,platformServices:s});if(!g.ok)return g.response;let _=c?i.requireCurrent(c):void 0,v=await g.execute($n(r,t.flags,_?.appBundleId,_?.trace?.outPath));return L(i,c,t,t.command,v),{ok:!0,data:{platform:j(h),...v}}}function Fp(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Ip(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Lp(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Rp(e,...t){for(let n of t)Q(e,n)}function Q(e,t){e.push(t),nn({type:`command`,status:`progress`,message:zp(t)})}function zp(e){return[oi(e),...ai(e)].join(`
|
|
3
|
+
`)}async function Bp(e,t){let{device:n,targetApp:r,session:i,listInstalledApps:o}=t;if(r)try{let t=o?Vp(r,await o(`all`))?.id:void 0;if(!t){Q(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${j(n)}.`,evidence:{requested:r,platform:j(n)}});return}Q(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:r,resolved:t,sessionApp:i?.appBundleId}})}catch(t){let r=a(t);Q(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${r.message}`,hint:r.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${j(n)} --all`,evidence:{code:r.code,message:r.message}})}}function Vp(e,t){let n=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===n||e.name.toLowerCase()===n);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n));if(a.length===1)return a[0];throw a.length>1?new r(`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 r(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Hp(e,t,n){let r=Wp(t,n);try{let t=await Kp(r),n=Gp(t.devices,r);return Q(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Zp(n,r,t.failures),hint:n.length===0?em(t.failures):void 0,command:n.length===0?am(r):void 0,evidence:om(n,t.failures)}),n.length>0&&Jp(e,t.failures),{devices:n,hostDevices:n.filter(e=>t.hostDevices.includes(e)),platform:r.platform,target:r.target}}catch(t){let n=a(t);return Q(e,{id:`device`,status:`fail`,summary:n.message,hint:n.hint,command:`agent-device devices`,evidence:{code:n.code,details:n.details}}),{devices:[],hostDevices:[],platform:r.platform,target:r.target}}}function Up(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];Q(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:j(e),id:e.id,name:e.name}))}})}function Wp(e,t){let n=e.flags??{};return Xt({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 Gp(e,t){return e.filter(e=>pe(e,t,{includeExplicitSelectors:!0}))}async function Kp(e){if(e.platform)return{...qp([await Pn(e)]),failures:[]};let t=[],n=[];for(let r of f)try{t.push(await Pn({...e,platform:r}))}catch(e){n.push(Xp(r,e))}return{...qp(t),failures:n}}function qp(e){return{devices:e.flatMap(e=>e.devices),hostDevices:e.flatMap(e=>e.source===`local`?e.devices:[])}}function Jp(e,t){for(let n of t)Q(e,Yp(n))}function Yp(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${rm(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${rm(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Xp(e,t){let n=a(t);return{platform:e,message:n.message,hint:n.hint,code:n.code}}function Zp(e,t,n){if(e.length===0)return n.length>0?`No ${Qp(t)} devices found; ${$p(n)}.`:`No ${Qp(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Qp(t)} ${im(e.length,`device`)} available; ${r} booted`,a=tm(e,t);return a?`${i} (${a}).`:`${i}.`}function Qp(e){let t=e.platform?rm(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function $p(e){return e.slice(0,2).map(e=>`${rm(e.platform)} inventory failed: ${e.message}`).join(`; `)}function em(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function tm(e,t){if(t.platform||t.target)return;let n=h(e),r=nm();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 nm(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function rm(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 im(e,t){return e===1?t:`${t}s`}function am(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function om(e,t){let n=new Map;for(let t of e){let e=j(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const sm=1500;async function cm(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 lm(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?um(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 lm(e,t,n){try{return await(n.resolveProcessInfo??dm)(e,t)}catch{return}}function um(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 dm(e,t){if(!fm(e))return;let n=await pm(t);if(n!==void 0)return{pid:n,cwd:await mm(n)}}function fm(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function pm(e){let t=await kt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:sm});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 mm(e){let t=await kt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:sm});if(t.exitCode===0)return t.stdout.split(`
|
|
5
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const hm=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],gm=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerDeviceType`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function _m(e,t){let n=It(e.meta?.cwd);return{targetApp:Sm(e.flags?.targetApp)??t?.appBundleId,metroHost:Sm(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Cm(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:bm(e,n)}}function vm(e,t={}){let n=xm(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 ym(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 ${j(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 bm(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function xm(e){let t={...Object.fromEntries([...hm,...gm].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 Sm(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Cm(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function wm(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==D.doctor)return null;let s=Tm(e.hostDiagnostics),c=r.get(n),l=_m(t,c),u=Om(r,n),d=[];if(Rp(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Ft()} using ${u}`,evidence:{version:Ft(),stateDir:u}},...vm(t,{required:l.remote}),...ym(r,n,c,{remote:l.remote})),l.remote)return Nm(d,l);let f=Em(l,u,i),p=await Hp(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&Q(d,m);let h=await km({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=c?.device??Dm(p,h);if(g){let e=await s.warmupCheck(g,f);e&&Q(d,e)}return Nm(d,l,{device:h,includeMetro:!0,inventory:p})}function Tm(e){if(!e)throw new r(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function Em(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>rn(e),emitProgress:e=>nn({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await In(e),shouldPropagateInventoryProbeError:Nn,transportOverrides:Object.freeze({androidAdb:n})})}function Dm(e,t){let n=e?.hostDevices??[];if(t)return n.includes(t)?t:void 0;let r=n.filter(e=>P(e)&&e.kind===`simulator`);return r.find(e=>e.booted===!0)??r[0]}function Om(e,t){let n=W.dirname(e.resolveSessionDir(t));return W.basename(n)===`sessions`?W.dirname(n):n}async function km(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Up(t,i,a.targetApp);return u&&await Am(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&Q(t,await cm(a.metroHost,a.metroPort,a.kind)),Rp(t,...await r.ambientChecks(n)),u}async function Am(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await jm({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await Bp(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),Rp(e,...await r.deviceChecks(i,n))}async function jm(e){if(e.device.platform!==`harmonyos`)return Mm(e)}async function Mm(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,at),u=I(n.flags?.androidDeviceAllowlist),d=await To(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await Eo(l,d,e)}function Nm(e,t,n={}){let r=Fp(e);return{ok:!0,data:{status:r,summary:Ip(r),kind:t.kind,platform:n.device?j(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:Lp(e)}}}async function Pm(e){return await R({...e,command:`prepare`,use:Ee})}async function Fm(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return l(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=G(D.prepare,o,s);if(c)return c;let u=await K({session:o,flags:s,platformServices:e.platformServices}),d=await Pm({device:u,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:Im(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:Fr(t)}});return{ok:!0,data:Lm(a,u,Math.max(0,Date.now()-f),p)}}function Im(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ye}function Lm(e,t,n,r){return{action:e,platform:j(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Rm(n,r),message:`Prepared Apple runner: ${t.name}`}}function Rm(e,t){let n=zm(t.buildMs),r=Bm(t.connectMs),i=Bm(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 zm(e){return e===void 0?void 0:Bm(e)}function Bm(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Vm=e=>Do(e),Hm=e=>js({req:e.req,createCommandSurface:e.createCommandSurface,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Um=e=>bo({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Wm=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a})=>await Is({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a}),Gm=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a})=>await zs({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a}),Km=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a})=>await Js({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformServices:a}),$=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,platformServices:i,inspectFacts:a,appLogAdmissionLedger:o,audioProbeAdmissionLedger:s,perfCaptureAdmissionLedger:c,throwIfCanceled:l})=>await Uc({req:e,sessionName:t,sessionStore:n,bindDevice:r,platformServices:i,inspectFacts:a,appLogAdmissionLedger:o,audioProbeAdmissionLedger:s,perfCaptureAdmissionLedger:c,throwIfCanceled:l}),qm={session_list:Vm,devices:Vm,capabilities:Vm,apps:Vm,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await wm({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Wm,shutdown:Gm,appstate:Km,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>wp({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await ia({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await Pp({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),keyboard:Fa,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o})=>await Fm({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o}),install:Ya,reinstall:Ya,install_source:Ya,release_materialized_paths:async({req:e})=>await Hi({req:e}),push:Ya,"trigger-app-event":Ia,open:Hm,replay:bp,test:xp,batch:async({req:e,sessionName:t,invoke:n})=>await Xa(e,t,n),close:Um};async function Jm(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Tr,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,platformServices:p,bindExactDevice:m,appLogAdmissionLedger:h,audioProbeAdmissionLedger:g,perfCaptureAdmissionLedger:_,screenRecordingAdmissionLedger:v,hostDiagnostics:y,requestScope:b,retainDeviceExecutionLock:x,throwIfCanceled:S,reconcileOrphanedDeviceClaim:C,platformResourceCleanup:w}=e,T=qm[t.command];return T?await T({req:t,createCommandSurface:e.createCommandSurface,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,platformServices:p,bindExactDevice:m,appLogAdmissionLedger:h,audioProbeAdmissionLedger:g,perfCaptureAdmissionLedger:_,screenRecordingAdmissionLedger:v,hostDiagnostics:y,requestScope:b,retainDeviceExecutionLock:x,throwIfCanceled:S,reconcileOrphanedDeviceClaim:C,platformResourceCleanup:w}):null}export{Jm as handleSessionCommands};
|