agent-device 0.21.2 → 0.21.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.2.apk → agent-device-android-ime-helper-0.21.3.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.3.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.2.manifest.json → agent-device-android-ime-helper-0.21.3.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.2.apk → agent-device-android-snapshot-helper-0.21.3.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.3.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.2.manifest.json → agent-device-android-snapshot-helper-0.21.3.manifest.json} +7 -7
  7. package/dist/src/agent-device-client.js +1 -1
  8. package/dist/src/app-launch.js +1 -1
  9. package/dist/src/auth.js +1 -1
  10. package/dist/src/back-mode.js +1 -1
  11. package/dist/src/cli.js +2 -2
  12. package/dist/src/client-types.d.ts +1 -1
  13. package/dist/src/command-schema.js +1 -1
  14. package/dist/src/config.js +1 -1
  15. package/dist/src/connection-runtime.js +1 -1
  16. package/dist/src/connection.js +1 -1
  17. package/dist/src/daemon-client-lifecycle.js +1 -1
  18. package/dist/src/daemon-registration.js +1 -1
  19. package/dist/src/daemon-resolution.js +1 -0
  20. package/dist/src/daemon.js +1 -1
  21. package/dist/src/device-claim-rule.js +1 -1
  22. package/dist/src/harmonyos.js +1 -1
  23. package/dist/src/human-control-contract.js +1 -1
  24. package/dist/src/human-control.js +1 -1
  25. package/dist/src/interaction.js +1 -1
  26. package/dist/src/interactor.js +1 -1
  27. package/dist/src/interactors.js +1 -1
  28. package/dist/src/internal/bin.js +1 -1
  29. package/dist/src/internal/daemon.js +2 -2
  30. package/dist/src/lease-scope.js +1 -1
  31. package/dist/src/mechanics.js +16 -16
  32. package/dist/src/perf-runtime-plan.js +1 -1
  33. package/dist/src/physical-device-control.js +1 -1
  34. package/dist/src/platform-request-scope.js +1 -1
  35. package/dist/src/platform-runtime-host.js +1 -1
  36. package/dist/src/platform-runtime-operation-host.js +1 -1
  37. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  38. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  39. package/dist/src/platform-runtime.js +1 -1
  40. package/dist/src/provider-webdriver.js +1 -1
  41. package/dist/src/record-runtime.js +1 -1
  42. package/dist/src/register-builtins.js +1 -1
  43. package/dist/src/registry.js +3 -3
  44. package/dist/src/request-providers.js +1 -1
  45. package/dist/src/runner-cache-metadata.js +2 -2
  46. package/dist/src/runner-client.js +1 -1
  47. package/dist/src/runner-disposal.js +1 -1
  48. package/dist/src/runtime.js +1 -1
  49. package/dist/src/runtime2.js +1 -1
  50. package/dist/src/runtime4.js +5 -5
  51. package/dist/src/runtime6.js +1 -1
  52. package/dist/src/runtime9.js +1 -1
  53. package/dist/src/screen-recording-resource-recovery.js +1 -1
  54. package/dist/src/screen-recording-runtime.js +1 -1
  55. package/dist/src/screenshot-runtime.js +1 -1
  56. package/dist/src/sdk-batch.js +2 -2
  57. package/dist/src/sdk-remote-config.d.ts +1 -0
  58. package/dist/src/sdk-remote-config.js +1 -1
  59. package/dist/src/selector-runtime.js +1 -1
  60. package/dist/src/session-routing.js +1 -1
  61. package/dist/src/session-snapshot.js +1 -1
  62. package/dist/src/session2.js +5 -5
  63. package/dist/src/simulator.js +1 -1
  64. package/dist/src/snapshot-runtime-binding.js +1 -1
  65. package/dist/src/snapshot-runtime.js +1 -1
  66. package/dist/src/snapshot4.js +1 -1
  67. package/dist/src/src3.js +1 -1
  68. package/dist/src/src4.js +1 -1
  69. package/package.json +1 -1
  70. package/server.json +2 -2
  71. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.2.apk.sha256 +0 -1
  72. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.2.apk.sha256 +0 -1
  73. package/dist/src/config2.js +0 -1
  74. package/dist/src/provider-device-runtime.js +0 -1
@@ -1,5 +1,5 @@
1
- import{A as e,C as t,M as n,T as r,d as i,g as a,m as o,t as s,w as c,z as l}from"./sdk-contracts.js";import"./capture.js";import{D as u,n as d,r as f,t as p}from"./sdk-batch-runner.js";import{a as m,n as h,t as g}from"./snapshot-diagnostics.js";import{f as _}from"./android-input-ownership.js";import{_ as v,b as y,c as b,d as x,g as S,l as C,m as w,u as T,v as E}from"./sdk-device.js";import{A as ee,B as D,Cr as O,F as te,G as ne,I as re,In as ie,Ir as ae,J as oe,K as se,L as ce,N as le,P as ue,R as de,Rn as fe,Sr as pe,St as me,T as he,U as ge,Ur as _e,Vn as ve,Vr as ye,W as be,Wn as xe,X as Se,Y as Ce,Z as we,at as Te,bt as Ee,d as De,dn as Oe,dt as ke,en as Ae,f as je,fn as Me,ft as Ne,hn as Pe,j as Fe,jt as Ie,mn as Le,nn as Re,nr as ze,nt as Be,pn as Ve,q as He,rr as Ue,rt as We,tr as Ge,v as Ke,xt as qe,z as Je,zn as Ye,zr as Xe,zt as Ze}from"./sdk-batch.js";import{u as Qe}from"./scroll-gesture.js";import{a as $e,b as et,f as tt,g as nt,n as rt,p as it,r as at,w as ot,y as st}from"./script.js";import{_ as ct,a as lt,c as k,d as ut,f as dt,g as ft,h as pt,l as mt,m as ht,p as gt,t as A,u as _t}from"./session-store.js";import{a as vt,c as yt,n as bt,o as xt,r as St,t as Ct}from"./session-target-evidence.js";import{a as wt,i as Tt,n as Et,o as Dt,r as Ot,s as kt,t as At}from"./vars.js";import{n as jt,r as Mt,t as Nt}from"./format.js";import{A as Pt,_ as Ft,d as It,g as Lt,h as Rt,j as zt,k as Bt,l as Vt,m as Ht,o as Ut,p as Wt,s as Gt,u as Kt}from"./parameterized-recorded-fill.js";import{F as qt,N as Jt,P as Yt,c as Xt,f as Zt,j as Qt,v as $t}from"./runtime.js";import{$ as en,A as tn,B as nn,C as rn,D as an,F as on,G as sn,H as cn,I as ln,J as un,K as dn,L as fn,M as pn,N as mn,Q as hn,R as gn,S as _n,T as vn,U as yn,V as bn,W as xn,X as Sn,Y as Cn,Z as wn,_ as Tn,_t as En,at as Dn,b as On,bt as kn,c as An,ct as jn,d as Mn,et as Nn,f as Pn,g as Fn,h as In,it as Ln,j as Rn,k as zn,l as Bn,lt as Vn,m as Hn,n as Un,nt as Wn,o as Gn,p as Kn,q as qn,r as Jn,t as Yn,tt as j,u as Xn,ut as Zn,v as Qn,vt as $n,w as er,x as tr,y as nr,z as rr}from"./device-claim-rule.js";import{n as ir,t as ar}from"./catalog.js";import{g as or,i as sr}from"./observability.js";import{n as M,r as cr}from"./success-text.js";import{d as lr,i as ur,u as dr}from"./absence-observation-errors.js";import{t as fr}from"./app-inventory.js";import{r as pr,t as mr}from"./device.js";import{a as hr,o as gr,r as N}from"./diagnostics.js";import{a as _r,i as vr,r as yr}from"./verified-file.js";import{c as br,p as xr}from"./exec.js";import{t as Sr}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Cr,r as wr}from"./output-path.js";import"./command.js";import{a as Tr,i as Er,n as Dr,t as Or}from"./replay-divergence.js";import"./retry.js";import{r as kr}from"./version.js";import{t as Ar}from"./session-paths.js";import{i as jr,r as Mr}from"./session-artifact-paths.js";import{t as Nr}from"./project-runtime.js";import{r as Pr}from"./rect-center.js";import{o as Fr}from"./android-system-chrome.js";import{t as Ir}from"./keyed-lock.js";import{n as Lr,t as Rr}from"./deploy-result-target.js";import{t as zr}from"./keyboard-actions.js";import{a as Br,i as Vr,n as Hr,o as Ur,r as P}from"./request-cancel.js";import{t as Wr}from"./request.js";import{i as Gr,s as Kr}from"./provider-session-ownership.js";import{a as qr,i as F,s as Jr}from"./request-runtime-binding.js";import{c as Yr,i as Xr,t as Zr}from"./device-claim-inspection.js";import{t as Qr}from"./audio-probe-result.js";import{T as $r,_ as ei,a as ti,b as ni,c as ri,d as ii,f as ai,g as oi,h as si,i as ci,l as li,m as ui,n as di,o as fi,r as pi,s as mi,t as hi,u as gi,v as _i,x as vi}from"./perf-runtime-plan.js";import{i as yi,n as bi}from"./lease-context.js";import{m as xi}from"./screenshot-runtime.js";import{n as I,r as Si}from"./device-isolation.js";import{a as Ci,n as wi,r as Ti}from"./device-inventory-context.js";import{n as Ei,r as Di,t as Oi}from"./dispatch-resolve.js";import{C as ki,E as L,O as Ai,g as R,h as ji,i as Mi,k as Ni,m as Pi,n as Fi,s as Ii,v as Li,x as Ri}from"./session-snapshot.js";import{t as zi}from"./touch-reference-frame.js";import{a as Bi,i as Vi,n as Hi,o as Ui}from"./session-routing.js";import{d as z}from"./src8.js";import{i as Wi,n as B,r as Gi}from"./compatibility-policy.js";import{o as Ki,p as qi}from"./quality-warnings.js";import{a as Ji,i as V,n as Yi,r as Xi,t as Zi}from"./session-runtime-admission.js";import{t as Qi}from"./semantic-index.js";import{n as $i,r as ea}from"./device-selection-resolver.js";import{n as ta,r as na}from"./doctor-output.js";import{t as ra}from"./record-runtime.js";import{n as ia}from"./gesture-runtime.js";import{i as aa,n as oa,r as sa}from"./platform-runtime-open-target.js";import{t as ca}from"./snapshot-runtime.js";import{t as la}from"./app-log-files.js";import H from"node:path";import U,{promises as W}from"node:fs";import{createHash as ua}from"node:crypto";import da from"node:os";import{fileURLToPath as fa}from"node:url";import{setTimeout as pa}from"node:timers/promises";import ma from"node:vm";function G(e,t){return z({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function ha(e){return z({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function ga(e,t){let n=xa(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},ha(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:_a(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function _a(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function va(e,t,n,r){let i=xa(await r.resolveTarget({selector:e,...t},G(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Nn(`Maestro target did not resolve to a visible element.`,{selector:e,candidateCount:i.candidateCount});return{kind:`selector`,selector:e,query:{selector:e,...t},...i,rect:i.rect}}function ya(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function ba(e){if(!e||typeof e!=`object`)return!1;let t=e;return[`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`&&Number.isFinite(t[e]))}function xa(e,t){return Sa(e,t),Ca(e),wa(e),Ta(e),e}function Sa(e,n){if(e.generation!==n)throw new t(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${n}.`)}function Ca(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function wa(e){if(e.rect!==void 0&&!ba(e.rect)||e.viewport!==void 0&&!ba(e.viewport))throw new t(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Ta(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ea(e,t,n,r,i,a={}){let o=Da(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Ma(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Da(e,t,n,r,i){let a=n===`up`||n===`down`,o=nn(e,un(e,r),i),s=o.visibility,c=wn({visibility:s,matches:e.nodes.filter(e=>ae(e)),platform:r}),l=ye(s.viewportRects)??ka(c);if(!l||!Xe(l))return;let u=c.flatMap(e=>{if(!Xe(e.rect))return[];let t=Aa(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=Oa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(ja)[0]?.viewport}function Oa(e,t){return ae(e)?e:O(e,t)}function ka(e){let t;for(let n of e)Xe(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Aa(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width)-n,a=Math.min(e.y+e.height,t.y+t.height)-r;return i>0&&a>0?{x:n,y:r,width:i,height:a}:void 0}function ja(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ma(e,t){let n=K(e,.5,.5),r=B.scrollUntilVisibleSwipe.nearEdgeFraction,i=B.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:K(e,.5,i)};case`down`:return{start:n,end:K(e,.5,r)};case`left`:return{start:n,end:K(e,i,.5)};case`right`:return{start:n,end:K(e,r,.5)}}}async function Na(e,n,r){let i=j(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new t(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(G(n,n.command)):void 0;return{authored:e,gesture:Fa(await Pa(e.start,n,r,a),await Pa(e.end,n,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let t=await r.resolveGestureViewport(G(n,n.command)),{start:a,end:o}=Ia(t,e.direction,r.platform);return{authored:e,gesture:Fa(a,o,i),viewport:t}}let a=await va(e.from,{purpose:`swipe`,timeoutMs:`optional`in n.command&&n.command.optional===!0?B.command.optionalTargetLookupTimeoutMs:B.command.targetLookupTimeoutMs},n,r),o=a.viewport??await r.resolveGestureViewport(G(n,n.command)),{start:s,end:c}=La(a,e.direction,o);return{authored:e,gesture:Fa(s,c,i),target:a,viewport:o}}async function Pa(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(G(t,t.command));return{x:i.x+Math.trunc(i.width*e.x/100),y:i.y+Math.trunc(i.height*e.y/100)}}function Fa(e,t,n){return{from:e,to:t,durationMs:n??B.command.swipeDurationMs}}function Ia(e,t,n){if(t===`left`||t===`right`){let n=Qe(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=B.screenSwipe,i=K(e,r.centerFraction,r.nearEdgeFraction),a=K(e,r.centerFraction,r.farEdgeFraction),o=K(e,r.centerFraction,r.downStartFraction),s=K(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function K(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function La(e,t,n){let r=Pr(e.rect),i=n.x+Math.trunc(n.width*B.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*B.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*B.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*B.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const Ra={launchApp:Ua,stopApp:Ua,clearState:Ua,openLink:Ua,tapOn:Ga,doubleTapOn:Ga,longPressOn:Ga,swipe:Xa,inputText:Za,eraseText:Za,scroll:Qa,scrollUntilVisible:Qa,hideKeyboard:Qa,pressKey:Qa,back:Qa,waitForAnimationToEnd:Qa,takeScreenshot:to,runScript:to,evalScript:ro,assertVisible:no,assertNotVisible:no,assertTrue:no,extendedWaitUntil:no},za={launchApp:!0,stopApp:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ba(e){return za[e.kind]}async function Va(e,t){let n=e.command;return await Ha(n,e,t,G(e,n))}function Ha(e,t,n,r){let i=Ra[e.kind];return i(e,t,n,r)}async function Ua(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,Wa(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`clearState`:return await q(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function Wa(e,t){return z({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function Ga(e,t,n,r){switch(e.kind){case`tapOn`:return await Ka(e,t,n,r);case`doubleTapOn`:{let i=await fo(e.target,{purpose:`doubleTap`,timeoutMs:Ja(e)},t,n),a=j(e.delay,`doubleTapOn.delay`)??B.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?ya(i.resolution):void 0)}case`longPressOn`:{let i=await fo(e.target,{purpose:`longPress`,timeoutMs:Ja(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?ya(i.resolution):void 0)}}}async function Ka(e,t,n,r){let i=await qa(e,t,n);return await q(n.tapOn,Ya(e,i),r,`invalidate`,i.resolution?ya(i.resolution):void 0)}async function qa(e,t,n){let r={purpose:`tap`,timeoutMs:Ja(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await fo(e.target,r,t,n)}function Ja(e){return e.optional===!0?B.command.optionalTargetLookupTimeoutMs:B.command.targetLookupTimeoutMs}function Ya(e,t){let n=j(e.repeat,`tapOn.repeat`),r=j(e.delay,`tapOn.delay`),i=n===void 0?r:r??B.command.repeatDelayMs;return z({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Xa(e,t,n,r){let i=await Na(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?ya(i.target):void 0)}async function Za(e,t,n,r){switch(e.kind){case`inputText`:return await q(n.inputText,z({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await q(n.eraseText,z({charactersToErase:j(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function Qa(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,$a(e),r,`invalidate`);case`hideKeyboard`:return await q(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await q(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await q(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await q(n.waitForAnimationToEnd,eo(e),r,`preserve`)}}function $a(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:j(e.timeout,`scrollUntilVisible.timeout`)??B.command.scrollUntilVisibleTimeoutMs,durationMs:Wi(B.command.scrollUntilVisibleSpeed)}}function eo(e){return z({timeoutMs:j(e.timeout,`waitForAnimationToEnd.timeout`)})}async function to(e,t,n,r){switch(e.kind){case`takeScreenshot`:return ao(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await q(n.runScript,z({file:e.file,env:e.env}),r,`preserve`)}}async function no(e){throw new t(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function ro(e){throw new t(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function q(e,t,n,r,i){let a=io(n,r);return ao(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function io(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function ao(e,t,n,r){let i=e?.observation;return oo(i,r),{...so(n??i),...co(e?.outputEnv),...lo(t,e?.artifactPaths),...uo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function oo(e,n){if(!(!e||n===void 0||e.generation===n))throw new t(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${n}.`)}function so(e){return e?{observation:e}:{}}function co(e){return e?{outputEnv:{...e}}:{}}function lo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function uo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function fo(e,t,n,r){if(e.space===`target`){let i=await va(e.selector,t,n,r);return{authored:e,point:Pr(i.rect),resolution:i}}return{authored:e,point:await Pa(e,n,r)}}function po(e,t,n,r={}){let i=n===`ios`&&r.presentation?ho(r.presentation):void 0,a=i?go(e,t,i):cn(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:bo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?sn(s,t.selector.index):xn(s,t.selector.index)?.node,l=bo(t,o,s,c);if(!c)return _o(t,o,s,l);let u=i?xn(i.visibleForSource(c),void 0):null,d=dn(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!mo(t.selector)&&i?vo(d,s,u):0,evidence:l}:_o(t,o,s,l)}const mo=Sn;function ho(e){let t=pe(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>hn(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function go(e,t,n){let r=un(e,`ios`),i=Cn(e,{},{orderUnindexed:e=>qn(e,r)}),a=bn(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:yn(o,t.selector,`ios`,i.visibility,r)}}function _o(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function vo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&yo(n.rect,e)?1:0:t.length}function yo(e,t){let n=Pr(e),r=Pr(t);return n.x===r.x&&n.y===r.y}function bo(e,t,n,r){return z({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:Gi,retryTapMaxAttempts:B.command.retryTapMaxAttempts,longPressDurationMs:B.command.longPressDurationMs,eraseTextMaxCharacters:B.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:B.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:B.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:B.command.waitForAnimationToEndDifferencePercent,observationPollMs:B.observation.pollIntervalMs};function xo(e,t={}){return{execute:async n=>{let r=G(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ba(n.command)&&!i,visualStabilityBarrier:i});let a=await Va(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await ga(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function So(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Co(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:So(n)}}function wo(e){let t=Co(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Kr(n,e.meta?.tenantId)},cleanup:()=>{Gr(n)}}}function Y(e,t,n){return t||Vn(n)?null:F(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function To(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function X(e){return Zn(e.flags)||!e.session?await Ei(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Eo(e.session.device)}async function Eo(e){if(Jr(e)||!C(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await Li.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 Ei(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Ei({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Do(e,t){return t?Ln(t,e).length===0:!1}async function Oo(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=wo(t);let n=Mo(t),l=await Ao(a,t.flags),u=await Xi(e.inspectFacts)(l),d=V(`install_from_source`,u.operations.ensureReady)??V(`install_from_source`,u.operations.materializeAppSource)??V(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Yi(e.bindDevice)(l,Se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await No({artifact:s,retention:n,req:t,session:a,sessionName:r}),a&&L(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Po(l,s,p,c),h=cr(m,`Installed: ${Lr(m)}`);return k(i,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await zn(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:n(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function ko(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await zn(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:n(e)}}}async function Ao(e,n){let r=jo(n?.platform);if(e&&r&&e.device.platform!==r)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await X({session:e,flags:n})}function jo(e){return e===`ios`||e===`android`?e:void 0}function Mo(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function No(e){if(e.retention.enabled)return await Rn({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 Po(e,t,n,r){return C(e)?Fo(t,n,r):Io(t,n,r)}function Fo(e,n,r){let i=n.bundleId??e.bundleId;if(!i)throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Ro(r),bundleId:i,...Lo(n,e),launchTarget:n.launchTarget??i}}function Io(e,n,r){let i=n.packageName??n.launchTarget??e.packageName;if(!i)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Ro(r),packageName:i,...Lo(n,e),launchTarget:n.launchTarget??i}}function Lo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Ro(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function zo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Bo(t);if(!a.ok)return a.response;let o=Y(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await X({session:n,flags:t.flags}),c=await R({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:D});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return F(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:F(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Bo(e){let t=Vo(e);if(!t.ok)return t;let n=Ho(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 Vo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Ho(e){let t=Uo(e.flags?.devicePort),n=Uo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Uo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Wo(e){return await R({...e,command:`runtime clear`,use:ce})}async function Go(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await zo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Ko({...e,session:r.get(n)});if(!qo(i))return F(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Jo({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Yo(n,o):Zo({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Ko(e){if(!e.session)return F(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ia({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=ki(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 qo(e){return e===`set`||e===`show`||e===`clear`}async function Jo(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(Mn(i)&&r?.appBundleId){let e=await Wo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;L(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:In(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Yo(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Xo(e){return e?E(e.device):void 0}function Zo(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Xo(i),s=Qn(t.flags?.platform??a?.platform??o);if(!s)return F(`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 F(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Kn(a,Bn(t.flags,s));return Xn(c)===0?F(`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 Qo=/^[A-Za-z0-9_.:-]{1,64}$/,$o=8192,es=4096;function ts(e){let n=e[0]?.trim(),r=e[1]?.trim();if(!n)throw new t(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Qo.test(n))throw new t(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new t(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:rs(r,n)}}function ns(e,n,r){let i=E(e),a=is(e);if(!a)throw new t(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>es)throw new t(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:es});return s}function rs(e,n){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>$o)throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${$o} bytes`);return r}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function is(e){return((C(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function as(e,t,n,r){let{eventName:i,payload:a}=ts([...r]),o=ns(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Pi(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...M(`Triggered app event: ${i}`)}}async function os(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await R({command:`trigger-app-event`,device:t,use:Be,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>as(s,t,e,n)}}function ss(e){let n=(e[0]??`status`).toLowerCase();if(!zr(n))throw new t(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new t(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return cs(n)}function cs(e){return e===`get`?`status`:e===`return`?`enter`:e}const ls={"ime-probe":`android`},us={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ds={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function fs(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Pi(e)}}async function ps(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 ms(e,t){return e.operations.keyboardStatus(fs(t)).then(e=>({platform:ls[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 hs(e,t){let n=await e.operations.keyboardDismiss(fs(t)),r=us[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...M(vs(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 gs(e,t){let n=await e.operations.keyboardEnter(fs(t)),r=ds[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 _s(e){let t=ss(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ps({command:`keyboard status`,device:n,use:me,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ms(e,t)):t===`dismiss`?await ps({command:`keyboard dismiss`,device:n,use:Ee,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>hs(e,t)):await ps({command:`keyboard enter`,device:n,use:qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>gs(e,t))}function vs(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ys(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=Y(i,l,u);if(d)return d;let f=await X({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&xi(t)===`may-invalidate`&&L(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function bs(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return F(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function xs(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ys({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...ki(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Ss(e){return bs(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await xs({...e,command:ir.keyboard,resolveRuntime:e=>_s(e)})}async function Cs(e){return await xs({...e,command:ir.triggerAppEvent,resolveRuntime:e=>os(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await sa(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function ws(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Ts(e,n){let r=n?.subject??`Payload`,i=e.trim();if(!i)throw new t(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!U.statSync(a).isFile())throw new t(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof t)throw e;let n=e.code;if(n===`EACCES`||n===`EPERM`)throw new t(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new t(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(ws(i))return{kind:`inline`,text:i};throw new t(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Es(e){let n=Ts(e,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await Ds(n.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ds(e){try{return await W.readFile(e,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new t(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new t(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new t(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new t(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function Os(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=Y(n,a,o);if(s)return s;let c=Ps(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Kr(l,t.meta?.tenantId):A.expandHome(c.appPathInput);if(!U.existsSync(s))return F(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await X({session:a,flags:o}),d=await Xi(e.inspectFacts)(u),f=V(n,d.operations.deployApp);if(f)return f;let p=await Yi(e.bindDevice)(u,Ce);a&&L(a);let m=await p.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),h=As(u,c.app,s,m),g=cr(h,`Installed: ${h.appName??Rr(h)}`),_=Ns(a,h);return _&&_!==a&&i.set(r,_),k(i,_,t,n,g),{ok:!0,data:g}}finally{l&&Gr(l)}}async function ks(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=Y(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return F(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Es(Fs(c,t.meta?.cwd)),u=await X({session:i,flags:a}),d=await Xi(e.inspectFacts)(u),f=V(`push`,d.operations.ensureReady)??V(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Yi(e.bindDevice)(u,we);await p.operations.ensureReady({}),i&&L(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=C(u)?cr({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):cr({platform:E(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function As(e,t,n,r){return C(e)?js(t,n,r):Ms(e,t,n,r)}function js(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 Ms(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 Ns(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ps(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:F(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:F(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Fs(e,t){let n=Ts(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Is(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Os({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Oo({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await ks({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Ls(e,t,n){return await d(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Rs=new Set(`acceptAlert.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function zs(e){return Rs.has(e)}const Bs=new Map(De.map(e=>[e.name,e]));function Vs(e){let t=new Set;for(let n of e){let e=Hs(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Hs(e){let t=Bs.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(zs)?n:void 0}function Us(e){if(e!==void 0&&e.remainingSteps.length!==0)return Vs(e.remainingSteps)}function Ws(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:yi(e),plannedOperations:Us(e.internal?.executionPlan)}}function Gs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...M(`Closed: ${t.name}`)}})}function Ks(e,t,n){if(!dt(t))return{kind:`not-armed`};let r=t.actions.length;Gs(e,t,n);let i=Wt(t),a=e.writeSessionLog(t,{force:Kt(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(mt(t),{kind:`aborted`})}function qs(e,t){let r=n(t),i=Pt(e.scriptPublication??Ft);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Js(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Gs(r,n,t);try{let e=r.writeSessionLog(n,{force:Kt(n,t.flags?.force)});e.written&&Rt(n,e.path);return}catch(e){return Ys(e)}}function Ys(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof t?new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n(e).message}`,r)}async function Xs(e){let t=e.clearRuntimeHints?Je:de,n=await ji({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,de)};let r=await n.bind(e.device,Je);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Zs(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await Qs(n,a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&Mn(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:In(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>tn(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Qs(e,t,n,r){let i=t.get(e.name)??e;i.screenRecording&&await n(`recording`,()=>tr({session:i,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>rn({session:e,sessionName:e.name,sessionStore:t})),await n(`audio_probe`,()=>On({session:e,sessionName:e.name,sessionStore:t})),await n(`perf_capture`,()=>er({session:e,sessionName:e.name,sessionStore:t})),await n(`platform_snapshot_helper`,()=>vn(e,r))}function $s(e,t){return _n({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function ec(e){if(e instanceof t)return e;let n=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const tc=(e,t)=>(e.positionals?.length??0)>0||an(t);async function nc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=dt(n),s=JSON.stringify(t.positionals??[]);if(o&&!ut(n,s)){let e=await ic({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:qs(n,ec(e))};pt(n,s)}let c=Ks(i,n,t);return c.kind===`failed`?{response:qs(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function rc(e){try{return{providerData:await En(e)}}catch(t){let r=n(t);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function ic(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(tc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Ws(t,r,n.trace?.outPath)});return}catch(e){return e}}function ac(e,n){if(!e.flags?.saveScript||It(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new t(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new t(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function oc(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.get(r);if(!c)return await uc({req:n,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});ac(n,c);let l=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!l)return F(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let u=e.platformResourceCleanup,d=await Xs({device:c.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!c.appBundleId&&Mn(a.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;if(L(c),n.internal?.closeAppOnly===!0&&l)return await lc({req:n,session:c,logPath:i,lifecycle:d.runtime,app:l});let f=await nc({req:n,session:c,logPath:i,sessionStore:a,lifecycle:d.runtime});if(`response`in f)return f.response;let p=await sc({req:n,session:c,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:d.runtime,clearRuntimeHints:d.clearRuntimeHints,repairArmed:f.repairArmed,platformResourceCleanup:u});return p.kind===`response`?p.response:cc({session:c,repair:f,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:p.shutdownResult,providerData:p.providerData})}async function sc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Zs({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:ic,finalizeOrdinaryCloseScript:Js,platformResourceCleanup:e.platformResourceCleanup}),m=await rc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=$s(r,u),g=d??h;if(g?n.deviceClaim&&N({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await ni(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function cc(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:cr({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...M(c),...o,...s}}}async function lc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await ic({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...M(`Closed: ${a}`)}}}async function uc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return F(`SESSION_NOT_FOUND`,`No active session`);let a=await Xs({device:await X({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Ws(t,n)}),{ok:!0,data:{app:t.positionals[0],...M(`Closed: ${t.positionals[0]}`)}})}function dc(e,t){return e.operations.ensureReady(t)}function fc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function pc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return mc(t,r);case`devices`:return await gc(t);case`capabilities`:return await wc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Ac({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function mc(e,t){let n=Bi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ui(e.session,n)).map(e=>hc(e,t))}}}function hc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:jr(r),platform:E(t.device),...b(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...b(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function gc(e){try{let t=_c();return{ok:!0,data:{devices:(await yc(e)).map(e=>({...Lc(e),...vc(e,t)}))}}}catch(e){let t=c(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function _c(){let e=new Map;for(let t of Xr({})){let n=t.claim;!n||Zr(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function vc(e,t){let n=t.get(Yr(vi(e)));return n?{claimedBy:n}:{}}async function yc(e){let t=e.flags?.platform;return Cc(await wi(bc(e,t)),e.flags?.platform,e.flags?.target)}function bc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:xc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Sc(n?.androidDeviceAllowlist)}}function xc(e,t,n){return y({simulatorSetPath:Si(e),platform:t,target:n})}function Sc(e){let t=I(e);return t?Array.from(t).sort():void 0}function Cc(e,t,n){let r=t?e.filter(e=>Rc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function wc(e){let t=await Ic({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Tc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Nc(n,e.inspectFacts);return{ok:!0,data:{device:Lc(n),availableCommands:Ke().filter(e=>e===`appstate`&&r?!0:Oc(e,i))}}}function Tc(e,t,n){return!t||!C(e)&&!T(e)||!Do(n,t)?!1:Ec(t)||Dc(e,t)}function Ec(e){return!!(e.appName||e.appBundleId)}function Dc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Oc(e,t){let n=je(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>kc(t,e)))}function kc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Ac(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await jc(t,e.providerAppCatalog);if(o)return o;let s=await Ic({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=fr(t.flags?.appsFilter),u=I(t.flags?.androidDeviceAllowlist),d=await Pc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Fc(await fc(f,await dc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function jc(e,t){let n=Mc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,P(e.meta?.requestId))]}}}function Mc(e){let t=bi(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 Nc(e,t){if(t)try{return await t(e)}catch{return}}async function Pc(e){if(!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await e.inspectFacts(e.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Te)}}function Fc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Ic(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=Y(t.command,a,o);return s?{response:s}:{device:await X({session:a,flags:o,androidAvdSelection:i})}}function Lc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...b(r.platform)&&n?{appleOs:n}:{}}}function Rc(e,t){return v(e,t)}function zc(e){return F(`INVALID_ARGS`,e)}function Bc(e,n,r,i){try{return oa({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return F(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}async function Vc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await aa({target:n,platform:i.platform,surface:r});return a?zc(a):null}async function Hc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await aa({target:n,platform:r});return i?zc(i):null}function Uc(e){let t=nr(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:Mn(n),clearRemovedRuntimeHints:Tn({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Wc(e){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!f(a??``),execution:{startupDeadlineAtMs:Kc(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:yi(n)}});let{appBundleId:d,appName:p}=await Gc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new t(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Pn({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:p,runtime:c.runtime}}}async function Gc(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 Kc(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}function qc(e,t){e.warnings=[...Jc(e),t]}function Jc(e){let t=e?.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}async function Yc(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:F(`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:F(`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:F(`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 Xc(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let n=await ca({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.ok?{ok:!0,data:{...o.data,snapshot:n.data}}:Zc(o.data,n.error)}catch(e){return Zc(o.data,n(e))}}function Zc(e,t){return{ok:!0,data:{...e,warnings:[...Jc(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Qc(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...$c(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=E(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,w(d.platform)&&(g.serial=d.id)),d&&C(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...M(`Opened: ${o??s??t}`)}}function $c(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function el(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const tl=Object.freeze({async observeBootTimeMs(e){if(C(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function nl(e){return e.internal?.resolvedSessionScope??Bi(e)}function rl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Vt(t,{});return}It(n)&&(Gt(t),qc(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function il(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function al(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function ol(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function sl(e,t){if(!t)return;let n=await $r(t);if(n.status!==`renewed`)return n.conflict?Jn(e,n.conflict):F(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function cl(e){let{req:t,sessionName:n,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:u,appBundleId:d,runtimeHints:f,lifecycle:p,applyRuntimeHints:m,existingSession:h,deviceClaim:g,tookOverDeviceClaim:_,selection:v}=e,y=t.flags?.relaunch===!0,b=d,x=Date.now(),S=await ll({req:t,sessionName:n,sessionStore:i,device:o,surface:u,sessionAppBundleId:b,appName:l,existingSession:h});if(S.type===`response`)return S.response;let C=S.session??h,w=Date.now(),T=await p.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:b,surface:u,hasExistingSession:h!==void 0,relaunch:y,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:al(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:In(f),applyRuntimeHints:m,execution:Ws(t,a,h?.trace?.outPath)});b=T.appBundleId??b;let E={...T.timing},ee=$i(v),D=s?ol(w,s,b):void 0;if(Vr(t.meta?.requestId)){let e=r();return F(e.code,e.message,e.details)}h&&Ri({session:h,command:`open`,positionals:[],flags:void 0});let O=el({existingSession:C,sessionName:h?.name??Vi(t),sessionScope:h?.sessionScope??nl(t),device:o,surface:u,appBundleId:b,appName:l});O.lease=$n({req:t,existingLease:h?.lease}),g&&(O.deviceClaim=g),t.runtime!==void 0&&Fn(i,n,f);let te=i.ensureSessionDir(n),ne=Mr(te,t.meta?.requestId??hr().requestId);E.totalDurationMs=Math.max(0,Date.now()-x),N({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let re=Qc({sessionName:O.name,sessionStateDir:te,runnerLogPath:jr(te),requestLogPath:ne,eventLogPath:i.resolveEventLogPath(n),appName:l,appBundleId:b,surface:u,startup:D,timing:E,device:o,runtime:f,runtimeHintCount:Xn,sessionReused:h!==void 0,selection:ee});return _&&qc(re,il(_)),rl({session:O,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:re}),i.set(n,O),i.recordAction(O,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:re}),{ok:!0,data:re}}async function ll(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=ul(e);r.set(n,o);let s=await a(o);return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function ul(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=el({existingSession:o,sessionName:o?.name??Vi(t),sessionScope:o?.sessionScope??nl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=$n({req:t,existingLease:o?.lease}),s}function dl(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(i)return Hi(t,i.session)?F(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):Dn(i,n)}async function fl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Yn(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Un(n,r,An({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await _i({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:tl})}}async function pl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=dl({req:t,device:a,sessionStore:i});if(m)return m;let h=await fl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Jn(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await ml({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Wc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await sl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await cl({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function ml(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await ni(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await ei(t);N({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const hl=new Map;async function gl(e){let t=oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await ji({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ge)};case`open-apply-runtime-hints`:{let t=await r(e.device,ne);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,be);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function _l(e){let t=Uc(e);if(t.type===`response`)return t;let n=await gl({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function vl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Yc({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return F(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Bc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return zc(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let u=await Vc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await sl(i.device,i.deviceClaim);if(d)return d;let f=await Eo(i.device),p=ea(f);await o.internal?.retainDeviceExecutionLock?.(f.id);let m=await _l({req:o,sessionStore:r,sessionName:t,device:f,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;L(i);let _=await Wc({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:h.runtime,runtimeHintPlan:g,clearRuntimeHints:h.clearRuntimeHints,foreground:!1});return _.type===`response`?_.response:await sl(f,i.deviceClaim)||await cl({req:o,sessionName:t,sessionStore:r,logPath:n,device:f,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:_.details.appBundleId,appName:_.details.appName,runtimeHints:_.details.runtime,lifecycle:h.runtime,applyRuntimeHints:h.applyRuntimeHints,surface:l,existingSession:i,selection:p})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return zc(`open --relaunch requires an app argument.`);let l=await Hc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await Di(o.flags??{},jn(c)),d=u.device;await o.internal?.retainDeviceExecutionLock?.(d.id);let f=Bc(d,o.flags?.surface,c);if(typeof f!=`string`)return f;let p=await Vc({shouldRelaunch:s,openTarget:c,surface:f,device:d});if(p)return p;let m=await _l({req:o,sessionStore:r,sessionName:t,device:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;return await Ir(hl,d.id,async()=>await pl({req:o,sessionName:t,logPath:n,sessionStore:r,device:d,surface:f,openTarget:c,lifecycle:h.runtime,runtimeHintPlan:g,applyRuntimeHints:h.applyRuntimeHints,clearRuntimeHints:h.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:u}))}async function yl(e){let t=await vl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Xc({...e,inspectFacts:Xi(e.inspectFacts),bindDevice:Yi(e.bindDevice),openResponse:t})}const bl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,xl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Sl(e){return t=>F(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function Cl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function wl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Tl(e){return e.available?null:F(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function El(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Dl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&To(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return F(`SESSION_NOT_FOUND`,e)}let s=Y(`appstate`,i,a);if(s)return s;let c=b(i?.device.platform)&&Do(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return F(`SESSION_NOT_FOUND`,bl);if(u&&!c)return F(`SESSION_NOT_FOUND`,xl);if(c&&i){let e=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return F(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:E(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...C(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a});if(C(d))return F(`SESSION_NOT_FOUND`,bl);if(T(d))return F(`SESSION_NOT_FOUND`,xl);let f=await R({command:`appstate`,device:d,use:We,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>F(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:kl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:E(d),package:m.package,activity:m.activity}}}async function Ol(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=I(a.androidDeviceAllowlist),l=s?[...s].sort():void 0,u=Ie({headless:a.headless===!0}),d;try{d=await X({session:i,flags:a,androidAvdSelection:`include-stopped`})}catch(e){let t=c(e);if(u.kind===`boot-target-headless`&&!El(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return F(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(a.target&&(d.target??`mobile`)!==a.target)return F(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await ji({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Sl(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:a.serial,androidSerialAllowlist:l};return d=u.kind===`boot-target-headless`?await(await f.bind(d,u.use)).operations.bootTargetHeadless(p):await(await f.bind(d,u.use)).operations.bootTarget(p),{ok:!0,data:{platform:E(d),target:d.target??`mobile`,device:d.name,id:d.id,kind:d.kind,booted:!0,...b(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=await X({flags:a,session:i,androidAvdSelection:`include-stopped`}),c=Tl((await Cl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return F(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await wl(e.bindDevice)(s,Ze)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...b(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:F(l.error?.code??`COMMAND_FAILED`,Al(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Dl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function kl(e){let t=I(e);return t?[...t].sort():void 0}function Al(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function jl(e){let t=vr(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=U.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{U.closeSync(t)}}function Ml(e,t){la(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=yr(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function Nl(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=_r(e);try{U.fsyncSync(r)}finally{U.closeSync(r)}let i=0;for(let e of U.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{U.unlinkSync(H.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Pl(e){return gi.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Fl(e){try{return await Il(e)}catch(e){return{ok:!1,error:n(e)}}}async function Il(e){let t=Ll(e);if(!t.ok)return t;let n=t.session,r=le(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Rl(a,o);let c=ue({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await zl(e,n,r,c.use);case`capture-status`:return await Bl(e,n);case`capture-stop`:return await Vl(e,n)}}function Ll(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:F(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Rl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return F(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function zl(e,t,n,r){if(t.audioProbe){await ri({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return F(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=mi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=mi.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=H.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),c=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await fi({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...c,throwIfCanceled:e.throwIfCanceled});let l=e.sessionStore.get(e.sessionName)?.audioProbe;if(!l)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await l.handle.status()}}async function Bl(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Hl()};let r=await n.handle.status();return r.state===`stopped`&&await ri({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Vl(e,t){return t.audioProbe?{ok:!0,data:await ri({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Hl()}}function Hl(){return Qr({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Ul(e){let r=e.sessionStore.get(e.sessionName);if(!r)return F(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(or(e.req.positionals?.[0]))throw new t(`INVALID_ARGS`,sr);uu(e.req);let n=hi({positionals:e.req.positionals,kind:fu(e.req.flags?.kind),outPath:fu(e.req.flags?.out)}),i=di(n);if(i.kind===`capture-stop`)return Wl(e,await Jl(e,r,i.request));let a=await Zi({device:r.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Wl(e,await Gl(e,r,a)):V(`perf`,a.fact)??F(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:n(e)}}}function Wl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,au(t.data)?{...t.data}:{}),t}async function Gl(e,n,r){let{device:i,plan:a}=Ji(r),o=Yi(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:eu(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:ou(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:su(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:H.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Kl(e,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=lu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:A.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Kl(e,t,n,r){if(t.perfCapture)return F(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return F(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=lu(e,r.outPath,i),o=ti.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=ti.createNextFence({admissionLedger:ql(e),resourcePath:o,device:t.device}),c=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await pi({admissionLedger:ql(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:c.pendingHandle,envelope:c.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:c.response}}function ql(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new t(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Jl(e,t,n){let r=t.perfCapture;if(!r)return F(`INVALID_ARGS`,`no active native perf capture`);let i=$l(r.handle.inspect(),n);if(i)return F(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let a=await ci({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Yl(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function Yl(e){if(Xl(e)||Zl(e))return e;throw new t(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Xl(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Zl(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ql(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ql(e,t){return t.every(t=>typeof e[t]==`string`)}function $l(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function eu(e,t){return{...cu(e),metrics:{fps:tu(t.metric,e)},sampling:{fps:t.sampling}}}function tu(e,t){if(!au(e)||e.available!==!0)return e;let n=nu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function nu(e,t){let n=ru(t.windowStartedAt),r=ru(t.windowEndedAt)??ru(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:iu(e)})).slice(-12)}function ru(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function iu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function au(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ou(e,t){return{...cu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function su(e,t){return{...cu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function cu(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id}}function lu(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):H.join(e.sessionStore.ensureSessionDir(e.sessionName),`${du()}-${n}`)}function uu(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new t(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function du(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function fu(e){return typeof e==`string`&&e.length>0?e:void 0}const pu=[`dump`,`log`],mu=`network requires ${pu.join(` or `)}`,hu=`network include mode must be one of: ${s.join(`, `)}`,gu=2048;async function _u(e){let t=e.sessionStore.get(e.sessionName);if(!t)return F(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=vu(e.bindDevice),r=(await n(t.device,ee)).facts.networkDump;if(!r.available)return Cu(r.hint);let i=yu(e.req);if(!i.ok)return i;let a=Fe({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return wu(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:gu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:n(e)}}}function vu(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function yu(e){let t=bu(e);if(!t.ok)return t;let n=xu(e);if(!n.ok)return n;let r=Su(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function bu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return pu.includes(t)?{ok:!0,action:t}:F(`INVALID_ARGS`,mu)}function xu(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?F(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Su(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return F(`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}:F(`INVALID_ARGS`,hu)}function Cu(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function wu(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:gu,maxScanLines:e.entries.length},notes:e.notes}}}function Tu(e,t){let n=ui(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Eu(e.appLogFailure)]:Du(n.state)}}function Eu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Du(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function Ou(e,t){return Ue([...e,...t.notes??[]])}async function ku(e){let{req:t}=e;return t.command===`perf`?await Ul({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?ju(e):t.command===`events`?await Au(e):t.command===`network`?await _u(e):t.command===`audio`?await Fl(Uu(e)):null}async function Au(e){let{req:t,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:n(e)}}}async function ju(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return F(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Wu({...e,session:a}),r=(await n.bindDevice(a.device,te)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=Pu(re({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Mu(n,i)}catch(e){return{ok:!1,error:n(e)}}}async function Mu(e,t){switch(t.kind){case`path`:return Fu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Iu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Nu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Vu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Lu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ru(e)}}async function Nu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Bu(e,t.appBundleId,n.owner,n.operations.appLogStart):await zu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Pu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):F(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Fu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=jl(a),s=Tu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Iu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Tu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:Ou(t.notes,o)}}}function Lu(e,t,n){let r=n.resolveAppLogPath(t);return Ml(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ru(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return F(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Nl(r.resolveAppLogPath(n));return ii({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function zu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await ai({session:i,sessionName:a,sessionStore:o,resourcePath:oi.resolvePath(o.resolveSessionDir(a))});let s=Nl(o.resolveAppLogPath(a)),c=await Hu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Bu(e,t,n,r){let{session:i}=e;return i.appLog?F(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Hu(e,t,r,n)}async function Vu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return F(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await ai({session:t,sessionName:n,sessionStore:r,resourcePath:oi.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Hu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=oi.resolvePath(o.resolveSessionDir(a));try{let l=Pl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await li({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:si({session:i,sessionName:a,sessionStore:o,error:e})}}}function Uu(e){if(!e.bindDevice||!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new t(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Wu(e){if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new t(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Gu(e){let t=Ku(e),n=Ge(t);return ua(`sha256`).update(n,`utf8`).digest(`hex`)}function Ku(e){let{actions:t,actionLines:n,actionSourcePaths:r,metadata:i}=e;return{platform:i.platform??null,target:i.target??null,steps:t.map((e,t)=>qu(e,n[t]??null,r?.[t]??null))}}function qu(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function Ju(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=Yu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Yu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Xu({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Zu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Qu(n,r)];for(let e of s){let t=e();if(t)return t}}function Xu(e){let{from:t,actionCount:n,pendingRecordAndHeal:r}=e,i=t===n+1&&r!==void 0&&r.expectedFrom===t;return Number.isInteger(t)&&t>=1&&(t<=n||i)?void 0:`replay --from ${t} is out of range for a ${n}-step plan.`}function Zu(e){let{from:t,pendingRecordAndHeal:n,sessionActionsLength:r}=e;if(n?.expectedFrom===t&&r===n.actionsCountAtDivergence)return`replay --from ${t} continues a record-and-heal-shaped repair, but no corrective action was recorded in this repair segment; press the correct control via a blessed @ref from the divergence's screen.refs (recorded, no --no-record) — or, if your corrective action was a read (get/is/find/snapshot), re-run it with --record so it lands in the heal — before resuming with --from ${t}.`}function Qu(e,t){if(e!==t)return`replay --plan-digest does not match the current plan digest; the script, its includes, or its platform-conditioned expansion changed since the divergence report was generated. Run a fresh full replay to get a new digest.`}function $u(e,n){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new t(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=rt(e),a=at(e),o=Gu({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??$e(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>Ju(e,s,o)}}function ed(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function td(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ve(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function nd(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function rd(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=nd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ye(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function id(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ye(e,r),...fe(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function ad(e,t,n,r,i,a){if(n.targetEvidences)return od(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return cd(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return cd(e,n,r,i,a);if(s.kind===`post-resolution`){let c=ed({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return cd(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return ld(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=td({recorded:o,token:s.token});if(c.kind===`skip`)return cd(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,sd(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?ld(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function od(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return cd(e,n,r,i,a);let d=td({recorded:o[c],token:u.token});if(d.kind===`skip`)return cd(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,sd(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return ld(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function sd(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function cd(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function ld(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=ud(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=dd(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function ud(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function dd(e,t,n){return n.status===`guard-mismatch`?rd(e,n.evidence,t):id(e,n.evidence)}async function fd(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=At(e.varSources),o=[],s=[],c=gd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!hd(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(_d(u,n.length,r,e))}let d=kt(r,a,md(e,u)),f=Et(a),p=t.diagnosticsMarker(),m=await ad(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:pd(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function pd(e,t){return t.length===0?e:[...new Set([...e,...t])]}function md(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function hd(e){return!!(e&&e.command!==`replay`)}function gd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(hd(n))return n.command===`close`?t:void 0}}function _d(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function vd(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:ft(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){n.update(t=>{_t(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:yd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){ft(r())!==void 0&&n.update(ct)},markCompleteIfArmed(){ft(r())!==void 0&&n.update(ht)},markSessionHeldIfArmed(e){if(e.ok||!gt(r()))return e;let t=Er(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&xd(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{bd({session:t,...e})})}}}}function yd(e){let t=H.dirname(e),n=H.basename(e,H.extname(e));return H.join(t,`${n}.healed.ad`)}function bd(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Sd({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function xd(e){e.pendingRecordAndHeal=void 0}function Sd(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Cd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Ve(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function wd(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),nt(e.command)){let n=Td(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Ve(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Cd([...e.positionals]);n&&t.push(n)}return Ue(t).filter(e=>e.trim().length>0)}function Td(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Ed(n)?t.slice(0,-1):t}function Ed(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Dd(e){let t=Od({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Od(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=kd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function kd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function Ad(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!jd(n))return`manual`;let i=Md(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function jd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Nd(e.scrollRegion)}function Md(e,t){let n=Yt(t),r=Fd(e.ancestry,n,t),i=e.scrollRegion;return i&&Nd(i)?r&&Pd(i,n,t):r}function Nd(e){return e.id!==void 0||e.label!==void 0}function Pd(e,t,n){return n.some(n=>xt(bt(n,t),e))}function Fd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Jt(n,t,e.length);return!r.broken&&ve(r.chain,e)})}const Id=new WeakMap;function Ld(e){return{store:t=>Rd(e,t),finalize:(t,n)=>zd({...e,evidence:t,projection:n})}}function Rd(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Mi(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Id.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ai(a),refFrame:Ni(a)}),{evidence:s,refsGeneration:o}}function zd(e){let t=Id.get(e.evidence);Id.delete(e.evidence);let n=Vd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Bd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Hd(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Fi(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Bd(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Ai(n)===t.runtimeRevision&&Ni(n)===t.refFrame}function Vd(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Hd(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Ud(e){let{sessionStore:t,observationStore:n,sessionName:r,divergence:i,responseLevel:a}=e,o,s,c=Or({divergence:i,level:a,writeOverflowArtifact:e=>{let n=l(e),r=Kd(t,n);return`artifactPath`in r&&(o=n,s=r.artifactPath),r}}),u=(o??c).screen;if(u.state!==`available`||u.refs.length===0)return e.evidence&&Ld({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.state===`available`?u.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return Gd(s),Wd(c,`missing-evidence`);let d=Ld({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.refsGeneration,refs:u.refs.map(e=>e.ref)});return d.published===!0?c:(Gd(s),Wd(c,d.reason))}function Wd(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function Gd(e){if(e)try{U.unlinkSync(e)}catch{}}function Kd(e,t){try{let n=H.join(e.ensureSessionDir(),`replay-divergence`);U.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=H.join(n,r);return U.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const qd={id:0,"role-label":1,label:2,other:3};function Jd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Yd(n.basis)<Yd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Yd(e.basis)-Yd(t.basis)||e.nodeIndex-t.nodeIndex)}function Yd(e){return qd[e]}async function Xd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,observationStore:l,resumeStamper:u,logPath:d,responseLevel:f,scrubVars:p=[],planActions:m,planDigest:h,signal:g}=e,_=Dr(p),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await $d({session:o,sessionName:s,observationStore:l,logPath:d,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},b=rf(y,_),x=y.state===`available`&&o?lf({action:n,session:o,nodes:y.nodes,sanitize:_}):[],S=Ad({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Zd(y)}),C=Dd({failedIndex:r+1,actions:m,planDigest:h,repairHint:S,resumeStamper:u});return Ud({sessionStore:c,observationStore:l,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(tt(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:C,repairHint:S},responseLevel:f,evidence:y.state===`available`?y.evidence:void 0,...g?{signal:g}:{}})}function Zd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Qd=[300,500,800,1200,2e3,3e3,4e3];async function $d(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=tf(a),c=Date.now()+12e3,l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Qd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await Sr(Math.min(e,a)),l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s})}return l.observation}async function ef(e){let{session:t,sessionName:n,observationStore:r,logPath:i,flags:a}=e;try{let e=(await Ii({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(qi(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let o=Ld({sessionStore:r,sessionName:n}).store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:o.refsGeneration,evidence:o.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:Fr(e)}}}function tf(e){return{snapshotInteractiveOnly:nf(e)}}function nf(e){return!uf(e.command)||df(e).requiresRect}function rf(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=cf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function af(e){return!!dr(e,lr(e.type??`Element`))||e.hittable===!0}function of(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function sf(e,t){let n=Qt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&af(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>of(e,t)),...o.filter(e=>!of(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function cf(e,t,n){let{nodes:r,truncated:i}=sf(e,n);return{refs:r.map(e=>{let n=lr(e.type??`Element`),r=dr(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function lf(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!uf(t.command))return[];let a=wd(t);return a.length===0?[]:ff({candidates:a,nodes:r,session:n,action:t,matching:df(t),sanitize:i})}function uf(e){return nt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function df(e){let t=nt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function ff(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=pf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Jd(s).map(e=>e.suggestion)}function pf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Pe(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:mf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function mf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Oe(t,r.device.platform,{action:i.command===`fill`?`fill`:nt(i.command)?`click`:`get`,nodes:n}),c=lr(t.type??`Element`),l=dr(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function hf(e){return{...e,hint:e.hint??vf(e.details,`hint`),diagnosticId:e.diagnosticId??vf(e.details,`diagnosticId`),logPath:e.logPath??vf(e.details,`logPath`)}}function gf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return _f({error:t,actionLabel:tt(n),action:n.command,positionals:lt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function _f(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Tr(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Tr(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...bf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function vf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const yf=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`];function bf(e){if(!e)return{};let t={};for(let n of yf)e[n]!==void 0&&(t[n]=e[n]);return t}async function xf(e){return await Sf({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function Sf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,planActions:g,planDigest:_}=e;if(t.ok)return t;let v=Cf(t.error.details?.replaySource),y=hf(t.error),b=await Xd({error:y,action:n,index:r,sourcePath:v?.path??a,sourceLine:v?.line??o,session:p.get(),sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:g,planDigest:_,signal:P(u.meta?.requestId)});return gf({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function Cf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(n!==void 0||r!==void 0)return{path:n,line:r}}function wf(e,t){if(e)try{U.appendFileSync(e,`${JSON.stringify(l(t))}\n`)}catch(t){N({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Tf(e){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=e,p=Date.now();wf(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:lt(o)??[]});let m;try{m=await Df({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(e){if(!(e instanceof t))throw e;m={ok:!1,error:n(e)}}let h=Date.now();return wf(d,{type:`replay_action_stop`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:m.ok,durationMs:h-p,resultTiming:m.ok?kf(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Ef(m,u??s,c)}function Ef(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function Df(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Af(t.flags,r.flags),s=i.command===`fill`?zt(Ut(i)):void 0;return s&&(o.recordAs=s),await a(Of({token:t.token,session:n,flags:o,runtime:r.runtime,meta:t.meta,internal:{...t.internal,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:t.internal?.resolvedSessionScope??Bi(t)}:{}}},r))}function Of(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:et(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ot(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function kf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function Af(e,t){return p(e,{...t??{}})}function jf(e){return Rf(e.ok?Nf(e.data):Mf(e.error.details?.artifactPaths))}function Mf(e){return Array.isArray(e)?e.filter(Lf):[]}function Nf(e){return e?[If(e.path),If(e.outPath),...Pf(e.artifacts)].filter(Lf):[]}function Pf(e){return Array.isArray(e)?e.map(Ff).filter(Lf):[]}function Ff(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return If(t.localPath)??If(t.path)}function If(e){return typeof e==`string`?e:void 0}function Lf(e){return typeof e==`string`}function Rf(e){return[...new Set(e.filter(zf))]}function zf(e){try{return U.statSync(e).isFile()}catch{return!1}}function Bf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Vf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Yt(r),u=ie(t),d=qt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>St(r,e)===t.sibling),p=d.filter(e=>xt(bt(e,l),t.scrollRegion)),m=vt(p)[t.viewportOrder]?.ref,h=yt({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Wf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Vf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Hf(n,t,i,a):Uf(n,t,r,a,o)}function Hf(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),s=a(t),c=s?o(e,s):null;if(i(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Zt(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Uf(e,t,n,r,i){let a=Le(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=$t(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Wf(e){let{classification:t,matchCount:n,winnerNode:r,identitySet:i,byIndex:a,recorded:o}=e;switch(t.reason){case`selector-miss`:return{kind:`selector-miss`,matchCount:0,observedNode:void 0,candidateNodes:[],mismatches:[],causeCode:`SELECTOR_MISS`,causeMessage:`The recorded target no longer matches any current element.`};case`identity-set-empty`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`The recorded selector/ref still matches, but nothing in the current tree carries the recorded identity.`};case`unique-but-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Exactly one current element carries the recorded identity, but the resolved target is a different element.`};case`signal-isolated-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`A disambiguation signal (sibling or viewport position) isolated a different element than the resolved target.`};case`no-signal-isolation`:return{kind:`identity-unverifiable`,matchCount:n,observedNode:r,candidateNodes:i.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`${i.length} current elements carry the recorded identity and neither disambiguation signal isolated one.`}}}function Gf(e,t,n){let r=Ct(t),i=Jt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ye(e,r),...fe(e.ancestry,i)].slice(0,5)}function Kf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=st(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ve(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!nt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Jf(r)&&Jf(n[1])))return r}function qf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Jf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Yf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionName:l,sessionStore:u,resumeStamper:d,responseLevel:f,scrubVars:p,planActions:m,planDigest:h}=e,g=Dr(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:ap(ie(n),g),...t.observed?{observed:ap(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>op(e,g))},v=Ad({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Dd({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b={version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(tt(r)),cause:{code:t.causeCode,message:g(t.causeMessage),...t.causeHint?{hint:g(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:y,repairHint:v,targetBinding:_},x=Ud({sessionStore:u,observationStore:e.observationStore,sessionName:l,divergence:b,responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return gf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:x,scrubVars:p})}function Xf(e,t,n){let r=Dr(e.scrubVars);return Yf(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:rf(n,r),publicationEvidence:ep(n),repairCapture:Zd(n)})}async function Zf(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await $d({session:t,sessionName:n,observationStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function Qf(e,t){return Xf(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await Zf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function $f(e,t,n){return Xf(e,t,await Zf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ep(e){return e.state===`available`?e.evidence:void 0}function tp(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?he(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Re(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Kf(n,i),platform:a.device.platform}:{kind:`inactive`}}function np(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=df(r),s=Bf({recorded:t,token:n,nodes:i,platform:a,refLabel:qf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Ct(s.winnerNode),structural:xe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Ct(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function rp(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function ip(e){return!e.ok&&e.error.details?.reason===Xt}function ap(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function op(e,t){let n=lr(e.type??`Element`),r=dr(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function sp(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function cp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.role==`string`)return{...typeof t.id==`string`?{id:t.id}:{},role:t.role,...typeof t.label==`string`?{label:t.label}:{}}}function lp(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function up(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.documentOrder==`number`&&typeof t.sibling==`number`)return{documentOrder:t.documentOrder,sibling:t.sibling}}function dp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:cp(e?.observed),expectedStructural:up(e?.expectedStructural),observedStructural:up(e?.observedStructural)}}function fp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:cp(e?.observed),observedAncestry:lp(e?.observedAncestry)}}function pp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function mp(e,t,n){let r=pp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&rp(e)?{status:`guard-mismatch`,evidence:dp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&ip(e)?{status:`landmark-mismatch`,evidence:fp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function hp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionName:t.sessionName,sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,pp(gp(e),jf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return tp({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await $d({session:i,sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return np({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Tf({req:sp(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke});o=l,jf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:mp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await Qf(c(e,n,r,i),{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Xf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await $f(c(e,n,i,a),r,{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=gp(o),u=await _p(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>vp(e),onStep:i,diagnosticsMarker:()=>bp(t.sessionStore),diagnosticsSince:e=>xp(t.sessionStore,e)},readLastResponse:()=>o}}function gp(e){return e&&!e.ok?e:F(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function _p(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return yp(i)?c(i):c(await xf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionName:e.sessionName,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function vp(e){let t=e.positionals??[],n=Me(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function yp(e){if(e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence,n=t&&typeof t==`object`?t.kind:void 0;return typeof n==`string`&&n!==`action-failure`}function bp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function xp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Sp(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Cp(t,i)};return Tp(o,`AD_PLATFORM`,a.platform??r.platform),Tp(o,`AD_TARGET`,a.target??r.target),Tp(o,`AD_DEVICE`,a.device),Tp(o,`AD_DEVICE_ID`,wp(a)),Ep(o,`AD_SHARD_INDEX`,a.shardIndex),Ep(o,`AD_SHARD_COUNT`,a.shardCount),Tp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Cp(e,t){let n=e.meta?.cwd??process.cwd();return H.relative(n,t)||t}function wp(e){return typeof e.serial==`string`?e.serial:e.udid}function Tp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Ep(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Dp=3e4,Op=1e3;function kp(e){let{scriptPath:r,env:i,publicNetworkOnly:a}=e,o=U.readFileSync(r,`utf8`),s=Object.create(null);try{ma.runInNewContext(o,Ap(i,s,a),{filename:r,timeout:Dp})}catch(e){let i=n(e);throw new t(i.code,`Maestro runScript failed: ${i.message}`,u({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),e instanceof Error?e:void 0)}return Lp(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Rp(t)]))}function Ap(e,t,n){return{...e,output:t,json:jp,http:{post:(e,t)=>Np(`POST`,e,n,t)}}}function jp(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Mp)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,Op)},n instanceof Error?n:void 0)}}function Mp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Np(e,n,r,i){let a=xr(process.execPath,Pp(),{stdin:JSON.stringify(Ip(e,n,i,r)),timeoutMs:Dp,allowFailure:!0});if(a.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${zp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:a.stdout.slice(0,Op),stderr:a.stderr.slice(0,Op)},r instanceof Error?r:void 0)}}function Pp(){let e=Fp(import.meta.url);if(!e)throw new t(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Fp(e){try{let t=fa(e),n=H.extname(t)||`.js`;return[H.join(H.dirname(t),`run-script-http-child`+n),H.join(H.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>U.existsSync(e))??null}catch{return null}}function Ip(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Lp(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function Rp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function zp(e){let t=e.trim();return t.length>0?t.slice(0,Op):`request process exited without stderr`}async function Bp(e){return await Vp(`tap`,async t=>{let n=H.join(t,`before.png`),r=H.join(t,`after.png`),i=await Up(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Up(e,r)))return await Hp(n,r,e.signal,`tap`)}})})}async function Vp(e,t){let n=await W.mkdtemp(H.join(da.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await W.rm(n,{recursive:!0,force:!0})}catch{}}}async function Hp(e,t,n,r){try{let[i,a]=await Promise.all([W.readFile(e),W.readFile(t)]);qp(n);let o=await Ki(i,a,`Maestro screenshot`);return qp(n),Wp(o,r)}catch(e){Kp(e,n),N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Up(e,t){try{return await W.rm(t,{force:!0}),qp(e.signal),await e.capture(t),qp(e.signal),!0}catch(t){return Kp(t,e.signal),!1}}function Wp(e,t){if(e.status!==`compared`)return Gp(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return Gp(t,n?`stable`:`changed`,e),n}function Gp(e,t,n){N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Kp(t,n){if(n?.aborted||e(t))throw r()}function qp(e){if(e?.aborted)throw r()}async function Jp(e){Xp(e.timeoutMs),qp(e.signal);let t=e.now()+e.timeoutMs;return await Vp(`animation`,async n=>{let r=H.join(n,`first.png`),i=H.join(n,`second.png`);for(;;){if(qp(e.signal),await Yp(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Yp(e,t,n){let r=[await Up(e,t),await Up(e,n)];return!r[0]||!r[1]?!1:await Hp(t,n,e.signal,`animation`)===!0}function Xp(e){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Zp=J.observationPollMs;async function Qp(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!mm(n)||(Z(e.context.signal),!await fm(e.dependencies,t,Zp,e.context.signal)))throw n}}}function $p(e){return em({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function em(e){let t=zi(e.snapshot),n=e.platform===`ios`?Qi(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:i(n.nodes)}:e.snapshot;return am(po(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function tm(e){pm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await Qp(e,n),i=em({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,_a(e.condition,i))return i;if(e.dependencies.now()>=n)break;await fm(e.dependencies,n,Zp,e.context.signal)}return Z(e.context.signal),_m(t)}async function nm(e){pm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await Qp(e,t);if(r=void 0,n=em({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===J.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),_m(n)}async function rm(e){pm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Qp(e,t),r=hm(n);for(;;){Z(e.context.signal),await fm(e.dependencies,t,Zp,e.context.signal);let i=await Qp(e,t),a=hm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function im(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function am(e,t,n,r,i,a,o){if(!e.ok){let t=im(r);return{generation:n,matched:e.evidence.matched,visible:e.evidence.visible,candidateCount:e.evidence.candidateCount,...e.evidence.ref?{ref:e.evidence.ref}:{},...t?{viewport:t}:{}}}let s=sm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=im(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:om(e.rect,c)}:{},candidateCount:e.evidence.candidateCount,rect:e.rect,...e.evidence.ref?{ref:e.evidence.ref}:{},...c?{viewport:c}:{},...s?{dispatchSelector:s}:{},...i.includeSurfaceSignature?{surfaceSignature:hm(t)}:{}}}function om(e,t){return!Xe(e)||!Xe(t)?0:_e(t,e)?100:Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))*100/(e.width*e.height)}function sm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!cm(t,n,r)||i!==1))return lm(t.selector)}function cm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!mo(e.selector)}function lm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!um(n)||typeof r!=`string`)return;let i=en(r)?.trim();return i?{key:n,value:i}:void 0}function um(e){return e===`id`||e===`label`||e===`text`}async function dm(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?r():e}Z(n)}async function fm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await dm(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw r()}function pm(e,n){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function mm(e){return e instanceof t&&e.details?.retriable===!0}function hm(e){return ua(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,bounds:gm(e.rect)})))).digest(`hex`)}function gm(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function _m(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function vm(e){return e.kind===`clearState`?Cm(e):ym(e)?bm(e):jm(e)?Mm(e):Tm(e)}function ym(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function bm(e){switch(e.kind){case`launchApp`:return xm(e);case`stopApp`:return Sm(e);case`openLink`:return wm(e)}}function xm(e){return{command:`open`,positionals:e.appId?[e.appId]:[],flags:{...e.relaunch?{relaunch:!0}:{},...e.clearState?{clearAppState:!0}:{},...e.launchArgs.length>0?{launchArgs:e.launchArgs}:{}}}}function Sm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function Cm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function wm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Tm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Em(e);case`clickPoint`:return Dm(e);case`swipe`:return Om(e);case`scroll`:return km(e);case`pressKey`:return Am(e)}}function Em(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Dm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Om(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},internal:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function km(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Am(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function jm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Mm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0}}}}async function Nm(e,n){let r=vm(n),{input:i,flags:a,internal:o,...s}=e.baseReq,c=Pm(a,r.flags??{}),l=u({...o,...r.internal,...n.kind===`snapshot`?{observationOnly:!0}:{}}),d=await e.invoke(u({...s,command:r.command,positionals:r.positionals,input:r.input,flags:c,internal:Object.keys(l).length>0?l:void 0}));if(!d.ok)throw Bm(d);if(n.kind===`gestureViewport`){let e=d.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new t(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return d.data}function Pm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=u({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Fm(e){return e?e.kind===`scalar`?[String(e.value)]:e.kind===`list`?e.values.map(String):Object.entries(e.values).flatMap(([e,t])=>[e,String(t)]):[]}function Im(e,t){return{generation:t.generation,matched:t.matched&&t.visible,candidateCount:t.candidateCount,evidence:{kind:`selector`,selector:e,visible:t.visible,candidateCount:t.candidateCount,...t.ref?{ref:t.ref}:{}}}}function Lm(e){if(!e)return[];let t=[];if(typeof e.path==`string`&&t.push(e.path),Array.isArray(e.artifactPaths)&&t.push(...e.artifactPaths.filter(e=>typeof e==`string`)),Array.isArray(e.artifacts))for(let n of e.artifacts)typeof n.localPath==`string`?t.push(n.localPath):typeof n.path==`string`&&t.push(n.path);return[...new Set(t)]}function Rm(e,n,r){if(H.isAbsolute(e))return e;let i=n.source?.path??r;if(!i)throw new t(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return H.resolve(H.dirname(i),e)}function zm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Bm(e){let n=e.error,r=u({...n.details??{},hint:n.hint??Vm(n.details,`hint`),diagnosticId:n.diagnosticId??Vm(n.details,`diagnosticId`),logPath:n.logPath??Vm(n.details,`logPath`),retriable:n.retriable??Hm(n.details,`retriable`),supportedOn:n.supportedOn??Vm(n.details,`supportedOn`)});return new t(n.code,n.message,Object.keys(r).length?r:void 0)}function Vm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Hm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Um(e){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Nm(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new t(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=_(i,i);return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function Wm(e){let{input:t,context:n,snapshots:r,options:i}=e,a=i.dependencies.now()+t.timeoutMs,o=e.allowObservationReuse===!1?void 0:r.reuseObservation(n);for(;;){let e=i.dependencies.now(),s=o!==void 0;o??=await Qp({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=$p({query:t,context:n,snapshot:o,platform:i.platform});if(Xm(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await fm(i.dependencies,a,Zp,n.signal)}}}async function Gm(e,t,n,r,i,a){let o=async()=>await Jm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Bp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Nm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await Km(e,t,n,r,i,a.click,o)});return}await Km(e,t,n,r,i,a.click)}async function Km(e,t,n,r,i,a,o){let s=async()=>await Jm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:hm(await t.capture(i))),l=async()=>{let r=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await qm({baselineSignature:c,screenshotBaseline:o,dispatch:s,settle:l,onRetry:()=>{n.tapRetries+=1}});t.prime(i.generation,e.snapshot)}catch(e){throw t.requireStability(i.generation),e}}async function qm(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<J.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Jm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Zm(e,o,n.point,i);return}catch(n){if(!Qm(n))throw n;let o=await Wm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Ym(o))throw n;t.invalidate(r.generation),await $m(e,Pr(o.rect),i);return}}t.invalidate(r.generation),await $m(e,n.point,i)}function Ym(e){return e.matched&&e.visible&&e.rect!==void 0}function Xm(e,t){return Ym(e)?!t||e.dispatchSelector!==void 0:!1}async function Zm(e,t,n,r){N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Nm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Qm(e){let t=c(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===ur.selectorNotFound}async function $m(e,n,r){if(!n)throw new t(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await Nm(e,{kind:`clickPoint`,point:n,options:r})}function eh(e){let t=Um(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},r=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},i=e.platform,a=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Nm(e,t)),o=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},s=async(e,t,n=`none`)=>await o(()=>a(e),t,n),c=async(n,i)=>{gr(n),await s({kind:`typeText`,text:n},i);let a=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});r(a),t.prime(i.generation,a.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await Wm({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await tm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async()=>await a({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Fm(e.arguments),...Fm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;await s({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`stopApp`,...n?{appId:n}:{}},t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await s({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(r,i)=>await Gm(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>$m(e,t.target.point,u({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>$m(e,t.target.point,{holdMs:J.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??J.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await nm({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=Ea(o,n.selector,n.direction,n.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await rm({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw Nn(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Im(n.selector,a))}},pressKey:async(e,t)=>{await s({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await s({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await s({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await Jp({timeoutMs:t.timeoutMs??J.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Lm(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:kp({scriptPath:Rm(t.file,n,e.sourcePath),publicNetworkOnly:e.baseReq.internal?.publicNetworkOnly===!0,env:{...n.env,...t.env?zm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function th(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=eh(e);return xo(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function nh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),rh(()=>oh(r,e)),rh(()=>sh(n,t,e))},actionCompleted:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!0))},actionFailed:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!1))}}}function rh(e){try{e()}catch{}}function ih(e,t){let n=e.get(t);return e.delete(t),n}function ah(e,t){return u({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function oh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function sh(e,t,n){wf(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function ch(e,n,r,i){let a=lh(r);wf(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof t?{errorCode:r.error.code}:{}})}function lh(e){let t=`data`in e?e.data:void 0,n=uh(t?.timing)?t.timing:void 0;return u({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function uh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function dh(e,t){return fn(e,t)}function fh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:gh(e.action),positionals:_h(e.action,e.value),flags:t.flags??{}}}}async function ph(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,observationStore:o,logPath:s}=e,c=P(r.meta?.requestId),l=fh(t,r),u=hf(e.error),d=[...t.redactions],f=Dr(d),p={...u,message:f(u.message),...u.hint?{hint:f(u.hint)}:{}},m=o.get(),h=m?await $d({session:m,sessionName:i,observationStore:o,logPath:s,action:l.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},g=m&&h.state===`available`&&!t.isControl?mh({failure:t,action:l.action,session:m,nodes:h.nodes,sanitize:f}):[],_=[t.action,hh(t.value)].filter(Boolean).join(` `),v=Ud({sessionStore:a,observationStore:o,sessionName:i,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:f(t.source.path??n),line:t.source.line}},action:f(_),cause:{code:p.code,message:p.message,...p.hint?{hint:p.hint}:{}},screen:rf(h,f),suggestions:g.slice(0,5),suggestionCount:g.length,resume:t.resume,repairHint:Ad({kind:`action-failure`,targetEvidence:void 0,capture:Zd(h)})},responseLevel:r.meta?.responseLevel,evidence:h.state===`available`?h.evidence:void 0,...c?{signal:c}:{}});return _f({error:p,actionLabel:_,action:t.action,positionals:[...l.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:v,scrubVars:d})}function mh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Jd(dh(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>mf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function hh(e){return!e||e===`<text>`?e??``:it(e)}function gh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function _h(e,t){return!t||e===`inputText`?[]:[t]}function vh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=bh(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:xh(c,Date.now()-r)}}}async function yh(e){let{command:t,replayPath:r,state:i,outcome:a}=e,{request:o,session:{name:s,store:c,observationStore:l,logPath:u}}=t,{failure:d}=a,f=n(a.error);return d?await ph({error:f,failure:d,replayPath:r,req:o,sessionName:s,sessionStore:c,observationStore:l,logPath:u,snapshotDiagnostics:bh(c,i.snapshotStart)}):{ok:!1,error:f}}function bh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return m(n)}function xh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Sh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return F(`INVALID_ARGS`,on);if(t.flags?.saveScript!==void 0)return F(`INVALID_ARGS`,`Maestro YAML does not support --save-script; ADR 0012 repair recording applies only to .ad scripts.`);let r=Date.now(),i={snapshotStart:0};try{return await Ch({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await yh({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Ch(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c,invoke:l}=t,u=await wh({command:t,bundle:n}),d=jh({req:a,invoke:l,device:u.device,platform:u.platform,runtimeHints:u.runtimeHints,sourcePath:u.filePath});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await gn(u.flow,d,{defaults:u.defaults,env:u.env,platform:u.platform,target:u.target,runtimeHints:u.runtimeHints,signal:u.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:a.internal?.publicNetworkOnly!==!0,readSource:e=>ln(n,e),observer:nh({filePath:u.filePath,tracePath:s,onStep:c})});return f.ok?vh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await yh({command:t,replayPath:n.entry,state:i,outcome:f})}async function wh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=rr(ln(n,o),o),c=a.lookup(),l=c?.session;c&&Wn(c,r.flags);let u=await Th({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:kh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Ah(r),signal:P(r.meta?.requestId)}}async function Th(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await Ei(t.flags??{},pn(a.appTarget,o))),c=Ih(t,s),l=Dh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Eh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Lh(t,s),runtimeHints:l,flow:a})}async function Eh(e){if(e.device||!Oh(e.runtimeHints))return e;let t=await Ei(e.req.flags??{},pn(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Lh(e.req,t),runtimeHints:Dh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Dh(e){return Hn({req:e.req,sessionStore:{getRuntimeHints:t=>t===e.sessionName?e.sessionStore.getRuntimeHints():void 0},sessionName:e.sessionName,device:e.device,platform:e.platform})}function Oh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function kh(e){return{...Sp({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Ah(e){return{...Ot(Dt(e.flags?.replayShellEnv)),...Tt(wt(e.flags?.replayEnv))}}function jh(e){let{req:t,invoke:n,device:r,platform:i,runtimeHints:a,sourcePath:o}=e,{command:s,positionals:c,input:l,flags:d,...f}=t;return th({baseReq:u({...f,flags:Mh(r,i,t.flags),runtime:a}),invoke:n,platform:i,sourcePath:o,dependencies:{now:Date.now,sleep:async(e,t)=>{await pa(e,void 0,{signal:t})}}})}function Mh(e,t,n){if(!e)return Nh(t,n);let r={platform:t,target:e.target,noRecord:!0};return t===`android`?{...r,serial:e.id}:{...r,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}}}function Nh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Ph(n,t):Fh(n,t)}function Ph(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Fh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Ih(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new t(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Lh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function Rh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(Mt(t,a.flags?.replayBackend)===`maestro`)return n?F(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Sh(i):F(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function zh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Bh(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=Vh(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(),_=Hh({req:t,coordinator:s,manifest:l,preEntrySession:g});return _.ok?{ok:!0,value:{replayReq:u,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h,preEntrySession:g,entryIndex:_.value,varSources:Wh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Bh(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return F(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Vh(e,t){let n=$u(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Uh({...e,flags:mn(e.flags,n.actions)},n.metadata)}}function Hh(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:F(`INVALID_ARGS`,a.message)}}function Uh(e,t){return!t.platform&&!t.target?e:{...e,flags:Gh(e.flags,t)}}function Wh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Sp({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Ot(Dt(t.flags?.replayShellEnv)),cliEnv:Tt(wt(t.flags?.replayEnv))}}function Gh(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function Kh(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=qh({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Xh({req:t,coordinator:a}),Yh({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function qh(e){let t=Zh(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return qr()}function Jh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?F(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):Qh({saveScript:t,liveForce:n,persistedForce:Bt(r)||void 0,sourcePath:i,existingSaveScriptPath:Pt(r)})}function Yh(e){let{req:t,sessionStore:n,sourcePath:r,coordinator:i}=e,a=n.get(),{saveScript:o,force:s}=t.flags??{},c=Jh({saveScript:o,force:s,preRunState:a?.scriptPublication??Ft,sourcePath:r});return c?{ok:!1,response:c}:(i.demoteForRerunIfArmed(),{ok:!0,armSaveScript:$h({saveScript:o,force:s,coordinator:i,sourcePath:r})})}function Xh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Zh(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return F(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function Qh(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Ar(t):a??yd(i);if(!(n||r&&o===a)&&U.existsSync(o))return F(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function $h(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function eg(e){let{request:t,session:{name:n,logPath:r,store:i,mutationStore:a,observationStore:o},tracePath:s,onStep:l,invoke:u}=e,d=t.flags?.replayScriptSource;if(!d)return F(`INVALID_ARGS`,on);let f=Date.now(),p=t.flags?.replayKeepSession===!0,m=``,h=new Set,g=vd({sessionStore:i,mutationStore:a});try{if(m=d.entry,Nt(m)&&t.flags?.replayBackend!==`maestro`)return F(`INVALID_ARGS`,jt(`replay`,m));let a=await Rh({resolved:m,keepSession:p,coordinator:g,command:e});if(a)return a;let c=zh({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:m,script:ln(d,m),coordinator:g});if(!c.ok)return c.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=c.value,T=Kh({req:t,entryIndex:S,sessionStore:i,sourcePath:m,coordinator:g});if(!T.ok)return T.response;let{runtime:E,readLastResponse:ee}=hp({ctx:{replayReq:_,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:m,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:u,signal:P(t.meta?.requestId),coordinator:g},req:t,artifactPaths:h,onStep:l,armSaveScript:T.armSaveScript}),D=await fd({actions:v,entryIndex:S,keepSession:p,actionLines:y,actionSourcePaths:b,resolvedPath:m,varSources:C},E);return D.status===`failed`?ee()??F(`COMMAND_FAILED`,`replay step failed with no recorded response`):tg({startedAt:f,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:g,keepSession:p})}catch(e){let t=c(e);return F(t.code,t.message,h.size>0?{artifactPaths:[...h]}:void 0)}}function tg(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=rg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=m([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:ng(i,Date.now()-t)}}}function ng(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function rg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return F(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function ig(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=H.resolve(n??`.`,t??`.agent-device/test-artifacts`);return H.join(i,r)}function ag(e,t){let n=t?H.relative(t,e):H.basename(e),r=n.length===0||n.startsWith(`..`)?H.basename(e):n;return ze(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function og(e,t){U.mkdirSync(t,{recursive:!0}),lg(e,t)}function sg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=H.join(o,`result.txt`),u=H.join(o,`failure.txt`),d=cg([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>H.basename(e)).join(`, `)}`);let p=`${f.join(`
2
- `)}\n`;U.writeFileSync(l,p),s||U.writeFileSync(u,p)}function cg(e,t,n){let r=[],i=new Set(n.map(e=>H.basename(e).toLowerCase()));for(let n of e){if(!dg(n))continue;let e=H.basename(n);if(H.resolve(n)===H.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=ug(e,t,i),o=H.join(t,a);U.copyFileSync(n,o),r.push(o)}return r}function lg(e,t){let n=H.join(t,`replay.ad`);if(U.copyFileSync(e,n),H.extname(e).toLowerCase()===`.ad`)return;let r=H.join(t,H.basename(e));H.resolve(r)!==H.resolve(n)&&U.copyFileSync(e,r)}function ug(e,t,n){let r=H.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||U.existsSync(H.join(t,a));)a=`${i}-${o++}${r}`;return a}function dg(e){try{return U.statSync(e).isFile()}catch{return!1}}function fg(e){let{platformFilter:n,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}vg(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=n?` for --platform ${n}`:``;throw new t(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function pg(e,t,n,r,i=0){let a=H.basename(n,H.extname(n)),o=ze(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function mg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return ze(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function hg(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,H.basename(r),`attempt`,a+1].join(`:`)}function gg(e,t){return typeof e==`number`?e:t}function _g(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function vg(e,t){return e===`apple`?b(t):t===e}function yg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const bg=2e3;async function xg(e){let{filePath:t,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=Og({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>yg({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(kg(o,[...v]))},o)})]):await w,Q(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Cg(w)||(x=Eg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:bg}}),wg({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await Tg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Dg(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=Sg(x,i,v)}}return x??yg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Sg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:yg({error:t,artifactPaths:[...n],infrastructure:!0})}async function Cg(e){return await Promise.race([e.then(()=>!0),pa(bg).then(()=>!1)])}async function wg(e){let{replayPromise:t,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:n(e).message}})}}}async function Tg(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Q(o,e)});return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=n(e);return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:t.message}}),yg({error:t})}}function Eg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Dg(e,t){return{...e,warnings:[...e.warnings,t]}}function Og(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=H.join(t,`replay-timing.ndjson`);return U.mkdirSync(H.dirname(l),{recursive:!0}),U.writeFileSync(l,``),n.add(l),Q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Q(e,t){e&&U.appendFileSync(e,`${JSON.stringify(t)}\n`)}function kg(e,t=[]){return yg({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function Ag(e){let t=jg(e),n=await Mg(e,t);return{result:Rg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function jg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:H.join(i,...a?[`shard-${a.shardIndex+1}`]:[],ag(t.path,n)),maxAttempts:r+1}}async function Mg(e,t){Pg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Ng(e,t,r);if(Fg(n,i),Ig(e,i.outcome,r))break;Lg(e,t,i)}return n}async function Ng(e,t,n){let{entry:r,sessionName:i,suiteInvocationId:a,caseIndex:o,suiteIndex:s,suiteTotal:c,requestId:l,timeoutMs:u,shard:d}=e,f=n+1,p=Date.now(),m=pg(i,a,r.path,o,n),h=H.join(t.testArtifactsDir,`attempt-${f}`);og(r.path,h);let g=hg({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Hg(d)},v=await xg({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return sg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Pg(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:pg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Hg(c)})}function Fg(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function Ig(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Lg(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Hg(e.shard)})}function Rg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?zg(e,t,n,r):Bg(e,t,n,r)}function zg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Hg(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}:{},...Vg(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Bg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...Hg(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...c?.status===`failed`&&c.infrastructure?{infrastructure:!0}:{},...c?.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...Vg(s)}}function Vg(e){return Hg(e)}function Hg(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Ug(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 Wg(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),c=await Gg(t,u,d);Yg(c,a);let p=c.shardPlan?Xg({entries:c.entries,total:c.total,emitProgress:a}):[];return c.shardPlan?p.push(...await Zg({shards:c.shardPlan.shards,sessionName:f,suiteInvocationId:c.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:c.suiteArtifactsDir,suiteTotal:c.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l})):p.push(...await t_({discoveryEntries:c.entries,sessionName:f,suiteInvocationId:c.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:c.suiteArtifactsDir,suiteTotal:c.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l})),{status:`completed`,data:i_(c.total,p,Date.now()-e,c.suiteArtifactsDir)}}catch(e){let t=c(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Gg(e,t,n){let r=Kg(e,t),i=qg(r),a=r.length-i.length,o=mg(e.requestId),s=await Ug(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:Jg(e,o),total:s?.total??r.length}}function Kg(e,t){return fg({platformFilter:e.platformFilter,discoverSources:t})}function qg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Jg(e,t){return ig({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Yg(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 Xg(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 Zg(e){return(await Promise.allSettled(e.shards.map(async t=>await $g({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Qg(r,e.sessionName,t.reason)]:[]})}function Qg(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:e_(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function $g(e){let{shard:t,sessionName:n}=e;return await n_({...e,entries:t.entries,sessionName:e_(n,t),shard:t})}function e_(e,t){return`${e}:shard-${t.shardIndex+1}`}async function t_(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await Ag({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:_g(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:gg(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),r_(t,o,p))break}return g}async function n_(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await Ag({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:_g(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:gg(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),r_(b,o,m))break}return _}function r_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function i_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=g(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function a_(e,t){return()=>e.map(e=>o_(e,t))}function o_(e,t){let n=e.entry,r=ln(e,n),i=Mt(n,t)===`maestro`,a=at(r);return{path:n,manifest:{...i?{title:rr(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function s_(e){return async t=>(await u_(e,t)).map(c_)}function c_(e){if(e.platform===`web`||!x(e))throw new t(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function l_(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 u_(e,n){let r=m_(e),i=f_(await wi(d_(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${p_(n)}, but only ${i.length} matched`);return i.slice(0,n)}function d_(e){let t=I(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:y({simulatorSetPath:Si(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function f_(e,t,n){return t.length>0?h_(e,t,n):e.filter(e=>g_(e,n)).sort(y_)}function p_(e){return`${e} device${e===1?``:`s`}`}function m_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function h_(e,n,r){return n.map(n=>{let i=v_(n),a=e.find(e=>__(e,r)&&(e.id===n||v_(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function g_(e,t){return!__(e,t)||!x(e)?!1:e.booted!==!1}function __(e,t){return!(!v(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function v_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function y_(e,t){return e.id.localeCompare(t.id)}function b_(e){let n=x_(e?.shardAll,`--shard-all`),r=x_(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function x_(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}const S_=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 C_(e){return S_.has(e.toUpperCase())}const w_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function T_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=E_(e);return t?D_(t.details)||O_(t.code,t.message):!1}function E_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function D_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||Gn(t)?!0:t?C_(t):!1}function O_(e,t){let n=`${e}\n${t}`.toLowerCase();return w_.some(e=>n.includes(e))}function k_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:M_(e.error.details?.artifactPaths),infrastructure:T_(e),...N_(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:j_(t?.warnings),artifactPaths:M_(t?.artifactPaths),...N_(t?.snapshotDiagnostics)}}function A_(e){if(!e||e.ok)return;let t=k_(e);return t.status===`failed`?t:void 0}function j_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function M_(e){return[...new Set(j_(e))]}function N_(e){let t=h(e);return t?{snapshotDiagnostics:t}:{}}const P_=1e3,F_=3e3;function I_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await L_(e)}}async function L_(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=wr(o.device.platform),c=i?H.join(i,`recording${s}`):Cr(o.device.platform);z_(a,{type:`video_recording_start`,session:n,videoPath:c}),N({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(B_({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 Sr(P_),z_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:P_}),N({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:P_}}),l}async function R_(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:F_});let o=Date.now();await Sr(F_);let s=Date.now(),c=await e.video.record(B_({req:t,sessionName:n,phase:`stop`}));return jf(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}),N({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 B_(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 V_=[{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.`}],H_=({attemptId:e,parentAttemptId:t})=>{Ur(e);let n=U_(e,t);return{cancel:()=>Br(e),release:()=>{n(),Hr(e)}}};function U_(e,t){if(!t||t===e)return()=>{};let n=P(t);if(!n)return()=>{};let r=()=>{Br(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function W_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=G_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:l_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function G_(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 K_(e){let{request:t,session:{name:n,logPath:r},createSession:i,invoke:a,cleanupSession:o,video:s}=e;if(t.flags?.recordVideo===!0&&s===void 0)return F(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of V_)if(e.requested(l))return F(`INVALID_ARGS`,e.message);let u,d;try{u=Y_(t,n),d=J_(t)}catch(e){let t=c(e);return F(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Wg({request:u,emitProgress:Wr,isCanceled:()=>Vr(t.meta?.requestId),emitDiagnostic:N,bindAttemptCancellation:H_,runReplay:async({filePath:e,sessionName:n,platform:o,target:c,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&jf(e).forEach(e=>d.add(e)),e),v=W_({parentFlags:t.flags,platform:o,target:c,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=i(n,r),b=s?{req:t,sessionName:n,sessionStore:y.store,artifactsDir:u,appendTimingEvent:m,video:s}:void 0,x=b?I_(b):void 0;return k_(await eg({request:{...t,command:`replay`,session:n,positionals:[e],flags:v,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||x?{internal:{...t.internal??{},...x?{openLifecycle:x}:{}}}:{}},session:y,tracePath:p,onStep:g,invoke:async e=>{let t=b?await L_(b):void 0;return t&&!t.ok?t:_(await a(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,appendTimingEvent:o})=>{if(s)return A_(await R_({req:t,sessionName:e,sessionStore:i(e,r).store,artifactsDir:a,appendTimingEvent:o,artifactPaths:n,video:s}))},discoverSources:a_(d,t.flags?.replayBackend),resolveShardTargets:s_(t.flags),cleanupSession:o});return p.status===`completed`?{ok:!0,data:q_(p.data,t)}:F(p.error.code,p.error.message)}function q_(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=H.join(n,H.basename(r)),a=e=>e===r||e.startsWith(r+H.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:H.basename(r)}]}:o}function J_(e){let n=e.flags?.replayScriptSources;if(!n)throw new t(`INVALID_ARGS`,on);return n}function Y_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=Z_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:Ar(i,r),failFast:n.failFast===!0,retries:X_(n.retries),timeoutMs:X_(n.timeoutMs),shard:b_(n)}}function X_(e){return typeof e==`number`?e:void 0}function Z_(e){return typeof e==`string`?e:void 0}function Q_(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await ra({req:$_(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function $_(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 ev=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await eg({request:e,session:nv(t,n,r),invoke:a??i}),tv=async({req:e,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Q_({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await K_({request:e,session:nv(n,r,i),createSession:(e,t)=>nv(e,t,i),invoke:s??o,cleanupSession:async t=>await rv({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function nv(e,t,n){let r=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1};return{name:e,logPath:t,store:{get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)},mutationStore:{update:r,clearRepairTombstone:()=>n.clearRepairTombstone(e)},observationStore:{get:()=>n.get(e),update:r}}}async function rv(e){let{req:n,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await oc({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new t(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function iv(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command!==ar.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return cv(new t(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return cv(new t(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=sv(a);if(o)return cv(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return cv(new t(`INVALID_ARGS`,`session save-script path cannot be empty.`));Lt(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:Kt(a,n.flags?.force),publication:`active`});return c.written?(Ht(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...M(`Published script: ${c.path}`)}}):cv(c.error??new t(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function av(e){if(dt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:It(e)?void 0:`not-armed`}const ov={repair:()=>new t(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new t(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new t(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new t(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function sv(e){let t=av(e);return t?ov[t]():void 0}function cv(e){return{ok:!1,error:n(e)}}function lv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function uv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Pi(e)}}async function dv(e,n,r){if(r.length!==1)throw new t(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(uv(n))}}async function fv(e,n,r){if(r.length<2)throw new t(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...uv(n),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...M(`Clipboard updated`)}}async function pv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await R({command:`clipboard`,device:t,use:ke,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>dv(n,e,r)}}let o=await R({command:`clipboard`,device:t,use:Ne,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>fv(s,e,r)}}async function mv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=Y(ir.clipboard,s,c);if(l)return l;let u=t.positionals??[],d=lv(u);if(!d)return F(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let f=await X({session:s,flags:c}),p=await pv({device:f,action:d,positionals:u,inspectFacts:a,bindDevice:o});if(!p.ok)return p.response;let m=await p.execute(ki(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,m),{ok:!0,data:{platform:E(f),...m}}}function hv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function gv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function _v(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function vv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Wr({type:`command`,status:`progress`,message:yv(t)})}function yv(e){return[na(e),...ta(e)].join(`
3
- `)}async function bv(e,t){let{device:r,targetApp:i,session:a,listInstalledApps:o}=t;if(i)try{let t=o?xv(i,await o(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${E(r)}.`,evidence:{requested:i,platform:E(r)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(t){let i=n(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${E(r)} --all`,evidence:{code:i.code,message:i.message}})}}function xv(e,n){let r=e.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new t(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new t(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Sv(e,t,r){let i=wv(t,r);try{let t=await Ev(i),n=Tv(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Av(n,i,t.failures),hint:n.length===0?Nv(t.failures):void 0,command:n.length===0?Rv(i):void 0,evidence:zv(n,t.failures)}),n.length>0&&Dv(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(t){let r=n(t);return $(e,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function Cv(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:E(e),id:e.id,name:e.name}))}})}function wv(e,t){let n=e.flags??{};return Oi({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 Tv(e,t){return e.filter(e=>S(e,t,{includeExplicitSelectors:!0}))}async function Ev(e){if(e.platform)return{devices:await wi(e),failures:[]};let t=[],n=[];for(let r of mr)try{t.push(...await wi({...e,platform:r}))}catch(e){n.push(kv(r,e))}return{devices:t,failures:n}}function Dv(e,t){for(let n of t)$(e,Ov(n))}function Ov(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Iv(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Iv(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function kv(e,t){let r=n(t);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Av(e,t,n){if(e.length===0)return n.length>0?`No ${jv(t)} devices found; ${Mv(n)}.`:`No ${jv(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${jv(t)} ${Lv(e.length,`device`)} available; ${r} booted`,a=Pv(e,t);return a?`${i} (${a}).`:`${i}.`}function jv(e){let t=e.platform?Iv(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Mv(e){return e.slice(0,2).map(e=>`${Iv(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Nv(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Pv(e,t){if(t.platform||t.target)return;let n=pr(e),r=Fv();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 Fv(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Iv(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 Lv(e,t){return e===1?t:`${t}s`}function Rv(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function zv(e,t){let n=new Map;for(let t of e){let e=E(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Bv=1500;async function Vv(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 Hv(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Uv(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 Hv(e,t,n){try{return await(n.resolveProcessInfo??Wv)(e,t)}catch{return}}function Uv(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 Wv(e,t){if(!Gv(e))return;let n=await Kv(t);if(n!==void 0)return{pid:n,cwd:await qv(n)}}function Gv(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Kv(e){let t=await br(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Bv});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 qv(e){let t=await br(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Bv});if(t.exitCode===0)return t.stdout.split(`
5
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Jv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Yv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Xv(e,t){let n=Nr(e.meta?.cwd);return{targetApp:ty(e.flags?.targetApp)??t?.appBundleId,metroHost:ty(e.runtime?.metroHost)??`127.0.0.1`,metroPort:ny(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:$v(e,n)}}function Zv(e,t={}){let n=ey(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 Qv(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${E(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function $v(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function ey(e){let t={...Object.fromEntries([...Jv,...Yv].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 ty(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function ny(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function ry(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==ir.doctor)return null;let s=iy(e.hostDiagnostics),c=r.get(n),l=Xv(t,c),u=sy(r,n),d=[];if(vv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${kr()} using ${u}`,evidence:{version:kr(),stateDir:u}},...Zv(t,{required:l.remote}),...Qv(r,n,c,{remote:l.remote})),l.remote)return fy(d,l);let f=ay(l,u,i),p=await Sv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await cy({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??oy(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return fy(d,l,{device:h,includeMetro:!0,inventory:p})}function iy(e){if(!e)throw new t(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function ay(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>Jr(e),emitProgress:e=>Wr({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ti(e),shouldPropagateInventoryProbeError:Ci,transportOverrides:Object.freeze({androidAdb:n})})}function oy(e){let t=(e?.devices??[]).filter(e=>C(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function sy(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function cy(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Cv(t,i,a.targetApp);return u&&await ly(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await Vv(a.metroHost,a.metroPort,a.kind)),vv(t,...await r.ambientChecks(n)),u}async function ly(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await uy({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await bv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),vv(e,...await r.deviceChecks(i,n))}async function uy(e){if(e.device.platform!==`harmonyos`)return dy(e)}async function dy(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Te),u=I(n.flags?.androidDeviceAllowlist),d=await dc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await fc(l,d,e)}function fy(e,t,n={}){let r=hv(e);return{ok:!0,data:{status:r,summary:gv(r),kind:t.kind,platform:n.device?E(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:_v(e)}}}async function py(e){return await R({...e,command:`prepare`,use:He})}async function my(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return F(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(ir.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s}),u=await py({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let d=Date.now(),f=await u.runtime.operations.prepareAppleRunner({timeoutMs:hy(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:yi(t)}});return{ok:!0,data:gy(a,l,Math.max(0,Date.now()-d),f)}}function hy(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ae}function gy(e,t,n,r){return{action:e,platform:E(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:_y(n,r),message:`Prepared Apple runner: ${t.name}`}}function _y(e,t){let n=vy(t.buildMs),r=yy(t.connectMs),i=yy(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 vy(e){return e===void 0?void 0:yy(e)}function yy(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const by=e=>pc(e),xy=e=>yl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Sy=e=>oc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Cy=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Ol({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),wy=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ku({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),Ty={session_list:by,devices:by,capabilities:by,apps:by,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await ry({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Cy,shutdown:Cy,appstate:Cy,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>iv({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Go({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await mv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Ss,perf:wy,logs:wy,events:wy,network:wy,audio:wy,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await my({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Is,reinstall:Is,install_source:Is,release_materialized_paths:async({req:e})=>await ko({req:e}),push:Is,"trigger-app-event":Cs,open:xy,replay:ev,test:tv,batch:async({req:e,sessionName:t,invoke:n})=>await Ls(e,t,n),close:Sy};async function Ey(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new kn,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=Ty[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{Ey as handleSessionCommands};
1
+ import{A as e,C as t,M as n,T as r,d as i,g as a,m as o,t as s,w as c,z as l}from"./sdk-contracts.js";import"./capture.js";import{D as u,n as d,r as f,t as p}from"./sdk-batch-runner.js";import{a as m,n as h,t as g}from"./snapshot-diagnostics.js";import{f as _}from"./android-input-ownership.js";import{_ as v,b as y,c as b,d as x,g as S,l as C,m as w,u as T,v as E}from"./sdk-device.js";import{A as ee,B as D,Cr as O,F as te,G as ne,I as re,In as ie,Ir as ae,J as oe,K as se,L as ce,N as le,P as ue,R as de,Rn as fe,Sr as pe,St as me,T as he,U as ge,Ur as _e,Vn as ve,Vr as ye,W as be,Wn as xe,X as Se,Y as Ce,Z as we,at as Te,bt as Ee,d as De,dn as Oe,dt as ke,en as Ae,f as je,fn as Me,ft as Ne,hn as Pe,j as Fe,jt as Ie,mn as Le,nn as Re,nr as ze,nt as Be,pn as Ve,q as He,rr as Ue,rt as We,tr as Ge,v as Ke,xt as qe,z as Je,zn as Ye,zr as Xe,zt as Ze}from"./sdk-batch.js";import{u as Qe}from"./scroll-gesture.js";import{a as $e,b as et,f as tt,g as nt,n as rt,p as it,r as at,w as ot,y as st}from"./script.js";import{_ as ct,a as lt,c as k,d as ut,f as dt,g as ft,h as pt,l as mt,m as ht,p as gt,t as A,u as _t}from"./session-store.js";import{a as vt,c as yt,n as bt,o as xt,r as St,t as Ct}from"./session-target-evidence.js";import{a as wt,i as Tt,n as Et,o as Dt,r as Ot,s as kt,t as At}from"./vars.js";import{n as jt,r as Mt,t as Nt}from"./format.js";import{A as Pt,_ as Ft,d as It,g as Lt,h as Rt,j as zt,k as Bt,l as Vt,m as Ht,o as Ut,p as Wt,s as Gt,u as Kt}from"./parameterized-recorded-fill.js";import{F as qt,N as Jt,P as Yt,c as Xt,f as Zt,j as Qt,v as $t}from"./runtime.js";import{$ as en,A as tn,B as nn,C as rn,D as an,F as on,G as sn,H as cn,I as ln,J as un,K as dn,L as fn,M as pn,N as mn,Q as hn,R as gn,S as _n,T as vn,U as yn,V as bn,W as xn,X as Sn,Y as Cn,Z as wn,_ as Tn,b as En,c as Dn,d as On,dt as kn,et as An,f as jn,ft as Mn,g as Nn,h as Pn,it as Fn,j as In,k as Ln,l as Rn,m as zn,mt as Bn,n as Vn,nt as Hn,o as Un,p as Wn,q as Gn,r as Kn,rt as qn,t as Jn,tt as j,u as Yn,v as Xn,w as Zn,x as Qn,y as $n,z as er}from"./device-claim-rule.js";import{n as tr,t as nr}from"./catalog.js";import{g as rr,i as ir}from"./observability.js";import{n as M,r as ar}from"./success-text.js";import{d as or,i as sr,u as cr}from"./absence-observation-errors.js";import{t as lr}from"./app-inventory.js";import{r as ur,t as dr}from"./device.js";import{a as fr,o as pr,r as N}from"./diagnostics.js";import{a as mr,i as hr,r as gr}from"./verified-file.js";import{c as _r,p as vr}from"./exec.js";import{t as yr}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as br,r as xr}from"./output-path.js";import"./command.js";import{a as Sr,i as Cr,n as wr,t as Tr}from"./replay-divergence.js";import"./retry.js";import{r as Er}from"./version.js";import{t as Dr}from"./session-paths.js";import{i as Or,r as kr}from"./session-artifact-paths.js";import{t as Ar}from"./project-runtime.js";import{r as jr}from"./rect-center.js";import{o as Mr}from"./android-system-chrome.js";import{t as Nr}from"./keyed-lock.js";import{n as Pr,t as Fr}from"./deploy-result-target.js";import{t as Ir}from"./keyboard-actions.js";import{a as Lr,i as Rr,n as zr,o as Br,r as P}from"./request-cancel.js";import{t as Vr}from"./request.js";import{i as Hr,s as Ur}from"./provider-session-ownership.js";import{a as Wr,i as F,s as Gr}from"./request-runtime-binding.js";import{C as Kr,E as I,O as qr,g as L,h as Jr,i as Yr,k as Xr,m as Zr,n as Qr,s as $r,v as ei,x as ti}from"./session-snapshot.js";import{c as ni,i as ri,t as ii}from"./device-claim-inspection.js";import{t as ai}from"./audio-probe-result.js";import{T as oi,_ as si,a as ci,b as li,c as ui,d as di,f as fi,g as pi,h as mi,i as hi,l as gi,m as _i,n as vi,o as yi,r as bi,s as xi,t as Si,u as Ci,v as wi,x as Ti}from"./perf-runtime-plan.js";import{i as Ei,n as Di}from"./lease-context.js";import{h as Oi}from"./screenshot-runtime.js";import{n as R,r as ki}from"./device-isolation.js";import{a as Ai,n as ji,r as Mi}from"./device-inventory-context.js";import{n as Ni,r as Pi,t as Fi}from"./dispatch-resolve.js";import{t as Ii}from"./touch-reference-frame.js";import{a as Li,i as Ri,l as zi,n as Bi,o as Vi,s as Hi,u as Ui}from"./session-routing.js";import{d as z}from"./src8.js";import{i as Wi,n as B,r as Gi}from"./compatibility-policy.js";import{o as Ki,p as qi}from"./quality-warnings.js";import{a as Ji,i as V,n as Yi,r as Xi,t as Zi}from"./session-runtime-admission.js";import{t as Qi}from"./semantic-index.js";import{n as $i,r as ea}from"./device-selection-resolver.js";import{n as ta,r as na}from"./doctor-output.js";import{t as ra}from"./record-runtime.js";import{n as ia}from"./gesture-runtime.js";import{i as aa,n as oa,r as sa}from"./platform-runtime-open-target.js";import{t as ca}from"./snapshot-runtime.js";import{t as la}from"./app-log-files.js";import H from"node:path";import U,{promises as W}from"node:fs";import{createHash as ua}from"node:crypto";import da from"node:os";import{fileURLToPath as fa}from"node:url";import{setTimeout as pa}from"node:timers/promises";import ma from"node:vm";function G(e,t){return z({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function ha(e){return z({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function ga(e,t){let n=xa(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},ha(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:_a(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function _a(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function va(e,t,n,r){let i=xa(await r.resolveTarget({selector:e,...t},G(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw An(`Maestro target did not resolve to a visible element.`,{selector:e,candidateCount:i.candidateCount});return{kind:`selector`,selector:e,query:{selector:e,...t},...i,rect:i.rect}}function ya(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function ba(e){if(!e||typeof e!=`object`)return!1;let t=e;return[`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`&&Number.isFinite(t[e]))}function xa(e,t){return Sa(e,t),Ca(e),wa(e),Ta(e),e}function Sa(e,n){if(e.generation!==n)throw new t(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${n}.`)}function Ca(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function wa(e){if(e.rect!==void 0&&!ba(e.rect)||e.viewport!==void 0&&!ba(e.viewport))throw new t(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Ta(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ea(e,t,n,r,i,a={}){let o=Da(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Ma(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Da(e,t,n,r,i){let a=n===`up`||n===`down`,o=nn(e,un(e,r),i),s=o.visibility,c=wn({visibility:s,matches:e.nodes.filter(e=>ae(e)),platform:r}),l=ye(s.viewportRects)??ka(c);if(!l||!Xe(l))return;let u=c.flatMap(e=>{if(!Xe(e.rect))return[];let t=Aa(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=Oa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(ja)[0]?.viewport}function Oa(e,t){return ae(e)?e:O(e,t)}function ka(e){let t;for(let n of e)Xe(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Aa(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width)-n,a=Math.min(e.y+e.height,t.y+t.height)-r;return i>0&&a>0?{x:n,y:r,width:i,height:a}:void 0}function ja(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ma(e,t){let n=K(e,.5,.5),r=B.scrollUntilVisibleSwipe.nearEdgeFraction,i=B.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:K(e,.5,i)};case`down`:return{start:n,end:K(e,.5,r)};case`left`:return{start:n,end:K(e,i,.5)};case`right`:return{start:n,end:K(e,r,.5)}}}async function Na(e,n,r){let i=j(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new t(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(G(n,n.command)):void 0;return{authored:e,gesture:Fa(await Pa(e.start,n,r,a),await Pa(e.end,n,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let t=await r.resolveGestureViewport(G(n,n.command)),{start:a,end:o}=Ia(t,e.direction,r.platform);return{authored:e,gesture:Fa(a,o,i),viewport:t}}let a=await va(e.from,{purpose:`swipe`,timeoutMs:`optional`in n.command&&n.command.optional===!0?B.command.optionalTargetLookupTimeoutMs:B.command.targetLookupTimeoutMs},n,r),o=a.viewport??await r.resolveGestureViewport(G(n,n.command)),{start:s,end:c}=La(a,e.direction,o);return{authored:e,gesture:Fa(s,c,i),target:a,viewport:o}}async function Pa(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(G(t,t.command));return{x:i.x+Math.trunc(i.width*e.x/100),y:i.y+Math.trunc(i.height*e.y/100)}}function Fa(e,t,n){return{from:e,to:t,durationMs:n??B.command.swipeDurationMs}}function Ia(e,t,n){if(t===`left`||t===`right`){let n=Qe(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=B.screenSwipe,i=K(e,r.centerFraction,r.nearEdgeFraction),a=K(e,r.centerFraction,r.farEdgeFraction),o=K(e,r.centerFraction,r.downStartFraction),s=K(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function K(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function La(e,t,n){let r=jr(e.rect),i=n.x+Math.trunc(n.width*B.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*B.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*B.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*B.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const Ra={launchApp:Ua,stopApp:Ua,clearState:Ua,openLink:Ua,tapOn:Ga,doubleTapOn:Ga,longPressOn:Ga,swipe:Xa,inputText:Za,eraseText:Za,scroll:Qa,scrollUntilVisible:Qa,hideKeyboard:Qa,pressKey:Qa,back:Qa,waitForAnimationToEnd:Qa,takeScreenshot:to,runScript:to,evalScript:ro,assertVisible:no,assertNotVisible:no,assertTrue:no,extendedWaitUntil:no},za={launchApp:!0,stopApp:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ba(e){return za[e.kind]}async function Va(e,t){let n=e.command;return await Ha(n,e,t,G(e,n))}function Ha(e,t,n,r){let i=Ra[e.kind];return i(e,t,n,r)}async function Ua(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,Wa(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`clearState`:return await q(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function Wa(e,t){return z({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function Ga(e,t,n,r){switch(e.kind){case`tapOn`:return await Ka(e,t,n,r);case`doubleTapOn`:{let i=await fo(e.target,{purpose:`doubleTap`,timeoutMs:Ja(e)},t,n),a=j(e.delay,`doubleTapOn.delay`)??B.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?ya(i.resolution):void 0)}case`longPressOn`:{let i=await fo(e.target,{purpose:`longPress`,timeoutMs:Ja(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?ya(i.resolution):void 0)}}}async function Ka(e,t,n,r){let i=await qa(e,t,n);return await q(n.tapOn,Ya(e,i),r,`invalidate`,i.resolution?ya(i.resolution):void 0)}async function qa(e,t,n){let r={purpose:`tap`,timeoutMs:Ja(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await fo(e.target,r,t,n)}function Ja(e){return e.optional===!0?B.command.optionalTargetLookupTimeoutMs:B.command.targetLookupTimeoutMs}function Ya(e,t){let n=j(e.repeat,`tapOn.repeat`),r=j(e.delay,`tapOn.delay`),i=n===void 0?r:r??B.command.repeatDelayMs;return z({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Xa(e,t,n,r){let i=await Na(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?ya(i.target):void 0)}async function Za(e,t,n,r){switch(e.kind){case`inputText`:return await q(n.inputText,z({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await q(n.eraseText,z({charactersToErase:j(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function Qa(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,$a(e),r,`invalidate`);case`hideKeyboard`:return await q(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await q(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await q(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await q(n.waitForAnimationToEnd,eo(e),r,`preserve`)}}function $a(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:j(e.timeout,`scrollUntilVisible.timeout`)??B.command.scrollUntilVisibleTimeoutMs,durationMs:Wi(B.command.scrollUntilVisibleSpeed)}}function eo(e){return z({timeoutMs:j(e.timeout,`waitForAnimationToEnd.timeout`)})}async function to(e,t,n,r){switch(e.kind){case`takeScreenshot`:return ao(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await q(n.runScript,z({file:e.file,env:e.env}),r,`preserve`)}}async function no(e){throw new t(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function ro(e){throw new t(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function q(e,t,n,r,i){let a=io(n,r);return ao(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function io(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function ao(e,t,n,r){let i=e?.observation;return oo(i,r),{...so(n??i),...co(e?.outputEnv),...lo(t,e?.artifactPaths),...uo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function oo(e,n){if(!(!e||n===void 0||e.generation===n))throw new t(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${n}.`)}function so(e){return e?{observation:e}:{}}function co(e){return e?{outputEnv:{...e}}:{}}function lo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function uo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function fo(e,t,n,r){if(e.space===`target`){let i=await va(e.selector,t,n,r);return{authored:e,point:jr(i.rect),resolution:i}}return{authored:e,point:await Pa(e,n,r)}}function po(e,t,n,r={}){let i=n===`ios`&&r.presentation?ho(r.presentation):void 0,a=i?go(e,t,i):cn(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:bo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?sn(s,t.selector.index):xn(s,t.selector.index)?.node,l=bo(t,o,s,c);if(!c)return _o(t,o,s,l);let u=i?xn(i.visibleForSource(c),void 0):null,d=dn(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!mo(t.selector)&&i?vo(d,s,u):0,evidence:l}:_o(t,o,s,l)}const mo=Sn;function ho(e){let t=pe(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>hn(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function go(e,t,n){let r=un(e,`ios`),i=Cn(e,{},{orderUnindexed:e=>Gn(e,r)}),a=bn(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:yn(o,t.selector,`ios`,i.visibility,r)}}function _o(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function vo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&yo(n.rect,e)?1:0:t.length}function yo(e,t){let n=jr(e),r=jr(t);return n.x===r.x&&n.y===r.y}function bo(e,t,n,r){return z({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:Gi,retryTapMaxAttempts:B.command.retryTapMaxAttempts,longPressDurationMs:B.command.longPressDurationMs,eraseTextMaxCharacters:B.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:B.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:B.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:B.command.waitForAnimationToEndDifferencePercent,observationPollMs:B.observation.pollIntervalMs};function xo(e,t={}){return{execute:async n=>{let r=G(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ba(n.command)&&!i,visualStabilityBarrier:i});let a=await Va(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await ga(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function So(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Co(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:So(n)}}function wo(e){let t=Co(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Ur(n,e.meta?.tenantId)},cleanup:()=>{Hr(n)}}}function Y(e,t,n){return t||qn(n)?null:F(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function To(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function X(e){return Fn(e.flags)||!e.session?await Ni(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Eo(e.session.device)}async function Eo(e){if(Gr(e)||!C(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ei.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 Ni(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Ni({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Do(e,t){return t?zi(t,e).length===0:!1}async function Oo(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=wo(t);let n=Mo(t),l=await Ao(a,t.flags),u=await Xi(e.inspectFacts)(l),d=V(`install_from_source`,u.operations.ensureReady)??V(`install_from_source`,u.operations.materializeAppSource)??V(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Yi(e.bindDevice)(l,Se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await No({artifact:s,retention:n,req:t,session:a,sessionName:r}),a&&I(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Po(l,s,p,c),h=ar(m,`Installed: ${Pr(m)}`);return k(i,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Ln(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:n(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function ko(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Ln(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:n(e)}}}async function Ao(e,n){let r=jo(n?.platform);if(e&&r&&e.device.platform!==r)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await X({session:e,flags:n})}function jo(e){return e===`ios`||e===`android`?e:void 0}function Mo(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function No(e){if(e.retention.enabled)return await In({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 Po(e,t,n,r){return C(e)?Fo(t,n,r):Io(t,n,r)}function Fo(e,n,r){let i=n.bundleId??e.bundleId;if(!i)throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Ro(r),bundleId:i,...Lo(n,e),launchTarget:n.launchTarget??i}}function Io(e,n,r){let i=n.packageName??n.launchTarget??e.packageName;if(!i)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Ro(r),packageName:i,...Lo(n,e),launchTarget:n.launchTarget??i}}function Lo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Ro(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function zo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Bo(t);if(!a.ok)return a.response;let o=Y(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await X({session:n,flags:t.flags}),c=await L({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:D});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return F(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:F(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Bo(e){let t=Vo(e);if(!t.ok)return t;let n=Ho(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 Vo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Ho(e){let t=Uo(e.flags?.devicePort),n=Uo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Uo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Wo(e){return await L({...e,command:`runtime clear`,use:ce})}async function Go(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await zo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Ko({...e,session:r.get(n)});if(!qo(i))return F(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Jo({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Yo(n,o):Zo({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Ko(e){if(!e.session)return F(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ia({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Kr(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 qo(e){return e===`set`||e===`show`||e===`clear`}async function Jo(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(On(i)&&r?.appBundleId){let e=await Wo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;I(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Pn(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Yo(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Xo(e){return e?E(e.device):void 0}function Zo(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Xo(i),s=Xn(t.flags?.platform??a?.platform??o);if(!s)return F(`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 F(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Wn(a,Rn(t.flags,s));return Yn(c)===0?F(`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 Qo=/^[A-Za-z0-9_.:-]{1,64}$/,$o=8192,es=4096;function ts(e){let n=e[0]?.trim(),r=e[1]?.trim();if(!n)throw new t(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Qo.test(n))throw new t(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new t(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:rs(r,n)}}function ns(e,n,r){let i=E(e),a=is(e);if(!a)throw new t(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>es)throw new t(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:es});return s}function rs(e,n){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>$o)throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${$o} bytes`);return r}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function is(e){return((C(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function as(e,t,n,r){let{eventName:i,payload:a}=ts([...r]),o=ns(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Zr(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...M(`Triggered app event: ${i}`)}}async function os(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await L({command:`trigger-app-event`,device:t,use:Be,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>as(s,t,e,n)}}function ss(e){let n=(e[0]??`status`).toLowerCase();if(!Ir(n))throw new t(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new t(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return cs(n)}function cs(e){return e===`get`?`status`:e===`return`?`enter`:e}const ls={"ime-probe":`android`},us={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ds={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function fs(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Zr(e)}}async function ps(e,t){let n=await L(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ms(e,t){return e.operations.keyboardStatus(fs(t)).then(e=>({platform:ls[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 hs(e,t){let n=await e.operations.keyboardDismiss(fs(t)),r=us[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...M(vs(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 gs(e,t){let n=await e.operations.keyboardEnter(fs(t)),r=ds[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 _s(e){let t=ss(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ps({command:`keyboard status`,device:n,use:me,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ms(e,t)):t===`dismiss`?await ps({command:`keyboard dismiss`,device:n,use:Ee,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>hs(e,t)):await ps({command:`keyboard enter`,device:n,use:qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>gs(e,t))}function vs(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ys(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=Y(i,l,u);if(d)return d;let f=await X({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Oi(t)===`may-invalidate`&&I(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function bs(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return F(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function xs(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ys({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Kr(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Ss(e){return bs(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await xs({...e,command:tr.keyboard,resolveRuntime:e=>_s(e)})}async function Cs(e){return await xs({...e,command:tr.triggerAppEvent,resolveRuntime:e=>os(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await sa(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function ws(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Ts(e,n){let r=n?.subject??`Payload`,i=e.trim();if(!i)throw new t(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!U.statSync(a).isFile())throw new t(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof t)throw e;let n=e.code;if(n===`EACCES`||n===`EPERM`)throw new t(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new t(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(ws(i))return{kind:`inline`,text:i};throw new t(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Es(e){let n=Ts(e,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await Ds(n.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ds(e){try{return await W.readFile(e,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new t(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new t(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new t(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new t(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function Os(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=Y(n,a,o);if(s)return s;let c=Ps(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Ur(l,t.meta?.tenantId):A.expandHome(c.appPathInput);if(!U.existsSync(s))return F(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await X({session:a,flags:o}),d=await Xi(e.inspectFacts)(u),f=V(n,d.operations.deployApp);if(f)return f;let p=await Yi(e.bindDevice)(u,Ce);a&&I(a);let m=await p.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),h=As(u,c.app,s,m),g=ar(h,`Installed: ${h.appName??Fr(h)}`),_=Ns(a,h);return _&&_!==a&&i.set(r,_),k(i,_,t,n,g),{ok:!0,data:g}}finally{l&&Hr(l)}}async function ks(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=Y(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return F(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Es(Fs(c,t.meta?.cwd)),u=await X({session:i,flags:a}),d=await Xi(e.inspectFacts)(u),f=V(`push`,d.operations.ensureReady)??V(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Yi(e.bindDevice)(u,we);await p.operations.ensureReady({}),i&&I(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=C(u)?ar({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):ar({platform:E(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function As(e,t,n,r){return C(e)?js(t,n,r):Ms(e,t,n,r)}function js(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 Ms(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 Ns(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ps(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:F(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:F(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Fs(e,t){let n=Ts(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Is(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Os({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Oo({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await ks({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Ls(e,t,n){return await d(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Rs=new Set(`acceptAlert.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function zs(e){return Rs.has(e)}const Bs=new Map(De.map(e=>[e.name,e]));function Vs(e){let t=new Set;for(let n of e){let e=Hs(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Hs(e){let t=Bs.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(zs)?n:void 0}function Us(e){if(e!==void 0&&e.remainingSteps.length!==0)return Vs(e.remainingSteps)}function Ws(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:Ei(e),plannedOperations:Us(e.internal?.executionPlan)}}function Gs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...M(`Closed: ${t.name}`)}})}function Ks(e,t,n){if(!dt(t))return{kind:`not-armed`};let r=t.actions.length;Gs(e,t,n);let i=Wt(t),a=e.writeSessionLog(t,{force:Kt(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(mt(t),{kind:`aborted`})}function qs(e,t){let r=n(t),i=Pt(e.scriptPublication??Ft);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Js(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Gs(r,n,t);try{let e=r.writeSessionLog(n,{force:Kt(n,t.flags?.force)});e.written&&Rt(n,e.path);return}catch(e){return Ys(e)}}function Ys(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof t?new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n(e).message}`,r)}async function Xs(e){let t=e.clearRuntimeHints?Je:de,n=await Jr({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,de)};let r=await n.bind(e.device,Je);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Zs(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await Qs(n,a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&On(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Pn(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>tn(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Qs(e,t,n,r){let i=t.get(e.name)??e;i.screenRecording&&await n(`recording`,()=>Qn({session:i,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>rn({session:e,sessionName:e.name,sessionStore:t})),await n(`audio_probe`,()=>En({session:e,sessionName:e.name,sessionStore:t})),await n(`perf_capture`,()=>Zn({session:e,sessionName:e.name,sessionStore:t})),await n(`platform_snapshot_helper`,()=>vn(e,r))}function $s(e,t){return _n({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function ec(e){if(e instanceof t)return e;let n=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const tc=(e,t)=>(e.positionals?.length??0)>0||an(t);async function nc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=dt(n),s=JSON.stringify(t.positionals??[]);if(o&&!ut(n,s)){let e=await ic({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:qs(n,ec(e))};pt(n,s)}let c=Ks(i,n,t);return c.kind===`failed`?{response:qs(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function rc(e){try{return{providerData:await kn(e)}}catch(t){let r=n(t);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function ic(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(tc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Ws(t,r,n.trace?.outPath)});return}catch(e){return e}}function ac(e,n){if(!e.flags?.saveScript||It(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new t(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new t(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function oc(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.get(r);if(!c)return await uc({req:n,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});ac(n,c);let l=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!l)return F(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let u=e.platformResourceCleanup,d=await Xs({device:c.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!c.appBundleId&&On(a.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;if(I(c),n.internal?.closeAppOnly===!0&&l)return await lc({req:n,session:c,logPath:i,lifecycle:d.runtime,app:l});let f=await nc({req:n,session:c,logPath:i,sessionStore:a,lifecycle:d.runtime});if(`response`in f)return f.response;let p=await sc({req:n,session:c,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:d.runtime,clearRuntimeHints:d.clearRuntimeHints,repairArmed:f.repairArmed,platformResourceCleanup:u});return p.kind===`response`?p.response:cc({session:c,repair:f,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:p.shutdownResult,providerData:p.providerData})}async function sc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Zs({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:ic,finalizeOrdinaryCloseScript:Js,platformResourceCleanup:e.platformResourceCleanup}),m=await rc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=$s(r,u),g=d??h;if(g?n.deviceClaim&&N({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await li(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function cc(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:ar({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...M(c),...o,...s}}}async function lc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await ic({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...M(`Closed: ${a}`)}}}async function uc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return F(`SESSION_NOT_FOUND`,`No active session`);let a=await Xs({device:await X({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Ws(t,n)}),{ok:!0,data:{app:t.positionals[0],...M(`Closed: ${t.positionals[0]}`)}})}function dc(e,t){return e.operations.ensureReady(t)}function fc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function pc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return mc(t,r);case`devices`:return await gc(t);case`capabilities`:return await wc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Ac({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function mc(e,t){let n=Li(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Vi(e.session,n)).map(e=>hc(e,t))}}}function hc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Or(r),platform:E(t.device),...b(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...b(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function gc(e){try{let t=_c();return{ok:!0,data:{devices:(await yc(e)).map(e=>({...Lc(e),...vc(e,t)}))}}}catch(e){let t=c(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function _c(){let e=new Map;for(let t of ri({})){let n=t.claim;!n||ii(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function vc(e,t){let n=t.get(ni(Ti(e)));return n?{claimedBy:n}:{}}async function yc(e){let t=e.flags?.platform;return Cc(await ji(bc(e,t)),e.flags?.platform,e.flags?.target)}function bc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:xc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Sc(n?.androidDeviceAllowlist)}}function xc(e,t,n){return y({simulatorSetPath:ki(e),platform:t,target:n})}function Sc(e){let t=R(e);return t?Array.from(t).sort():void 0}function Cc(e,t,n){let r=t?e.filter(e=>Rc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function wc(e){let t=await Ic({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Tc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Nc(n,e.inspectFacts);return{ok:!0,data:{device:Lc(n),availableCommands:Ke().filter(e=>e===`appstate`&&r?!0:Oc(e,i))}}}function Tc(e,t,n){return!t||!C(e)&&!T(e)||!Do(n,t)?!1:Ec(t)||Dc(e,t)}function Ec(e){return!!(e.appName||e.appBundleId)}function Dc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Oc(e,t){let n=je(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>kc(t,e)))}function kc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Ac(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await jc(t,e.providerAppCatalog);if(o)return o;let s=await Ic({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=lr(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await Pc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Fc(await fc(f,await dc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function jc(e,t){let n=Mc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,P(e.meta?.requestId))]}}}function Mc(e){let t=Di(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 Nc(e,t){if(t)try{return await t(e)}catch{return}}async function Pc(e){if(!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await e.inspectFacts(e.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Te)}}function Fc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Ic(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=Y(t.command,a,o);return s?{response:s}:{device:await X({session:a,flags:o,androidAvdSelection:i})}}function Lc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...b(r.platform)&&n?{appleOs:n}:{}}}function Rc(e,t){return v(e,t)}function zc(e){return F(`INVALID_ARGS`,e)}function Bc(e,n,r,i){try{return oa({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return F(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}async function Vc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await aa({target:n,platform:i.platform,surface:r});return a?zc(a):null}async function Hc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await aa({target:n,platform:r});return i?zc(i):null}function Uc(e){let t=$n(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:On(n),clearRemovedRuntimeHints:Tn({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Wc(e){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!f(a??``),execution:{startupDeadlineAtMs:Kc(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:Ei(n)}});let{appBundleId:d,appName:p}=await Gc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new t(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await jn({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:p,runtime:c.runtime}}}async function Gc(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 Kc(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}function qc(e,t){e.warnings=[...Jc(e),t]}function Jc(e){let t=e?.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}async function Yc(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:F(`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:F(`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:F(`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 Xc(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let n=await ca({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.ok?{ok:!0,data:{...o.data,snapshot:n.data}}:Zc(o.data,n.error)}catch(e){return Zc(o.data,n(e))}}function Zc(e,t){return{ok:!0,data:{...e,warnings:[...Jc(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Qc(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...$c(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=E(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,w(d.platform)&&(g.serial=d.id)),d&&C(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...M(`Opened: ${o??s??t}`)}}function $c(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function el(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const tl=Object.freeze({async observeBootTimeMs(e){if(C(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function nl(e){return e.internal?.resolvedSessionScope??Li(e)}function rl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Vt(t,{});return}It(n)&&(Gt(t),qc(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function il(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function al(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function ol(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function sl(e,t){if(!t)return;let n=await oi(t);if(n.status!==`renewed`)return n.conflict?Kn(e,n.conflict):F(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function cl(e){let{req:t,sessionName:n,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:u,appBundleId:d,runtimeHints:f,lifecycle:p,applyRuntimeHints:m,existingSession:h,deviceClaim:g,tookOverDeviceClaim:_,selection:v}=e,y=t.flags?.relaunch===!0,b=d,x=Date.now(),S=await ll({req:t,sessionName:n,sessionStore:i,device:o,surface:u,sessionAppBundleId:b,appName:l,existingSession:h});if(S.type===`response`)return S.response;let C=S.session??h,w=Date.now(),T=await p.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:b,surface:u,hasExistingSession:h!==void 0,relaunch:y,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:al(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Pn(f),applyRuntimeHints:m,execution:Ws(t,a,h?.trace?.outPath)});b=T.appBundleId??b;let E={...T.timing},ee=$i(v),D=s?ol(w,s,b):void 0;if(Rr(t.meta?.requestId)){let e=r();return F(e.code,e.message,e.details)}h&&ti({session:h,command:`open`,positionals:[],flags:void 0});let O=el({existingSession:C,sessionName:h?.name??Ri(t),sessionScope:h?.sessionScope??nl(t),device:o,surface:u,appBundleId:b,appName:l});O.lease=Mn({req:t,existingLease:h?.lease}),g&&(O.deviceClaim=g),t.runtime!==void 0&&Nn(i,n,f);let te=i.ensureSessionDir(n),ne=kr(te,t.meta?.requestId??fr().requestId);E.totalDurationMs=Math.max(0,Date.now()-x),N({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let re=Qc({sessionName:O.name,sessionStateDir:te,runnerLogPath:Or(te),requestLogPath:ne,eventLogPath:i.resolveEventLogPath(n),appName:l,appBundleId:b,surface:u,startup:D,timing:E,device:o,runtime:f,runtimeHintCount:Yn,sessionReused:h!==void 0,selection:ee});return _&&qc(re,il(_)),rl({session:O,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:re}),i.set(n,O),i.recordAction(O,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:re}),{ok:!0,data:re}}async function ll(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=ul(e);r.set(n,o);let s=await a(o);return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function ul(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=el({existingSession:o,sessionName:o?.name??Ri(t),sessionScope:o?.sessionScope??nl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=Mn({req:t,existingLease:o?.lease}),s}function dl(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(i)return Bi(t,i.session)?F(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):Ui(i,n)}async function fl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Jn(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Vn(n,r,Dn({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await wi({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:tl})}}async function pl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=dl({req:t,device:a,sessionStore:i});if(m)return m;let h=await fl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Kn(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await ml({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Wc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await sl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await cl({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function ml(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await li(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await si(t);N({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const hl=new Map;async function gl(e){let t=oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Jr({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ge)};case`open-apply-runtime-hints`:{let t=await r(e.device,ne);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,be);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function _l(e){let t=Uc(e);if(t.type===`response`)return t;let n=await gl({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function vl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Yc({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return F(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Bc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return zc(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let u=await Vc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await sl(i.device,i.deviceClaim);if(d)return d;let f=await Eo(i.device),p=ea(f);await o.internal?.retainDeviceExecutionLock?.(f.id);let m=await _l({req:o,sessionStore:r,sessionName:t,device:f,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;I(i);let _=await Wc({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:h.runtime,runtimeHintPlan:g,clearRuntimeHints:h.clearRuntimeHints,foreground:!1});return _.type===`response`?_.response:await sl(f,i.deviceClaim)||await cl({req:o,sessionName:t,sessionStore:r,logPath:n,device:f,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:_.details.appBundleId,appName:_.details.appName,runtimeHints:_.details.runtime,lifecycle:h.runtime,applyRuntimeHints:h.applyRuntimeHints,surface:l,existingSession:i,selection:p})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return zc(`open --relaunch requires an app argument.`);let l=await Hc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await Pi(o.flags??{},Hn(c)),d=u.device;await o.internal?.retainDeviceExecutionLock?.(d.id);let f=Bc(d,o.flags?.surface,c);if(typeof f!=`string`)return f;let p=await Vc({shouldRelaunch:s,openTarget:c,surface:f,device:d});if(p)return p;let m=await _l({req:o,sessionStore:r,sessionName:t,device:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;return await Nr(hl,d.id,async()=>await pl({req:o,sessionName:t,logPath:n,sessionStore:r,device:d,surface:f,openTarget:c,lifecycle:h.runtime,runtimeHintPlan:g,applyRuntimeHints:h.applyRuntimeHints,clearRuntimeHints:h.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:u}))}async function yl(e){let t=await vl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Xc({...e,inspectFacts:Xi(e.inspectFacts),bindDevice:Yi(e.bindDevice),openResponse:t})}const bl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,xl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Sl(e){return t=>F(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function Cl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function wl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Tl(e){return e.available?null:F(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function El(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Dl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&To(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return F(`SESSION_NOT_FOUND`,e)}let s=Y(`appstate`,i,a);if(s)return s;let c=b(i?.device.platform)&&Do(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return F(`SESSION_NOT_FOUND`,bl);if(u&&!c)return F(`SESSION_NOT_FOUND`,xl);if(c&&i){let e=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return F(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:E(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...C(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a});if(C(d))return F(`SESSION_NOT_FOUND`,bl);if(T(d))return F(`SESSION_NOT_FOUND`,xl);let f=await L({command:`appstate`,device:d,use:We,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>F(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:kl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:E(d),package:m.package,activity:m.activity}}}async function Ol(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=R(a.androidDeviceAllowlist),l=s?[...s].sort():void 0,u=Ie({headless:a.headless===!0}),d;try{d=await X({session:i,flags:a,androidAvdSelection:`include-stopped`})}catch(e){let t=c(e);if(u.kind===`boot-target-headless`&&!El(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return F(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(a.target&&(d.target??`mobile`)!==a.target)return F(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await Jr({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Sl(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:a.serial,androidSerialAllowlist:l};return d=u.kind===`boot-target-headless`?await(await f.bind(d,u.use)).operations.bootTargetHeadless(p):await(await f.bind(d,u.use)).operations.bootTarget(p),{ok:!0,data:{platform:E(d),target:d.target??`mobile`,device:d.name,id:d.id,kind:d.kind,booted:!0,...b(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=await X({flags:a,session:i,androidAvdSelection:`include-stopped`}),c=Tl((await Cl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return F(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await wl(e.bindDevice)(s,Ze)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...b(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:F(l.error?.code??`COMMAND_FAILED`,Al(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Dl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function kl(e){let t=R(e);return t?[...t].sort():void 0}function Al(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function jl(e){let t=hr(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=U.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{U.closeSync(t)}}function Ml(e,t){la(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=gr(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function Nl(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=mr(e);try{U.fsyncSync(r)}finally{U.closeSync(r)}let i=0;for(let e of U.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{U.unlinkSync(H.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Pl(e){return Ci.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Fl(e){try{return await Il(e)}catch(e){return{ok:!1,error:n(e)}}}async function Il(e){let t=Ll(e);if(!t.ok)return t;let n=t.session,r=le(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Rl(a,o);let c=ue({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await zl(e,n,r,c.use);case`capture-status`:return await Bl(e,n);case`capture-stop`:return await Vl(e,n)}}function Ll(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:F(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Rl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return F(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function zl(e,t,n,r){if(t.audioProbe){await ui({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return F(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=xi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=xi.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=H.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),c=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await yi({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...c,throwIfCanceled:e.throwIfCanceled});let l=e.sessionStore.get(e.sessionName)?.audioProbe;if(!l)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await l.handle.status()}}async function Bl(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Hl()};let r=await n.handle.status();return r.state===`stopped`&&await ui({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Vl(e,t){return t.audioProbe?{ok:!0,data:await ui({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Hl()}}function Hl(){return ai({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Ul(e){let r=e.sessionStore.get(e.sessionName);if(!r)return F(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(rr(e.req.positionals?.[0]))throw new t(`INVALID_ARGS`,ir);uu(e.req);let n=Si({positionals:e.req.positionals,kind:fu(e.req.flags?.kind),outPath:fu(e.req.flags?.out)}),i=vi(n);if(i.kind===`capture-stop`)return Wl(e,await Jl(e,r,i.request));let a=await Zi({device:r.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Wl(e,await Gl(e,r,a)):V(`perf`,a.fact)??F(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:n(e)}}}function Wl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,au(t.data)?{...t.data}:{}),t}async function Gl(e,n,r){let{device:i,plan:a}=Ji(r),o=Yi(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:eu(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:ou(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:su(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:H.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Kl(e,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=lu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:A.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Kl(e,t,n,r){if(t.perfCapture)return F(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return F(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=lu(e,r.outPath,i),o=ci.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=ci.createNextFence({admissionLedger:ql(e),resourcePath:o,device:t.device}),c=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await bi({admissionLedger:ql(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:c.pendingHandle,envelope:c.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:c.response}}function ql(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new t(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Jl(e,t,n){let r=t.perfCapture;if(!r)return F(`INVALID_ARGS`,`no active native perf capture`);let i=$l(r.handle.inspect(),n);if(i)return F(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let a=await hi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Yl(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function Yl(e){if(Xl(e)||Zl(e))return e;throw new t(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Xl(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Zl(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ql(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ql(e,t){return t.every(t=>typeof e[t]==`string`)}function $l(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function eu(e,t){return{...cu(e),metrics:{fps:tu(t.metric,e)},sampling:{fps:t.sampling}}}function tu(e,t){if(!au(e)||e.available!==!0)return e;let n=nu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function nu(e,t){let n=ru(t.windowStartedAt),r=ru(t.windowEndedAt)??ru(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:iu(e)})).slice(-12)}function ru(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function iu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function au(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ou(e,t){return{...cu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function su(e,t){return{...cu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function cu(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id}}function lu(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):H.join(e.sessionStore.ensureSessionDir(e.sessionName),`${du()}-${n}`)}function uu(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new t(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function du(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function fu(e){return typeof e==`string`&&e.length>0?e:void 0}const pu=[`dump`,`log`],mu=`network requires ${pu.join(` or `)}`,hu=`network include mode must be one of: ${s.join(`, `)}`,gu=2048;async function _u(e){let t=e.sessionStore.get(e.sessionName);if(!t)return F(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=vu(e.bindDevice),r=(await n(t.device,ee)).facts.networkDump;if(!r.available)return Cu(r.hint);let i=yu(e.req);if(!i.ok)return i;let a=Fe({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return wu(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:gu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:n(e)}}}function vu(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function yu(e){let t=bu(e);if(!t.ok)return t;let n=xu(e);if(!n.ok)return n;let r=Su(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function bu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return pu.includes(t)?{ok:!0,action:t}:F(`INVALID_ARGS`,mu)}function xu(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?F(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Su(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return F(`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}:F(`INVALID_ARGS`,hu)}function Cu(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function wu(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:gu,maxScanLines:e.entries.length},notes:e.notes}}}function Tu(e,t){let n=_i(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Eu(e.appLogFailure)]:Du(n.state)}}function Eu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Du(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function Ou(e,t){return Ue([...e,...t.notes??[]])}async function ku(e){let{req:t}=e;return t.command===`perf`?await Ul({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?ju(e):t.command===`events`?await Au(e):t.command===`network`?await _u(e):t.command===`audio`?await Fl(Uu(e)):null}async function Au(e){let{req:t,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:n(e)}}}async function ju(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return F(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Wu({...e,session:a}),r=(await n.bindDevice(a.device,te)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=Pu(re({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Mu(n,i)}catch(e){return{ok:!1,error:n(e)}}}async function Mu(e,t){switch(t.kind){case`path`:return Fu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Iu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Nu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Vu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Lu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ru(e)}}async function Nu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Bu(e,t.appBundleId,n.owner,n.operations.appLogStart):await zu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Pu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):F(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Fu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=jl(a),s=Tu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Iu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Tu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:Ou(t.notes,o)}}}function Lu(e,t,n){let r=n.resolveAppLogPath(t);return Ml(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ru(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return F(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Nl(r.resolveAppLogPath(n));return di({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function zu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await fi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:pi.resolvePath(o.resolveSessionDir(a))});let s=Nl(o.resolveAppLogPath(a)),c=await Hu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Bu(e,t,n,r){let{session:i}=e;return i.appLog?F(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Hu(e,t,r,n)}async function Vu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return F(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await fi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:pi.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Hu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=pi.resolvePath(o.resolveSessionDir(a));try{let l=Pl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await gi({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:mi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Uu(e){if(!e.bindDevice||!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new t(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Wu(e){if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new t(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Gu(e){let t=Ku(e),n=Ge(t);return ua(`sha256`).update(n,`utf8`).digest(`hex`)}function Ku(e){let{actions:t,actionLines:n,actionSourcePaths:r,metadata:i}=e;return{platform:i.platform??null,target:i.target??null,steps:t.map((e,t)=>qu(e,n[t]??null,r?.[t]??null))}}function qu(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function Ju(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=Yu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Yu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Xu({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Zu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Qu(n,r)];for(let e of s){let t=e();if(t)return t}}function Xu(e){let{from:t,actionCount:n,pendingRecordAndHeal:r}=e,i=t===n+1&&r!==void 0&&r.expectedFrom===t;return Number.isInteger(t)&&t>=1&&(t<=n||i)?void 0:`replay --from ${t} is out of range for a ${n}-step plan.`}function Zu(e){let{from:t,pendingRecordAndHeal:n,sessionActionsLength:r}=e;if(n?.expectedFrom===t&&r===n.actionsCountAtDivergence)return`replay --from ${t} continues a record-and-heal-shaped repair, but no corrective action was recorded in this repair segment; press the correct control via a blessed @ref from the divergence's screen.refs (recorded, no --no-record) — or, if your corrective action was a read (get/is/find/snapshot), re-run it with --record so it lands in the heal — before resuming with --from ${t}.`}function Qu(e,t){if(e!==t)return`replay --plan-digest does not match the current plan digest; the script, its includes, or its platform-conditioned expansion changed since the divergence report was generated. Run a fresh full replay to get a new digest.`}function $u(e,n){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new t(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=rt(e),a=at(e),o=Gu({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??$e(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>Ju(e,s,o)}}function ed(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function td(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ve(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function nd(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function rd(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=nd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ye(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function id(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ye(e,r),...fe(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function ad(e,t,n,r,i,a){if(n.targetEvidences)return od(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return cd(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return cd(e,n,r,i,a);if(s.kind===`post-resolution`){let c=ed({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return cd(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return ld(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=td({recorded:o,token:s.token});if(c.kind===`skip`)return cd(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,sd(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?ld(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function od(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return cd(e,n,r,i,a);let d=td({recorded:o[c],token:u.token});if(d.kind===`skip`)return cd(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,sd(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return ld(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function sd(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function cd(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function ld(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=ud(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=dd(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function ud(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function dd(e,t,n){return n.status===`guard-mismatch`?rd(e,n.evidence,t):id(e,n.evidence)}async function fd(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=At(e.varSources),o=[],s=[],c=gd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!hd(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(_d(u,n.length,r,e))}let d=kt(r,a,md(e,u)),f=Et(a),p=t.diagnosticsMarker(),m=await ad(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:pd(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function pd(e,t){return t.length===0?e:[...new Set([...e,...t])]}function md(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function hd(e){return!!(e&&e.command!==`replay`)}function gd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(hd(n))return n.command===`close`?t:void 0}}function _d(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function vd(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:ft(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){n.update(t=>{_t(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:yd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){ft(r())!==void 0&&n.update(ct)},markCompleteIfArmed(){ft(r())!==void 0&&n.update(ht)},markSessionHeldIfArmed(e){if(e.ok||!gt(r()))return e;let t=Cr(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&xd(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{bd({session:t,...e})})}}}}function yd(e){let t=H.dirname(e),n=H.basename(e,H.extname(e));return H.join(t,`${n}.healed.ad`)}function bd(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Sd({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function xd(e){e.pendingRecordAndHeal=void 0}function Sd(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Cd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Ve(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function wd(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),nt(e.command)){let n=Td(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Ve(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Cd([...e.positionals]);n&&t.push(n)}return Ue(t).filter(e=>e.trim().length>0)}function Td(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Ed(n)?t.slice(0,-1):t}function Ed(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Dd(e){let t=Od({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Od(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=kd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function kd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function Ad(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!jd(n))return`manual`;let i=Md(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function jd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Nd(e.scrollRegion)}function Md(e,t){let n=Yt(t),r=Fd(e.ancestry,n,t),i=e.scrollRegion;return i&&Nd(i)?r&&Pd(i,n,t):r}function Nd(e){return e.id!==void 0||e.label!==void 0}function Pd(e,t,n){return n.some(n=>xt(bt(n,t),e))}function Fd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Jt(n,t,e.length);return!r.broken&&ve(r.chain,e)})}const Id=new WeakMap;function Ld(e){return{store:t=>Rd(e,t),finalize:(t,n)=>zd({...e,evidence:t,projection:n})}}function Rd(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Yr(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Id.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:qr(a),refFrame:Xr(a)}),{evidence:s,refsGeneration:o}}function zd(e){let t=Id.get(e.evidence);Id.delete(e.evidence);let n=Vd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Bd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Hd(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Qr(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Bd(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&qr(n)===t.runtimeRevision&&Xr(n)===t.refFrame}function Vd(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Hd(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Ud(e){let{sessionStore:t,observationStore:n,sessionName:r,divergence:i,responseLevel:a}=e,o,s,c=Tr({divergence:i,level:a,writeOverflowArtifact:e=>{let n=l(e),r=Kd(t,n);return`artifactPath`in r&&(o=n,s=r.artifactPath),r}}),u=(o??c).screen;if(u.state!==`available`||u.refs.length===0)return e.evidence&&Ld({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.state===`available`?u.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return Gd(s),Wd(c,`missing-evidence`);let d=Ld({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.refsGeneration,refs:u.refs.map(e=>e.ref)});return d.published===!0?c:(Gd(s),Wd(c,d.reason))}function Wd(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function Gd(e){if(e)try{U.unlinkSync(e)}catch{}}function Kd(e,t){try{let n=H.join(e.ensureSessionDir(),`replay-divergence`);U.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=H.join(n,r);return U.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const qd={id:0,"role-label":1,label:2,other:3};function Jd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Yd(n.basis)<Yd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Yd(e.basis)-Yd(t.basis)||e.nodeIndex-t.nodeIndex)}function Yd(e){return qd[e]}async function Xd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,observationStore:l,resumeStamper:u,logPath:d,responseLevel:f,scrubVars:p=[],planActions:m,planDigest:h,signal:g}=e,_=wr(p),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await $d({session:o,sessionName:s,observationStore:l,logPath:d,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},b=rf(y,_),x=y.state===`available`&&o?lf({action:n,session:o,nodes:y.nodes,sanitize:_}):[],S=Ad({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Zd(y)}),C=Dd({failedIndex:r+1,actions:m,planDigest:h,repairHint:S,resumeStamper:u});return Ud({sessionStore:c,observationStore:l,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(tt(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:C,repairHint:S},responseLevel:f,evidence:y.state===`available`?y.evidence:void 0,...g?{signal:g}:{}})}function Zd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Qd=[300,500,800,1200,2e3,3e3,4e3];async function $d(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=tf(a),c=Date.now()+12e3,l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Qd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await yr(Math.min(e,a)),l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s})}return l.observation}async function ef(e){let{session:t,sessionName:n,observationStore:r,logPath:i,flags:a}=e;try{let e=(await $r({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(qi(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let o=Ld({sessionStore:r,sessionName:n}).store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:o.refsGeneration,evidence:o.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:Mr(e)}}}function tf(e){return{snapshotInteractiveOnly:nf(e)}}function nf(e){return!uf(e.command)||df(e).requiresRect}function rf(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=cf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function af(e){return!!cr(e,or(e.type??`Element`))||e.hittable===!0}function of(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function sf(e,t){let n=Qt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&af(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>of(e,t)),...o.filter(e=>!of(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function cf(e,t,n){let{nodes:r,truncated:i}=sf(e,n);return{refs:r.map(e=>{let n=or(e.type??`Element`),r=cr(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function lf(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!uf(t.command))return[];let a=wd(t);return a.length===0?[]:ff({candidates:a,nodes:r,session:n,action:t,matching:df(t),sanitize:i})}function uf(e){return nt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function df(e){let t=nt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function ff(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=pf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Jd(s).map(e=>e.suggestion)}function pf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Pe(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:mf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function mf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Oe(t,r.device.platform,{action:i.command===`fill`?`fill`:nt(i.command)?`click`:`get`,nodes:n}),c=or(t.type??`Element`),l=cr(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function hf(e){return{...e,hint:e.hint??vf(e.details,`hint`),diagnosticId:e.diagnosticId??vf(e.details,`diagnosticId`),logPath:e.logPath??vf(e.details,`logPath`)}}function gf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return _f({error:t,actionLabel:tt(n),action:n.command,positionals:lt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function _f(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Sr(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Sr(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...bf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function vf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const yf=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`];function bf(e){if(!e)return{};let t={};for(let n of yf)e[n]!==void 0&&(t[n]=e[n]);return t}async function xf(e){return await Sf({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function Sf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,planActions:g,planDigest:_}=e;if(t.ok)return t;let v=Cf(t.error.details?.replaySource),y=hf(t.error),b=await Xd({error:y,action:n,index:r,sourcePath:v?.path??a,sourceLine:v?.line??o,session:p.get(),sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:g,planDigest:_,signal:P(u.meta?.requestId)});return gf({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function Cf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(n!==void 0||r!==void 0)return{path:n,line:r}}function wf(e,t){if(e)try{U.appendFileSync(e,`${JSON.stringify(l(t))}\n`)}catch(t){N({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Tf(e){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=e,p=Date.now();wf(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:lt(o)??[]});let m;try{m=await Df({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(e){if(!(e instanceof t))throw e;m={ok:!1,error:n(e)}}let h=Date.now();return wf(d,{type:`replay_action_stop`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:m.ok,durationMs:h-p,resultTiming:m.ok?kf(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Ef(m,u??s,c)}function Ef(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function Df(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Af(t.flags,r.flags),s=i.command===`fill`?zt(Ut(i)):void 0;return s&&(o.recordAs=s),await a(Of({token:t.token,session:n,flags:o,runtime:r.runtime,meta:t.meta,internal:{...t.internal,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:t.internal?.resolvedSessionScope??Li(t)}:{}}},r))}function Of(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:et(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ot(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function kf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function Af(e,t){return p(e,{...t??{}})}function jf(e){return Rf(e.ok?Nf(e.data):Mf(e.error.details?.artifactPaths))}function Mf(e){return Array.isArray(e)?e.filter(Lf):[]}function Nf(e){return e?[If(e.path),If(e.outPath),...Pf(e.artifacts)].filter(Lf):[]}function Pf(e){return Array.isArray(e)?e.map(Ff).filter(Lf):[]}function Ff(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return If(t.localPath)??If(t.path)}function If(e){return typeof e==`string`?e:void 0}function Lf(e){return typeof e==`string`}function Rf(e){return[...new Set(e.filter(zf))]}function zf(e){try{return U.statSync(e).isFile()}catch{return!1}}function Bf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Vf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Yt(r),u=ie(t),d=qt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>St(r,e)===t.sibling),p=d.filter(e=>xt(bt(e,l),t.scrollRegion)),m=vt(p)[t.viewportOrder]?.ref,h=yt({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Wf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Vf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Hf(n,t,i,a):Uf(n,t,r,a,o)}function Hf(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),s=a(t),c=s?o(e,s):null;if(i(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Zt(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Uf(e,t,n,r,i){let a=Le(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=$t(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Wf(e){let{classification:t,matchCount:n,winnerNode:r,identitySet:i,byIndex:a,recorded:o}=e;switch(t.reason){case`selector-miss`:return{kind:`selector-miss`,matchCount:0,observedNode:void 0,candidateNodes:[],mismatches:[],causeCode:`SELECTOR_MISS`,causeMessage:`The recorded target no longer matches any current element.`};case`identity-set-empty`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`The recorded selector/ref still matches, but nothing in the current tree carries the recorded identity.`};case`unique-but-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Exactly one current element carries the recorded identity, but the resolved target is a different element.`};case`signal-isolated-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`A disambiguation signal (sibling or viewport position) isolated a different element than the resolved target.`};case`no-signal-isolation`:return{kind:`identity-unverifiable`,matchCount:n,observedNode:r,candidateNodes:i.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`${i.length} current elements carry the recorded identity and neither disambiguation signal isolated one.`}}}function Gf(e,t,n){let r=Ct(t),i=Jt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ye(e,r),...fe(e.ancestry,i)].slice(0,5)}function Kf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=st(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ve(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!nt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Jf(r)&&Jf(n[1])))return r}function qf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Jf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Yf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionName:l,sessionStore:u,resumeStamper:d,responseLevel:f,scrubVars:p,planActions:m,planDigest:h}=e,g=wr(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:ap(ie(n),g),...t.observed?{observed:ap(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>op(e,g))},v=Ad({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Dd({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b={version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(tt(r)),cause:{code:t.causeCode,message:g(t.causeMessage),...t.causeHint?{hint:g(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:y,repairHint:v,targetBinding:_},x=Ud({sessionStore:u,observationStore:e.observationStore,sessionName:l,divergence:b,responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return gf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:x,scrubVars:p})}function Xf(e,t,n){let r=wr(e.scrubVars);return Yf(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:rf(n,r),publicationEvidence:ep(n),repairCapture:Zd(n)})}async function Zf(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await $d({session:t,sessionName:n,observationStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function Qf(e,t){return Xf(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await Zf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function $f(e,t,n){return Xf(e,t,await Zf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ep(e){return e.state===`available`?e.evidence:void 0}function tp(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?he(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Re(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Kf(n,i),platform:a.device.platform}:{kind:`inactive`}}function np(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=df(r),s=Bf({recorded:t,token:n,nodes:i,platform:a,refLabel:qf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Ct(s.winnerNode),structural:xe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Ct(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function rp(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function ip(e){return!e.ok&&e.error.details?.reason===Xt}function ap(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function op(e,t){let n=or(e.type??`Element`),r=cr(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function sp(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function cp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.role==`string`)return{...typeof t.id==`string`?{id:t.id}:{},role:t.role,...typeof t.label==`string`?{label:t.label}:{}}}function lp(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function up(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.documentOrder==`number`&&typeof t.sibling==`number`)return{documentOrder:t.documentOrder,sibling:t.sibling}}function dp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:cp(e?.observed),expectedStructural:up(e?.expectedStructural),observedStructural:up(e?.observedStructural)}}function fp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:cp(e?.observed),observedAncestry:lp(e?.observedAncestry)}}function pp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function mp(e,t,n){let r=pp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&rp(e)?{status:`guard-mismatch`,evidence:dp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&ip(e)?{status:`landmark-mismatch`,evidence:fp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function hp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionName:t.sessionName,sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,pp(gp(e),jf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return tp({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await $d({session:i,sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return np({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Tf({req:sp(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke});o=l,jf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:mp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await Qf(c(e,n,r,i),{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Xf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await $f(c(e,n,i,a),r,{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=gp(o),u=await _p(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>vp(e),onStep:i,diagnosticsMarker:()=>bp(t.sessionStore),diagnosticsSince:e=>xp(t.sessionStore,e)},readLastResponse:()=>o}}function gp(e){return e&&!e.ok?e:F(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function _p(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return yp(i)?c(i):c(await xf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionName:e.sessionName,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function vp(e){let t=e.positionals??[],n=Me(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function yp(e){if(e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence,n=t&&typeof t==`object`?t.kind:void 0;return typeof n==`string`&&n!==`action-failure`}function bp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function xp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Sp(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Cp(t,i)};return Tp(o,`AD_PLATFORM`,a.platform??r.platform),Tp(o,`AD_TARGET`,a.target??r.target),Tp(o,`AD_DEVICE`,a.device),Tp(o,`AD_DEVICE_ID`,wp(a)),Ep(o,`AD_SHARD_INDEX`,a.shardIndex),Ep(o,`AD_SHARD_COUNT`,a.shardCount),Tp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Cp(e,t){let n=e.meta?.cwd??process.cwd();return H.relative(n,t)||t}function wp(e){return typeof e.serial==`string`?e.serial:e.udid}function Tp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Ep(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Dp=3e4,Op=1e3;function kp(e){let{scriptPath:r,env:i,publicNetworkOnly:a}=e,o=U.readFileSync(r,`utf8`),s=Object.create(null);try{ma.runInNewContext(o,Ap(i,s,a),{filename:r,timeout:Dp})}catch(e){let i=n(e);throw new t(i.code,`Maestro runScript failed: ${i.message}`,u({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),e instanceof Error?e:void 0)}return Lp(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Rp(t)]))}function Ap(e,t,n){return{...e,output:t,json:jp,http:{post:(e,t)=>Np(`POST`,e,n,t)}}}function jp(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Mp)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,Op)},n instanceof Error?n:void 0)}}function Mp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Np(e,n,r,i){let a=vr(process.execPath,Pp(),{stdin:JSON.stringify(Ip(e,n,i,r)),timeoutMs:Dp,allowFailure:!0});if(a.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${zp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:a.stdout.slice(0,Op),stderr:a.stderr.slice(0,Op)},r instanceof Error?r:void 0)}}function Pp(){let e=Fp(import.meta.url);if(!e)throw new t(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Fp(e){try{let t=fa(e),n=H.extname(t)||`.js`;return[H.join(H.dirname(t),`run-script-http-child`+n),H.join(H.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>U.existsSync(e))??null}catch{return null}}function Ip(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Lp(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function Rp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function zp(e){let t=e.trim();return t.length>0?t.slice(0,Op):`request process exited without stderr`}async function Bp(e){return await Vp(`tap`,async t=>{let n=H.join(t,`before.png`),r=H.join(t,`after.png`),i=await Up(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Up(e,r)))return await Hp(n,r,e.signal,`tap`)}})})}async function Vp(e,t){let n=await W.mkdtemp(H.join(da.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await W.rm(n,{recursive:!0,force:!0})}catch{}}}async function Hp(e,t,n,r){try{let[i,a]=await Promise.all([W.readFile(e),W.readFile(t)]);qp(n);let o=await Ki(i,a,`Maestro screenshot`);return qp(n),Wp(o,r)}catch(e){Kp(e,n),N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Up(e,t){try{return await W.rm(t,{force:!0}),qp(e.signal),await e.capture(t),qp(e.signal),!0}catch(t){return Kp(t,e.signal),!1}}function Wp(e,t){if(e.status!==`compared`)return Gp(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return Gp(t,n?`stable`:`changed`,e),n}function Gp(e,t,n){N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Kp(t,n){if(n?.aborted||e(t))throw r()}function qp(e){if(e?.aborted)throw r()}async function Jp(e){Xp(e.timeoutMs),qp(e.signal);let t=e.now()+e.timeoutMs;return await Vp(`animation`,async n=>{let r=H.join(n,`first.png`),i=H.join(n,`second.png`);for(;;){if(qp(e.signal),await Yp(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Yp(e,t,n){let r=[await Up(e,t),await Up(e,n)];return!r[0]||!r[1]?!1:await Hp(t,n,e.signal,`animation`)===!0}function Xp(e){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Zp=J.observationPollMs;async function Qp(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!mm(n)||(Z(e.context.signal),!await fm(e.dependencies,t,Zp,e.context.signal)))throw n}}}function $p(e){return em({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function em(e){let t=Ii(e.snapshot),n=e.platform===`ios`?Qi(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:i(n.nodes)}:e.snapshot;return am(po(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function tm(e){pm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await Qp(e,n),i=em({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,_a(e.condition,i))return i;if(e.dependencies.now()>=n)break;await fm(e.dependencies,n,Zp,e.context.signal)}return Z(e.context.signal),_m(t)}async function nm(e){pm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await Qp(e,t);if(r=void 0,n=em({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===J.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),_m(n)}async function rm(e){pm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Qp(e,t),r=hm(n);for(;;){Z(e.context.signal),await fm(e.dependencies,t,Zp,e.context.signal);let i=await Qp(e,t),a=hm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function im(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function am(e,t,n,r,i,a,o){if(!e.ok){let t=im(r);return{generation:n,matched:e.evidence.matched,visible:e.evidence.visible,candidateCount:e.evidence.candidateCount,...e.evidence.ref?{ref:e.evidence.ref}:{},...t?{viewport:t}:{}}}let s=sm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=im(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:om(e.rect,c)}:{},candidateCount:e.evidence.candidateCount,rect:e.rect,...e.evidence.ref?{ref:e.evidence.ref}:{},...c?{viewport:c}:{},...s?{dispatchSelector:s}:{},...i.includeSurfaceSignature?{surfaceSignature:hm(t)}:{}}}function om(e,t){return!Xe(e)||!Xe(t)?0:_e(t,e)?100:Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))*100/(e.width*e.height)}function sm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!cm(t,n,r)||i!==1))return lm(t.selector)}function cm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!mo(e.selector)}function lm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!um(n)||typeof r!=`string`)return;let i=en(r)?.trim();return i?{key:n,value:i}:void 0}function um(e){return e===`id`||e===`label`||e===`text`}async function dm(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?r():e}Z(n)}async function fm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await dm(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw r()}function pm(e,n){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function mm(e){return e instanceof t&&e.details?.retriable===!0}function hm(e){return ua(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,bounds:gm(e.rect)})))).digest(`hex`)}function gm(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function _m(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function vm(e){return e.kind===`clearState`?Cm(e):ym(e)?bm(e):jm(e)?Mm(e):Tm(e)}function ym(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function bm(e){switch(e.kind){case`launchApp`:return xm(e);case`stopApp`:return Sm(e);case`openLink`:return wm(e)}}function xm(e){return{command:`open`,positionals:e.appId?[e.appId]:[],flags:{...e.relaunch?{relaunch:!0}:{},...e.clearState?{clearAppState:!0}:{},...e.launchArgs.length>0?{launchArgs:e.launchArgs}:{}}}}function Sm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function Cm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function wm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Tm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Em(e);case`clickPoint`:return Dm(e);case`swipe`:return Om(e);case`scroll`:return km(e);case`pressKey`:return Am(e)}}function Em(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Dm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Om(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},internal:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function km(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Am(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function jm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Mm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0}}}}async function Nm(e,n){let r=vm(n),{input:i,flags:a,internal:o,...s}=e.baseReq,c=Pm(a,r.flags??{}),l=u({...o,...r.internal,...n.kind===`snapshot`?{observationOnly:!0}:{}}),d=await e.invoke(u({...s,command:r.command,positionals:r.positionals,input:r.input,flags:c,internal:Object.keys(l).length>0?l:void 0}));if(!d.ok)throw Bm(d);if(n.kind===`gestureViewport`){let e=d.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new t(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return d.data}function Pm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=u({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Fm(e){return e?e.kind===`scalar`?[String(e.value)]:e.kind===`list`?e.values.map(String):Object.entries(e.values).flatMap(([e,t])=>[e,String(t)]):[]}function Im(e,t){return{generation:t.generation,matched:t.matched&&t.visible,candidateCount:t.candidateCount,evidence:{kind:`selector`,selector:e,visible:t.visible,candidateCount:t.candidateCount,...t.ref?{ref:t.ref}:{}}}}function Lm(e){if(!e)return[];let t=[];if(typeof e.path==`string`&&t.push(e.path),Array.isArray(e.artifactPaths)&&t.push(...e.artifactPaths.filter(e=>typeof e==`string`)),Array.isArray(e.artifacts))for(let n of e.artifacts)typeof n.localPath==`string`?t.push(n.localPath):typeof n.path==`string`&&t.push(n.path);return[...new Set(t)]}function Rm(e,n,r){if(H.isAbsolute(e))return e;let i=n.source?.path??r;if(!i)throw new t(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return H.resolve(H.dirname(i),e)}function zm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Bm(e){let n=e.error,r=u({...n.details??{},hint:n.hint??Vm(n.details,`hint`),diagnosticId:n.diagnosticId??Vm(n.details,`diagnosticId`),logPath:n.logPath??Vm(n.details,`logPath`),retriable:n.retriable??Hm(n.details,`retriable`),supportedOn:n.supportedOn??Vm(n.details,`supportedOn`)});return new t(n.code,n.message,Object.keys(r).length?r:void 0)}function Vm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Hm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Um(e){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Nm(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new t(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=_(i,i);return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function Wm(e){let{input:t,context:n,snapshots:r,options:i}=e,a=i.dependencies.now()+t.timeoutMs,o=e.allowObservationReuse===!1?void 0:r.reuseObservation(n);for(;;){let e=i.dependencies.now(),s=o!==void 0;o??=await Qp({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=$p({query:t,context:n,snapshot:o,platform:i.platform});if(Xm(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await fm(i.dependencies,a,Zp,n.signal)}}}async function Gm(e,t,n,r,i,a){let o=async()=>await Jm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Bp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Nm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await Km(e,t,n,r,i,a.click,o)});return}await Km(e,t,n,r,i,a.click)}async function Km(e,t,n,r,i,a,o){let s=async()=>await Jm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:hm(await t.capture(i))),l=async()=>{let r=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await qm({baselineSignature:c,screenshotBaseline:o,dispatch:s,settle:l,onRetry:()=>{n.tapRetries+=1}});t.prime(i.generation,e.snapshot)}catch(e){throw t.requireStability(i.generation),e}}async function qm(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<J.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Jm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Zm(e,o,n.point,i);return}catch(n){if(!Qm(n))throw n;let o=await Wm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Ym(o))throw n;t.invalidate(r.generation),await $m(e,jr(o.rect),i);return}}t.invalidate(r.generation),await $m(e,n.point,i)}function Ym(e){return e.matched&&e.visible&&e.rect!==void 0}function Xm(e,t){return Ym(e)?!t||e.dispatchSelector!==void 0:!1}async function Zm(e,t,n,r){N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Nm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Qm(e){let t=c(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===sr.selectorNotFound}async function $m(e,n,r){if(!n)throw new t(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await Nm(e,{kind:`clickPoint`,point:n,options:r})}function eh(e){let t=Um(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},r=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},i=e.platform,a=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Nm(e,t)),o=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},s=async(e,t,n=`none`)=>await o(()=>a(e),t,n),c=async(n,i)=>{pr(n),await s({kind:`typeText`,text:n},i);let a=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});r(a),t.prime(i.generation,a.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await Wm({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await tm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async()=>await a({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Fm(e.arguments),...Fm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;await s({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`stopApp`,...n?{appId:n}:{}},t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await s({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(r,i)=>await Gm(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>$m(e,t.target.point,u({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>$m(e,t.target.point,{holdMs:J.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??J.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await nm({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=Ea(o,n.selector,n.direction,n.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await rm({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw An(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Im(n.selector,a))}},pressKey:async(e,t)=>{await s({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await s({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await s({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await Jp({timeoutMs:t.timeoutMs??J.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Lm(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:kp({scriptPath:Rm(t.file,n,e.sourcePath),publicNetworkOnly:e.baseReq.internal?.publicNetworkOnly===!0,env:{...n.env,...t.env?zm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function th(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=eh(e);return xo(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function nh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),rh(()=>oh(r,e)),rh(()=>sh(n,t,e))},actionCompleted:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!0))},actionFailed:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!1))}}}function rh(e){try{e()}catch{}}function ih(e,t){let n=e.get(t);return e.delete(t),n}function ah(e,t){return u({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function oh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function sh(e,t,n){wf(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function ch(e,n,r,i){let a=lh(r);wf(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof t?{errorCode:r.error.code}:{}})}function lh(e){let t=`data`in e?e.data:void 0,n=uh(t?.timing)?t.timing:void 0;return u({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function uh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function dh(e,t){return fn(e,t)}function fh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:gh(e.action),positionals:_h(e.action,e.value),flags:t.flags??{}}}}async function ph(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,observationStore:o,logPath:s}=e,c=P(r.meta?.requestId),l=fh(t,r),u=hf(e.error),d=[...t.redactions],f=wr(d),p={...u,message:f(u.message),...u.hint?{hint:f(u.hint)}:{}},m=o.get(),h=m?await $d({session:m,sessionName:i,observationStore:o,logPath:s,action:l.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},g=m&&h.state===`available`&&!t.isControl?mh({failure:t,action:l.action,session:m,nodes:h.nodes,sanitize:f}):[],_=[t.action,hh(t.value)].filter(Boolean).join(` `),v=Ud({sessionStore:a,observationStore:o,sessionName:i,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:f(t.source.path??n),line:t.source.line}},action:f(_),cause:{code:p.code,message:p.message,...p.hint?{hint:p.hint}:{}},screen:rf(h,f),suggestions:g.slice(0,5),suggestionCount:g.length,resume:t.resume,repairHint:Ad({kind:`action-failure`,targetEvidence:void 0,capture:Zd(h)})},responseLevel:r.meta?.responseLevel,evidence:h.state===`available`?h.evidence:void 0,...c?{signal:c}:{}});return _f({error:p,actionLabel:_,action:t.action,positionals:[...l.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:v,scrubVars:d})}function mh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Jd(dh(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>mf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function hh(e){return!e||e===`<text>`?e??``:it(e)}function gh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function _h(e,t){return!t||e===`inputText`?[]:[t]}function vh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=bh(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:xh(c,Date.now()-r)}}}async function yh(e){let{command:t,replayPath:r,state:i,outcome:a}=e,{request:o,session:{name:s,store:c,observationStore:l,logPath:u}}=t,{failure:d}=a,f=n(a.error);return d?await ph({error:f,failure:d,replayPath:r,req:o,sessionName:s,sessionStore:c,observationStore:l,logPath:u,snapshotDiagnostics:bh(c,i.snapshotStart)}):{ok:!1,error:f}}function bh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return m(n)}function xh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Sh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return F(`INVALID_ARGS`,on);if(t.flags?.saveScript!==void 0)return F(`INVALID_ARGS`,`Maestro YAML does not support --save-script; ADR 0012 repair recording applies only to .ad scripts.`);let r=Date.now(),i={snapshotStart:0};try{return await Ch({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await yh({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Ch(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c,invoke:l}=t,u=await wh({command:t,bundle:n}),d=jh({req:a,invoke:l,device:u.device,platform:u.platform,runtimeHints:u.runtimeHints,sourcePath:u.filePath});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await gn(u.flow,d,{defaults:u.defaults,env:u.env,platform:u.platform,target:u.target,runtimeHints:u.runtimeHints,signal:u.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:a.internal?.publicNetworkOnly!==!0,readSource:e=>ln(n,e),observer:nh({filePath:u.filePath,tracePath:s,onStep:c})});return f.ok?vh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await yh({command:t,replayPath:n.entry,state:i,outcome:f})}async function wh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=er(ln(n,o),o),c=a.lookup(),l=c?.session;c&&Hi(c,r.flags);let u=await Th({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:kh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Ah(r),signal:P(r.meta?.requestId)}}async function Th(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await Ni(t.flags??{},pn(a.appTarget,o))),c=Ih(t,s),l=Dh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Eh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Lh(t,s),runtimeHints:l,flow:a})}async function Eh(e){if(e.device||!Oh(e.runtimeHints))return e;let t=await Ni(e.req.flags??{},pn(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Lh(e.req,t),runtimeHints:Dh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Dh(e){return zn({req:e.req,sessionStore:{getRuntimeHints:t=>t===e.sessionName?e.sessionStore.getRuntimeHints():void 0},sessionName:e.sessionName,device:e.device,platform:e.platform})}function Oh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function kh(e){return{...Sp({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Ah(e){return{...Ot(Dt(e.flags?.replayShellEnv)),...Tt(wt(e.flags?.replayEnv))}}function jh(e){let{req:t,invoke:n,device:r,platform:i,runtimeHints:a,sourcePath:o}=e,{command:s,positionals:c,input:l,flags:d,...f}=t;return th({baseReq:u({...f,flags:Mh(r,i,t.flags),runtime:a}),invoke:n,platform:i,sourcePath:o,dependencies:{now:Date.now,sleep:async(e,t)=>{await pa(e,void 0,{signal:t})}}})}function Mh(e,t,n){if(!e)return Nh(t,n);let r={platform:t,target:e.target,noRecord:!0};return t===`android`?{...r,serial:e.id}:{...r,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}}}function Nh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Ph(n,t):Fh(n,t)}function Ph(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Fh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Ih(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new t(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Lh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function Rh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(Mt(t,a.flags?.replayBackend)===`maestro`)return n?F(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Sh(i):F(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function zh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Bh(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=Vh(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(),_=Hh({req:t,coordinator:s,manifest:l,preEntrySession:g});return _.ok?{ok:!0,value:{replayReq:u,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h,preEntrySession:g,entryIndex:_.value,varSources:Wh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Bh(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return F(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Vh(e,t){let n=$u(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Uh({...e,flags:mn(e.flags,n.actions)},n.metadata)}}function Hh(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:F(`INVALID_ARGS`,a.message)}}function Uh(e,t){return!t.platform&&!t.target?e:{...e,flags:Gh(e.flags,t)}}function Wh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Sp({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Ot(Dt(t.flags?.replayShellEnv)),cliEnv:Tt(wt(t.flags?.replayEnv))}}function Gh(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function Kh(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=qh({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Xh({req:t,coordinator:a}),Yh({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function qh(e){let t=Zh(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return Wr()}function Jh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?F(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):Qh({saveScript:t,liveForce:n,persistedForce:Bt(r)||void 0,sourcePath:i,existingSaveScriptPath:Pt(r)})}function Yh(e){let{req:t,sessionStore:n,sourcePath:r,coordinator:i}=e,a=n.get(),{saveScript:o,force:s}=t.flags??{},c=Jh({saveScript:o,force:s,preRunState:a?.scriptPublication??Ft,sourcePath:r});return c?{ok:!1,response:c}:(i.demoteForRerunIfArmed(),{ok:!0,armSaveScript:$h({saveScript:o,force:s,coordinator:i,sourcePath:r})})}function Xh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Zh(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return F(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function Qh(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Dr(t):a??yd(i);if(!(n||r&&o===a)&&U.existsSync(o))return F(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function $h(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function eg(e){let{request:t,session:{name:n,logPath:r,store:i,mutationStore:a,observationStore:o},tracePath:s,onStep:l,invoke:u}=e,d=t.flags?.replayScriptSource;if(!d)return F(`INVALID_ARGS`,on);let f=Date.now(),p=t.flags?.replayKeepSession===!0,m=``,h=new Set,g=vd({sessionStore:i,mutationStore:a});try{if(m=d.entry,Nt(m)&&t.flags?.replayBackend!==`maestro`)return F(`INVALID_ARGS`,jt(`replay`,m));let a=await Rh({resolved:m,keepSession:p,coordinator:g,command:e});if(a)return a;let c=zh({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:m,script:ln(d,m),coordinator:g});if(!c.ok)return c.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=c.value,T=Kh({req:t,entryIndex:S,sessionStore:i,sourcePath:m,coordinator:g});if(!T.ok)return T.response;let{runtime:E,readLastResponse:ee}=hp({ctx:{replayReq:_,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:m,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:u,signal:P(t.meta?.requestId),coordinator:g},req:t,artifactPaths:h,onStep:l,armSaveScript:T.armSaveScript}),D=await fd({actions:v,entryIndex:S,keepSession:p,actionLines:y,actionSourcePaths:b,resolvedPath:m,varSources:C},E);return D.status===`failed`?ee()??F(`COMMAND_FAILED`,`replay step failed with no recorded response`):tg({startedAt:f,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:g,keepSession:p})}catch(e){let t=c(e);return F(t.code,t.message,h.size>0?{artifactPaths:[...h]}:void 0)}}function tg(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=rg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=m([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:ng(i,Date.now()-t)}}}function ng(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function rg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return F(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function ig(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=H.resolve(n??`.`,t??`.agent-device/test-artifacts`);return H.join(i,r)}function ag(e,t){let n=t?H.relative(t,e):H.basename(e),r=n.length===0||n.startsWith(`..`)?H.basename(e):n;return ze(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function og(e,t){U.mkdirSync(t,{recursive:!0}),lg(e,t)}function sg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=H.join(o,`result.txt`),u=H.join(o,`failure.txt`),d=cg([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>H.basename(e)).join(`, `)}`);let p=`${f.join(`
2
+ `)}\n`;U.writeFileSync(l,p),s||U.writeFileSync(u,p)}function cg(e,t,n){let r=[],i=new Set(n.map(e=>H.basename(e).toLowerCase()));for(let n of e){if(!dg(n))continue;let e=H.basename(n);if(H.resolve(n)===H.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=ug(e,t,i),o=H.join(t,a);U.copyFileSync(n,o),r.push(o)}return r}function lg(e,t){let n=H.join(t,`replay.ad`);if(U.copyFileSync(e,n),H.extname(e).toLowerCase()===`.ad`)return;let r=H.join(t,H.basename(e));H.resolve(r)!==H.resolve(n)&&U.copyFileSync(e,r)}function ug(e,t,n){let r=H.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||U.existsSync(H.join(t,a));)a=`${i}-${o++}${r}`;return a}function dg(e){try{return U.statSync(e).isFile()}catch{return!1}}function fg(e){let{platformFilter:n,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}vg(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=n?` for --platform ${n}`:``;throw new t(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function pg(e,t,n,r,i=0){let a=H.basename(n,H.extname(n)),o=ze(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function mg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return ze(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function hg(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,H.basename(r),`attempt`,a+1].join(`:`)}function gg(e,t){return typeof e==`number`?e:t}function _g(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function vg(e,t){return e===`apple`?b(t):t===e}function yg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const bg=2e3;async function xg(e){let{filePath:t,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=Og({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>yg({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(kg(o,[...v]))},o)})]):await w,Q(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Cg(w)||(x=Eg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:bg}}),wg({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await Tg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Dg(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=Sg(x,i,v)}}return x??yg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Sg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:yg({error:t,artifactPaths:[...n],infrastructure:!0})}async function Cg(e){return await Promise.race([e.then(()=>!0),pa(bg).then(()=>!1)])}async function wg(e){let{replayPromise:t,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:n(e).message}})}}}async function Tg(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Q(o,e)});return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=n(e);return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:t.message}}),yg({error:t})}}function Eg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Dg(e,t){return{...e,warnings:[...e.warnings,t]}}function Og(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=H.join(t,`replay-timing.ndjson`);return U.mkdirSync(H.dirname(l),{recursive:!0}),U.writeFileSync(l,``),n.add(l),Q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Q(e,t){e&&U.appendFileSync(e,`${JSON.stringify(t)}\n`)}function kg(e,t=[]){return yg({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function Ag(e){let t=jg(e),n=await Mg(e,t);return{result:Rg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function jg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:H.join(i,...a?[`shard-${a.shardIndex+1}`]:[],ag(t.path,n)),maxAttempts:r+1}}async function Mg(e,t){Pg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Ng(e,t,r);if(Fg(n,i),Ig(e,i.outcome,r))break;Lg(e,t,i)}return n}async function Ng(e,t,n){let{entry:r,sessionName:i,suiteInvocationId:a,caseIndex:o,suiteIndex:s,suiteTotal:c,requestId:l,timeoutMs:u,shard:d}=e,f=n+1,p=Date.now(),m=pg(i,a,r.path,o,n),h=H.join(t.testArtifactsDir,`attempt-${f}`);og(r.path,h);let g=hg({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Hg(d)},v=await xg({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return sg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Pg(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:pg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Hg(c)})}function Fg(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function Ig(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Lg(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Hg(e.shard)})}function Rg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?zg(e,t,n,r):Bg(e,t,n,r)}function zg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Hg(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}:{},...Vg(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Bg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...Hg(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...c?.status===`failed`&&c.infrastructure?{infrastructure:!0}:{},...c?.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...Vg(s)}}function Vg(e){return Hg(e)}function Hg(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Ug(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 Wg(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),c=await Gg(t,u,d);Yg(c,a);let p=c.shardPlan?Xg({entries:c.entries,total:c.total,emitProgress:a}):[];return c.shardPlan?p.push(...await Zg({shards:c.shardPlan.shards,sessionName:f,suiteInvocationId:c.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:c.suiteArtifactsDir,suiteTotal:c.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l})):p.push(...await t_({discoveryEntries:c.entries,sessionName:f,suiteInvocationId:c.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:c.suiteArtifactsDir,suiteTotal:c.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l})),{status:`completed`,data:i_(c.total,p,Date.now()-e,c.suiteArtifactsDir)}}catch(e){let t=c(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Gg(e,t,n){let r=Kg(e,t),i=qg(r),a=r.length-i.length,o=mg(e.requestId),s=await Ug(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:Jg(e,o),total:s?.total??r.length}}function Kg(e,t){return fg({platformFilter:e.platformFilter,discoverSources:t})}function qg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Jg(e,t){return ig({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Yg(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 Xg(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 Zg(e){return(await Promise.allSettled(e.shards.map(async t=>await $g({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Qg(r,e.sessionName,t.reason)]:[]})}function Qg(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:e_(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function $g(e){let{shard:t,sessionName:n}=e;return await n_({...e,entries:t.entries,sessionName:e_(n,t),shard:t})}function e_(e,t){return`${e}:shard-${t.shardIndex+1}`}async function t_(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await Ag({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:_g(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:gg(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),r_(t,o,p))break}return g}async function n_(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await Ag({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:_g(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:gg(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),r_(b,o,m))break}return _}function r_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function i_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=g(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function a_(e,t){return()=>e.map(e=>o_(e,t))}function o_(e,t){let n=e.entry,r=ln(e,n),i=Mt(n,t)===`maestro`,a=at(r);return{path:n,manifest:{...i?{title:er(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function s_(e){return async t=>(await u_(e,t)).map(c_)}function c_(e){if(e.platform===`web`||!x(e))throw new t(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function l_(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 u_(e,n){let r=m_(e),i=f_(await ji(d_(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${p_(n)}, but only ${i.length} matched`);return i.slice(0,n)}function d_(e){let t=R(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:y({simulatorSetPath:ki(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function f_(e,t,n){return t.length>0?h_(e,t,n):e.filter(e=>g_(e,n)).sort(y_)}function p_(e){return`${e} device${e===1?``:`s`}`}function m_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function h_(e,n,r){return n.map(n=>{let i=v_(n),a=e.find(e=>__(e,r)&&(e.id===n||v_(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function g_(e,t){return!__(e,t)||!x(e)?!1:e.booted!==!1}function __(e,t){return!(!v(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function v_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function y_(e,t){return e.id.localeCompare(t.id)}function b_(e){let n=x_(e?.shardAll,`--shard-all`),r=x_(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function x_(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}const S_=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 C_(e){return S_.has(e.toUpperCase())}const w_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function T_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=E_(e);return t?D_(t.details)||O_(t.code,t.message):!1}function E_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function D_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||Un(t)?!0:t?C_(t):!1}function O_(e,t){let n=`${e}\n${t}`.toLowerCase();return w_.some(e=>n.includes(e))}function k_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:M_(e.error.details?.artifactPaths),infrastructure:T_(e),...N_(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:j_(t?.warnings),artifactPaths:M_(t?.artifactPaths),...N_(t?.snapshotDiagnostics)}}function A_(e){if(!e||e.ok)return;let t=k_(e);return t.status===`failed`?t:void 0}function j_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function M_(e){return[...new Set(j_(e))]}function N_(e){let t=h(e);return t?{snapshotDiagnostics:t}:{}}const P_=1e3,F_=3e3;function I_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await L_(e)}}async function L_(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=xr(o.device.platform),c=i?H.join(i,`recording${s}`):br(o.device.platform);z_(a,{type:`video_recording_start`,session:n,videoPath:c}),N({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(B_({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 yr(P_),z_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:P_}),N({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:P_}}),l}async function R_(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:F_});let o=Date.now();await yr(F_);let s=Date.now(),c=await e.video.record(B_({req:t,sessionName:n,phase:`stop`}));return jf(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}),N({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 B_(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 V_=[{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.`}],H_=({attemptId:e,parentAttemptId:t})=>{Br(e);let n=U_(e,t);return{cancel:()=>Lr(e),release:()=>{n(),zr(e)}}};function U_(e,t){if(!t||t===e)return()=>{};let n=P(t);if(!n)return()=>{};let r=()=>{Lr(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function W_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=G_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:l_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function G_(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 K_(e){let{request:t,session:{name:n,logPath:r},createSession:i,invoke:a,cleanupSession:o,video:s}=e;if(t.flags?.recordVideo===!0&&s===void 0)return F(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of V_)if(e.requested(l))return F(`INVALID_ARGS`,e.message);let u,d;try{u=Y_(t,n),d=J_(t)}catch(e){let t=c(e);return F(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Wg({request:u,emitProgress:Vr,isCanceled:()=>Rr(t.meta?.requestId),emitDiagnostic:N,bindAttemptCancellation:H_,runReplay:async({filePath:e,sessionName:n,platform:o,target:c,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&jf(e).forEach(e=>d.add(e)),e),v=W_({parentFlags:t.flags,platform:o,target:c,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=i(n,r),b=s?{req:t,sessionName:n,sessionStore:y.store,artifactsDir:u,appendTimingEvent:m,video:s}:void 0,x=b?I_(b):void 0;return k_(await eg({request:{...t,command:`replay`,session:n,positionals:[e],flags:v,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||x?{internal:{...t.internal??{},...x?{openLifecycle:x}:{}}}:{}},session:y,tracePath:p,onStep:g,invoke:async e=>{let t=b?await L_(b):void 0;return t&&!t.ok?t:_(await a(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,appendTimingEvent:o})=>{if(s)return A_(await R_({req:t,sessionName:e,sessionStore:i(e,r).store,artifactsDir:a,appendTimingEvent:o,artifactPaths:n,video:s}))},discoverSources:a_(d,t.flags?.replayBackend),resolveShardTargets:s_(t.flags),cleanupSession:o});return p.status===`completed`?{ok:!0,data:q_(p.data,t)}:F(p.error.code,p.error.message)}function q_(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=H.join(n,H.basename(r)),a=e=>e===r||e.startsWith(r+H.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:H.basename(r)}]}:o}function J_(e){let n=e.flags?.replayScriptSources;if(!n)throw new t(`INVALID_ARGS`,on);return n}function Y_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=Z_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:Dr(i,r),failFast:n.failFast===!0,retries:X_(n.retries),timeoutMs:X_(n.timeoutMs),shard:b_(n)}}function X_(e){return typeof e==`number`?e:void 0}function Z_(e){return typeof e==`string`?e:void 0}function Q_(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await ra({req:$_(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function $_(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 ev=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await eg({request:e,session:nv(t,n,r),invoke:a??i}),tv=async({req:e,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Q_({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await K_({request:e,session:nv(n,r,i),createSession:(e,t)=>nv(e,t,i),invoke:s??o,cleanupSession:async t=>await rv({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function nv(e,t,n){let r=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1};return{name:e,logPath:t,store:{get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)},mutationStore:{update:r,clearRepairTombstone:()=>n.clearRepairTombstone(e)},observationStore:{get:()=>n.get(e),update:r}}}async function rv(e){let{req:n,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await oc({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new t(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function iv(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command!==nr.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return cv(new t(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return cv(new t(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=sv(a);if(o)return cv(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return cv(new t(`INVALID_ARGS`,`session save-script path cannot be empty.`));Lt(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:Kt(a,n.flags?.force),publication:`active`});return c.written?(Ht(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...M(`Published script: ${c.path}`)}}):cv(c.error??new t(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function av(e){if(dt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:It(e)?void 0:`not-armed`}const ov={repair:()=>new t(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new t(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new t(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new t(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function sv(e){let t=av(e);return t?ov[t]():void 0}function cv(e){return{ok:!1,error:n(e)}}function lv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function uv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Zr(e)}}async function dv(e,n,r){if(r.length!==1)throw new t(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(uv(n))}}async function fv(e,n,r){if(r.length<2)throw new t(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...uv(n),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...M(`Clipboard updated`)}}async function pv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await L({command:`clipboard`,device:t,use:ke,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>dv(n,e,r)}}let o=await L({command:`clipboard`,device:t,use:Ne,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>fv(s,e,r)}}async function mv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=Y(tr.clipboard,s,c);if(l)return l;let u=t.positionals??[],d=lv(u);if(!d)return F(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let f=await X({session:s,flags:c}),p=await pv({device:f,action:d,positionals:u,inspectFacts:a,bindDevice:o});if(!p.ok)return p.response;let m=await p.execute(Kr(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,m),{ok:!0,data:{platform:E(f),...m}}}function hv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function gv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function _v(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function vv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Vr({type:`command`,status:`progress`,message:yv(t)})}function yv(e){return[na(e),...ta(e)].join(`
3
+ `)}async function bv(e,t){let{device:r,targetApp:i,session:a,listInstalledApps:o}=t;if(i)try{let t=o?xv(i,await o(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${E(r)}.`,evidence:{requested:i,platform:E(r)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(t){let i=n(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${E(r)} --all`,evidence:{code:i.code,message:i.message}})}}function xv(e,n){let r=e.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new t(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new t(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Sv(e,t,r){let i=wv(t,r);try{let t=await Ev(i),n=Tv(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Av(n,i,t.failures),hint:n.length===0?Nv(t.failures):void 0,command:n.length===0?Rv(i):void 0,evidence:zv(n,t.failures)}),n.length>0&&Dv(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(t){let r=n(t);return $(e,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function Cv(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:E(e),id:e.id,name:e.name}))}})}function wv(e,t){let n=e.flags??{};return Fi({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 Tv(e,t){return e.filter(e=>S(e,t,{includeExplicitSelectors:!0}))}async function Ev(e){if(e.platform)return{devices:await ji(e),failures:[]};let t=[],n=[];for(let r of dr)try{t.push(...await ji({...e,platform:r}))}catch(e){n.push(kv(r,e))}return{devices:t,failures:n}}function Dv(e,t){for(let n of t)$(e,Ov(n))}function Ov(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Iv(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Iv(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function kv(e,t){let r=n(t);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Av(e,t,n){if(e.length===0)return n.length>0?`No ${jv(t)} devices found; ${Mv(n)}.`:`No ${jv(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${jv(t)} ${Lv(e.length,`device`)} available; ${r} booted`,a=Pv(e,t);return a?`${i} (${a}).`:`${i}.`}function jv(e){let t=e.platform?Iv(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Mv(e){return e.slice(0,2).map(e=>`${Iv(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Nv(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Pv(e,t){if(t.platform||t.target)return;let n=ur(e),r=Fv();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 Fv(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Iv(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 Lv(e,t){return e===1?t:`${t}s`}function Rv(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function zv(e,t){let n=new Map;for(let t of e){let e=E(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Bv=1500;async function Vv(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 Hv(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Uv(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 Hv(e,t,n){try{return await(n.resolveProcessInfo??Wv)(e,t)}catch{return}}function Uv(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 Wv(e,t){if(!Gv(e))return;let n=await Kv(t);if(n!==void 0)return{pid:n,cwd:await qv(n)}}function Gv(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Kv(e){let t=await _r(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Bv});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 qv(e){let t=await _r(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Bv});if(t.exitCode===0)return t.stdout.split(`
5
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Jv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Yv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Xv(e,t){let n=Ar(e.meta?.cwd);return{targetApp:ty(e.flags?.targetApp)??t?.appBundleId,metroHost:ty(e.runtime?.metroHost)??`127.0.0.1`,metroPort:ny(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:$v(e,n)}}function Zv(e,t={}){let n=ey(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 Qv(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${E(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function $v(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function ey(e){let t={...Object.fromEntries([...Jv,...Yv].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 ty(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function ny(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function ry(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==tr.doctor)return null;let s=iy(e.hostDiagnostics),c=r.get(n),l=Xv(t,c),u=sy(r,n),d=[];if(vv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Er()} using ${u}`,evidence:{version:Er(),stateDir:u}},...Zv(t,{required:l.remote}),...Qv(r,n,c,{remote:l.remote})),l.remote)return fy(d,l);let f=ay(l,u,i),p=await Sv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await cy({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??oy(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return fy(d,l,{device:h,includeMetro:!0,inventory:p})}function iy(e){if(!e)throw new t(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function ay(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>Gr(e),emitProgress:e=>Vr({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Mi(e),shouldPropagateInventoryProbeError:Ai,transportOverrides:Object.freeze({androidAdb:n})})}function oy(e){let t=(e?.devices??[]).filter(e=>C(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function sy(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function cy(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Cv(t,i,a.targetApp);return u&&await ly(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await Vv(a.metroHost,a.metroPort,a.kind)),vv(t,...await r.ambientChecks(n)),u}async function ly(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await uy({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await bv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),vv(e,...await r.deviceChecks(i,n))}async function uy(e){if(e.device.platform!==`harmonyos`)return dy(e)}async function dy(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Te),u=R(n.flags?.androidDeviceAllowlist),d=await dc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await fc(l,d,e)}function fy(e,t,n={}){let r=hv(e);return{ok:!0,data:{status:r,summary:gv(r),kind:t.kind,platform:n.device?E(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:_v(e)}}}async function py(e){return await L({...e,command:`prepare`,use:He})}async function my(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return F(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(tr.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s}),u=await py({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let d=Date.now(),f=await u.runtime.operations.prepareAppleRunner({timeoutMs:hy(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:Ei(t)}});return{ok:!0,data:gy(a,l,Math.max(0,Date.now()-d),f)}}function hy(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ae}function gy(e,t,n,r){return{action:e,platform:E(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:_y(n,r),message:`Prepared Apple runner: ${t.name}`}}function _y(e,t){let n=vy(t.buildMs),r=yy(t.connectMs),i=yy(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 vy(e){return e===void 0?void 0:yy(e)}function yy(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const by=e=>pc(e),xy=e=>yl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),Sy=e=>oc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Cy=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Ol({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),wy=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ku({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),Ty={session_list:by,devices:by,capabilities:by,apps:by,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await ry({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Cy,shutdown:Cy,appstate:Cy,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>iv({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Go({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await mv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Ss,perf:wy,logs:wy,events:wy,network:wy,audio:wy,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await my({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Is,reinstall:Is,install_source:Is,release_materialized_paths:async({req:e})=>await ko({req:e}),push:Is,"trigger-app-event":Cs,open:xy,replay:ev,test:tv,batch:async({req:e,sessionName:t,invoke:n})=>await Ls(e,t,n),close:Sy};async function Ey(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Bn,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=Ty[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{Ey as handleSessionCommands};