agent-device 0.21.19 → 0.21.20

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 (114) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.apk → agent-device-android-ime-helper-0.21.20.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.20.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.manifest.json → agent-device-android-ime-helper-0.21.20.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.19.apk → agent-device-android-snapshot-helper-0.21.20.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.19.manifest.json → agent-device-android-snapshot-helper-0.21.20.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +12 -0
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -14
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +14 -16
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +40 -14
  11. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +20 -5
  12. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +2 -15
  13. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +10 -25
  14. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +1 -18
  15. package/dist/src/adapter.js +1 -1
  16. package/dist/src/adb-failure.js +1 -1
  17. package/dist/src/agent-browser-process-record.js +1 -1
  18. package/dist/src/agent-browser-provider.js +1 -1
  19. package/dist/src/agent-browser-tool.js +1 -1
  20. package/dist/src/agent-device-client.js +2 -2
  21. package/dist/src/alert-runtime.js +1 -1
  22. package/dist/src/alert.js +1 -0
  23. package/dist/src/android-input-ownership.js +1 -1
  24. package/dist/src/app-launch.js +2 -2
  25. package/dist/src/app-lifecycle.js +1 -1
  26. package/dist/src/app-resolution.js +2 -2
  27. package/dist/src/apple-runner-platform.js +1 -1
  28. package/dist/src/archive.js +2 -2
  29. package/dist/src/browser-launch.js +1 -1
  30. package/dist/src/cache.js +1 -1
  31. package/dist/src/cli-config.js +1 -1
  32. package/dist/src/cli-help.js +287 -301
  33. package/dist/src/cli-runner.js +1 -1
  34. package/dist/src/cli.js +1 -1
  35. package/dist/src/client-metro-companion.js +1 -1
  36. package/dist/src/client-metro.js +1 -1
  37. package/dist/src/client-types.d.ts +14 -2
  38. package/dist/src/{scroll-command.d.ts → cloud-artifacts.d.ts} +242 -238
  39. package/dist/src/command-schema.js +3 -3
  40. package/dist/src/command-tools.js +2 -2
  41. package/dist/src/command.js +1 -1
  42. package/dist/src/config.js +1 -1
  43. package/dist/src/connection-runtime.js +1 -1
  44. package/dist/src/daemon-client-lifecycle.js +1 -1
  45. package/dist/src/daemon-client-transport.js +1 -1
  46. package/dist/src/daemon-registration.js +1 -1
  47. package/dist/src/debug-symbols-facade.js +3 -3
  48. package/dist/src/device-rotation.js +1 -1
  49. package/dist/src/devicectl.js +1 -1
  50. package/dist/src/display-inventory.js +1 -1
  51. package/dist/src/exec.js +1 -1
  52. package/dist/src/hdc.js +1 -1
  53. package/dist/src/helper.js +2 -2
  54. package/dist/src/host.js +1 -1
  55. package/dist/src/index.d.ts +1 -1
  56. package/dist/src/interactor.js +5 -5
  57. package/dist/src/interactor2.js +1 -1
  58. package/dist/src/internal/bin.js +1 -1
  59. package/dist/src/internal/daemon.js +2 -2
  60. package/dist/src/launch-confirmation.js +1 -0
  61. package/dist/src/limrun-runtime-dependencies.js +1 -1
  62. package/dist/src/limrun.d.ts +50 -42
  63. package/dist/src/mechanics.js +16 -16
  64. package/dist/src/owner-identity.js +1 -1
  65. package/dist/src/perf-facade.js +1 -1
  66. package/dist/src/perf-target.js +1 -1
  67. package/dist/src/physical-device-control.js +1 -1
  68. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  69. package/dist/src/platform-runtime-app-log-process.js +1 -1
  70. package/dist/src/platform-runtime-host.js +1 -1
  71. package/dist/src/platform-runtime-operation-host.js +2 -2
  72. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  73. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  74. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  75. package/dist/src/provider-session-ownership.js +1 -1
  76. package/dist/src/provider-webdriver.js +1 -1
  77. package/dist/src/registry.js +20 -4
  78. package/dist/src/result-serialization.js +1 -1
  79. package/dist/src/runner-cache-metadata.js +3 -3
  80. package/dist/src/runner-client.js +1 -1
  81. package/dist/src/runner-dev-tools-security.js +1 -1
  82. package/dist/src/runner-device-readiness.js +1 -1
  83. package/dist/src/runner-disposal.js +1 -1
  84. package/dist/src/runner-error-classification.js +1 -1
  85. package/dist/src/runner-exchange.js +1 -1
  86. package/dist/src/runner-operations-facade.js +1 -1
  87. package/dist/src/runner-session-types.js +1 -1
  88. package/dist/src/runner-start-budget.js +1 -1
  89. package/dist/src/runner-startup-transport.js +1 -1
  90. package/dist/src/runner-xctestrun.js +1 -1
  91. package/dist/src/runtime.js +1 -1
  92. package/dist/src/runtime10.js +1 -1
  93. package/dist/src/runtime2.js +1 -1
  94. package/dist/src/runtime4.js +5 -5
  95. package/dist/src/screenshot-result.js +1 -1
  96. package/dist/src/screenshot-runtime.js +1 -1
  97. package/dist/src/screenshot3.js +1 -1
  98. package/dist/src/sdk-contracts.d.ts +2 -0
  99. package/dist/src/sdk-contracts.js +2 -2
  100. package/dist/src/sdk-selectors.d.ts +4 -4
  101. package/dist/src/session2.js +1 -1
  102. package/dist/src/simulator-boot.js +1 -1
  103. package/dist/src/simulator.js +1 -1
  104. package/dist/src/snapshot-runtime.js +1 -1
  105. package/dist/src/tool-provider.js +3 -3
  106. package/dist/src/tool-provider2.js +1 -1
  107. package/dist/src/tool-provider3.js +1 -1
  108. package/dist/src/toolchain-probe.js +1 -1
  109. package/dist/src/update-check.js +1 -1
  110. package/dist/src/video.js +1 -1
  111. package/package.json +1 -1
  112. package/server.json +2 -2
  113. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.19.apk.sha256 +0 -1
  114. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk.sha256 +0 -1
@@ -1,4 +1,4 @@
1
- import{E as e,F as t,G as n,N as r,P as i,_ as a,b as o,d as s,o as c,q as l,t as u,tt as d,x as f}from"./sdk-contracts.js";import"./capture.js";import{i as p,k as m,n as h,t as g}from"./sdk-batch-runner.js";import{a as _,n as v,t as y}from"./snapshot-diagnostics.js";import{f as b}from"./android-input-ownership.js";import{C as x,T as S,b as C,d as w,h as ee,m as T,p as E,v as te,x as D}from"./sdk-device.js";import{$r as O,B as ne,Ct as re,Dr as ie,E as ae,F as oe,G as se,Gr as ce,I as le,J as ue,K as de,Kn as fe,L as pe,M as me,Or as he,P as ge,Pt as _e,Q as ve,R as ye,Tt as be,Un as xe,V as Se,Vn as Ce,W as we,Wn as Te,Wt as Ee,X as De,Y as Oe,Yn as ke,Yr as Ae,Z as je,Zr as Me,_n as Ne,an as Pe,at as Fe,bn as Ie,cr as Le,d as Re,f as ze,gn as Be,it as Ve,j as He,mt as Ue,or as We,p as Ge,pt as Ke,q as qe,sn as Je,sr as Ye,st as Xe,vn as Ze,wt as Qe,y as $e,yn as et,z as tt}from"./sdk-batch.js";import{u as nt}from"./scroll-gesture.js";import{a as rt,b as it,f as at,g as ot,n as st,p as ct,r as lt,w as ut,y as dt}from"./script.js";import{_ as ft,a as pt,c as k,d as mt,f as ht,g as gt,h as _t,l as vt,m as yt,p as bt,t as A,u as xt}from"./session-store.js";import{a as St,d as Ct,n as wt,o as Tt,r as Et,t as Dt}from"./target-evidence.js";import{a as Ot,i as kt,n as At,o as jt,r as Mt,s as Nt,t as Pt}from"./vars.js";import{n as Ft,r as It,t as Lt}from"./format.js";import{A as Rt,O as zt,c as Bt,f as Vt,g as Ht,h as Ut,j as Wt,k as Gt,l as Kt,m as qt,o as Jt,p as Yt,u as Xt}from"./parameterized-recorded-fill.js";import{F as Zt,M as Qt,N as $t,P as en,_ as tn,c as nn,h as rn}from"./runtime.js";import{n as an,t as on}from"./catalog.js";import{g as sn,i as cn}from"./observability.js";import{i as ln,n as un,r as j}from"./success-text.js";import{o as dn,p as fn}from"./overlay.js";import{t as pn}from"./app-inventory.js";import{a as mn,r as hn,t as gn}from"./device.js";import{a as _n,o as vn,r as M}from"./diagnostics.js";import{a as yn,i as bn,r as xn}from"./verified-file.js";import{c as Sn,p as Cn}from"./exec.js";import{t as wn}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Tn,r as En}from"./output-path.js";import"./command.js";import{a as Dn,i as On,n as kn,t as An}from"./replay-divergence.js";import"./retry.js";import{a as jn}from"./version.js";import{t as Mn}from"./session-paths.js";import{i as Nn,r as Pn}from"./session-artifact-paths.js";import{t as Fn}from"./project-runtime.js";import{r as In}from"./rect-center.js";import{t as Ln}from"./android-snapshot-quality.js";import{t as Rn}from"./keyed-lock.js";import{n as zn,t as Bn}from"./deploy-result-target.js";import{t as Vn}from"./keyboard-actions.js";import{a as Hn,i as Un,n as Wn,o as Gn,r as Kn}from"./request-cancel.js";import{t as qn}from"./request.js";import{i as Jn,s as Yn}from"./provider-session-ownership.js";import{$ as Xn,A as Zn,B as Qn,C as $n,E as er,F as tr,G as nr,H as rr,I as ir,J as ar,K as or,M as sr,O as cr,Q as lr,R as ur,S as dr,U as fr,V as pr,W as mr,X as hr,Y as gr,Z as _r,_ as vr,_t as yr,b as br,c as xr,ct as Sr,d as Cr,et as wr,f as Tr,g as Er,gt as Dr,h as Or,it as N,k as kr,l as Ar,lt as jr,m as Mr,n as Nr,nt as Pr,p as Fr,q as Ir,r as Lr,rt as Rr,s as zr,st as Br,t as Vr,tt as Hr,u as Ur,v as Wr,w as Gr,x as Kr,y as qr,yt as Jr,z as Yr}from"./device-claim-rule.js";import{n as Xr}from"./provider-device-admission.js";import{M as Zr,N as Qr,O as P,_ as $r,f as ei,h as ti,i as ni,n as ri,p as ii,s as ai}from"./session-snapshot.js";import{c as oi,i as si,t as ci}from"./device-claim-inspection.js";import{t as li}from"./audio-probe-result.js";import{T as ui,_ as di,a as fi,b as pi,c as mi,d as hi,f as gi,g as _i,h as vi,i as yi,l as bi,m as xi,n as Si,o as Ci,r as wi,s as Ti,t as Ei,u as Di,v as Oi,x as ki}from"./perf-runtime-plan.js";import{i as Ai,n as ji}from"./lease-context.js";import{h as Mi}from"./screenshot-runtime.js";import{n as F,r as Ni}from"./device-isolation.js";import{a as Pi,n as Fi,r as Ii}from"./device-inventory-context.js";import{n as Li,r as Ri,t as zi}from"./dispatch-resolve.js";import{t as Bi}from"./touch-reference-frame.js";import"./screen-recording-admission-ledger.js";import{a as Vi,d as Hi,i as Ui,l as Wi,n as Gi,o as Ki,s as qi,u as Ji}from"./session-routing.js";import{d as I}from"./src8.js";import{i as Yi,n as L,r as Xi}from"./compatibility-policy.js";import{n as R,t as Zi}from"./runtime-admission.js";import{s as Qi}from"./quality-warnings.js";import{t as $i}from"./png-worker-client.js";import{a as ea,i as z,n as ta,r as na,t as ra}from"./session-runtime-admission.js";import{a as ia}from"./ios-snapshot-engine.js";import{n as aa,r as oa}from"./device-selection-resolver.js";import{n as sa,r as ca}from"./doctor-output.js";import{t as la}from"./record-runtime.js";import{n as ua}from"./gesture-runtime.js";import{i as da,n as fa,r as pa}from"./platform-runtime-open-target.js";import{t as ma}from"./snapshot-runtime.js";import{t as ha}from"./app-log-files.js";import B from"node:path";import V,{promises as H}from"node:fs";import{createHash as ga}from"node:crypto";import _a from"node:os";import{fileURLToPath as va}from"node:url";import{setTimeout as ya}from"node:timers/promises";import ba from"node:vm";function U(e,t){return I({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function xa(e){return I({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Sa(e,t){let n=Da(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},xa(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:Ca(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Ca(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function wa(e,t,n,r){let i=Da(await r.resolveTarget({selector:e,...t},U(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Rr(`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 Ta(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 Ea(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 Da(e,t){return Oa(e,t),ka(e),Aa(e),ja(e),e}function Oa(e,t){if(e.generation!==t)throw new r(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function ka(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Aa(e){if(e.rect!==void 0&&!Ea(e.rect)||e.viewport!==void 0&&!Ea(e.viewport))throw new r(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function ja(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ma(e,t,n,r,i,a={}){let o=Na(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Ra(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Na(e,t,n,r,i){let a=n===`up`||n===`down`,o=fr(e,_r(e,r),i),s=o.visibility,c=wr({visibility:s,matches:e.nodes.filter(e=>ce(e)),platform:r}),l=Me(s.viewportRects)??Fa(c);if(!l||!Ae(l))return;let u=c.flatMap(e=>{if(!Ae(e.rect))return[];let t=Ia(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=Pa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(La)[0]?.viewport}function Pa(e,t){return ce(e)?e:he(e,t)}function Fa(e){let t;for(let n of e)Ae(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ia(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 La(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ra(e,t){let n=W(e,.5,.5),r=L.scrollUntilVisibleSwipe.nearEdgeFraction,i=L.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:W(e,.5,i)};case`down`:return{start:n,end:W(e,.5,r)};case`left`:return{start:n,end:W(e,i,.5)};case`right`:return{start:n,end:W(e,r,.5)}}}async function za(e,t,n){let i=N(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new r(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await n.resolveGestureViewport(U(t,t.command)):void 0;return{authored:e,gesture:Va(await Ba(e.start,t,n,a),await Ba(e.end,t,n,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let r=await n.resolveGestureViewport(U(t,t.command)),{start:a,end:o}=Ha(r,e.direction,n.platform);return{authored:e,gesture:Va(a,o,i),viewport:r}}let a=await wa(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs},t,n),o=a.viewport??await n.resolveGestureViewport(U(t,t.command)),{start:s,end:c}=Ua(a,e.direction,o);return{authored:e,gesture:Va(s,c,i),target:a,viewport:o}}async function Ba(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(U(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 Va(e,t,n){return{from:e,to:t,durationMs:n??L.command.swipeDurationMs}}function Ha(e,t,n){if(t===`left`||t===`right`){let n=nt(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=L.screenSwipe,i=W(e,r.centerFraction,r.nearEdgeFraction),a=W(e,r.centerFraction,r.farEdgeFraction),o=W(e,r.centerFraction,r.downStartFraction),s=W(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function W(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Ua(e,t,n){let r=In(e.rect),i=n.x+Math.trunc(n.width*L.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*L.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*L.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*L.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 Wa={launchApp:Ya,stopApp:Ya,setPermissions:Ya,clearState:Ya,openLink:Ya,tapOn:Qa,doubleTapOn:Qa,longPressOn:Qa,swipe:ro,inputText:io,eraseText:io,scroll:G,scrollUntilVisible:G,hideKeyboard:G,pressKey:G,back:G,waitForAnimationToEnd:G,takeScreenshot:so,runScript:so,evalScript:lo,assertVisible:co,assertNotVisible:co,assertTrue:co,extendedWaitUntil:co},Ga={launchApp:!0,stopApp:!0,setPermissions:!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 Ka(e){return Ga[e.kind]}async function qa(e,t){let n=e.command;return await Ja(n,e,t,U(e,n))}function Ja(e,t,n,r){let i=Wa[e.kind];return i(e,t,n,r)}async function Ya(e,t,n,r){switch(e.kind){case`launchApp`:return await K(n.launchApp,Xa(e,t),r,`invalidate`);case`stopApp`:return await K(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`setPermissions`:return await K(n.setPermissions,{appId:e.appId??t.appId,permissions:Za(e.permissions)},r,`invalidate`);case`clearState`:return await K(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await K(n.openLink,{link:e.link},r,`invalidate`)}}function Xa(e,t){return I({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?Za(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function Za(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function Qa(e,t,n,r){switch(e.kind){case`tapOn`:return await $a(e,t,n,r);case`doubleTapOn`:{let i=await vo(e.target,{purpose:`doubleTap`,timeoutMs:to(e)},t,n),a=N(e.delay,`doubleTapOn.delay`)??L.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}case`longPressOn`:{let i=await vo(e.target,{purpose:`longPress`,timeoutMs:to(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}}}async function $a(e,t,n,r){let i=await eo(e,t,n);return await K(n.tapOn,no(e,i),r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}async function eo(e,t,n){let r={purpose:`tap`,timeoutMs:to(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await vo(e.target,r,t,n)}function to(e){return e.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs}function no(e,t){let n=N(e.repeat,`tapOn.repeat`),r=N(e.delay,`tapOn.delay`),i=n===void 0?r:r??L.command.repeatDelayMs;return I({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function ro(e,t,n,r){let i=await za(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?Ta(i.target):void 0)}async function io(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,I({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,I({charactersToErase:N(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function G(e,t,n,r){switch(e.kind){case`scroll`:return await K(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await K(n.scrollUntilVisible,ao(e),r,`invalidate`);case`hideKeyboard`:return await K(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await K(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await K(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await K(n.waitForAnimationToEnd,oo(e),r,`preserve`)}}function ao(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:N(e.timeout,`scrollUntilVisible.timeout`)??L.command.scrollUntilVisibleTimeoutMs,durationMs:Yi(L.command.scrollUntilVisibleSpeed)}}function oo(e){return I({timeoutMs:N(e.timeout,`waitForAnimationToEnd.timeout`)})}async function so(e,t,n,r){switch(e.kind){case`takeScreenshot`:return fo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,I({file:e.file,env:e.env}),r,`preserve`)}}async function co(e){throw new r(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function lo(e){throw new r(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function K(e,t,n,r,i){let a=uo(n,r);return fo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function uo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function fo(e,t,n,r){let i=e?.observation;return po(i,r),{...mo(n??i),...ho(e?.outputEnv),...go(t,e?.artifactPaths),..._o(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function po(e,t){if(!(!e||t===void 0||e.generation===t))throw new r(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function mo(e){return e?{observation:e}:{}}function ho(e){return e?{outputEnv:{...e}}:{}}function go(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function _o(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function vo(e,t,n,r){if(e.space===`target`){let i=await wa(e.selector,t,n,r);return{authored:e,point:In(i.rect),resolution:i}}return{authored:e,point:await Ba(e,n,r)}}function yo(e,t,n,r={}){let i=n===`ios`&&r.presentation?xo(r.presentation):void 0,a=i?So(e,t,i):nr(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Eo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?ar(s,t.selector.index):Ir(s,t.selector.index)?.node,l=Eo(t,o,s,c);if(!c)return Co(t,o,s,l);let u=i?Ir(i.visibleForSource(c),void 0):null,d=gr(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&&!bo(t.selector)&&i?wo(d,s,u):0,evidence:l}:Co(t,o,s,l)}const bo=Xn;function xo(e){let t=ie(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=>Hr(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function So(e,t,n){let r=_r(e,`ios`),i=lr(e,{},{orderUnindexed:e=>hr(e,r)}),a=mr(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:or(o,t.selector,`ios`,i.visibility,r)}}function Co(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 wo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&To(n.rect,e)?1:0:t.length}function To(e,t){let n=In(e),r=In(t);return n.x===r.x&&n.y===r.y}function Eo(e,t,n,r){return I({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:Xi,retryTapMaxAttempts:L.command.retryTapMaxAttempts,longPressDurationMs:L.command.longPressDurationMs,eraseTextMaxCharacters:L.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:L.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:L.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:L.command.waitForAnimationToEndDifferencePercent,observationPollMs:L.observation.pollIntervalMs};function Do(e,t={}){return{execute:async n=>{let r=U(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ka(n.command)&&!i,visualStabilityBarrier:i});let a=await qa(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Sa(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Oo(e){throw new r(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function ko(e){let t=e.meta?.installSource;if(!t)throw new r(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new r(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Oo(t)}}function Ao(e){let t=ko(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Yn(n,e.meta?.tenantId)},cleanup:()=>{Jn(n)}}}function J(e,t,n){return t||Sr(n)?null:c(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function jo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function Y(e){return jr(e.flags)||!e.session?await Li(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Mo(e.session.device)}async function Mo(e){if(Xr(e)||!E(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ii.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Li(t)}catch(e){if(!(e instanceof r)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Li({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function No(e,t){return t?Wi(t,e).length===0:!1}async function Po(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a,o,s;try{a=Ao(t);let c=Ro(t),l=await Io(i,t.flags),u=await na(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await ta(e.bindDevice)(l,je);await f.operations.ensureReady({}),o=await f.operations.materializeAppSource({source:a.source}),s=await zo({artifact:o,retention:c,req:t,session:i,sessionName:n}),i&&P(i);let p=await f.operations.deployMaterializedApp({artifact:o}),m=Bo(l,o,p,s),h=ln(m,`Installed: ${zn(m)}`);return k(r,i,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return s&&await cr(s.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:l(e)}}finally{await o?.cleanup(),a?.cleanup()}}async function Fo(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new r(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await cr(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:l(e)}}}async function Io(e,t){let n=Lo(t?.platform);if(e&&n&&!D(e.device,n))throw new r(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${x(e.device)}`);if(!e&&!n)throw new r(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await Y({session:e,flags:t})}function Lo(e){return e===`ios`||e===`android`?e:void 0}function Ro(e){let t=e.meta?.retainMaterializedPaths===!0,n=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(n!==void 0&&n<=0)throw new r(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...n===void 0?{}:{ttlMs:n}}}async function zo(e){if(e.retention.enabled)return await Zn({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 Bo(e,t,n,r){return E(e)?Vo(t,n,r):Ho(t,n,r)}function Vo(e,t,n){let i=t.bundleId??e.bundleId;if(!i)throw new r(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Wo(n),bundleId:i,...Uo(t,e),launchTarget:t.launchTarget??i}}function Ho(e,t,n){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new r(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Wo(n),packageName:i,...Uo(t,e),launchTarget:t.launchTarget??i}}function Uo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Wo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Go(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Ko(t);if(!a.ok)return a.response;let o=J(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await Y({session:n,flags:t.flags}),l=await R({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:Se});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==a.options.provider)return c(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let u=await l.runtime.operations.configureProviderPortReverse(a.options);return u?{ok:!0,data:{action:`port-reverse`,...u}}:c(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Ko(e){let t=qo(e);if(!t.ok)return t;let n=Jo(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 qo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Jo(e){let t=Yo(e.flags?.devicePort),n=Yo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Yo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Xo(e){return await R({...e,command:`runtime clear`,use:ye})}async function Zo(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Go({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Qo({...e,session:r.get(n)});if(!$o(i))return c(`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 es({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?ts(n,o):rs({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Qo(e){if(!e.session)return c(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ua({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=ti(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 $o(e){return e===`set`||e===`show`||e===`clear`}async function es(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(Ur(i)&&r?.appBundleId){let e=await Xo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;P(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Mr(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function ts(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function ns(e){return e?x(e.device):void 0}function rs(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=ns(i),s=vr(t.flags?.platform??a?.platform??o);if(!s)return c(`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 c(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let l=Tr(a,xr(t.flags,s));return Ar(l)===0?c(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,l),{ok:!0,data:{session:n,configured:!0,runtime:l}})}const is=/^[A-Za-z0-9_.:-]{1,64}$/,as=8192,os=4096;function ss(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new r(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!is.test(t))throw new r(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new r(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:ls(n,t)}}function cs(e,t,n){let i=x(e),a=us(e);if(!a)throw new r(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>os)throw new r(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:os});return s}function ls(e,t){if(e)try{let n=JSON.parse(e);if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(n);if(Buffer.byteLength(i,`utf8`)>as)throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${as} bytes`);return n}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function us(e){return((E(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 ds(e,t,n,r){let{eventName:i,payload:a}=ss([...r]),o=cs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ei(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...j(`Triggered app event: ${i}`)}}async function fs(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await R({command:`trigger-app-event`,device:t,use:Ve,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=>ds(s,t,e,n)}}function ps(e){let t=(e[0]??`status`).toLowerCase();if(!Vn(t))throw new r(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new r(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return ms(t)}function ms(e){return e===`get`?`status`:e===`return`?`enter`:e}const hs={"ime-probe":`android`},gs={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},_s={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function vs(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ei(e)}}async function ys(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 bs(e,t){return e.operations.keyboardStatus(vs(t)).then(e=>({platform:hs[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 xs(e,t){let n=await e.operations.keyboardDismiss(vs(t)),r=gs[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...j(ws(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...j(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function Ss(e,t){let n=await e.operations.keyboardEnter(vs(t)),r=_s[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...j(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...j(`Keyboard enter pressed`)}}async function Cs(e){let t=ps(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ys({command:`keyboard status`,device:n,use:be,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>bs(e,t)):t===`dismiss`?await ys({command:`keyboard dismiss`,device:n,use:re,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>xs(e,t)):await ys({command:`keyboard enter`,device:n,use:Qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>Ss(e,t))}function ws(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Ts(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=J(i,l,u);if(d)return d;let f=await Y({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Mi(t)===`may-invalidate`&&P(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 Es(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return c(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Ds(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await Ts({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:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...ti(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Os(e){return Es(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Ds({...e,command:an.keyboard,resolveRuntime:e=>Cs(e)})}async function ks(e){return await Ds({...e,command:an.triggerAppEvent,resolveRuntime:e=>fs(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await pa(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function As(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function js(e,t){let n=t?.subject??`Payload`,i=e.trim();if(!i)throw new r(`INVALID_ARGS`,`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!V.statSync(a).isFile())throw new r(`INVALID_ARGS`,`${n} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof r)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new r(`INVALID_ARGS`,`${n} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new r(`COMMAND_FAILED`,`Unable to read ${n} file: ${a}`,{cause:String(e)})}if(As(i))return{kind:`inline`,text:i};throw new r(`INVALID_ARGS`,`${n} file not found: ${a}`)}async function Ms(e){let t=js(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ns(t.path);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ns(e){try{return await H.readFile(e,`utf8`)}catch(t){let n=t.code;throw n===`ENOENT`?new r(`INVALID_ARGS`,`Push payload file not found: ${e}`):n===`EISDIR`?new r(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):n===`EACCES`||n===`EPERM`?new r(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new r(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Ps(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=J(n,a,o);if(s)return s;let l=Bs(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let s=u?Yn(u,t.meta?.tenantId):A.expandHome(l.appPathInput);if(!V.existsSync(s))return c(`INVALID_ARGS`,`App binary not found: ${s}`);let d=await Y({session:a,flags:o}),f=await na(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await ta(e.bindDevice)(d,De);a&&P(a);let h=await m.operations.deployApp({app:l.app,appPath:s,replaceExisting:n===`reinstall`}),g=Is(d,l.app,s,h),_=ln(g,`Installed: ${g.appName??Bn(g)}`),v=zs(a,g);return v&&v!==a&&i.set(r,v),k(i,v,t,n,_),{ok:!0,data:_}}finally{u&&Jn(u)}}async function Fs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=J(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!s||!l)return c(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await Ms(Vs(l,t.meta?.cwd)),d=await Y({session:i,flags:a}),f=await na(e.inspectFacts)(d),p=z(`push`,f.operations.ensureReady)??z(`push`,f.operations.sendPushNotification);if(p)return p;let m=await ta(e.bindDevice)(d,ve);await m.operations.ensureReady({}),i&&P(i);let h=await m.operations.sendPushNotification({appId:s,payload:u}),g=E(d)?ln({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):ln({platform:x(d),package:s,action:h.action,extrasCount:h.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,g,{positionals:[s,l]}),{ok:!0,data:g}}function Is(e,t,n,r){return E(e)?Ls(t,n,r):Rs(e,t,n,r)}function Ls(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 Rs(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 zs(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Bs(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:c(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:c(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Vs(e,t){let n=js(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Hs(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Ps({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Po({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await Fs({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Us(e,t,n){return await h(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Ws=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Gs(e){return Ws.has(e)}const Ks=new Map(ze.map(e=>[e.name,e]));function qs(e){let t=new Set;for(let n of e){let e=Js(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Js(e){let t=Ks.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(Gs)?n:void 0}function Ys(e){if(e!==void 0&&e.remainingSteps.length!==0)return qs(e.remainingSteps)}function Xs(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:Ai(e),plannedOperations:Ys(e.internal?.executionPlan)}}function Zs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...j(`Closed: ${t.name}`)}})}function Qs(e,t,n){if(!ht(t))return{kind:`not-armed`};let r=t.actions.length;Zs(e,t,n);let i=Vt(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`}:(vt(t),{kind:`aborted`})}function $s(e,t){let n=l(t),r=Gt(e.scriptPublication??Ht);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...r?{savedScript:r}:{}},retriable:!0}}}function ec(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Zs(r,n,t);try{let e=r.writeSessionLog(n,{force:Kt(n,t.flags?.force)});e.written&&qt(n,e.path);return}catch(e){return tc(e)}}function tc(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof r?new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${l(e).message}`,t)}async function nc(e){let t=e.clearRuntimeHints?ne:tt,n=await Zi({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,tt)};let r=await n.bind(e.device,ne);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function rc(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 ic({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&Ur(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Mr(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`,()=>kr(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function ic(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>br({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>dr({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>qr({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>$n({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Gr(a,r))}function ac(e,t){return Kr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function oc(e){if(e instanceof r)return e;let t=e instanceof Error?e.message:String(e);return new r(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const sc=(e,t)=>(e.positionals?.length??0)>0||er(t);async function cc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=ht(n),s=JSON.stringify(t.positionals??[]);if(o&&!mt(n,s)){let e=await uc({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:$s(n,oc(e))};_t(n,s)}let c=Qs(i,n,t);return c.kind===`failed`?{response:$s(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function lc(e){try{return{providerData:await Dr(e)}}catch(t){let n=l(t);return{response:{ok:!1,error:{...n,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...n.details,session:e.session.name},retriable:!0}}}}}async function uc(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(sc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Xs(t,r,n.trace?.outPath)});return}catch(e){return e}}function dc(e,t){if(!e.flags?.saveScript||Xt(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new r(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new r(`INVALID_ARGS`,`close --save-script cannot ${n.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function fc(e){let{req:t,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,l=a.get(n);if(!l)return await gc({req:t,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});dc(t,l);let u=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!u)return c(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=e.platformResourceCleanup,f=await nc({device:l.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!l.appBundleId&&Ur(a.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(f.type===`response`)return f.response;if(P(l),t.internal?.closeAppOnly===!0&&u)return await hc({req:t,session:l,logPath:i,lifecycle:f.runtime,app:u});let p=await cc({req:t,session:l,logPath:i,sessionStore:a,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await pc({req:t,session:l,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:mc({session:l,repair:p,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function pc(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 rc({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:uc,finalizeOrdinaryCloseScript:ec,platformResourceCleanup:e.platformResourceCleanup}),m=await lc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ac(r,u),g=d??h;if(g?n.deviceClaim&&M({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await pi(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function mc(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:ln({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...j(c),...o,...s}}}async function hc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await uc({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...j(`Closed: ${a}`)}}}async function gc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return c(`SESSION_NOT_FOUND`,`No active session`);let a=await nc({device:await Y({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:Xs(t,n)}),{ok:!0,data:{app:t.positionals[0],...j(`Closed: ${t.positionals[0]}`)}})}function _c(e,t){return e.operations.ensureReady(t)}function vc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function yc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return bc(t,r);case`devices`:return await Sc(t);case`capabilities`:return await Ac({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Ic({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function bc(e,t){let n=Vi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ki(e.session,n)).map(e=>xc(e,t))}}}function xc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Nn(r),platform:x(t.device),...w(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,...w(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function Sc(e){try{let t=Cc();return{ok:!0,data:{devices:(await Tc(e)).map(e=>({...Uc(e),...wc(e,t)}))}}}catch(e){let t=i(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function Cc(){let e=new Map;for(let t of si({})){let n=t.claim;!n||ci(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function wc(e,t){let n=t.get(oi(ki(e)));return n?{claimedBy:n}:{}}async function Tc(e){let t=e.flags?.platform;return kc(await Fi(Ec(e,t)),e.flags?.platform,e.flags?.target)}function Ec(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Dc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Oc(n?.androidDeviceAllowlist)}}function Dc(e,t,n){return S({simulatorSetPath:Ni(e),platform:t,target:n})}function Oc(e){let t=F(e);return t?Array.from(t).sort():void 0}function kc(e,t,n){let r=t?e.filter(e=>Wc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Ac(e){let t=await Hc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=jc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await zc(n,e.inspectFacts);return{ok:!0,data:{device:Uc(n),availableCommands:$e().filter(e=>e===`appstate`&&r?!0:Pc(e,i))}}}function jc(e,t,n){return!t||!E(e)&&!T(e)||!No(n,t)?!1:Mc(t)||Nc(e,t)}function Mc(e){return!!(e.appName||e.appBundleId)}function Nc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Pc(e,t){let n=Ge(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Fc(t,e)))}function Fc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Ic(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Lc(t,e.providerAppCatalog);if(o)return o;let s=await Hc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=pn(t.flags?.appsFilter),u=F(t.flags?.androidDeviceAllowlist),d=await Bc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Vc(await vc(f,await _c(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Lc(e,t){let n=Rc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,Kn(e.meta?.requestId))]}}}function Rc(e){let t=ji(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 zc(e,t){if(t)try{return await t(e)}catch{return}}async function Bc(e){if(!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(n&&!n.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}};if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Xe)}}function Vc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Hc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=J(t.command,a,o);return s?{response:s}:{device:await Y({session:a,flags:o,androidAvdSelection:i})}}function Uc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:x({platform:r.platform,appleOs:n}),...w(r.platform)&&n?{appleOs:n}:{}}}function Wc(e,t){return D(e,t)}function Gc(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function Kc(e){return c(`INVALID_ARGS`,e)}function qc(e,t,n,i){try{return fa({device:e,surfaceFlag:t,openTarget:n,existingSurface:i})}catch(e){return c(e instanceof r?e.code:`INVALID_ARGS`,String(e.message))}}async function Jc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await da({target:n,platform:i.platform,surface:r});return a?Kc(a):null}async function Yc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await da({target:n,platform:r});return i?Kc(i):null}function Xc(e){let t=Wr(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:Ur(n),clearRemovedRuntimeHints:Er({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Zc(e){let{req:t,logPath:n,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!p(a??``),execution:{startupDeadlineAtMs:$c(t),requestId:t.meta?.requestId,logPath:n,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(t)}});let{appBundleId:d,appName:f}=await Qc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new r(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Cr({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:f,runtime:c.runtime}}}async function Qc(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 $c(e){return Gc(e.flags?.timeoutMs)}async function el(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:c(`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:c(`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:c(`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 tl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,openResponse:a}=e;if(!a.ok||t.flags?.foreground!==!0)return a;try{let o=await ma({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n,logPath:r,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return o.ok?{ok:!0,data:{...a.data,snapshot:o.data}}:nl(a.data,o.error)}catch(e){return nl(a.data,l(e))}}function nl(e,t){return{ok:!0,data:{...e,warnings:[...un(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function rl(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,...il(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=x(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,te(d.platform)&&(g.serial=d.id)),d&&E(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...j(`Opened: ${o??s??t}`)}}function il(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function al(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 ol=Object.freeze({async observeBootTimeMs(e){if(E(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 sl(e,t){e.warnings=[...un(e),t]}function cl(e){return e.internal?.resolvedSessionScope??Vi(e)}function ll(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Bt(t,{});return}Xt(n)&&(Jt(t),sl(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 ul(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 dl(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function fl(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 pl(e,t){if(!t)return;let n=await ui(t);if(n.status!==`renewed`)return n.conflict?Lr(e,n.conflict):c(`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 ml(e){let{req:n,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:l,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=n.flags?.relaunch===!0,x=f,S=Date.now(),C=await hl({req:n,sessionName:r,sessionStore:i,device:o,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(C.type===`response`)return C.response;let w=C.session??g,ee=Date.now(),T=await m.operations.openApplication({target:s,positionals:l,outPath:n.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:n.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:dl(o,n),stateDir:i.resolveDaemonStateDir(),runtimeHints:Mr(p),applyRuntimeHints:h,execution:Xs(n,a,g?.trace?.outPath)});x=T.appBundleId??x;let E={...T.timing},te=aa(y),D=s?fl(ee,s,x):void 0;if(Un(n.meta?.requestId)){let e=t();return c(e.code,e.message,e.details)}g&&$r({session:g,command:`open`,positionals:[],flags:void 0});let O=al({existingSession:w,sessionName:g?.name??Ui(n),sessionScope:g?.sessionScope??cl(n),device:o,surface:d,appBundleId:x,appName:u});O.lease=yr({req:n,existingLease:g?.lease}),_&&(O.deviceClaim=_),n.runtime!==void 0&&Or(i,r,p);let ne=i.ensureSessionDir(r),re=Pn(ne,n.meta?.requestId??_n().requestId);E.totalDurationMs=Math.max(0,Date.now()-S),M({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let ie=rl({sessionName:O.name,sessionStateDir:ne,runnerLogPath:Nn(ne),requestLogPath:re,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:x,surface:d,startup:D,timing:E,device:o,runtime:p,runtimeHintCount:Ar,sessionReused:g!==void 0,selection:te});return v&&sl(ie,ul(v)),ll({session:O,existingSession:g,saveScriptRequested:!!n.flags?.saveScript,responseData:ie}),i.set(r,O),i.recordAction(O,{command:`open`,positionals:l,flags:n.flags??{},runtime:n.runtime===void 0?void 0:p,result:ie}),{ok:!0,data:ie}}async function hl(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=gl(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function gl(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=al({existingSession:o,sessionName:o?.name??Ui(t),sessionScope:o?.sessionScope??cl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=yr({req:t,existingLease:o?.lease}),s}function _l(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=sr(t);return Gi(t,i.session)?Hi(i,n,a):Ji(i,n,a)}async function vl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Vr(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Nr(n,r,zr({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Oi({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:ol})}}async function yl(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=_l({req:t,device:a,sessionStore:i});if(m)return m;let h=await vl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Lr(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 bl({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Zc({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 pl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await ml({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 bl(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pi(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await di(t);M({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const xl=new Map;async function Sl(e){let t=Oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Zi({...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,we)};case`open-apply-runtime-hints`:{let t=await r(e.device,de);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,qe);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function Cl(e){let t=Xc(e);if(t.type===`response`)return t;let n=await Sl({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 wl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await el({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 c(`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],l=s??(a?i.appName:void 0),u=qc(i.device,o.flags?.surface,l,i.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return Kc(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 d=await Jc({shouldRelaunch:a,openTarget:l,surface:u,device:i.device});if(d)return d;let f=await pl(i.device,i.deviceClaim);if(f)return f;let p=await Mo(i.device),m=oa(p);await o.internal?.retainDeviceExecutionLock?.(p.id);let h=await Cl({req:o,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;P(i);let v=await Zc({req:o,logPath:n,surface:u,openTarget:l,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await pl(p,i.deviceClaim)||await ml({req:o,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:l,openPositionals:s?o.positionals??[]:l?[l]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:u,existingSession:i,selection:m})}let s=o.flags?.relaunch===!0,l=o.positionals?.[0];if(s&&!l)return Kc(`open --relaunch requires an app argument.`);let u=await Yc({shouldRelaunch:s,openTarget:l,platform:o.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await Ri(o.flags??{},Br(l)),f=d.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=qc(f,o.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Jc({shouldRelaunch:s,openTarget:l,surface:p,device:f});if(m)return m;let h=await Cl({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await Rn(xl,f.id,async()=>await yl({req:o,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:l,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:d}))}async function Tl(e){let t=await wl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await tl({...e,inspectFacts:na(e.inspectFacts),bindDevice:ta(e.bindDevice),openResponse:t})}const El=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Dl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Ol(e){return t=>c(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 kl(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function Al(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function jl(e){return e.available?null:c(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Ml(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Nl(e,t){if(!t.appBundleId)return;let r=await R({command:`appstate`,device:t.device,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(r.type!==`response`)try{return(await r.runtime.operations.appState({appBundleId:t.appBundleId})).applicationState}catch(e){if(n(e))throw e;M({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:i(e).code,message:i(e).message}});return}}async function Pl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&jo(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 c(`SESSION_NOT_FOUND`,e)}let s=J(`appstate`,i,a);if(s)return s;let l=w(i?.device.platform)&&No(a,i),u=o===`ios`,d=o===`macos`;if(u&&!l)return c(`SESSION_NOT_FOUND`,El);if(d&&!l)return c(`SESSION_NOT_FOUND`,Dl);if(l&&i){let t=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:x(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return c(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await Nl(e,i);return{ok:!0,data:{platform:x(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...E(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let f=await Y({session:i,flags:a});if(E(f))return c(`SESSION_NOT_FOUND`,El);if(T(f))return c(`SESSION_NOT_FOUND`,Dl);let p=await R({command:`appstate`,device:f,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>c(`UNSUPPORTED_OPERATION`,f.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(p.type===`response`)return p.response;let m=p.runtime;await m.operations.ensureReady({serial:a.serial,androidSerialAllowlist:Il(a.androidDeviceAllowlist)});let h=await m.operations.appState();return{ok:!0,data:{platform:x(f),package:h.package,activity:h.activity}}}async function Fl(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let a=r.get(n),o=t.flags??{},s=J(t.command,a,o);if(s)return s;let l=F(o.androidDeviceAllowlist),u=l?[...l].sort():void 0,d=_e({headless:o.headless===!0}),f;try{f=await Y({session:a,flags:o,androidAvdSelection:`include-stopped`})}catch(e){let t=i(e);if(d.kind===`boot-target-headless`&&!Ml(o.device,a?.device)&&t.code===`DEVICE_NOT_FOUND`)return c(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(o.target&&(f.target??`mobile`)!==o.target)return c(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${o.target}.`);let p=await Zi({command:`boot`,device:f,required:d.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Ol(d.kind===`boot-target-headless`)});if(p.type===`response`)return p.response;let m={serial:o.serial,androidSerialAllowlist:u,deadlineAtMs:Gc(o.timeoutMs)};return f=d.kind===`boot-target-headless`?await(await p.bind(f,d.use)).operations.bootTargetHeadless(m):await(await p.bind(f,d.use)).operations.bootTarget(m),{ok:!0,data:{platform:x(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...w(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=J(t.command,i,a);if(o)return o;let s=await Y({flags:a,session:i,androidAvdSelection:`include-stopped`}),l=jl((await kl(e.inspectFacts)(s)).operations.shutdownTarget);if(l)return l;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return c(`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:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let u=await(await Al(e.bindDevice)(s,Ee)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u,...w(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:c(u.error?.code??`COMMAND_FAILED`,Ll(u),{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u})}return t.command===`appstate`?await Pl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Il(e){let t=F(e);return t?[...t].sort():void 0}function Ll(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Rl(e){let t=bn(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=V.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{V.closeSync(t)}}function zl(e,t){ha(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=xn(e);try{V.writeFileSync(r,n,`utf8`)}finally{V.closeSync(r)}}function Bl(e){let t=B.dirname(e),n=B.basename(e);V.existsSync(t)||V.mkdirSync(t,{recursive:!0});let r=yn(e);try{V.fsyncSync(r)}finally{V.closeSync(r)}let i=0;for(let e of V.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{V.unlinkSync(B.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Vl(e){return Di.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Hl(e){try{return await Ul(e)}catch(e){return{ok:!1,error:l(e)}}}async function Ul(e){let t=Wl(e);if(!t.ok)return t;let n=t.session,r=ge(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 Gl(a,o);let c=oe({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 Kl(e,n,r,c.use);case`capture-status`:return await ql(e,n);case`capture-stop`:return await Jl(e,n)}}function Wl(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:c(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Gl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return c(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Kl(e,t,n,r){if(t.audioProbe){await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return c(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=Ti.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=Ti.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=B.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await Ci({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...l,throwIfCanceled:e.throwIfCanceled});let u=e.sessionStore.get(e.sessionName)?.audioProbe;if(!u)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await u.handle.status()}}async function ql(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Yl()};let r=await n.handle.status();return r.state===`stopped`&&await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Jl(e,t){return t.audioProbe?{ok:!0,data:await mi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Yl()}}function Yl(){return li({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 Xl(e){let t=e.sessionStore.get(e.sessionName);if(!t)return c(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(sn(e.req.positionals?.[0]))throw new r(`INVALID_ARGS`,cn);_u(e.req);let n=Ei({positionals:e.req.positionals,kind:yu(e.req.flags?.kind),outPath:yu(e.req.flags?.out)}),i=Si(n);if(i.kind===`capture-stop`)return Zl(e,await tu(e,t,i.request));let a=await ra({device:t.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Zl(e,await Ql(e,t,a)):z(`perf`,a.fact)??c(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:l(e)}}}function Zl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,fu(t.data)?{...t.data}:{}),t}async function Ql(e,t,n){let{device:i,plan:a}=ea(n),o=ta(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:su(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:pu(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:mu(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:B.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await $l(e,t,await o(i,a.use),a.request);case`profile-report`:{let n=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=gu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await n.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:A.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function $l(e,t,n,r){if(t.perfCapture)return c(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return c(`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=gu(e,r.outPath,i),o=fi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=fi.createNextFence({admissionLedger:eu(e),resourcePath:o,device:t.device}),l=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 wi({admissionLedger:eu(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function eu(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new r(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function tu(e,t,n){let r=t.perfCapture;if(!r)return c(`INVALID_ARGS`,`no active native perf capture`);let i=ou(r.handle.inspect(),n);if(i)return c(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let a=await yi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=nu(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function nu(e){if(ru(e)||iu(e))return e;throw new r(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function ru(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function iu(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&au(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function au(e,t){return t.every(t=>typeof e[t]==`string`)}function ou(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 su(e,t){return{...hu(e),metrics:{fps:cu(t.metric,e)},sampling:{fps:t.sampling}}}function cu(e,t){if(!fu(e)||e.available!==!0)return e;let n=lu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function lu(e,t){let n=uu(t.windowStartedAt),r=uu(t.windowEndedAt)??uu(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:du(e)})).slice(-12)}function uu(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function du(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function fu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function pu(e,t){return{...hu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function mu(e,t){return{...hu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function hu(e){return{session:e.name,platform:x(e.device),device:e.device.name,deviceId:e.device.id}}function gu(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):B.join(e.sessionStore.ensureSessionDir(e.sessionName),`${vu()}-${n}`)}function _u(e){let t=e.positionals?.[0]?.toLowerCase(),n=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||n!==`snapshot`))throw new r(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function vu(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function yu(e){return typeof e==`string`&&e.length>0?e:void 0}const bu=[`dump`,`log`],xu=`network requires ${bu.join(` or `)}`,Su=`network include mode must be one of: ${u.join(`, `)}`,Cu=2048;async function wu(e){let t=e.sessionStore.get(e.sessionName);if(!t)return c(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=Tu(e.bindDevice),r=(await n(t.device,He)).facts.networkDump;if(!r.available)return Au(r.hint);let i=Eu(e.req);if(!i.ok)return i;let a=me({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return ju(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:Cu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:l(e)}}}function Tu(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Eu(e){let t=Du(e);if(!t.ok)return t;let n=Ou(e);if(!n.ok)return n;let r=ku(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Du(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return bu.includes(t)?{ok:!0,action:t}:c(`INVALID_ARGS`,xu)}function Ou(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?c(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ku(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return c(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return u.includes(r)?{ok:!0,include:r}:c(`INVALID_ARGS`,Su)}function Au(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ju(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:Cu,maxScanLines:e.entries.length},notes:e.notes}}}function Mu(e,t){let n=xi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Nu(e.appLogFailure)]:Pu(n.state)}}function Nu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Pu(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 Fu(e,t){return Le([...e,...t.notes??[]])}async function Iu(e){let{req:t}=e;return t.command===`perf`?await Xl({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Ru(e):t.command===`events`?await Lu(e):t.command===`network`?await wu(e):t.command===`audio`?await Hl(Xu(e)):null}async function Lu(e){let{req:t,sessionName:n,sessionStore:r}=e;try{return await r.flushEvents(n),{ok:!0,data:r.readEvents(n,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:l(e)}}}async function Ru(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return c(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Zu({...e,session:i}),r=(await n.bindDevice(i.device,le)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let a=Vu(pe({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),i);return`ok`in a?a:await zu(n,a)}catch(e){return{ok:!1,error:l(e)}}}async function zu(e,t){switch(t.kind){case`path`:return Hu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Uu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Bu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Ju(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Wu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Gu(e)}}async function Bu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await qu(e,t.appBundleId,n.owner,n.operations.appLogStart):await Ku(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Vu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):c(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Hu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Rl(a),s=Mu(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 Uu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Mu(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:Fu(t.notes,o)}}}function Wu(e,t,n){let r=n.resolveAppLogPath(t);return zl(r,e),{ok:!0,data:{path:r,marked:!0}}}function Gu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return c(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Bl(r.resolveAppLogPath(n));return hi({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Ku(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await gi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:_i.resolvePath(o.resolveSessionDir(a))});let s=Bl(o.resolveAppLogPath(a)),c=await Yu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function qu(e,t,n,r){let{session:i}=e;return i.appLog?c(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Yu(e,t,r,n)}async function Ju(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return c(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await gi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:_i.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Yu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=_i.resolvePath(o.resolveSessionDir(a));try{let l=Vl({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 bi({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:vi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Xu(e){if(!e.bindDevice||!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new r(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Zu(e){if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new r(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}const Qu=new WeakMap;function $u(e){return{store:t=>ed(e,t),finalize:(t,n)=>td({...e,evidence:t,projection:n})}}function ed(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{ni(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 Qu.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Zr(a),refFrame:Qr(a)}),{evidence:s,refsGeneration:o}}function td(e){let t=Qu.get(e.evidence);Qu.delete(e.evidence);let n=rd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!nd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!id(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ri(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function nd(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&&Zr(n)===t.runtimeRevision&&Qr(n)===t.refFrame}function rd(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 id(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function ad(e){let t=od(e),n=We(t);return ga(`sha256`).update(n,`utf8`).digest(`hex`)}function od(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)=>sd(e,n[t]??null,r?.[t]??null))}}function sd(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 cd(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=ld({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function ld(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>ud({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>dd({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>fd(n,r)];for(let e of s){let t=e();if(t)return t}}function ud(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 dd(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 fd(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 pd(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new r(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=st(e),a=lt(e),o=ad({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??rt(i.actions)??a.platform,target:t?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>cd(e,s,o)}}function md(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function hd(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ze(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function gd(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 _d(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=gd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Te(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 vd(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Te(e,r),...xe(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 yd(e,t,n,r,i,a){if(n.targetEvidences)return bd(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return X(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return X(e,n,r,i,a);if(s.kind===`post-resolution`){let c=md({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return X(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return Sd(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=hd({recorded:o,token:s.token});if(c.kind===`skip`)return X(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.observeTarget({action:n,index:i,token:l});if(u.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,xd(u),a,t)};let{classification:d}=u;return d.verified?Sd(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 bd(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 X(e,n,r,i,a);let d=hd({recorded:o[c],token:u.token});if(d.kind===`skip`)return X(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.observeTarget({action:l,index:i,token:d.token});if(f.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,xd(f),a,t)};let{classification:p}=f;if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return Sd(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function xd(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 X(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 Sd(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=Cd(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=wd(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 Cd(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 wd(e,t,n){return n.status===`guard-mismatch`?_d(e,n.evidence,t):vd(e,n.evidence)}async function Td(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Pt(e.varSources),o=[],s=[],c=kd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Od(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Ad(u,n.length,r,e))}let d=Nt(r,a,Dd(e,u)),f=At(a),p=t.diagnosticsMarker(),m=await yd(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:Ed(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 Ed(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Dd(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Od(e){return!!(e&&e.command!==`replay`)}function kd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Od(n))return n.command===`close`?t:void 0}}function Ad(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function jd(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=Ze(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function Md(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),ot(e.command)){let n=Nd(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=Ze(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=jd([...e.positionals]);n&&t.push(n)}return Le(t).filter(e=>e.trim().length>0)}function Nd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Pd(n)?t.slice(0,-1):t}function Pd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Fd(e){let t=B.dirname(e),n=B.basename(e,B.extname(e));return B.join(t,`${n}.healed.ad`)}function Id(e){let t=Ld({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 Ld(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Rd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Rd(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 zd(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Bd(n))return`manual`;let i=Vd(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Bd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Hd(e.scrollRegion)}function Vd(e,t){let n=en(t),r=Wd(e.ancestry,n,t),i=e.scrollRegion;return i&&Hd(i)?r&&Ud(i,n,t):r}function Hd(e){return e.id!==void 0||e.label!==void 0}function Ud(e,t,n){return n.some(n=>Tt(wt(n,t),e))}function Wd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=$t(n,t,e.length);return!r.broken&&fe(r.chain,e)})}function Gd(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:i}=e,a,o,s=An({divergence:r,level:i,writeOverflowArtifact:e=>{let n=d(e),r=Jd(t,n);return`artifactPath`in r&&(a=n,o=r.artifactPath),r}}),c=(a??s).screen;if(c.state!==`available`||c.refs.length===0)return e.evidence&&n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.state===`available`?c.refsGeneration:void 0,refs:[]}),s;if(!e.evidence)return qd(o),Kd(s,`missing-evidence`);let l=n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.refsGeneration,refs:c.refs.map(e=>e.ref)});return l.published===!0?s:(qd(o),Kd(s,l.reason))}function Kd(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 qd(e){if(e)try{V.unlinkSync(e)}catch{}}function Jd(e,t){try{let n=B.join(e.ensureSessionDir(),`replay-divergence`);V.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=B.join(n,r);return V.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const Yd={id:0,"role-label":1,label:2,other:3};function Xd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Zd(n.basis)<Zd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Zd(e.basis)-Zd(t.basis)||e.nodeIndex-t.nodeIndex)}function Zd(e){return Yd[e]}async function Qd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionStore:s,observationStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=kn(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await tf({session:o,observationStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=of(v,g),b=v.state===`available`&&o?df({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=zd({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:$d(v)}),S=Id({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Gd({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(at(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function $d(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const ef=[300,500,800,1200,2e3,3e3,4e3];async function tf(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=rf(i),s=Date.now()+12e3,c=await nf({session:t,observationStore:n,logPath:r,flags:o});if(!a)return c.observation;for(let e of ef){if(c.observation.state===`available`||!c.retryable)break;let i=s-Date.now();if(i<=0)break;await wn(Math.min(e,i)),c=await nf({session:t,observationStore:n,logPath:r,flags:o})}return c.observation}async function nf(e){let{session:t,observationStore:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).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 a=n.bindAuthority().store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:a.refsGeneration,evidence:a.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:Ln(e)}}}function rf(e){return{snapshotInteractiveOnly:af(e)}}function af(e){return!ff(e.command)||pf(e).requiresRect}function of(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=uf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function sf(e){return!!fn(e,f(e.type??`Element`))||e.hittable===!0}function cf(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function lf(e,t){let n=Qt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&sf(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=>cf(e,t)),...o.filter(e=>!cf(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function uf(e,t,n){let{nodes:r,truncated:i}=lf(e,n);return{refs:r.map(e=>{let n=f(e.type??`Element`),r=fn(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function df(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!ff(t.command))return[];let a=Md(t);return a.length===0?[]:mf({candidates:a,nodes:r,session:n,action:t,matching:pf(t),sanitize:i})}function ff(e){return ot(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function pf(e){let t=ot(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function mf(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=hf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Xd(s).map(e=>e.suggestion)}function hf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Ie(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:gf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function gf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Be(t,r.device.platform,{action:i.command===`fill`?`fill`:ot(i.command)?`click`:`get`,nodes:n}),c=f(t.type??`Element`),l=fn(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function _f(e){return{...e,hint:e.hint??bf(e.details,`hint`),diagnosticId:e.diagnosticId??bf(e.details,`diagnosticId`),logPath:e.logPath??bf(e.details,`logPath`)}}function vf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return yf({error:t,actionLabel:at(n),action:n.command,positionals:pt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function yf(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Dn(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Dn(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Sf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>Dn(e,u))}:{},divergence:l}}}}function bf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const xf=[`readiness`,`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function Sf(e){if(!e)return{};let t={};for(let n of xf)e[n]!==void 0&&(t[n]=e[n]);return t}async function Cf(e){return await wf({...e,snapshotDiagnostics:_(e.snapshotDiagnosticSamples)})}async function wf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Tf(t.error.details?.replaySource),v=_f(t.error),y=await Qd({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:Kn(u.meta?.requestId)});return vf({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Tf(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 Ef(e,t){if(e)try{V.appendFileSync(e,`${JSON.stringify(d(t))}\n`)}catch(t){M({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Df(e){let{req:t,sessionName:n,action:i,resolved:a,filePath:o,line:s,step:c,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();Ef(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,positionals:pt(a)??[]});let g;try{g=await kf({req:t,sessionName:n,resolved:a,sourceAction:i,invoke:f,resolvedSessionScope:p,dependencies:m,readinessTimeoutMs:e.readinessTimeoutMs})}catch(e){if(!(e instanceof r))throw e;g={ok:!1,error:l(e)}}let _=Date.now();return Ef(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?jf(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Of(g,u??o,s)}function Of(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function kf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Nf(t.flags,r.flags,r.command);e.readinessTimeoutMs!==void 0&&(c.readinessTimeoutMs=e.readinessTimeoutMs);let l=i.command===`fill`?Wt(Rt(i)):void 0;return l&&(c.recordAs=l),await a(Af({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Af(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:it(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ut(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function jf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}async function Mf(e,t){let{readinessTimeoutMs:n}=Nf(e,t.flags,t.command);if(n===void 0)return;let{SELECTOR_PIPELINE_POLICIES:r,readinessScheduleFor:i}=await import(`./selector-pipeline-policy.js`).then(e=>e.r);return i(r.promotedTarget.poll,n)}function Nf(e,t,n){let r=g(e,{...t??{}});return Re(n)&&r.readinessTimeoutMs===void 0&&(r.readinessTimeoutMs=2e3),r}function Pf(e){return Vf(e.ok?If(e.data):Ff(e.error.details?.artifactPaths))}function Ff(e){return Array.isArray(e)?e.filter(Bf):[]}function If(e){return e?[zf(e.path),zf(e.outPath),...Lf(e.artifacts)].filter(Bf):[]}function Lf(e){return Array.isArray(e)?e.map(Rf).filter(Bf):[]}function Rf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return zf(t.localPath)??zf(t.path)}function zf(e){return typeof e==`string`?e:void 0}function Bf(e){return typeof e==`string`}function Vf(e){return[...new Set(e.filter(Hf))]}function Hf(e){try{return V.statSync(e).isFile()}catch{return!1}}function Uf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Wf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=en(r),u=Ce(t),d=Zt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Et(r,e)===t.sibling),p=d.filter(e=>Tt(wt(e,l),t.scrollRegion)),m=St(p)[t.viewportOrder]?.ref,h=Ct({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,...qf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Wf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Gf(n,t,i,a):Kf(n,t,r,a,o)}function Gf(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),s=e(n),c=s?o(t,s):null;if(a(c))return{matchedNodes:[c],winnerRef:c.ref};let l=r?tn(t,r):null;return a(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Kf(e,t,n,r,i){let a=et(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=rn(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function qf(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?Jf(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?Jf(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?Jf(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 Jf(e,t,n){let r=Dt(t),i=$t(t,n,Math.max(e.ancestry.length,1)).chain;return[...Te(e,r),...xe(e.ancestry,i)].slice(0,5)}function Yf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=dt(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ze(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!ot(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Zf(r)&&Zf(n[1])))return r}function Xf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Zf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Qf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=kn(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:cp(Ce(n),h),...t.observed?{observed:cp(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>lp(e,h))},_=zd({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Id({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(at(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=Gd({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return vf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function $f(e,t,n){let r=kn(e.scrubVars);return Qf(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:of(n,r),publicationEvidence:rp(n),repairCapture:$d(n)})}async function ep(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await tf({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function tp(e,t){return $f(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 ep({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function np(e,t,n){return $f(e,t,await ep({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function rp(e){return e.state===`available`?e.evidence:void 0}function ip(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?ae(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Je(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Yf(n,i),platform:a.device.platform}:{kind:`inactive`}}function ap(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=pf(r),s=Uf({recorded:t,token:n,nodes:i,platform:a,refLabel:Xf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Dt(s.winnerNode),structural:ke(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Dt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function op(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function sp(e){return!e.ok&&e.error.details?.reason===nn}function cp(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function lp(e,t){let n=f(e.type??`Element`),r=fn(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function up(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function dp(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 fp(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 pp(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 mp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:dp(e?.observed),expectedStructural:pp(e?.expectedStructural),observedStructural:pp(e?.observedStructural)}}function hp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:dp(e?.observed),observedAncestry:fp(e?.observedAncestry)}}function gp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function _p(e,t,n){let r=gp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&op(e)?{status:`guard-mismatch`,evidence:mp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&sp(e)?{status:`landmark-mismatch`,evidence:hp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function vp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c,l=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),u=e=>(o=e,gp(yp(e),Pf(e))),d=async e=>{let n=t.observationStore.get();return n?await tf({session:n,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:!0}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`}};return{runtime:{beginTargetVerification(e,n,r,i){return ip({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async observeTarget({action:e,token:n}){let r=async()=>{let r=await d(e);if(s=r,r.state!==`available`)return{state:`unavailable`,reason:r.reason,hint:r.hint};let i=t.sessionStore.get();return{state:`classified`,classification:ap({recorded:e.targetEvidence,token:n,action:e,nodes:[...r.nodes],platform:i.device.platform})}},i=n.startsWith(`@`)?void 0:await Mf(t.replayReq.flags,e);if(!i)return await r();let{observeUntil:a}=await import(`./observe-until.js`).then(e=>e.n),o=await a({capture:r,verdict:e=>Tp(e)?{kind:`continue`}:{kind:`done`,result:e},schedule:i,...t.signal?{signal:t.signal}:{},...t.dependencies.clock?{clock:t.dependencies.clock}:{}});if(o.polls.length>1&&(c={remainingBudgetMs:Math.max(0,i.budgetMs-Ep(o)),readiness:{polls:o.polls.length,waitedMs:o.waitedMs,end:o.kind}},M({level:`debug`,phase:`interaction_target_readiness`,data:{...c.readiness,command:e.command}})),o.kind===`done`)return o.result;if(o.last!==void 0)return o.last;throw o.kind===`expired`?o.lastError:o.error},async dispatchStep(e,n,i,a,s){let l=t.actionLines[i]??1,u=await Df({...c?{readinessTimeoutMs:c.remainingBudgetMs}:{},req:up(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:l,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=u,Pf(u).forEach(e=>r.add(e));let d=[...r];return u.ok?{status:`ok`,artifactPaths:d}:_p(u,s,d)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await tp(l(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=$f(l(e,t,r,i),n,a);return u(n.kind===`selector-miss`&&c?Dp(o,c.readiness):o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await np(l(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=yp(o),l=await bp(t,n,e,r,c,[...i],[...a],s);return u(l)},armStep:()=>{s=void 0,c=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>xp(e),onStep:i,diagnosticsMarker:()=>Cp(t.sessionStore),diagnosticsSince:e=>wp(t.sessionStore,e)},readLastResponse:()=>o}}function yp(e){return e&&!e.ok?e:c(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function bp(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Sp(i)?c(i):c(await Cf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function xp(e){let t=e.positionals??[],n=Ne(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Sp(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 Cp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function wp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Tp(e){return e.state===`classified`&&!e.classification.verified&&e.classification.kind===`selector-miss`}function Ep(e){let t=e.polls[0];return t?e.waitedMs-(t.startedMs+t.durationMs):0}function Dp(e,t){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,readiness:t}}}}function Op(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:kp(t,i)};return jp(o,`AD_PLATFORM`,a.platform??r.platform),jp(o,`AD_TARGET`,a.target??r.target),jp(o,`AD_DEVICE`,a.device),jp(o,`AD_DEVICE_ID`,Ap(a)),Mp(o,`AD_SHARD_INDEX`,a.shardIndex),Mp(o,`AD_SHARD_COUNT`,a.shardCount),jp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function kp(e,t){let n=e.meta?.cwd??process.cwd();return B.relative(n,t)||t}function Ap(e){return typeof e.serial==`string`?e.serial:e.udid}function jp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Mp(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Np=3e4,Pp=1e3;function Fp(e){let{scriptPath:t,env:n,publicNetworkOnly:i}=e,a=V.readFileSync(t,`utf8`),o=Object.create(null);try{ba.runInNewContext(a,Ip(n,o,i),{filename:t,timeout:Np})}catch(e){let n=l(e);throw new r(n.code,`Maestro runScript failed: ${n.message}`,m({...n.details??{},hint:n.hint,diagnosticId:n.diagnosticId,logPath:n.logPath,retriable:n.retriable,supportedOn:n.supportedOn,scriptPath:t}),e instanceof Error?e:void 0)}return Up(o,t),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Wp(t)]))}function Ip(e,t,n){return{...e,output:t,json:Lp,http:{post:(e,t)=>zp(`POST`,e,n,t)}}}function Lp(e){if(typeof e!=`string`)throw new r(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new r(`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,Rp)}catch(t){throw new r(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Pp)},t instanceof Error?t:void 0)}}function Rp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function zp(e,t,n,i){let a=Cn(process.execPath,Bp(),{stdin:JSON.stringify(Hp(e,t,i,n)),timeoutMs:Np,allowFailure:!0});if(a.exitCode!==0)throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Gp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(n){throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:a.stdout.slice(0,Pp),stderr:a.stderr.slice(0,Pp)},n instanceof Error?n:void 0)}}function Bp(){let e=Vp(import.meta.url);if(!e)throw new r(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Vp(e){try{let t=va(e),n=B.extname(t)||`.js`;return[B.join(B.dirname(t),`run-script-http-child`+n),B.join(B.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>V.existsSync(e))??null}catch{return null}}function Hp(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Up(e,t){for(let n of Object.keys(e))if(n.includes(`.`))throw new r(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${n}`,{scriptPath:t,key:n})}function Wp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Gp(e){let t=e.trim();return t.length>0?t.slice(0,Pp):`request process exited without stderr`}async function Kp(e){return await qp(`tap`,async t=>{let n=B.join(t,`before.png`),r=B.join(t,`after.png`),i=await Yp(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Yp(e,r)))return await Jp(n,r,e.signal,`tap`)}})})}async function qp(e,t){let n=await H.mkdtemp(B.join(_a.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await H.rm(n,{recursive:!0,force:!0})}catch{}}}async function Jp(e,t,n,r){try{let[i,a]=await Promise.all([H.readFile(e),H.readFile(t)]);$p(n);let o=await $i(i,a,`Maestro screenshot`);return $p(n),Xp(o,r)}catch(e){Qp(e,n),M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Yp(e,t){try{return await H.rm(t,{force:!0}),$p(e.signal),await e.capture(t),$p(e.signal),!0}catch(t){return Qp(t,e.signal),!1}}function Xp(e,t){if(e.status!==`compared`)return Zp(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return Zp(t,n?`stable`:`changed`,e),n}function Zp(e,t,n){M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Qp(e,r){if(r?.aborted||n(e))throw t()}function $p(e){if(e?.aborted)throw t()}async function em(e){nm(e.timeoutMs),$p(e.signal);let t=e.now()+e.timeoutMs;return await qp(`animation`,async n=>{let r=B.join(n,`first.png`),i=B.join(n,`second.png`);for(;;){if($p(e.signal),await tm(e,r,i))return!0;if(e.now()>=t)return!1}})}async function tm(e,t,n){let r=[await Yp(e,t),await Yp(e,n)];return!r[0]||!r[1]?!1:await Jp(t,n,e.signal,`animation`)===!0}function nm(e){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const rm=q.observationPollMs;async function im(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!bm(n)||(Z(e.context.signal),!await vm(e.dependencies,t,rm,e.context.signal)))throw n}}}function am(e){return om({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function om(e){let t=Bi(e.snapshot),n=e.platform===`ios`?ia(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:a(n.nodes)}:e.snapshot;return dm(yo(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 sm(e){ym(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await im(e,n),i=om({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Ca(e.condition,i))return i;if(e.dependencies.now()>=n)break;await vm(e.dependencies,n,rm,e.context.signal)}return Z(e.context.signal),Cm(t)}async function cm(e){ym(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await im(e,t);if(r=void 0,n=om({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===q.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),Cm(n)}async function lm(e){ym(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await im(e,t),r=xm(n);for(;;){Z(e.context.signal),await vm(e.dependencies,t,rm,e.context.signal);let i=await im(e,t),a=xm(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 um(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function dm(e,t,n,r,i,a,o){if(!e.ok){let t=um(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=pm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=um(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:fm(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:xm(t)}:{}}}function fm(e,t){return!Ae(e)||!Ae(t)?0:O(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 pm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!mm(t,n,r)||i!==1))return hm(t.selector)}function mm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!bo(e.selector)}function hm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!gm(n)||typeof r!=`string`)return;let i=Pr(r)?.trim();return i?{key:n,value:i}:void 0}function gm(e){return e===`id`||e===`label`||e===`text`}async function _m(e,n,r){try{await e.sleep(n,r)}catch(e){throw r?.aborted?t():e}Z(r)}async function vm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await _m(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw t()}function ym(e,t){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function bm(e){return e instanceof r&&e.details?.retriable===!0}function xm(e){return ga(`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,checked:e.checked??!1,bounds:Sm(e.rect)})))).digest(`hex`)}function Sm(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 Cm(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function wm(e){return e.kind===`clearState`?km(e):Tm(e)?Em(e):Wm(e)?Gm(e):e.kind===`settingsPermission`?Lm(e):Rm(e)}function Tm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Em(e){switch(e.kind){case`launchApp`:return Dm(e);case`stopApp`:return Om(e);case`openLink`:return Am(e)}}function Dm(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 Om(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function km(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Am(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const jm={camera:`camera`,microphone:`microphone`,photos:`photos`,contacts:`contacts`,notifications:`notifications`,calendar:`calendar`,location:`location`,medialibrary:`media-library`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`},Mm={allow:`grant`,deny:`deny`,unset:`reset`},Nm={location:{always:{state:`grant`,permission:`location-always`},inuse:{state:`grant`,permission:`location`},never:{state:`deny`,permission:`location`}},photos:{limited:{state:`grant`,permission:`photos`,mode:`limited`}}};function Pm(e){let t=Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]);if(t.length===0)throw new r(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...t.filter(([e])=>e===`all`),...t.filter(([e])=>e!==`all`)].map(([e,t])=>Fm(e,t))}function Fm(e,t){let n=e===`all`?`all`:Im(jm,e);if(n===void 0)throw new r(`UNSUPPORTED_OPERATION`,`Maestro permission "${e}" is not supported.`,{hint:`Supported: all, ${Object.keys(jm).join(`, `)}.`});let i=Nm[e],a=i?Im(i,t):void 0;if(a)return a;let o=Im(Mm,t);if(o)return{state:o,permission:n};throw new r(`INVALID_ARGS`,`Maestro permission "${e}" does not accept "${t}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(i??{})].join(`|`)}.`})}function Im(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function Lm(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Rm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return zm(e);case`clickPoint`:return Bm(e);case`swipe`:return Vm(e);case`scroll`:return Hm(e);case`pressKey`:return Um(e)}}function zm(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Bm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Vm(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function Hm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Um(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Wm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Gm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Km(e,t){let n=wm(t),i=await e.invoke(m({...n,flags:qm(e.flags,n.flags??{})}));if(!i.ok)throw $m(i);if(t.kind===`gestureViewport`){let e=i.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new r(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function qm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=m({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Jm(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 Ym(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 Xm(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 Zm(e,t,n){if(B.isAbsolute(e))return e;let i=t.source?.path??n;if(!i)throw new r(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return B.resolve(B.dirname(i),e)}function Qm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function $m(e){let t=e.error,n=m({...t.details??{},hint:t.hint??eh(t.details,`hint`),diagnosticId:t.diagnosticId??eh(t.details,`diagnosticId`),logPath:t.logPath??eh(t.details,`logPath`),retriable:t.retriable??th(t.details,`retriable`),supportedOn:t.supportedOn??eh(t.details,`supportedOn`)});return new r(t.code,t.message,Object.keys(n).length?n:void 0)}function eh(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function th(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function nh(e){let t,n,i,a,o,s=0,c=0,l=async n=>{c+=1;let i=await Km(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new r(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=b(i,i);return t={generation:n.generation,snapshot:a},a};return{capture:async e=>{if(n?.generation===e.generation){let r=n.snapshot;return n=void 0,t={generation:e.generation,snapshot:r},r}return n=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,n=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,n=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,n=void 0}},prime:(e,t)=>{n={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await lm({timeoutMs:q.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,n={generation:i.generation,snapshot:c.snapshot},c}}}async function rh(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 im({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=am({query:t,context:n,snapshot:o,platform:i.platform});if(lh(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await vm(i.dependencies,a,rm,n.signal)}}}async function ih(e,t,n,r,i,a){let o=async()=>await sh(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Kp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Km(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await ah(e,t,n,r,i,a.click,o)});return}await ah(e,t,n,r,i,a.click)}async function ah(e,t,n,r,i,a,o){let s=async()=>await sh(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:xm(await t.capture(i))),l=async()=>{let r=await lm({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await oh({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 oh(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<q.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function sh(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await uh(e,o,n.point,i);return}catch(n){if(!dh(n))throw n;let o=await rh({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!ch(o))throw n;t.invalidate(r.generation),await fh(e,In(o.rect),i);return}}t.invalidate(r.generation),await fh(e,n.point,i)}function ch(e){return e.matched&&e.visible&&e.rect!==void 0}function lh(e,t){return ch(e)?!t||e.dispatchSelector!==void 0:!1}async function uh(e,t,n,r){M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Km(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function dh(e){let t=i(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===dn.selectorNotFound}async function fh(e,t,n){if(!t)throw new r(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Km(e,{kind:`clickPoint`,point:t,options:n})}function ph(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function mh(e){let t=nh(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},i=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},a=e.platform,o=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Km(e,t)),s=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},c=async(e,t,n=`none`)=>await s(()=>o(e),t,n),l=async(e,t,n)=>{let i=[];for(let a of t){try{await c({kind:`settingsPermission`,...e?{appId:e}:{},state:a.state,permission:a.permission,...a.mode?{mode:a.mode}:{}},n)}catch(e){throw e instanceof r?new r(e.code,e.message,{...e.details,appliedPermissionMutations:i,failedPermissionMutation:ph(a)}):e}i.push(ph(a))}},u=async(n,r)=>{vn(n),await c({kind:`typeText`,text:n},r);let a=await lm({timeoutMs:q.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});i(a),t.prime(r.generation,a.snapshot)};return{operations:{platform:a,resolveTarget:async(n,r)=>await rh({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await sm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a}),resolveGestureViewport:async()=>await o({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Jm(e.arguments),...Jm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Pm(e.permissions);i&&await c({kind:`clearState`,...n?{appId:n}:{}},t),await l(n,r,t)}await c({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i&&!e.permissions,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`stopApp`,...n?{appId:n}:{}},t)},setPermissions:async(e,t)=>{await l(e.appId??t.appId,Pm(e.permissions),t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await c({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:a===`ios`},t,`deferred`)},tapOn:async(r,i)=>await ih(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await s(()=>fh(e,t.target.point,m({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await s(()=>fh(e,t.target.point,{holdMs:q.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await c({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await u(e.text,t),eraseText:async(e,t)=>await u(`\b`.repeat(e.charactersToErase??q.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await c({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let i=await cm({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a,scroll:async(i,o)=>{let s=Ma(o,n.selector,n.direction,n.durationMs,a);return await c(s?{kind:`swipe`,...s}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await lm({timeoutMs:Math.min(q.settleTimeoutMs,i),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(i.visiblePercentage!==q.scrollUntilVisiblePercentage)throw Rr(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Ym(n.selector,i))}},pressKey:async(e,t)=>{await c({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await c({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await c({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await em({timeoutMs:t.timeoutMs??q.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await o({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Xm(await o({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Fp({scriptPath:Zm(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?Qm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:i}}function hh(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=mh(e);return Do(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 gh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),_h(()=>bh(r,e)),_h(()=>xh(n,t,e))},actionCompleted:e=>{let r=vh(i,e.stepIndex);_h(()=>Sh(n,t,yh(r,e),!0))},actionFailed:e=>{let r=vh(i,e.stepIndex);_h(()=>Sh(n,t,yh(r,e),!1))}}}function _h(e){try{e()}catch{}}function vh(e,t){let n=e.get(t);return e.delete(t),n}function yh(e,t){return m({...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 bh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function xh(e,t,n){Ef(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 Sh(e,t,n,i){let a=Ch(n);Ef(e,{type:`replay_action_stop`,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,ok:i,durationMs:n.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in n&&n.error instanceof r?{errorCode:n.error.code}:{}})}function Ch(e){let t=`data`in e?e.data:void 0,n=wh(t?.timing)?t.timing:void 0;return m({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function wh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Th(e,t){let n=m({...e.dispatch,...Eh(t.dispatch)});return m({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,dispatch:Object.keys(n).length>0?n:void 0})}function Eh(e){return m({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function Dh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:jh(e.action),positionals:Mh(e.action,e.value),flags:t.flags??{}}}}async function Oh(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=Kn(r.meta?.requestId),c=Dh(t,r),l=_f(e.error),u=[...t.redactions],d=kn(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await tf({session:p,observationStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?kh({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Ah(t.value)].filter(Boolean).join(` `),_=Gd({sessionStore:i,observationStore:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:of(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:zd({kind:`action-failure`,targetEvidence:void 0,capture:$d(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return yf({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u,warnings:t.warnings})}function kh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Xd(Qn(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>gf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Ah(e){return!e||e===`<text>`?e??``:ct(e)}function jh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Mh(e,t){return!t||e===`inputText`?[]:[t]}function Nh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=Fh(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:Ih(c,Date.now()-r)}}}async function Ph(e){let{command:t,replayPath:n,state:r,outcome:i}=e,{request:a,session:{store:o,observationStore:s,logPath:c}}=t,{failure:u}=i,d=l(i.error);return u?await Oh({error:d,failure:u,replayPath:n,req:a,sessionStore:o,observationStore:s,logPath:c,snapshotDiagnostics:Fh(o,r.snapshotStart)}):{ok:!1,error:d}}function Fh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return _(n)}function Ih(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Lh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return c(`INVALID_ARGS`,ur);if(t.flags?.saveScript!==void 0)return c(`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 Rh({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Ph({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Rh(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await zh({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Kh({command:t,device:l.device,platform:l.platform,runtimeHints:l.runtimeHints,sourcePath:l.filePath,publicNetworkOnly:u});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await pr(l.flow,d,{defaults:l.defaults,env:l.env,platform:l.platform,target:l.target,runtimeHints:l.runtimeHints,signal:l.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:!u,readSource:e=>Yr(n,e),observer:gh({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?Nh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Ph({command:t,replayPath:n.entry,state:i,outcome:f})}async function zh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=rr(Yr(n,o),o),c=a.lookup(),l=c?.session;c&&a.assertSelectorMatches(r.flags);let u=await Bh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Wh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Gh(r),signal:Kn(r.meta?.requestId)}}async function Bh(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 Li(t.flags??{},tr(a.appTarget,o))),c=Zh(t,s),l=Hh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Vh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Qh(t,s),runtimeHints:l,flow:a})}async function Vh(e){if(e.device||!Uh(e.runtimeHints))return e;let t=await Li(e.req.flags??{},tr(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Qh(e.req,t),runtimeHints:Hh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Hh(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function Uh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Wh(e){return{...Op({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Gh(e){return{...Mt(jt(e.flags?.replayShellEnv)),...kt(Ot(e.flags?.replayEnv))}}function Kh(e){let{command:t,device:n,platform:r,runtimeHints:i,sourcePath:a,publicNetworkOnly:o}=e,{request:s,invoke:c}=t,l={...s,runtime:i,...t.dispatch?{dispatch:t.dispatch}:{}};return hh({invoke:e=>c(Th(l,e)),flags:qh(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await ya(e,void 0,{signal:t})}}})}function qh(e,t,n){if(!e)return Jh(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 Jh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Yh(n,t):Xh(n,t)}function Yh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Xh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Zh(e,t){let n=e.flags?.platform;if(n===`android`||n===`ios`)return n;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new r(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Qh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function $h(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(It(t,a.flags?.replayBackend)===`maestro`)return n?c(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Lh(i):c(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function eg(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=tg(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=ng(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=rg({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:ag({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function tg(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return c(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function ng(e,t,n){let r=pd(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:ig({...e,flags:ir(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function rg(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:c(`INVALID_ARGS`,a.message)}}function ig(e,t){return!t.platform&&!t.target?e:{...e,flags:og(e.flags,t)}}function ag(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Op({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Mt(jt(t.flags?.replayShellEnv)),cliEnv:kt(Ot(t.flags?.replayEnv))}}function og(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const sg={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function cg(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=lg({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(fg({req:t,coordinator:a}),dg({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function lg(e){let t=pg(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return s()}function ug(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?c(`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.`):mg({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function dg(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=ug({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??sg,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:hg({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function fg(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function pg(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return c(`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 mg(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Mn(t):a??Fd(i);if(!(n||r&&o===a)&&V.existsSync(o))return c(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function hg(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 gg(e){let{request:t,session:{name:n,logPath:r,store:i,observationStore:a,coordinator:o},tracePath:s,onStep:u,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return c(`INVALID_ARGS`,ur);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,Lt(h)&&t.flags?.replayBackend!==`maestro`)return c(`INVALID_ARGS`,Ft(`replay`,h));let l=await $h({resolved:h,keepSession:m,coordinator:o,command:e});if(l)return l;let _=eg({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:h,script:Yr(f,h),coordinator:o,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:ee}=_.value,T=cg({req:t,entryIndex:C,sessionStore:i,sourcePath:h,coordinator:o});if(!T.ok)return T.response;let{runtime:E,readLastResponse:te}=vp({ctx:{replayReq:v,sessionName:n,sessionStore:i,observationStore:a,logPath:r,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:ee,responseLevel:t.meta?.responseLevel,invoke:d,signal:Kn(t.meta?.requestId),coordinator:o,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:u,armSaveScript:T.armSaveScript}),D=await Td({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},E);return D.status===`failed`?te()??c(`COMMAND_FAILED`,`replay step failed with no recorded response`):_g({startedAt:p,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:o,keepSession:m})}catch(e){let t=l(e);return g.size===0?{ok:!1,error:t}:{ok:!1,error:{...t,details:{...t.details,artifactPaths:[...g]}}}}}function _g(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=yg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=_([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:vg(i,Date.now()-t)}}}function vg(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function yg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return c(`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 bg(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=B.resolve(n??`.`,t??`.agent-device/test-artifacts`);return B.join(i,r)}function xg(e,t){let n=t?B.relative(t,e):B.basename(e),r=n.length===0||n.startsWith(`..`)?B.basename(e):n;return Ye(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function Sg(e,t){V.mkdirSync(t,{recursive:!0}),Tg(e,t)}function Cg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=B.join(o,`result.txt`),u=B.join(o,`failure.txt`),d=wg([...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=>B.basename(e)).join(`, `)}`);let p=`${f.join(`
1
+ import{E as e,F as t,G as n,N as r,P as i,_ as a,b as o,d as s,o as c,q as l,t as u,tt as d,x as f}from"./sdk-contracts.js";import"./capture.js";import{i as p,k as m,n as h,t as g}from"./sdk-batch-runner.js";import{a as _,n as v,t as y}from"./snapshot-diagnostics.js";import{f as b}from"./android-input-ownership.js";import{C as x,T as S,b as C,d as w,h as ee,m as T,p as E,v as te,x as D}from"./sdk-device.js";import{$r as O,B as ne,Ct as re,Dr as ie,E as ae,F as oe,G as se,Gr as ce,I as le,J as ue,K as de,Kn as fe,L as pe,M as me,Or as he,P as ge,Pt as _e,Q as ve,R as ye,Tt as be,Un as xe,V as Se,Vn as Ce,W as we,Wn as Te,Wt as Ee,X as De,Y as Oe,Yn as ke,Yr as Ae,Z as je,Zr as Me,_n as Ne,an as Pe,at as Fe,bn as Ie,cr as Le,d as Re,f as ze,gn as Be,it as Ve,j as He,mt as Ue,or as We,p as Ge,pt as Ke,q as qe,sn as Je,sr as Ye,st as Xe,vn as Ze,wt as Qe,y as $e,yn as et,z as tt}from"./sdk-batch.js";import{u as nt}from"./scroll-gesture.js";import{a as rt,b as it,f as at,g as ot,n as st,p as ct,r as lt,w as ut,y as dt}from"./script.js";import{_ as ft,a as pt,c as k,d as mt,f as ht,g as gt,h as _t,l as vt,m as yt,p as bt,t as A,u as xt}from"./session-store.js";import{a as St,d as Ct,n as wt,o as Tt,r as Et,t as Dt}from"./target-evidence.js";import{a as Ot,i as kt,n as At,o as jt,r as Mt,s as Nt,t as Pt}from"./vars.js";import{n as Ft,r as It,t as Lt}from"./format.js";import{A as Rt,O as zt,c as Bt,f as Vt,g as Ht,h as Ut,j as Wt,k as Gt,l as Kt,m as qt,o as Jt,p as Yt,u as Xt}from"./parameterized-recorded-fill.js";import{F as Zt,M as Qt,N as $t,P as en,_ as tn,c as nn,h as rn}from"./runtime.js";import{n as an,t as on}from"./catalog.js";import{g as sn,i as cn}from"./observability.js";import{i as ln,n as un,r as j}from"./success-text.js";import{o as dn,p as fn}from"./overlay.js";import{t as pn}from"./app-inventory.js";import{a as mn,r as hn,t as gn}from"./device.js";import{a as _n,o as vn,r as M}from"./diagnostics.js";import{a as yn,i as bn,r as xn}from"./verified-file.js";import{l as Sn,m as Cn}from"./exec.js";import{t as wn}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Tn,r as En}from"./output-path.js";import"./command.js";import{a as Dn,i as On,n as kn,t as An}from"./replay-divergence.js";import"./retry.js";import{a as jn}from"./version.js";import{t as Mn}from"./session-paths.js";import{i as Nn,r as Pn}from"./session-artifact-paths.js";import{t as Fn}from"./project-runtime.js";import{r as In}from"./rect-center.js";import{t as Ln}from"./android-snapshot-quality.js";import{t as Rn}from"./keyed-lock.js";import{n as zn,t as Bn}from"./deploy-result-target.js";import{t as Vn}from"./keyboard-actions.js";import{a as Hn,i as Un,n as Wn,o as Gn,r as Kn}from"./request-cancel.js";import{t as qn}from"./request.js";import{i as Jn,s as Yn}from"./provider-session-ownership.js";import{$ as Xn,A as Zn,B as Qn,C as $n,E as er,F as tr,G as nr,H as rr,I as ir,J as ar,K as or,M as sr,O as cr,Q as lr,R as ur,S as dr,U as fr,V as pr,W as mr,X as hr,Y as gr,Z as _r,_ as vr,_t as yr,b as br,c as xr,ct as Sr,d as Cr,et as wr,f as Tr,g as Er,gt as Dr,h as Or,it as N,k as kr,l as Ar,lt as jr,m as Mr,n as Nr,nt as Pr,p as Fr,q as Ir,r as Lr,rt as Rr,s as zr,st as Br,t as Vr,tt as Hr,u as Ur,v as Wr,w as Gr,x as Kr,y as qr,yt as Jr,z as Yr}from"./device-claim-rule.js";import{n as Xr}from"./provider-device-admission.js";import{M as Zr,N as Qr,O as P,_ as $r,f as ei,h as ti,i as ni,n as ri,p as ii,s as ai}from"./session-snapshot.js";import{c as oi,i as si,t as ci}from"./device-claim-inspection.js";import{t as li}from"./audio-probe-result.js";import{T as ui,_ as di,a as fi,b as pi,c as mi,d as hi,f as gi,g as _i,h as vi,i as yi,l as bi,m as xi,n as Si,o as Ci,r as wi,s as Ti,t as Ei,u as Di,v as Oi,x as ki}from"./perf-runtime-plan.js";import{i as Ai,n as ji}from"./lease-context.js";import{h as Mi}from"./screenshot-runtime.js";import{n as F,r as Ni}from"./device-isolation.js";import{a as Pi,n as Fi,r as Ii}from"./device-inventory-context.js";import{n as Li,r as Ri,t as zi}from"./dispatch-resolve.js";import{t as Bi}from"./touch-reference-frame.js";import"./screen-recording-admission-ledger.js";import{a as Vi,d as Hi,i as Ui,l as Wi,n as Gi,o as Ki,s as qi,u as Ji}from"./session-routing.js";import{d as I}from"./src8.js";import{i as Yi,n as L,r as Xi}from"./compatibility-policy.js";import{n as R,t as Zi}from"./runtime-admission.js";import{s as Qi}from"./quality-warnings.js";import{t as $i}from"./png-worker-client.js";import{a as ea,i as z,n as ta,r as na,t as ra}from"./session-runtime-admission.js";import{a as ia}from"./ios-snapshot-engine.js";import{n as aa,r as oa}from"./device-selection-resolver.js";import{n as sa,r as ca}from"./doctor-output.js";import{t as la}from"./record-runtime.js";import{n as ua}from"./gesture-runtime.js";import{i as da,n as fa,r as pa}from"./platform-runtime-open-target.js";import{t as ma}from"./snapshot-runtime.js";import{t as ha}from"./app-log-files.js";import B from"node:path";import V,{promises as H}from"node:fs";import{createHash as ga}from"node:crypto";import _a from"node:os";import{fileURLToPath as va}from"node:url";import{setTimeout as ya}from"node:timers/promises";import ba from"node:vm";function U(e,t){return I({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function xa(e){return I({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Sa(e,t){let n=Da(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},xa(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:Ca(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Ca(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function wa(e,t,n,r){let i=Da(await r.resolveTarget({selector:e,...t},U(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Rr(`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 Ta(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 Ea(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 Da(e,t){return Oa(e,t),ka(e),Aa(e),ja(e),e}function Oa(e,t){if(e.generation!==t)throw new r(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function ka(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Aa(e){if(e.rect!==void 0&&!Ea(e.rect)||e.viewport!==void 0&&!Ea(e.viewport))throw new r(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function ja(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ma(e,t,n,r,i,a={}){let o=Na(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Ra(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Na(e,t,n,r,i){let a=n===`up`||n===`down`,o=fr(e,_r(e,r),i),s=o.visibility,c=wr({visibility:s,matches:e.nodes.filter(e=>ce(e)),platform:r}),l=Me(s.viewportRects)??Fa(c);if(!l||!Ae(l))return;let u=c.flatMap(e=>{if(!Ae(e.rect))return[];let t=Ia(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=Pa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(La)[0]?.viewport}function Pa(e,t){return ce(e)?e:he(e,t)}function Fa(e){let t;for(let n of e)Ae(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ia(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 La(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ra(e,t){let n=W(e,.5,.5),r=L.scrollUntilVisibleSwipe.nearEdgeFraction,i=L.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:W(e,.5,i)};case`down`:return{start:n,end:W(e,.5,r)};case`left`:return{start:n,end:W(e,i,.5)};case`right`:return{start:n,end:W(e,r,.5)}}}async function za(e,t,n){let i=N(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new r(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await n.resolveGestureViewport(U(t,t.command)):void 0;return{authored:e,gesture:Va(await Ba(e.start,t,n,a),await Ba(e.end,t,n,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let r=await n.resolveGestureViewport(U(t,t.command)),{start:a,end:o}=Ha(r,e.direction,n.platform);return{authored:e,gesture:Va(a,o,i),viewport:r}}let a=await wa(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs},t,n),o=a.viewport??await n.resolveGestureViewport(U(t,t.command)),{start:s,end:c}=Ua(a,e.direction,o);return{authored:e,gesture:Va(s,c,i),target:a,viewport:o}}async function Ba(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(U(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 Va(e,t,n){return{from:e,to:t,durationMs:n??L.command.swipeDurationMs}}function Ha(e,t,n){if(t===`left`||t===`right`){let n=nt(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=L.screenSwipe,i=W(e,r.centerFraction,r.nearEdgeFraction),a=W(e,r.centerFraction,r.farEdgeFraction),o=W(e,r.centerFraction,r.downStartFraction),s=W(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function W(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Ua(e,t,n){let r=In(e.rect),i=n.x+Math.trunc(n.width*L.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*L.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*L.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*L.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 Wa={launchApp:Ya,stopApp:Ya,setPermissions:Ya,clearState:Ya,openLink:Ya,tapOn:Qa,doubleTapOn:Qa,longPressOn:Qa,swipe:ro,inputText:io,eraseText:io,scroll:G,scrollUntilVisible:G,hideKeyboard:G,pressKey:G,back:G,waitForAnimationToEnd:G,takeScreenshot:so,runScript:so,evalScript:lo,assertVisible:co,assertNotVisible:co,assertTrue:co,extendedWaitUntil:co},Ga={launchApp:!0,stopApp:!0,setPermissions:!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 Ka(e){return Ga[e.kind]}async function qa(e,t){let n=e.command;return await Ja(n,e,t,U(e,n))}function Ja(e,t,n,r){let i=Wa[e.kind];return i(e,t,n,r)}async function Ya(e,t,n,r){switch(e.kind){case`launchApp`:return await K(n.launchApp,Xa(e,t),r,`invalidate`);case`stopApp`:return await K(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`setPermissions`:return await K(n.setPermissions,{appId:e.appId??t.appId,permissions:Za(e.permissions)},r,`invalidate`);case`clearState`:return await K(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await K(n.openLink,{link:e.link},r,`invalidate`)}}function Xa(e,t){return I({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?Za(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function Za(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function Qa(e,t,n,r){switch(e.kind){case`tapOn`:return await $a(e,t,n,r);case`doubleTapOn`:{let i=await vo(e.target,{purpose:`doubleTap`,timeoutMs:to(e)},t,n),a=N(e.delay,`doubleTapOn.delay`)??L.command.repeatDelayMs;return await K(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}case`longPressOn`:{let i=await vo(e.target,{purpose:`longPress`,timeoutMs:to(e)},t,n);return await K(n.longPressOn,{target:i},r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}}}async function $a(e,t,n,r){let i=await eo(e,t,n);return await K(n.tapOn,no(e,i),r,`invalidate`,i.resolution?Ta(i.resolution):void 0)}async function eo(e,t,n){let r={purpose:`tap`,timeoutMs:to(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await vo(e.target,r,t,n)}function to(e){return e.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs}function no(e,t){let n=N(e.repeat,`tapOn.repeat`),r=N(e.delay,`tapOn.delay`),i=n===void 0?r:r??L.command.repeatDelayMs;return I({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function ro(e,t,n,r){let i=await za(e.gesture,t,n);return await K(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?Ta(i.target):void 0)}async function io(e,t,n,r){switch(e.kind){case`inputText`:return await K(n.inputText,I({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await K(n.eraseText,I({charactersToErase:N(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function G(e,t,n,r){switch(e.kind){case`scroll`:return await K(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await K(n.scrollUntilVisible,ao(e),r,`invalidate`);case`hideKeyboard`:return await K(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await K(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await K(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await K(n.waitForAnimationToEnd,oo(e),r,`preserve`)}}function ao(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:N(e.timeout,`scrollUntilVisible.timeout`)??L.command.scrollUntilVisibleTimeoutMs,durationMs:Yi(L.command.scrollUntilVisibleSpeed)}}function oo(e){return I({timeoutMs:N(e.timeout,`waitForAnimationToEnd.timeout`)})}async function so(e,t,n,r){switch(e.kind){case`takeScreenshot`:return fo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await K(n.runScript,I({file:e.file,env:e.env}),r,`preserve`)}}async function co(e){throw new r(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function lo(e){throw new r(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function K(e,t,n,r,i){let a=uo(n,r);return fo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function uo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function fo(e,t,n,r){let i=e?.observation;return po(i,r),{...mo(n??i),...ho(e?.outputEnv),...go(t,e?.artifactPaths),..._o(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function po(e,t){if(!(!e||t===void 0||e.generation===t))throw new r(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function mo(e){return e?{observation:e}:{}}function ho(e){return e?{outputEnv:{...e}}:{}}function go(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function _o(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function vo(e,t,n,r){if(e.space===`target`){let i=await wa(e.selector,t,n,r);return{authored:e,point:In(i.rect),resolution:i}}return{authored:e,point:await Ba(e,n,r)}}function yo(e,t,n,r={}){let i=n===`ios`&&r.presentation?xo(r.presentation):void 0,a=i?So(e,t,i):nr(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Eo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?ar(s,t.selector.index):Ir(s,t.selector.index)?.node,l=Eo(t,o,s,c);if(!c)return Co(t,o,s,l);let u=i?Ir(i.visibleForSource(c),void 0):null,d=gr(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&&!bo(t.selector)&&i?wo(d,s,u):0,evidence:l}:Co(t,o,s,l)}const bo=Xn;function xo(e){let t=ie(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=>Hr(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function So(e,t,n){let r=_r(e,`ios`),i=lr(e,{},{orderUnindexed:e=>hr(e,r)}),a=mr(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:or(o,t.selector,`ios`,i.visibility,r)}}function Co(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 wo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&To(n.rect,e)?1:0:t.length}function To(e,t){let n=In(e),r=In(t);return n.x===r.x&&n.y===r.y}function Eo(e,t,n,r){return I({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const q={settleTimeoutMs:Xi,retryTapMaxAttempts:L.command.retryTapMaxAttempts,longPressDurationMs:L.command.longPressDurationMs,eraseTextMaxCharacters:L.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:L.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:L.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:L.command.waitForAnimationToEndDifferencePercent,observationPollMs:L.observation.pollIntervalMs};function Do(e,t={}){return{execute:async n=>{let r=U(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ka(n.command)&&!i,visualStabilityBarrier:i});let a=await qa(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Sa(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Oo(e){throw new r(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function ko(e){let t=e.meta?.installSource;if(!t)throw new r(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new r(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new r(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Oo(t)}}function Ao(e){let t=ko(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Yn(n,e.meta?.tenantId)},cleanup:()=>{Jn(n)}}}function J(e,t,n){return t||Sr(n)?null:c(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function jo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function Y(e){return jr(e.flags)||!e.session?await Li(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Mo(e.session.device)}async function Mo(e){if(Xr(e)||!E(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ii.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Li(t)}catch(e){if(!(e instanceof r)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Li({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function No(e,t){return t?Wi(t,e).length===0:!1}async function Po(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a,o,s;try{a=Ao(t);let c=Ro(t),l=await Io(i,t.flags),u=await na(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await ta(e.bindDevice)(l,je);await f.operations.ensureReady({}),o=await f.operations.materializeAppSource({source:a.source}),s=await zo({artifact:o,retention:c,req:t,session:i,sessionName:n}),i&&P(i);let p=await f.operations.deployMaterializedApp({artifact:o}),m=Bo(l,o,p,s),h=ln(m,`Installed: ${zn(m)}`);return k(r,i,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return s&&await cr(s.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:l(e)}}finally{await o?.cleanup(),a?.cleanup()}}async function Fo(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new r(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await cr(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:l(e)}}}async function Io(e,t){let n=Lo(t?.platform);if(e&&n&&!D(e.device,n))throw new r(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${x(e.device)}`);if(!e&&!n)throw new r(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await Y({session:e,flags:t})}function Lo(e){return e===`ios`||e===`android`?e:void 0}function Ro(e){let t=e.meta?.retainMaterializedPaths===!0,n=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(n!==void 0&&n<=0)throw new r(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...n===void 0?{}:{ttlMs:n}}}async function zo(e){if(e.retention.enabled)return await Zn({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 Bo(e,t,n,r){return E(e)?Vo(t,n,r):Ho(t,n,r)}function Vo(e,t,n){let i=t.bundleId??e.bundleId;if(!i)throw new r(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Wo(n),bundleId:i,...Uo(t,e),launchTarget:t.launchTarget??i}}function Ho(e,t,n){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new r(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Wo(n),packageName:i,...Uo(t,e),launchTarget:t.launchTarget??i}}function Uo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Wo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Go(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Ko(t);if(!a.ok)return a.response;let o=J(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await Y({session:n,flags:t.flags}),l=await R({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:Se});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==a.options.provider)return c(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let u=await l.runtime.operations.configureProviderPortReverse(a.options);return u?{ok:!0,data:{action:`port-reverse`,...u}}:c(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Ko(e){let t=qo(e);if(!t.ok)return t;let n=Jo(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 qo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Jo(e){let t=Yo(e.flags?.devicePort),n=Yo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:c(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Yo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Xo(e){return await R({...e,command:`runtime clear`,use:ye})}async function Zo(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Go({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Qo({...e,session:r.get(n)});if(!$o(i))return c(`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 es({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?ts(n,o):rs({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Qo(e){if(!e.session)return c(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ua({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=ti(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 $o(e){return e===`set`||e===`show`||e===`clear`}async function es(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(Ur(i)&&r?.appBundleId){let e=await Xo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;P(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Mr(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function ts(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function ns(e){return e?x(e.device):void 0}function rs(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=ns(i),s=vr(t.flags?.platform??a?.platform??o);if(!s)return c(`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 c(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let l=Tr(a,xr(t.flags,s));return Ar(l)===0?c(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,l),{ok:!0,data:{session:n,configured:!0,runtime:l}})}const is=/^[A-Za-z0-9_.:-]{1,64}$/,as=8192,os=4096;function ss(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new r(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!is.test(t))throw new r(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new r(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:ls(n,t)}}function cs(e,t,n){let i=x(e),a=us(e);if(!a)throw new r(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>os)throw new r(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:os});return s}function ls(e,t){if(e)try{let n=JSON.parse(e);if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(n);if(Buffer.byteLength(i,`utf8`)>as)throw new r(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${as} bytes`);return n}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function us(e){return((E(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 ds(e,t,n,r){let{eventName:i,payload:a}=ss([...r]),o=cs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ei(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...j(`Triggered app event: ${i}`)}}async function fs(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await R({command:`trigger-app-event`,device:t,use:Ve,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=>ds(s,t,e,n)}}function ps(e){let t=(e[0]??`status`).toLowerCase();if(!Vn(t))throw new r(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new r(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return ms(t)}function ms(e){return e===`get`?`status`:e===`return`?`enter`:e}const hs={"ime-probe":`android`},gs={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},_s={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function vs(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ei(e)}}async function ys(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 bs(e,t){return e.operations.keyboardStatus(vs(t)).then(e=>({platform:hs[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 xs(e,t){let n=await e.operations.keyboardDismiss(vs(t)),r=gs[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...j(ws(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...j(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function Ss(e,t){let n=await e.operations.keyboardEnter(vs(t)),r=_s[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...j(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...j(`Keyboard enter pressed`)}}async function Cs(e){let t=ps(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ys({command:`keyboard status`,device:n,use:be,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>bs(e,t)):t===`dismiss`?await ys({command:`keyboard dismiss`,device:n,use:re,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>xs(e,t)):await ys({command:`keyboard enter`,device:n,use:Qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>Ss(e,t))}function ws(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Ts(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=J(i,l,u);if(d)return d;let f=await Y({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Mi(t)===`may-invalidate`&&P(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 Es(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return c(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Ds(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await Ts({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:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...ti(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Os(e){return Es(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Ds({...e,command:an.keyboard,resolveRuntime:e=>Cs(e)})}async function ks(e){return await Ds({...e,command:an.triggerAppEvent,resolveRuntime:e=>fs(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await pa(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function As(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function js(e,t){let n=t?.subject??`Payload`,i=e.trim();if(!i)throw new r(`INVALID_ARGS`,`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!V.statSync(a).isFile())throw new r(`INVALID_ARGS`,`${n} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof r)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new r(`INVALID_ARGS`,`${n} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new r(`COMMAND_FAILED`,`Unable to read ${n} file: ${a}`,{cause:String(e)})}if(As(i))return{kind:`inline`,text:i};throw new r(`INVALID_ARGS`,`${n} file not found: ${a}`)}async function Ms(e){let t=js(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ns(t.path);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof r?t:new r(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ns(e){try{return await H.readFile(e,`utf8`)}catch(t){let n=t.code;throw n===`ENOENT`?new r(`INVALID_ARGS`,`Push payload file not found: ${e}`):n===`EISDIR`?new r(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):n===`EACCES`||n===`EPERM`?new r(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new r(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Ps(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=J(n,a,o);if(s)return s;let l=Bs(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let s=u?Yn(u,t.meta?.tenantId):A.expandHome(l.appPathInput);if(!V.existsSync(s))return c(`INVALID_ARGS`,`App binary not found: ${s}`);let d=await Y({session:a,flags:o}),f=await na(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await ta(e.bindDevice)(d,De);a&&P(a);let h=await m.operations.deployApp({app:l.app,appPath:s,replaceExisting:n===`reinstall`}),g=Is(d,l.app,s,h),_=ln(g,`Installed: ${g.appName??Bn(g)}`),v=zs(a,g);return v&&v!==a&&i.set(r,v),k(i,v,t,n,_),{ok:!0,data:_}}finally{u&&Jn(u)}}async function Fs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=J(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!s||!l)return c(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await Ms(Vs(l,t.meta?.cwd)),d=await Y({session:i,flags:a}),f=await na(e.inspectFacts)(d),p=z(`push`,f.operations.ensureReady)??z(`push`,f.operations.sendPushNotification);if(p)return p;let m=await ta(e.bindDevice)(d,ve);await m.operations.ensureReady({}),i&&P(i);let h=await m.operations.sendPushNotification({appId:s,payload:u}),g=E(d)?ln({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):ln({platform:x(d),package:s,action:h.action,extrasCount:h.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,g,{positionals:[s,l]}),{ok:!0,data:g}}function Is(e,t,n,r){return E(e)?Ls(t,n,r):Rs(e,t,n,r)}function Ls(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 Rs(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 zs(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Bs(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:c(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:c(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Vs(e,t){let n=js(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Hs(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Ps({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Po({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await Fs({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Us(e,t,n){return await h(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Ws=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Gs(e){return Ws.has(e)}const Ks=new Map(ze.map(e=>[e.name,e]));function qs(e){let t=new Set;for(let n of e){let e=Js(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Js(e){let t=Ks.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(Gs)?n:void 0}function Ys(e){if(e!==void 0&&e.remainingSteps.length!==0)return qs(e.remainingSteps)}function Xs(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:Ai(e),plannedOperations:Ys(e.internal?.executionPlan)}}function Zs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...j(`Closed: ${t.name}`)}})}function Qs(e,t,n){if(!ht(t))return{kind:`not-armed`};let r=t.actions.length;Zs(e,t,n);let i=Vt(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`}:(vt(t),{kind:`aborted`})}function $s(e,t){let n=l(t),r=Gt(e.scriptPublication??Ht);return{ok:!1,error:{...n,details:{...n.details,session:e.name,...r?{savedScript:r}:{}},retriable:!0}}}function ec(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Zs(r,n,t);try{let e=r.writeSessionLog(n,{force:Kt(n,t.flags?.force)});e.written&&qt(n,e.path);return}catch(e){return tc(e)}}function tc(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof r?new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new r(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${l(e).message}`,t)}async function nc(e){let t=e.clearRuntimeHints?ne:tt,n=await Zi({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,tt)};let r=await n.bind(e.device,ne);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function rc(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 ic({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&Ur(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Mr(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`,()=>kr(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function ic(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>br({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>dr({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>qr({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>$n({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>Gr(a,r))}function ac(e,t){return Kr({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function oc(e){if(e instanceof r)return e;let t=e instanceof Error?e.message:String(e);return new r(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const sc=(e,t)=>(e.positionals?.length??0)>0||er(t);async function cc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=ht(n),s=JSON.stringify(t.positionals??[]);if(o&&!mt(n,s)){let e=await uc({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:$s(n,oc(e))};_t(n,s)}let c=Qs(i,n,t);return c.kind===`failed`?{response:$s(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function lc(e){try{return{providerData:await Dr(e)}}catch(t){let n=l(t);return{response:{ok:!1,error:{...n,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...n.details,session:e.session.name},retriable:!0}}}}}async function uc(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(sc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Xs(t,r,n.trace?.outPath)});return}catch(e){return e}}function dc(e,t){if(!e.flags?.saveScript||Xt(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new r(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new r(`INVALID_ARGS`,`close --save-script cannot ${n.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function fc(e){let{req:t,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,l=a.get(n);if(!l)return await gc({req:t,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});dc(t,l);let u=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!u)return c(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=e.platformResourceCleanup,f=await nc({device:l.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!l.appBundleId&&Ur(a.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(f.type===`response`)return f.response;if(P(l),t.internal?.closeAppOnly===!0&&u)return await hc({req:t,session:l,logPath:i,lifecycle:f.runtime,app:u});let p=await cc({req:t,session:l,logPath:i,sessionStore:a,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await pc({req:t,session:l,sessionName:n,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:mc({session:l,repair:p,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function pc(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 rc({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:uc,finalizeOrdinaryCloseScript:ec,platformResourceCleanup:e.platformResourceCleanup}),m=await lc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ac(r,u),g=d??h;if(g?n.deviceClaim&&M({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await pi(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function mc(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:ln({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...j(c),...o,...s}}}async function hc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await uc({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...j(`Closed: ${a}`)}}}async function gc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return c(`SESSION_NOT_FOUND`,`No active session`);let a=await nc({device:await Y({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:Xs(t,n)}),{ok:!0,data:{app:t.positionals[0],...j(`Closed: ${t.positionals[0]}`)}})}function _c(e,t){return e.operations.ensureReady(t)}function vc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function yc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return bc(t,r);case`devices`:return await Sc(t);case`capabilities`:return await Ac({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Ic({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function bc(e,t){let n=Vi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ki(e.session,n)).map(e=>xc(e,t))}}}function xc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Nn(r),platform:x(t.device),...w(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,...w(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function Sc(e){try{let t=Cc();return{ok:!0,data:{devices:(await Tc(e)).map(e=>({...Uc(e),...wc(e,t)}))}}}catch(e){let t=i(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function Cc(){let e=new Map;for(let t of si({})){let n=t.claim;!n||ci(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function wc(e,t){let n=t.get(oi(ki(e)));return n?{claimedBy:n}:{}}async function Tc(e){let t=e.flags?.platform;return kc(await Fi(Ec(e,t)),e.flags?.platform,e.flags?.target)}function Ec(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Dc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Oc(n?.androidDeviceAllowlist)}}function Dc(e,t,n){return S({simulatorSetPath:Ni(e),platform:t,target:n})}function Oc(e){let t=F(e);return t?Array.from(t).sort():void 0}function kc(e,t,n){let r=t?e.filter(e=>Wc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Ac(e){let t=await Hc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=jc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await zc(n,e.inspectFacts);return{ok:!0,data:{device:Uc(n),availableCommands:$e().filter(e=>e===`appstate`&&r?!0:Pc(e,i))}}}function jc(e,t,n){return!t||!E(e)&&!T(e)||!No(n,t)?!1:Mc(t)||Nc(e,t)}function Mc(e){return!!(e.appName||e.appBundleId)}function Nc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Pc(e,t){let n=Ge(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Fc(t,e)))}function Fc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Ic(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Lc(t,e.providerAppCatalog);if(o)return o;let s=await Hc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=pn(t.flags?.appsFilter),u=F(t.flags?.androidDeviceAllowlist),d=await Bc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Vc(await vc(f,await _c(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Lc(e,t){let n=Rc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,Kn(e.meta?.requestId))]}}}function Rc(e){let t=ji(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 zc(e,t){if(t)try{return await t(e)}catch{return}}async function Bc(e){if(!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(n&&!n.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}};if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Xe)}}function Vc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Hc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=J(t.command,a,o);return s?{response:s}:{device:await Y({session:a,flags:o,androidAvdSelection:i})}}function Uc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:x({platform:r.platform,appleOs:n}),...w(r.platform)&&n?{appleOs:n}:{}}}function Wc(e,t){return D(e,t)}function Gc(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Date.now()+e:void 0}function Kc(e){return c(`INVALID_ARGS`,e)}function qc(e,t,n,i){try{return fa({device:e,surfaceFlag:t,openTarget:n,existingSurface:i})}catch(e){return c(e instanceof r?e.code:`INVALID_ARGS`,String(e.message))}}async function Jc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await da({target:n,platform:i.platform,surface:r});return a?Kc(a):null}async function Yc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await da({target:n,platform:r});return i?Kc(i):null}function Xc(e){let t=Wr(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:Ur(n),clearRemovedRuntimeHints:Er({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Zc(e){let{req:t,logPath:n,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!p(a??``),execution:{startupDeadlineAtMs:$c(t),requestId:t.meta?.requestId,logPath:n,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Ai(t)}});let{appBundleId:d,appName:f}=await Qc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new r(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Cr({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:f,runtime:c.runtime}}}async function Qc(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 $c(e){return Gc(e.flags?.timeoutMs)}async function el(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:c(`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:c(`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:c(`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 tl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,openResponse:a}=e;if(!a.ok||t.flags?.foreground!==!0)return a;try{let o=await ma({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:n,logPath:r,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return o.ok?{ok:!0,data:{...a.data,snapshot:o.data}}:nl(a.data,o.error)}catch(e){return nl(a.data,l(e))}}function nl(e,t){return{ok:!0,data:{...e,warnings:[...un(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function rl(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,launchConfirmation:g}=e,_={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...il(h)};return o&&(_.appName=o),s&&(_.appBundleId=s),l&&(_.startup=l),u&&(_.timing=u),g&&(_.launchConfirmation=g),f&&p(f)>0&&(_.runtime=f),d&&(_.platform=x(d),_.target=d.target??`mobile`,_.device=d.name,_.id=d.id,_.kind=d.kind,te(d.platform)&&(_.serial=d.id)),d&&E(d)&&(_.device_udid=d.id,_.ios_simulator_device_set=d.simulatorSetPath??null),{..._,...j(`Opened: ${o??s??t}`)}}function il(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function al(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 ol=Object.freeze({async observeBootTimeMs(e){if(E(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 sl(e,t){e.warnings=[...un(e),t]}function cl(e){return e.internal?.resolvedSessionScope??Vi(e)}function ll(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Bt(t,{});return}Xt(n)&&(Jt(t),sl(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 ul(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 dl(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function fl(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 pl(e,t){if(!t)return;let n=await ui(t);if(n.status!==`renewed`)return n.conflict?Lr(e,n.conflict):c(`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 ml(e){let{req:n,sessionName:r,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:l,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=n.flags?.relaunch===!0,x=f,S=Date.now(),C=await hl({req:n,sessionName:r,sessionStore:i,device:o,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(C.type===`response`)return C.response;let w=C.session??g,ee=Date.now(),T=await m.operations.openApplication({target:s,positionals:l,outPath:n.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:n.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:dl(o,n),stateDir:i.resolveDaemonStateDir(),runtimeHints:Mr(p),applyRuntimeHints:h,execution:Xs(n,a,g?.trace?.outPath)});x=T.appBundleId??x;let E={...T.timing},te=aa(y),D=s?fl(ee,s,x):void 0;if(Un(n.meta?.requestId)){let e=t();return c(e.code,e.message,e.details)}g&&$r({session:g,command:`open`,positionals:[],flags:void 0});let O=al({existingSession:w,sessionName:g?.name??Ui(n),sessionScope:g?.sessionScope??cl(n),device:o,surface:d,appBundleId:x,appName:u});O.lease=yr({req:n,existingLease:g?.lease}),_&&(O.deviceClaim=_),n.runtime!==void 0&&Or(i,r,p);let ne=i.ensureSessionDir(r),re=Pn(ne,n.meta?.requestId??_n().requestId);E.totalDurationMs=Math.max(0,Date.now()-S),M({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let ie=rl({sessionName:O.name,sessionStateDir:ne,runnerLogPath:Nn(ne),requestLogPath:re,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:x,surface:d,startup:D,timing:E,device:o,runtime:p,runtimeHintCount:Ar,sessionReused:g!==void 0,selection:te,launchConfirmation:T.launchConfirmation});return v&&sl(ie,ul(v)),ll({session:O,existingSession:g,saveScriptRequested:!!n.flags?.saveScript,responseData:ie}),i.set(r,O),i.recordAction(O,{command:`open`,positionals:l,flags:n.flags??{},runtime:n.runtime===void 0?void 0:p,result:ie}),{ok:!0,data:ie}}async function hl(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=gl(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function gl(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=al({existingSession:o,sessionName:o?.name??Ui(t),sessionScope:o?.sessionScope??cl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=yr({req:t,existingLease:o?.lease}),s}function _l(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=sr(t);return Gi(t,i.session)?Hi(i,n,a):Ji(i,n,a)}async function vl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Vr(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Nr(n,r,zr({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Oi({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:ol})}}async function yl(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=_l({req:t,device:a,sessionStore:i});if(m)return m;let h=await vl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Lr(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 bl({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Zc({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 pl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await ml({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 bl(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pi(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await di(t);M({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const xl=new Map;async function Sl(e){let t=Oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Zi({...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,we)};case`open-apply-runtime-hints`:{let t=await r(e.device,de);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,qe);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function Cl(e){let t=Xc(e);if(t.type===`response`)return t;let n=await Sl({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 wl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await el({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 c(`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],l=s??(a?i.appName:void 0),u=qc(i.device,o.flags?.surface,l,i.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return Kc(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 d=await Jc({shouldRelaunch:a,openTarget:l,surface:u,device:i.device});if(d)return d;let f=await pl(i.device,i.deviceClaim);if(f)return f;let p=await Mo(i.device),m=oa(p);await o.internal?.retainDeviceExecutionLock?.(p.id);let h=await Cl({req:o,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;P(i);let v=await Zc({req:o,logPath:n,surface:u,openTarget:l,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await pl(p,i.deviceClaim)||await ml({req:o,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:l,openPositionals:s?o.positionals??[]:l?[l]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:u,existingSession:i,selection:m})}let s=o.flags?.relaunch===!0,l=o.positionals?.[0];if(s&&!l)return Kc(`open --relaunch requires an app argument.`);let u=await Yc({shouldRelaunch:s,openTarget:l,platform:o.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await Ri(o.flags??{},Br(l)),f=d.device;await o.internal?.retainDeviceExecutionLock?.(f.id);let p=qc(f,o.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Jc({shouldRelaunch:s,openTarget:l,surface:p,device:f});if(m)return m;let h=await Cl({req:o,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await Rn(xl,f.id,async()=>await yl({req:o,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:l,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:d}))}async function Tl(e){let t=await wl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await tl({...e,inspectFacts:na(e.inspectFacts),bindDevice:ta(e.bindDevice),openResponse:t})}const El=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Dl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Ol(e){return t=>c(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 kl(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function Al(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function jl(e){return e.available?null:c(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Ml(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Nl(e,t){if(!t.appBundleId)return;let r=await R({command:`appstate`,device:t.device,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(r.type!==`response`)try{return(await r.runtime.operations.appState({appBundleId:t.appBundleId})).applicationState}catch(e){if(n(e))throw e;M({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:i(e).code,message:i(e).message}});return}}async function Pl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&jo(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 c(`SESSION_NOT_FOUND`,e)}let s=J(`appstate`,i,a);if(s)return s;let l=w(i?.device.platform)&&No(a,i),u=o===`ios`,d=o===`macos`;if(u&&!l)return c(`SESSION_NOT_FOUND`,El);if(d&&!l)return c(`SESSION_NOT_FOUND`,Dl);if(l&&i){let t=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:x(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return c(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await Nl(e,i);return{ok:!0,data:{platform:x(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...E(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let f=await Y({session:i,flags:a});if(E(f))return c(`SESSION_NOT_FOUND`,El);if(T(f))return c(`SESSION_NOT_FOUND`,Dl);let p=await R({command:`appstate`,device:f,use:Fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>c(`UNSUPPORTED_OPERATION`,f.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(p.type===`response`)return p.response;let m=p.runtime;await m.operations.ensureReady({serial:a.serial,androidSerialAllowlist:Il(a.androidDeviceAllowlist)});let h=await m.operations.appState();return{ok:!0,data:{platform:x(f),package:h.package,activity:h.activity}}}async function Fl(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let a=r.get(n),o=t.flags??{},s=J(t.command,a,o);if(s)return s;let l=F(o.androidDeviceAllowlist),u=l?[...l].sort():void 0,d=_e({headless:o.headless===!0}),f;try{f=await Y({session:a,flags:o,androidAvdSelection:`include-stopped`})}catch(e){let t=i(e);if(d.kind===`boot-target-headless`&&!Ml(o.device,a?.device)&&t.code===`DEVICE_NOT_FOUND`)return c(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(o.target&&(f.target??`mobile`)!==o.target)return c(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${o.target}.`);let p=await Zi({command:`boot`,device:f,required:d.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Ol(d.kind===`boot-target-headless`)});if(p.type===`response`)return p.response;let m={serial:o.serial,androidSerialAllowlist:u,deadlineAtMs:Gc(o.timeoutMs)};return f=d.kind===`boot-target-headless`?await(await p.bind(f,d.use)).operations.bootTargetHeadless(m):await(await p.bind(f,d.use)).operations.bootTarget(m),{ok:!0,data:{platform:x(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...w(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=J(t.command,i,a);if(o)return o;let s=await Y({flags:a,session:i,androidAvdSelection:`include-stopped`}),l=jl((await kl(e.inspectFacts)(s)).operations.shutdownTarget);if(l)return l;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return c(`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:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let u=await(await Al(e.bindDevice)(s,Ee)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u,...w(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:c(u.error?.code??`COMMAND_FAILED`,Ll(u),{platform:x(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:u})}return t.command===`appstate`?await Pl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Il(e){let t=F(e);return t?[...t].sort():void 0}function Ll(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Rl(e){let t=bn(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=V.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{V.closeSync(t)}}function zl(e,t){ha(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=xn(e);try{V.writeFileSync(r,n,`utf8`)}finally{V.closeSync(r)}}function Bl(e){let t=B.dirname(e),n=B.basename(e);V.existsSync(t)||V.mkdirSync(t,{recursive:!0});let r=yn(e);try{V.fsyncSync(r)}finally{V.closeSync(r)}let i=0;for(let e of V.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{V.unlinkSync(B.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Vl(e){return Di.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Hl(e){try{return await Ul(e)}catch(e){return{ok:!1,error:l(e)}}}async function Ul(e){let t=Wl(e);if(!t.ok)return t;let n=t.session,r=ge(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 Gl(a,o);let c=oe({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 Kl(e,n,r,c.use);case`capture-status`:return await ql(e,n);case`capture-stop`:return await Jl(e,n)}}function Wl(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:c(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Gl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return c(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Kl(e,t,n,r){if(t.audioProbe){await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return c(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=Ti.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=Ti.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=B.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await Ci({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...l,throwIfCanceled:e.throwIfCanceled});let u=e.sessionStore.get(e.sessionName)?.audioProbe;if(!u)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await u.handle.status()}}async function ql(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Yl()};let r=await n.handle.status();return r.state===`stopped`&&await mi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Jl(e,t){return t.audioProbe?{ok:!0,data:await mi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Yl()}}function Yl(){return li({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 Xl(e){let t=e.sessionStore.get(e.sessionName);if(!t)return c(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(sn(e.req.positionals?.[0]))throw new r(`INVALID_ARGS`,cn);_u(e.req);let n=Ei({positionals:e.req.positionals,kind:yu(e.req.flags?.kind),outPath:yu(e.req.flags?.out)}),i=Si(n);if(i.kind===`capture-stop`)return Zl(e,await tu(e,t,i.request));let a=await ra({device:t.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Zl(e,await Ql(e,t,a)):z(`perf`,a.fact)??c(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:l(e)}}}function Zl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,fu(t.data)?{...t.data}:{}),t}async function Ql(e,t,n){let{device:i,plan:a}=ea(n),o=ta(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:su(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:pu(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:mu(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:B.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await $l(e,t,await o(i,a.use),a.request);case`profile-report`:{let n=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new r(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=gu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await n.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:A.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function $l(e,t,n,r){if(t.perfCapture)return c(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return c(`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=gu(e,r.outPath,i),o=fi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=fi.createNextFence({admissionLedger:eu(e),resourcePath:o,device:t.device}),l=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 wi({admissionLedger:eu(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function eu(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new r(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function tu(e,t,n){let r=t.perfCapture;if(!r)return c(`INVALID_ARGS`,`no active native perf capture`);let i=ou(r.handle.inspect(),n);if(i)return c(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let a=await yi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=nu(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function nu(e){if(ru(e)||iu(e))return e;throw new r(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function ru(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function iu(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&au(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function au(e,t){return t.every(t=>typeof e[t]==`string`)}function ou(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 su(e,t){return{...hu(e),metrics:{fps:cu(t.metric,e)},sampling:{fps:t.sampling}}}function cu(e,t){if(!fu(e)||e.available!==!0)return e;let n=lu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function lu(e,t){let n=uu(t.windowStartedAt),r=uu(t.windowEndedAt)??uu(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:du(e)})).slice(-12)}function uu(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function du(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function fu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function pu(e,t){return{...hu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function mu(e,t){return{...hu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function hu(e){return{session:e.name,platform:x(e.device),device:e.device.name,deviceId:e.device.id}}function gu(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):B.join(e.sessionStore.ensureSessionDir(e.sessionName),`${vu()}-${n}`)}function _u(e){let t=e.positionals?.[0]?.toLowerCase(),n=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||n!==`snapshot`))throw new r(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function vu(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function yu(e){return typeof e==`string`&&e.length>0?e:void 0}const bu=[`dump`,`log`],xu=`network requires ${bu.join(` or `)}`,Su=`network include mode must be one of: ${u.join(`, `)}`,Cu=2048;async function wu(e){let t=e.sessionStore.get(e.sessionName);if(!t)return c(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=Tu(e.bindDevice),r=(await n(t.device,He)).facts.networkDump;if(!r.available)return Au(r.hint);let i=Eu(e.req);if(!i.ok)return i;let a=me({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return ju(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:Cu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:l(e)}}}function Tu(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Eu(e){let t=Du(e);if(!t.ok)return t;let n=Ou(e);if(!n.ok)return n;let r=ku(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Du(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return bu.includes(t)?{ok:!0,action:t}:c(`INVALID_ARGS`,xu)}function Ou(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?c(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ku(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return c(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return u.includes(r)?{ok:!0,include:r}:c(`INVALID_ARGS`,Su)}function Au(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ju(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:Cu,maxScanLines:e.entries.length},notes:e.notes}}}function Mu(e,t){let n=xi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Nu(e.appLogFailure)]:Pu(n.state)}}function Nu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Pu(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 Fu(e,t){return Le([...e,...t.notes??[]])}async function Iu(e){let{req:t}=e;return t.command===`perf`?await Xl({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Ru(e):t.command===`events`?await Lu(e):t.command===`network`?await wu(e):t.command===`audio`?await Hl(Xu(e)):null}async function Lu(e){let{req:t,sessionName:n,sessionStore:r}=e;try{return await r.flushEvents(n),{ok:!0,data:r.readEvents(n,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:l(e)}}}async function Ru(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return c(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Zu({...e,session:i}),r=(await n.bindDevice(i.device,le)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let a=Vu(pe({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),i);return`ok`in a?a:await zu(n,a)}catch(e){return{ok:!1,error:l(e)}}}async function zu(e,t){switch(t.kind){case`path`:return Hu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Uu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Bu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Ju(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Wu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Gu(e)}}async function Bu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await qu(e,t.appBundleId,n.owner,n.operations.appLogStart):await Ku(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Vu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):c(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Hu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Rl(a),s=Mu(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 Uu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Mu(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:Fu(t.notes,o)}}}function Wu(e,t,n){let r=n.resolveAppLogPath(t);return zl(r,e),{ok:!0,data:{path:r,marked:!0}}}function Gu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return c(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Bl(r.resolveAppLogPath(n));return hi({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Ku(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await gi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:_i.resolvePath(o.resolveSessionDir(a))});let s=Bl(o.resolveAppLogPath(a)),c=await Yu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function qu(e,t,n,r){let{session:i}=e;return i.appLog?c(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Yu(e,t,r,n)}async function Ju(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return c(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await gi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:_i.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Yu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=_i.resolvePath(o.resolveSessionDir(a));try{let l=Vl({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 bi({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:vi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Xu(e){if(!e.bindDevice||!e.inspectFacts)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new r(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Zu(e){if(!e.bindDevice)throw new r(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new r(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}const Qu=new WeakMap;function $u(e){return{store:t=>ed(e,t),finalize:(t,n)=>td({...e,evidence:t,projection:n})}}function ed(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{ni(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 Qu.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Zr(a),refFrame:Qr(a)}),{evidence:s,refsGeneration:o}}function td(e){let t=Qu.get(e.evidence);Qu.delete(e.evidence);let n=rd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!nd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!id(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ri(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function nd(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&&Zr(n)===t.runtimeRevision&&Qr(n)===t.refFrame}function rd(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 id(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function ad(e){let t=od(e),n=We(t);return ga(`sha256`).update(n,`utf8`).digest(`hex`)}function od(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)=>sd(e,n[t]??null,r?.[t]??null))}}function sd(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 cd(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=ld({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function ld(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>ud({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>dd({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>fd(n,r)];for(let e of s){let t=e();if(t)return t}}function ud(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 dd(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 fd(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 pd(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new r(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=st(e),a=lt(e),o=ad({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??rt(i.actions)??a.platform,target:t?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>cd(e,s,o)}}function md(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function hd(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ze(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function gd(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 _d(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=gd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Te(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 vd(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Te(e,r),...xe(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 yd(e,t,n,r,i,a){if(n.targetEvidences)return bd(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return X(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return X(e,n,r,i,a);if(s.kind===`post-resolution`){let c=md({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return X(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return Sd(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=hd({recorded:o,token:s.token});if(c.kind===`skip`)return X(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.observeTarget({action:n,index:i,token:l});if(u.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,xd(u),a,t)};let{classification:d}=u;return d.verified?Sd(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 bd(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 X(e,n,r,i,a);let d=hd({recorded:o[c],token:u.token});if(d.kind===`skip`)return X(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.observeTarget({action:l,index:i,token:d.token});if(f.state!==`classified`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,xd(f),a,t)};let{classification:p}=f;if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return Sd(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function xd(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 X(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 Sd(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=Cd(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=wd(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 Cd(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 wd(e,t,n){return n.status===`guard-mismatch`?_d(e,n.evidence,t):vd(e,n.evidence)}async function Td(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Pt(e.varSources),o=[],s=[],c=kd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Od(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Ad(u,n.length,r,e))}let d=Nt(r,a,Dd(e,u)),f=At(a),p=t.diagnosticsMarker(),m=await yd(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:Ed(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 Ed(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Dd(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Od(e){return!!(e&&e.command!==`replay`)}function kd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Od(n))return n.command===`close`?t:void 0}}function Ad(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function jd(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=Ze(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function Md(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),ot(e.command)){let n=Nd(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=Ze(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=jd([...e.positionals]);n&&t.push(n)}return Le(t).filter(e=>e.trim().length>0)}function Nd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Pd(n)?t.slice(0,-1):t}function Pd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Fd(e){let t=B.dirname(e),n=B.basename(e,B.extname(e));return B.join(t,`${n}.healed.ad`)}function Id(e){let t=Ld({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 Ld(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Rd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Rd(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 zd(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Bd(n))return`manual`;let i=Vd(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Bd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Hd(e.scrollRegion)}function Vd(e,t){let n=en(t),r=Wd(e.ancestry,n,t),i=e.scrollRegion;return i&&Hd(i)?r&&Ud(i,n,t):r}function Hd(e){return e.id!==void 0||e.label!==void 0}function Ud(e,t,n){return n.some(n=>Tt(wt(n,t),e))}function Wd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=$t(n,t,e.length);return!r.broken&&fe(r.chain,e)})}function Gd(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:i}=e,a,o,s=An({divergence:r,level:i,writeOverflowArtifact:e=>{let n=d(e),r=Jd(t,n);return`artifactPath`in r&&(a=n,o=r.artifactPath),r}}),c=(a??s).screen;if(c.state!==`available`||c.refs.length===0)return e.evidence&&n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.state===`available`?c.refsGeneration:void 0,refs:[]}),s;if(!e.evidence)return qd(o),Kd(s,`missing-evidence`);let l=n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:c.refsGeneration,refs:c.refs.map(e=>e.ref)});return l.published===!0?s:(qd(o),Kd(s,l.reason))}function Kd(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 qd(e){if(e)try{V.unlinkSync(e)}catch{}}function Jd(e,t){try{let n=B.join(e.ensureSessionDir(),`replay-divergence`);V.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=B.join(n,r);return V.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const Yd={id:0,"role-label":1,label:2,other:3};function Xd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Zd(n.basis)<Zd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Zd(e.basis)-Zd(t.basis)||e.nodeIndex-t.nodeIndex)}function Zd(e){return Yd[e]}async function Qd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionStore:s,observationStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=kn(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await tf({session:o,observationStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=of(v,g),b=v.state===`available`&&o?df({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=zd({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:$d(v)}),S=Id({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Gd({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(at(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function $d(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const ef=[300,500,800,1200,2e3,3e3,4e3];async function tf(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=rf(i),s=Date.now()+12e3,c=await nf({session:t,observationStore:n,logPath:r,flags:o});if(!a)return c.observation;for(let e of ef){if(c.observation.state===`available`||!c.retryable)break;let i=s-Date.now();if(i<=0)break;await wn(Math.min(e,i)),c=await nf({session:t,observationStore:n,logPath:r,flags:o})}return c.observation}async function nf(e){let{session:t,observationStore:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).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 a=n.bindAuthority().store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:a.refsGeneration,evidence:a.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:Ln(e)}}}function rf(e){return{snapshotInteractiveOnly:af(e)}}function af(e){return!ff(e.command)||pf(e).requiresRect}function of(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=uf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function sf(e){return!!fn(e,f(e.type??`Element`))||e.hittable===!0}function cf(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function lf(e,t){let n=Qt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&sf(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=>cf(e,t)),...o.filter(e=>!cf(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function uf(e,t,n){let{nodes:r,truncated:i}=lf(e,n);return{refs:r.map(e=>{let n=f(e.type??`Element`),r=fn(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function df(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!ff(t.command))return[];let a=Md(t);return a.length===0?[]:mf({candidates:a,nodes:r,session:n,action:t,matching:pf(t),sanitize:i})}function ff(e){return ot(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function pf(e){let t=ot(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function mf(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=hf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Xd(s).map(e=>e.suggestion)}function hf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Ie(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:gf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function gf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Be(t,r.device.platform,{action:i.command===`fill`?`fill`:ot(i.command)?`click`:`get`,nodes:n}),c=f(t.type??`Element`),l=fn(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function _f(e){return{...e,hint:e.hint??bf(e.details,`hint`),diagnosticId:e.diagnosticId??bf(e.details,`diagnosticId`),logPath:e.logPath??bf(e.details,`logPath`)}}function vf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return yf({error:t,actionLabel:at(n),action:n.command,positionals:pt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function yf(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Dn(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Dn(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Sf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>Dn(e,u))}:{},divergence:l}}}}function bf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const xf=[`readiness`,`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function Sf(e){if(!e)return{};let t={};for(let n of xf)e[n]!==void 0&&(t[n]=e[n]);return t}async function Cf(e){return await wf({...e,snapshotDiagnostics:_(e.snapshotDiagnosticSamples)})}async function wf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=Tf(t.error.details?.replaySource),v=_f(t.error),y=await Qd({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:Kn(u.meta?.requestId)});return vf({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Tf(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 Ef(e,t){if(e)try{V.appendFileSync(e,`${JSON.stringify(d(t))}\n`)}catch(t){M({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Df(e){let{req:t,sessionName:n,action:i,resolved:a,filePath:o,line:s,step:c,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();Ef(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,positionals:pt(a)??[]});let g;try{g=await kf({req:t,sessionName:n,resolved:a,sourceAction:i,invoke:f,resolvedSessionScope:p,dependencies:m,readinessTimeoutMs:e.readinessTimeoutMs})}catch(e){if(!(e instanceof r))throw e;g={ok:!1,error:l(e)}}let _=Date.now();return Ef(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?jf(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Of(g,u??o,s)}function Of(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function kf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Nf(t.flags,r.flags,r.command);e.readinessTimeoutMs!==void 0&&(c.readinessTimeoutMs=e.readinessTimeoutMs);let l=i.command===`fill`?Wt(Rt(i)):void 0;return l&&(c.recordAs=l),await a(Af({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Af(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:it(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ut(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function jf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}async function Mf(e,t){let{readinessTimeoutMs:n}=Nf(e,t.flags,t.command);if(n===void 0)return;let{SELECTOR_PIPELINE_POLICIES:r,readinessScheduleFor:i}=await import(`./selector-pipeline-policy.js`).then(e=>e.r);return i(r.promotedTarget.poll,n)}function Nf(e,t,n){let r=g(e,{...t??{}});return Re(n)&&r.readinessTimeoutMs===void 0&&(r.readinessTimeoutMs=2e3),r}function Pf(e){return Vf(e.ok?If(e.data):Ff(e.error.details?.artifactPaths))}function Ff(e){return Array.isArray(e)?e.filter(Bf):[]}function If(e){return e?[zf(e.path),zf(e.outPath),...Lf(e.artifacts)].filter(Bf):[]}function Lf(e){return Array.isArray(e)?e.map(Rf).filter(Bf):[]}function Rf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return zf(t.localPath)??zf(t.path)}function zf(e){return typeof e==`string`?e:void 0}function Bf(e){return typeof e==`string`}function Vf(e){return[...new Set(e.filter(Hf))]}function Hf(e){try{return V.statSync(e).isFile()}catch{return!1}}function Uf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Wf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=en(r),u=Ce(t),d=Zt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Et(r,e)===t.sibling),p=d.filter(e=>Tt(wt(e,l),t.scrollRegion)),m=St(p)[t.viewportOrder]?.ref,h=Ct({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,...qf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Wf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Gf(n,t,i,a):Kf(n,t,r,a,o)}function Gf(t,n,r,i){let a=e=>e!==null&&(!i||!!e.rect),s=e(n),c=s?o(t,s):null;if(a(c))return{matchedNodes:[c],winnerRef:c.ref};let l=r?tn(t,r):null;return a(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Kf(e,t,n,r,i){let a=et(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=rn(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function qf(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?Jf(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?Jf(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?Jf(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 Jf(e,t,n){let r=Dt(t),i=$t(t,n,Math.max(e.ancestry.length,1)).chain;return[...Te(e,r),...xe(e.ancestry,i)].slice(0,5)}function Yf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=dt(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ze(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!ot(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Zf(r)&&Zf(n[1])))return r}function Xf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Zf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Qf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=kn(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:cp(Ce(n),h),...t.observed?{observed:cp(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>lp(e,h))},_=zd({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Id({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(at(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=Gd({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return vf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function $f(e,t,n){let r=kn(e.scrubVars);return Qf(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:of(n,r),publicationEvidence:rp(n),repairCapture:$d(n)})}async function ep(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await tf({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function tp(e,t){return $f(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 ep({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function np(e,t,n){return $f(e,t,await ep({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function rp(e){return e.state===`available`?e.evidence:void 0}function ip(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?ae(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Je(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Yf(n,i),platform:a.device.platform}:{kind:`inactive`}}function ap(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=pf(r),s=Uf({recorded:t,token:n,nodes:i,platform:a,refLabel:Xf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Dt(s.winnerNode),structural:ke(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Dt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function op(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function sp(e){return!e.ok&&e.error.details?.reason===nn}function cp(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function lp(e,t){let n=f(e.type??`Element`),r=fn(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function up(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function dp(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 fp(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 pp(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 mp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:dp(e?.observed),expectedStructural:pp(e?.expectedStructural),observedStructural:pp(e?.observedStructural)}}function hp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:dp(e?.observed),observedAncestry:fp(e?.observedAncestry)}}function gp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function _p(e,t,n){let r=gp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&op(e)?{status:`guard-mismatch`,evidence:mp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&sp(e)?{status:`landmark-mismatch`,evidence:hp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function vp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c,l=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),u=e=>(o=e,gp(yp(e),Pf(e))),d=async e=>{let n=t.observationStore.get();return n?await tf({session:n,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:!0}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`}};return{runtime:{beginTargetVerification(e,n,r,i){return ip({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async observeTarget({action:e,token:n}){let r=async()=>{let r=await d(e);if(s=r,r.state!==`available`)return{state:`unavailable`,reason:r.reason,hint:r.hint};let i=t.sessionStore.get();return{state:`classified`,classification:ap({recorded:e.targetEvidence,token:n,action:e,nodes:[...r.nodes],platform:i.device.platform})}},i=n.startsWith(`@`)?void 0:await Mf(t.replayReq.flags,e);if(!i)return await r();let{observeUntil:a}=await import(`./observe-until.js`).then(e=>e.n),o=await a({capture:r,verdict:e=>Tp(e)?{kind:`continue`}:{kind:`done`,result:e},schedule:i,...t.signal?{signal:t.signal}:{},...t.dependencies.clock?{clock:t.dependencies.clock}:{}});if(o.polls.length>1&&(c={remainingBudgetMs:Math.max(0,i.budgetMs-Ep(o)),readiness:{polls:o.polls.length,waitedMs:o.waitedMs,end:o.kind}},M({level:`debug`,phase:`interaction_target_readiness`,data:{...c.readiness,command:e.command}})),o.kind===`done`)return o.result;if(o.last!==void 0)return o.last;throw o.kind===`expired`?o.lastError:o.error},async dispatchStep(e,n,i,a,s){let l=t.actionLines[i]??1,u=await Df({...c?{readinessTimeoutMs:c.remainingBudgetMs}:{},req:up(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:l,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=u,Pf(u).forEach(e=>r.add(e));let d=[...r];return u.ok?{status:`ok`,artifactPaths:d}:_p(u,s,d)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await tp(l(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=$f(l(e,t,r,i),n,a);return u(n.kind===`selector-miss`&&c?Dp(o,c.readiness):o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await np(l(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return u(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=yp(o),l=await bp(t,n,e,r,c,[...i],[...a],s);return u(l)},armStep:()=>{s=void 0,c=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>xp(e),onStep:i,diagnosticsMarker:()=>Cp(t.sessionStore),diagnosticsSince:e=>wp(t.sessionStore,e)},readLastResponse:()=>o}}function yp(e){return e&&!e.ok?e:c(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function bp(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Sp(i)?c(i):c(await Cf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function xp(e){let t=e.positionals??[],n=Ne(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Sp(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 Cp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function wp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Tp(e){return e.state===`classified`&&!e.classification.verified&&e.classification.kind===`selector-miss`}function Ep(e){let t=e.polls[0];return t?e.waitedMs-(t.startedMs+t.durationMs):0}function Dp(e,t){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,readiness:t}}}}function Op(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:kp(t,i)};return jp(o,`AD_PLATFORM`,a.platform??r.platform),jp(o,`AD_TARGET`,a.target??r.target),jp(o,`AD_DEVICE`,a.device),jp(o,`AD_DEVICE_ID`,Ap(a)),Mp(o,`AD_SHARD_INDEX`,a.shardIndex),Mp(o,`AD_SHARD_COUNT`,a.shardCount),jp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function kp(e,t){let n=e.meta?.cwd??process.cwd();return B.relative(n,t)||t}function Ap(e){return typeof e.serial==`string`?e.serial:e.udid}function jp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Mp(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Np=3e4,Pp=1e3;function Fp(e){let{scriptPath:t,env:n,publicNetworkOnly:i}=e,a=V.readFileSync(t,`utf8`),o=Object.create(null);try{ba.runInNewContext(a,Ip(n,o,i),{filename:t,timeout:Np})}catch(e){let n=l(e);throw new r(n.code,`Maestro runScript failed: ${n.message}`,m({...n.details??{},hint:n.hint,diagnosticId:n.diagnosticId,logPath:n.logPath,retriable:n.retriable,supportedOn:n.supportedOn,scriptPath:t}),e instanceof Error?e:void 0)}return Up(o,t),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Wp(t)]))}function Ip(e,t,n){return{...e,output:t,json:Lp,http:{post:(e,t)=>zp(`POST`,e,n,t)}}}function Lp(e){if(typeof e!=`string`)throw new r(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new r(`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,Rp)}catch(t){throw new r(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Pp)},t instanceof Error?t:void 0)}}function Rp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function zp(e,t,n,i){let a=Cn(process.execPath,Bp(),{stdin:JSON.stringify(Hp(e,t,i,n)),timeoutMs:Np,allowFailure:!0});if(a.exitCode!==0)throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Gp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(n){throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:a.stdout.slice(0,Pp),stderr:a.stderr.slice(0,Pp)},n instanceof Error?n:void 0)}}function Bp(){let e=Vp(import.meta.url);if(!e)throw new r(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Vp(e){try{let t=va(e),n=B.extname(t)||`.js`;return[B.join(B.dirname(t),`run-script-http-child`+n),B.join(B.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>V.existsSync(e))??null}catch{return null}}function Hp(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Up(e,t){for(let n of Object.keys(e))if(n.includes(`.`))throw new r(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${n}`,{scriptPath:t,key:n})}function Wp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Gp(e){let t=e.trim();return t.length>0?t.slice(0,Pp):`request process exited without stderr`}async function Kp(e){return await qp(`tap`,async t=>{let n=B.join(t,`before.png`),r=B.join(t,`after.png`),i=await Yp(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Yp(e,r)))return await Jp(n,r,e.signal,`tap`)}})})}async function qp(e,t){let n=await H.mkdtemp(B.join(_a.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await H.rm(n,{recursive:!0,force:!0})}catch{}}}async function Jp(e,t,n,r){try{let[i,a]=await Promise.all([H.readFile(e),H.readFile(t)]);$p(n);let o=await $i(i,a,`Maestro screenshot`);return $p(n),Xp(o,r)}catch(e){Qp(e,n),M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Yp(e,t){try{return await H.rm(t,{force:!0}),$p(e.signal),await e.capture(t),$p(e.signal),!0}catch(t){return Qp(t,e.signal),!1}}function Xp(e,t){if(e.status!==`compared`)return Zp(t,e.status,e),!1;let n=e.differencePercent<=q.animationDifferencePercent;return Zp(t,n?`stable`:`changed`,e),n}function Zp(e,t,n){M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Qp(e,r){if(r?.aborted||n(e))throw t()}function $p(e){if(e?.aborted)throw t()}async function em(e){nm(e.timeoutMs),$p(e.signal);let t=e.now()+e.timeoutMs;return await qp(`animation`,async n=>{let r=B.join(n,`first.png`),i=B.join(n,`second.png`);for(;;){if($p(e.signal),await tm(e,r,i))return!0;if(e.now()>=t)return!1}})}async function tm(e,t,n){let r=[await Yp(e,t),await Yp(e,n)];return!r[0]||!r[1]?!1:await Jp(t,n,e.signal,`animation`)===!0}function nm(e){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const rm=q.observationPollMs;async function im(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!bm(n)||(Z(e.context.signal),!await vm(e.dependencies,t,rm,e.context.signal)))throw n}}}function am(e){return om({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function om(e){let t=Bi(e.snapshot),n=e.platform===`ios`?ia(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:a(n.nodes)}:e.snapshot;return dm(yo(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 sm(e){ym(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await im(e,n),i=om({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Ca(e.condition,i))return i;if(e.dependencies.now()>=n)break;await vm(e.dependencies,n,rm,e.context.signal)}return Z(e.context.signal),Cm(t)}async function cm(e){ym(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await im(e,t);if(r=void 0,n=om({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===q.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),Cm(n)}async function lm(e){ym(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await im(e,t),r=xm(n);for(;;){Z(e.context.signal),await vm(e.dependencies,t,rm,e.context.signal);let i=await im(e,t),a=xm(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 um(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function dm(e,t,n,r,i,a,o){if(!e.ok){let t=um(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=pm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=um(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:fm(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:xm(t)}:{}}}function fm(e,t){return!Ae(e)||!Ae(t)?0:O(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 pm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!mm(t,n,r)||i!==1))return hm(t.selector)}function mm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!bo(e.selector)}function hm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!gm(n)||typeof r!=`string`)return;let i=Pr(r)?.trim();return i?{key:n,value:i}:void 0}function gm(e){return e===`id`||e===`label`||e===`text`}async function _m(e,n,r){try{await e.sleep(n,r)}catch(e){throw r?.aborted?t():e}Z(r)}async function vm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await _m(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw t()}function ym(e,t){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function bm(e){return e instanceof r&&e.details?.retriable===!0}function xm(e){return ga(`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,checked:e.checked??!1,bounds:Sm(e.rect)})))).digest(`hex`)}function Sm(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 Cm(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function wm(e){return e.kind===`clearState`?km(e):Tm(e)?Em(e):Wm(e)?Gm(e):e.kind===`settingsPermission`?Lm(e):Rm(e)}function Tm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Em(e){switch(e.kind){case`launchApp`:return Dm(e);case`stopApp`:return Om(e);case`openLink`:return Am(e)}}function Dm(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 Om(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function km(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Am(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const jm={camera:`camera`,microphone:`microphone`,photos:`photos`,contacts:`contacts`,notifications:`notifications`,calendar:`calendar`,location:`location`,medialibrary:`media-library`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`},Mm={allow:`grant`,deny:`deny`,unset:`reset`},Nm={location:{always:{state:`grant`,permission:`location-always`},inuse:{state:`grant`,permission:`location`},never:{state:`deny`,permission:`location`}},photos:{limited:{state:`grant`,permission:`photos`,mode:`limited`}}};function Pm(e){let t=Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]);if(t.length===0)throw new r(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...t.filter(([e])=>e===`all`),...t.filter(([e])=>e!==`all`)].map(([e,t])=>Fm(e,t))}function Fm(e,t){let n=e===`all`?`all`:Im(jm,e);if(n===void 0)throw new r(`UNSUPPORTED_OPERATION`,`Maestro permission "${e}" is not supported.`,{hint:`Supported: all, ${Object.keys(jm).join(`, `)}.`});let i=Nm[e],a=i?Im(i,t):void 0;if(a)return a;let o=Im(Mm,t);if(o)return{state:o,permission:n};throw new r(`INVALID_ARGS`,`Maestro permission "${e}" does not accept "${t}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(i??{})].join(`|`)}.`})}function Im(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function Lm(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Rm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return zm(e);case`clickPoint`:return Bm(e);case`swipe`:return Vm(e);case`scroll`:return Hm(e);case`pressKey`:return Um(e)}}function zm(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Bm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Vm(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function Hm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Um(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Wm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Gm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Km(e,t){let n=wm(t),i=await e.invoke(m({...n,flags:qm(e.flags,n.flags??{})}));if(!i.ok)throw $m(i);if(t.kind===`gestureViewport`){let e=i.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new r(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function qm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=m({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Jm(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 Ym(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 Xm(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 Zm(e,t,n){if(B.isAbsolute(e))return e;let i=t.source?.path??n;if(!i)throw new r(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return B.resolve(B.dirname(i),e)}function Qm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function $m(e){let t=e.error,n=m({...t.details??{},hint:t.hint??eh(t.details,`hint`),diagnosticId:t.diagnosticId??eh(t.details,`diagnosticId`),logPath:t.logPath??eh(t.details,`logPath`),retriable:t.retriable??th(t.details,`retriable`),supportedOn:t.supportedOn??eh(t.details,`supportedOn`)});return new r(t.code,t.message,Object.keys(n).length?n:void 0)}function eh(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function th(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function nh(e){let t,n,i,a,o,s=0,c=0,l=async n=>{c+=1;let i=await Km(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new r(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=b(i,i);return t={generation:n.generation,snapshot:a},a};return{capture:async e=>{if(n?.generation===e.generation){let r=n.snapshot;return n=void 0,t={generation:e.generation,snapshot:r},r}return n=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,n=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,n=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,n=void 0}},prime:(e,t)=>{n={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await lm({timeoutMs:q.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,n={generation:i.generation,snapshot:c.snapshot},c}}}async function rh(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 im({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=am({query:t,context:n,snapshot:o,platform:i.platform});if(lh(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await vm(i.dependencies,a,rm,n.signal)}}}async function ih(e,t,n,r,i,a){let o=async()=>await sh(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Kp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Km(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await ah(e,t,n,r,i,a.click,o)});return}await ah(e,t,n,r,i,a.click)}async function ah(e,t,n,r,i,a,o){let s=async()=>await sh(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:xm(await t.capture(i))),l=async()=>{let r=await lm({timeoutMs:q.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await oh({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 oh(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<q.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function sh(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await uh(e,o,n.point,i);return}catch(n){if(!dh(n))throw n;let o=await rh({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!ch(o))throw n;t.invalidate(r.generation),await fh(e,In(o.rect),i);return}}t.invalidate(r.generation),await fh(e,n.point,i)}function ch(e){return e.matched&&e.visible&&e.rect!==void 0}function lh(e,t){return ch(e)?!t||e.dispatchSelector!==void 0:!1}async function uh(e,t,n,r){M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Km(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function dh(e){let t=i(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===dn.selectorNotFound}async function fh(e,t,n){if(!t)throw new r(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Km(e,{kind:`clickPoint`,point:t,options:n})}function ph(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function mh(e){let t=nh(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},i=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},a=e.platform,o=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Km(e,t)),s=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},c=async(e,t,n=`none`)=>await s(()=>o(e),t,n),l=async(e,t,n)=>{let i=[];for(let a of t){try{await c({kind:`settingsPermission`,...e?{appId:e}:{},state:a.state,permission:a.permission,...a.mode?{mode:a.mode}:{}},n)}catch(e){throw e instanceof r?new r(e.code,e.message,{...e.details,appliedPermissionMutations:i,failedPermissionMutation:ph(a)}):e}i.push(ph(a))}},u=async(n,r)=>{vn(n),await c({kind:`typeText`,text:n},r);let a=await lm({timeoutMs:q.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});i(a),t.prime(r.generation,a.snapshot)};return{operations:{platform:a,resolveTarget:async(n,r)=>await rh({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await sm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a}),resolveGestureViewport:async()=>await o({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Jm(e.arguments),...Jm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Pm(e.permissions);i&&await c({kind:`clearState`,...n?{appId:n}:{}},t),await l(n,r,t)}await c({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i&&!e.permissions,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`stopApp`,...n?{appId:n}:{}},t)},setPermissions:async(e,t)=>{await l(e.appId??t.appId,Pm(e.permissions),t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await c({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:a===`ios`},t,`deferred`)},tapOn:async(r,i)=>await ih(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await s(()=>fh(e,t.target.point,m({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await s(()=>fh(e,t.target.point,{holdMs:q.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await c({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await u(e.text,t),eraseText:async(e,t)=>await u(`\b`.repeat(e.charactersToErase??q.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await c({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let i=await cm({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a,scroll:async(i,o)=>{let s=Ma(o,n.selector,n.direction,n.durationMs,a);return await c(s?{kind:`swipe`,...s}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await lm({timeoutMs:Math.min(q.settleTimeoutMs,i),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(i.visiblePercentage!==q.scrollUntilVisiblePercentage)throw Rr(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Ym(n.selector,i))}},pressKey:async(e,t)=>{await c({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await c({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await c({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await em({timeoutMs:t.timeoutMs??q.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await o({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Xm(await o({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Fp({scriptPath:Zm(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?Qm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:i}}function hh(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=mh(e);return Do(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 gh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),_h(()=>bh(r,e)),_h(()=>xh(n,t,e))},actionCompleted:e=>{let r=vh(i,e.stepIndex);_h(()=>Sh(n,t,yh(r,e),!0))},actionFailed:e=>{let r=vh(i,e.stepIndex);_h(()=>Sh(n,t,yh(r,e),!1))}}}function _h(e){try{e()}catch{}}function vh(e,t){let n=e.get(t);return e.delete(t),n}function yh(e,t){return m({...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 bh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function xh(e,t,n){Ef(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 Sh(e,t,n,i){let a=Ch(n);Ef(e,{type:`replay_action_stop`,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,ok:i,durationMs:n.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in n&&n.error instanceof r?{errorCode:n.error.code}:{}})}function Ch(e){let t=`data`in e?e.data:void 0,n=wh(t?.timing)?t.timing:void 0;return m({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function wh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Th(e,t){let n=m({...e.dispatch,...Eh(t.dispatch)});return m({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,dispatch:Object.keys(n).length>0?n:void 0})}function Eh(e){return m({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function Dh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:jh(e.action),positionals:Mh(e.action,e.value),flags:t.flags??{}}}}async function Oh(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=Kn(r.meta?.requestId),c=Dh(t,r),l=_f(e.error),u=[...t.redactions],d=kn(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await tf({session:p,observationStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?kh({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Ah(t.value)].filter(Boolean).join(` `),_=Gd({sessionStore:i,observationStore:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:of(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:zd({kind:`action-failure`,targetEvidence:void 0,capture:$d(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return yf({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u,warnings:t.warnings})}function kh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Xd(Qn(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>gf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Ah(e){return!e||e===`<text>`?e??``:ct(e)}function jh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Mh(e,t){return!t||e===`inputText`?[]:[t]}function Nh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=Fh(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:Ih(c,Date.now()-r)}}}async function Ph(e){let{command:t,replayPath:n,state:r,outcome:i}=e,{request:a,session:{store:o,observationStore:s,logPath:c}}=t,{failure:u}=i,d=l(i.error);return u?await Oh({error:d,failure:u,replayPath:n,req:a,sessionStore:o,observationStore:s,logPath:c,snapshotDiagnostics:Fh(o,r.snapshotStart)}):{ok:!1,error:d}}function Fh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return _(n)}function Ih(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Lh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return c(`INVALID_ARGS`,ur);if(t.flags?.saveScript!==void 0)return c(`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 Rh({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Ph({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Rh(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await zh({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Kh({command:t,device:l.device,platform:l.platform,runtimeHints:l.runtimeHints,sourcePath:l.filePath,publicNetworkOnly:u});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await pr(l.flow,d,{defaults:l.defaults,env:l.env,platform:l.platform,target:l.target,runtimeHints:l.runtimeHints,signal:l.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:!u,readSource:e=>Yr(n,e),observer:gh({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?Nh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Ph({command:t,replayPath:n.entry,state:i,outcome:f})}async function zh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=rr(Yr(n,o),o),c=a.lookup(),l=c?.session;c&&a.assertSelectorMatches(r.flags);let u=await Bh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Wh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Gh(r),signal:Kn(r.meta?.requestId)}}async function Bh(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 Li(t.flags??{},tr(a.appTarget,o))),c=Zh(t,s),l=Hh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Vh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Qh(t,s),runtimeHints:l,flow:a})}async function Vh(e){if(e.device||!Uh(e.runtimeHints))return e;let t=await Li(e.req.flags??{},tr(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Qh(e.req,t),runtimeHints:Hh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Hh(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function Uh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Wh(e){return{...Op({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Gh(e){return{...Mt(jt(e.flags?.replayShellEnv)),...kt(Ot(e.flags?.replayEnv))}}function Kh(e){let{command:t,device:n,platform:r,runtimeHints:i,sourcePath:a,publicNetworkOnly:o}=e,{request:s,invoke:c}=t,l={...s,runtime:i,...t.dispatch?{dispatch:t.dispatch}:{}};return hh({invoke:e=>c(Th(l,e)),flags:qh(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await ya(e,void 0,{signal:t})}}})}function qh(e,t,n){if(!e)return Jh(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 Jh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Yh(n,t):Xh(n,t)}function Yh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Xh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Zh(e,t){let n=e.flags?.platform;if(n===`android`||n===`ios`)return n;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new r(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Qh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function $h(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(It(t,a.flags?.replayBackend)===`maestro`)return n?c(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Lh(i):c(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function eg(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=tg(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=ng(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=rg({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:ag({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function tg(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return c(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function ng(e,t,n){let r=pd(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:ig({...e,flags:ir(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function rg(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:c(`INVALID_ARGS`,a.message)}}function ig(e,t){return!t.platform&&!t.target?e:{...e,flags:og(e.flags,t)}}function ag(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Op({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Mt(jt(t.flags?.replayShellEnv)),cliEnv:kt(Ot(t.flags?.replayEnv))}}function og(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const sg={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function cg(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=lg({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(fg({req:t,coordinator:a}),dg({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function lg(e){let t=pg(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return s()}function ug(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?c(`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.`):mg({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function dg(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=ug({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??sg,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:hg({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function fg(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function pg(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return c(`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 mg(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Mn(t):a??Fd(i);if(!(n||r&&o===a)&&V.existsSync(o))return c(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function hg(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 gg(e){let{request:t,session:{name:n,logPath:r,store:i,observationStore:a,coordinator:o},tracePath:s,onStep:u,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return c(`INVALID_ARGS`,ur);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,Lt(h)&&t.flags?.replayBackend!==`maestro`)return c(`INVALID_ARGS`,Ft(`replay`,h));let l=await $h({resolved:h,keepSession:m,coordinator:o,command:e});if(l)return l;let _=eg({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:h,script:Yr(f,h),coordinator:o,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:ee}=_.value,T=cg({req:t,entryIndex:C,sessionStore:i,sourcePath:h,coordinator:o});if(!T.ok)return T.response;let{runtime:E,readLastResponse:te}=vp({ctx:{replayReq:v,sessionName:n,sessionStore:i,observationStore:a,logPath:r,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:ee,responseLevel:t.meta?.responseLevel,invoke:d,signal:Kn(t.meta?.requestId),coordinator:o,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:u,armSaveScript:T.armSaveScript}),D=await Td({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},E);return D.status===`failed`?te()??c(`COMMAND_FAILED`,`replay step failed with no recorded response`):_g({startedAt:p,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:o,keepSession:m})}catch(e){let t=l(e);return g.size===0?{ok:!1,error:t}:{ok:!1,error:{...t,details:{...t.details,artifactPaths:[...g]}}}}}function _g(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=yg({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=_([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:vg(i,Date.now()-t)}}}function vg(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function yg(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return c(`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 bg(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=B.resolve(n??`.`,t??`.agent-device/test-artifacts`);return B.join(i,r)}function xg(e,t){let n=t?B.relative(t,e):B.basename(e),r=n.length===0||n.startsWith(`..`)?B.basename(e):n;return Ye(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function Sg(e,t){V.mkdirSync(t,{recursive:!0}),Tg(e,t)}function Cg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=B.join(o,`result.txt`),u=B.join(o,`failure.txt`),d=wg([...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=>B.basename(e)).join(`, `)}`);let p=`${f.join(`
2
2
  `)}\n`;V.writeFileSync(l,p),s||V.writeFileSync(u,p)}function wg(e,t,n){let r=[],i=new Set(n.map(e=>B.basename(e).toLowerCase()));for(let n of e){if(!Dg(n))continue;let e=B.basename(n);if(B.resolve(n)===B.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=Eg(e,t,i),o=B.join(t,a);V.copyFileSync(n,o),r.push(o)}return r}function Tg(e,t){let n=B.join(t,`replay.ad`);if(V.copyFileSync(e,n),B.extname(e).toLowerCase()===`.ad`)return;let r=B.join(t,B.basename(e));B.resolve(r)!==B.resolve(n)&&V.copyFileSync(e,r)}function Eg(e,t,n){let r=B.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||V.existsSync(B.join(t,a));)a=`${i}-${o++}${r}`;return a}function Dg(e){try{return V.statSync(e).isFile()}catch{return!1}}function Og(e){let{platformFilter:t,discoverSources:n}=e,i=n(),a=[];for(let e of i){let{path:n,manifest:r}=e,i={kind:`run`,path:n,title:r.title,manifest:r};if(!t){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}Pg(t,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=t?` for --platform ${t}`:``;throw new r(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function kg(e,t,n,r,i=0){let a=B.basename(n,B.extname(n)),o=Ye(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Ag(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return Ye(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function jg(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,B.basename(r),`attempt`,a+1].join(`:`)}function Mg(e,t){return typeof e==`number`?e:t}function Ng(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Pg(e,t){return e===`apple`?w(t):t===e}function Fg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Ig=2e3;async function Lg(e){let{filePath:t,sessionName:n,requestId:r,parentRequestId:i,timeoutMs:a,platform:o,target:s,artifactsDir:c,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:r,parentAttemptId:i}),v=new Set,y,b=!1,x,S=Date.now(),C=Wg({artifactsDir:c,artifactPaths:v,filePath:t,sessionName:n,requestId:r,timeoutMs:a,platform:o,target:s}),w=f({filePath:t,sessionName:n,platform:o,target:s,requestId:r,artifactsDir:c,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>Fg({error:l(e)})).finally(()=>{_.release()});try{x=typeof a==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Gg(a,[...v]))},a)})]):await w,Q(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:n,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await zg(w)||(x=Hg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:r,graceMs:Ig}}),Bg({replayPromise:w,cleanupSession:p,sessionName:n,requestId:r,emitDiagnostic:h})));let e=await Vg({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:c,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Ug(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:n}),await p(n),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!0,durationMs:Date.now()-t})}catch(e){let r=l(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-t,errorCode:r.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:n,error:r.message}}),x=Rg(x,r,v)}}return x??Fg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Rg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:Fg({error:t,artifactPaths:[...n],infrastructure:!0})}async function zg(e){return await Promise.race([e.then(()=>!0),ya(Ig).then(()=>!1)])}async function Bg(e){let{replayPromise:t,cleanupSession:n,sessionName:r,requestId:i,emitDiagnostic:a}=e;try{await t}finally{try{await n(r)}catch(e){a({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:r,requestId:i,error:l(e).message}})}}}async function Vg(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:a,emitDiagnostic:o}=e;if(!t)return;let s=Date.now();Q(a,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:n});try{let e=await t({sessionName:n,artifactPaths:r,artifactsDir:i,tracePath:a,appendTimingEvent:e=>Q(a,e)});return Q(a,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:e===void 0,durationMs:Date.now()-s,errorCode:e?.error.code}),e}catch(e){let t=l(e);return Q(a,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-s,errorCode:t.code}),o({level:`warn`,phase:`test_finalize_failed`,data:{session:n,error:t.message}}),Fg({error:t})}}function Hg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Ug(e,t){return{...e,warnings:[...e.warnings,t]}}function Wg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=B.join(t,`replay-timing.ndjson`);return V.mkdirSync(B.dirname(l),{recursive:!0}),V.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&&V.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Gg(e,t=[]){return Fg({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 Kg(e){let t=qg(e),n=await Jg(e,t);return{result:e_(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function qg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:B.join(i,...a?[`shard-${a.shardIndex+1}`]:[],xg(t.path,n)),maxAttempts:r+1}}async function Jg(e,t){Xg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Yg(e,t,r);if(Zg(n,i),Qg(e,i.outcome,r))break;$g(e,t,i)}return n}async function Yg(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=kg(i,a,r.path,o,n),h=B.join(t.testArtifactsDir,`attempt-${f}`);Sg(r.path,h);let g=jg({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,...a_(d)},v=await Lg({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return Cg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Xg(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:kg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...a_(c)})}function Zg(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 Qg(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function $g(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,...a_(e.shard)})}function e_(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?t_(e,t,n,r):n_(e,t,n,r)}function t_(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,...a_(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}:{},...i_(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function n_(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,...a_(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...r_(c),...i_(s)}}function r_(e){let t=e?.status===`failed`?e:void 0;return{...t&&t.warnings.length>0?{warnings:[...t.warnings]}:{},...t?.infrastructure?{infrastructure:!0}:{},...e?.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function i_(e){return a_(e)}function a_(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function o_(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 s_(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),i=await c_(t,u,d);f_(i,o);let p=i.shardPlan?p_({entries:i.entries,total:i.total,emitProgress:o}):[];return i.shardPlan?p.push(...await m_({shards:i.shardPlan.shards,sessionName:f,suiteInvocationId:i.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:i.suiteArtifactsDir,suiteTotal:i.total,runReplay:n,cleanupSession:r,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await v_({discoveryEntries:i.entries,sessionName:f,suiteInvocationId:i.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:i.suiteArtifactsDir,suiteTotal:i.total,runReplay:n,cleanupSession:r,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:x_(i.total,p,Date.now()-e,i.suiteArtifactsDir)}}catch(e){let t=i(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function c_(e,t,n){let r=l_(e,t),i=u_(r),a=r.length-i.length,o=Ag(e.requestId),s=await o_(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:d_(e,o),total:s?.total??r.length}}function l_(e,t){return Og({platformFilter:e.platformFilter,discoverSources:t})}function u_(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function d_(e,t){return bg({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function f_(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 p_(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 m_(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?[h_(r,e.sessionName,t.reason)]:[]})}function h_(e,t,n){let r=l(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:__(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:r.code,message:r.message,hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,details:r.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function g_(e){let{shard:t,sessionName:n}=e;return await y_({...e,entries:t.entries,sessionName:__(n,t),shard:t})}function __(e,t){return`${e}:shard-${t.shardIndex+1}`}async function v_(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 Kg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Ng(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Mg(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),b_(t,o,p))break}return g}async function y_(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 Kg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Ng(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Mg(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),b_(b,o,m))break}return _}function b_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function x_(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=y(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function S_(e,t){return()=>e.map(e=>C_(e,t))}function C_(e,t){let n=e.entry,r=Yr(e,n),i=It(n,t)===`maestro`,a=lt(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 w_(e){return async t=>(await D_(e,t)).map(T_)}function T_(e){if(e.platform===`web`||!ee(e))throw new r(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function E_(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}async function D_(e,t){let n=j_(e),i=k_(await Fi(O_(e)),n,e);if(i.length<t)throw new r(`DEVICE_NOT_FOUND`,`test sharding requires ${A_(t)}, but only ${i.length} matched`);return i.slice(0,t)}function O_(e){let t=F(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:S({simulatorSetPath:Ni(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function k_(e,t,n){return t.length>0?M_(e,t,n):e.filter(e=>N_(e,n)).sort(I_)}function A_(e){return`${e} device${e===1?``:`s`}`}function j_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function M_(e,t,n){return t.map(t=>{let i=F_(t),a=e.find(e=>P_(e,n)&&(e.id===t||F_(e.name)===i));if(!a)throw new r(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function N_(e,t){return!P_(e,t)||!ee(e)?!1:e.booted!==!1}function P_(e,t){return!(!D(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function F_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function I_(e,t){return e.id.localeCompare(t.id)}function L_(e){let t=R_(e?.shardAll,`--shard-all`),n=R_(e?.shardSplit,`--shard-split`);if(t!==void 0&&n!==void 0)throw new r(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(n!==void 0)return{mode:`split`,count:n}}function R_(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new r(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const z_=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 B_(e){return z_.has(e.toUpperCase())}const V_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function H_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=U_(e);return t?W_(t.details)||G_(t.code,t.message):!1}function U_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function W_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||mn(t)?!0:t?B_(t):!1}function G_(e,t){let n=`${e}\n${t}`.toLowerCase();return V_.some(e=>n.includes(e))}function K_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Y_(e.error.details?.artifactPaths),warnings:un(e.error.details),infrastructure:H_(e),...X_(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:un(t),artifactPaths:Y_(t?.artifactPaths),...X_(t?.snapshotDiagnostics)}}function q_(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 Y_(e){return[...new Set(J_(e))]}function X_(e){let t=v(e);return t?{snapshotDiagnostics:t}:{}}const Z_=1e3,Q_=3e3;function $_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await ev(e)}}async function ev(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=En(o.device.platform),c=i?B.join(i,`recording${s}`):Tn(o.device.platform);nv(a,{type:`video_recording_start`,session:n,videoPath:c}),M({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(rv({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return nv(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await wn(Z_),nv(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:Z_}),M({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:Z_}}),l}async function tv(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;nv(a,{type:`video_tail_start`,session:n,requestedDurationMs:Q_});let o=Date.now();await wn(Q_);let s=Date.now(),c=await e.video.record(rv({req:t,sessionName:n,phase:`stop`}));return Pf(c).forEach(e=>i.add(e)),nv(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),M({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function nv(e,t){e({...t,ts:new Date().toISOString()})}function rv(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 iv=[{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.`}],av=({attemptId:e,parentAttemptId:t})=>{Gn(e);let n=ov(e,t);return{cancel:()=>Hn(e),release:()=>{n(),Wn(e)}}};function ov(e,t){if(!t||t===e)return()=>{};let n=Kn(t);if(!n)return()=>{};let r=()=>{Hn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function sv(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=cv(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:E_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function cv(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 lv(e){let{request:t,session:{name:n,logPath:r},createSession:a,invoke:o,cleanupSession:s,video:l}=e;if(t.flags?.recordVideo===!0&&l===void 0)return c(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let u=t.flags??{};for(let e of iv)if(e.requested(u))return c(`INVALID_ARGS`,e.message);let d,f;try{d=fv(t,n),f=dv(t)}catch(e){let t=i(e);return c(t.code,t.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await s_({request:d,emitProgress:qn,isCanceled:()=>Un(t.meta?.requestId),emitDiagnostic:M,bindAttemptCancellation:av,runReplay:async({filePath:n,sessionName:i,platform:s,target:c,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&Pf(e).forEach(e=>f.add(e)),e),y=sv({parentFlags:t.flags,platform:s,target:c,artifactsDir:d,shard:g,sourceBundle:p.get(n)}),b=a(i,r),x=l?{req:t,sessionName:i,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:l}:void 0,S=x?$_(x):void 0;return K_(await gg({...pv(e,{request:{...t,command:`replay`,session:i,positionals:[n],flags:y,meta:{...t.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await ev(x):void 0;return t&&!t.ok?t:v(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:i,appendTimingEvent:o})=>{if(l)return q_(await tv({req:t,sessionName:e,sessionStore:a(e,r).store,artifactsDir:i,appendTimingEvent:o,artifactPaths:n,video:l}))},discoverSources:S_(f,t.flags?.replayBackend),resolveShardTargets:w_(t.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:uv(m.data,t)}:c(m.error.code,m.error.message)}function uv(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=B.join(n,B.basename(r)),a=e=>e===r||e.startsWith(r+B.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 V.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:B.basename(r)}]}:o}function dv(e){let t=e.flags?.replayScriptSources;if(!t)throw new r(`INVALID_ARGS`,ur);return t}function fv(e,t){let n=e.flags??{},r=e.meta?.cwd,i=hv(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:Mn(i,r),failFast:n.failFast===!0,retries:mv(n.retries),timeoutMs:mv(n.timeoutMs),shard:L_(n)}}function pv(e,t){let{publicNetworkOnly:n,resolvedSessionScope:r,dispatch:i,dependencies:a}=e,o=i||t.openLifecycle?{...i,...t.openLifecycle?{openLifecycle:t.openLifecycle}:{}}:void 0;return{request:t.request,...n?{publicNetworkOnly:n}:{},...r?{resolvedSessionScope:r}:{},...o?{dispatch:o}:{},dependencies:a}}function mv(e){return typeof e==`number`?e:void 0}function hv(e){return typeof e==`string`?e:void 0}function gv(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority,capture:r.capture},coordinator:r.createCoordinator()}}function _v(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function vv(e,t){let n=m({...e,...t});return Object.keys(n).length>0?n:void 0}function yv(e,t){return async({dispatch:n,...r})=>{let i=vv(t.internal,n);return await e(i?{...r,internal:i}:r)}}function bv(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:gt(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:xv(e.scriptPublication??Ht)}},armStep(e){n.update(t=>{xt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Fd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){gt(r())!==void 0&&n.update(ft)},markCompleteIfArmed(){gt(r())!==void 0&&n.update(yt)},markSessionHeldIfArmed(e){if(e.ok||!bt(r()))return e;let t=On(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&&Cv(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Sv({session:t,...e})})}}}}function xv(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Gt(e),targetForce:zt(e)}}function Sv(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=wv({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Cv(e){e.pendingRecordAndHeal=void 0}function wv(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 Tv(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 la({req:Ev(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function Ev(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const Dv={resolveSessionScope:Vi},Ov=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await gg({..._v(e),session:Av(t,n,r),invoke:yv(a??i,e),dependencies:Dv}),kv=async({req:e,sessionName:t,logPath:n,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 r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Tv({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await lv({..._v(e),session:Av(t,n,i),createSession:(e,t)=>Av(e,t,i),invoke:yv(s??o,e),dependencies:Dv,cleanupSession:async t=>await jv({req:e,sessionName:t,logPath:n,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Av(e,t,n){let i=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1},a={get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)};return gv(e,t,a,{createCoordinator:()=>bv({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>n.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let r=n.lookup(e);r&&qi(r,t)},resolveOpenRuntimeHints:({request:t,device:r,platform:i})=>Fr({req:t,sessionStore:{getRuntimeHints:t=>t===e?n.getRuntimeHints(e):void 0},sessionName:e,device:r,platform:i}),bindAuthority:t=>$u({sessionStore:{get:()=>n.get(e),update:i},sessionName:e,...t?{signal:t}:{}}),capture:async({flags:t,logPath:i})=>{let a=n.get(e);if(!a)throw new r(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await ai({device:a.device,session:a,flags:t,logPath:i})}})}async function jv(e){let{req:t,sessionName:n,logPath:i,sessionStore:a}=e;if(!a.get(n))return;let o=await fc({req:{token:t.token,session:n,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:n,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new r(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function Mv(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command!==on.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return Iv(new r(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(n);if(!a)return Iv(new r(`SESSION_NOT_FOUND`,`No active session "${n}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=Fv(a);if(o)return Iv(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return Iv(new r(`INVALID_ARGS`,`session save-script path cannot be empty.`));Ut(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:Kt(a,t.flags?.force),publication:`active`});return c.written?(Yt(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...j(`Published script: ${c.path}`)}}):Iv(c.error??new r(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Nv(e){if(ht(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Xt(e)?void 0:`not-armed`}const Pv={repair:()=>new r(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new r(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new r(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new r(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function Fv(e){let t=Nv(e);return t?Pv[t]():void 0}function Iv(e){return{ok:!1,error:l(e)}}function Lv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function Rv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ei(e)}}async function zv(e,t,n){if(n.length!==1)throw new r(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(Rv(t))}}async function Bv(e,t,n){if(n.length<2)throw new r(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `),a={...Rv(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...j(`Clipboard updated`)}}async function Vv(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:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>zv(n,e,r)}}let o=await R({command:`clipboard`,device:t,use:Ue,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>Bv(s,e,r)}}async function Hv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),l=t.flags??{},u=J(an.clipboard,s,l);if(u)return u;let d=t.positionals??[],f=Lv(d);if(!f)return c(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let p=await Y({session:s,flags:l}),m=await Vv({device:p,action:f,positionals:d,inspectFacts:a,bindDevice:o});if(!m.ok)return m.response;let h=await m.execute(ti(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,h),{ok:!0,data:{platform:x(p),...h}}}function Uv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Wv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Gv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Kv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),qn({type:`command`,status:`progress`,message:qv(t)})}function qv(e){return[ca(e),...sa(e)].join(`
3
3
  `)}async function Jv(e,t){let{device:n,targetApp:r,session:i,listInstalledApps:a}=t;if(r)try{let t=a?Yv(r,await a(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${x(n)}.`,evidence:{requested:r,platform:x(n)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:r,resolved:t,sessionApp:i?.appBundleId}})}catch(t){let r=l(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${r.message}`,hint:r.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${x(n)} --all`,evidence:{code:r.code,message:r.message}})}}function Yv(e,t){let n=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===n||e.name.toLowerCase()===n);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n));if(a.length===1)return a[0];throw a.length>1?new r(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new r(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Xv(e,t,n){let r=Qv(t,n);try{let t=await ey(r),n=$v(t.devices,r);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:iy(n,r,t.failures),hint:n.length===0?sy(t.failures):void 0,command:n.length===0?fy(r):void 0,evidence:py(n,t.failures)}),n.length>0&&ty(e,t.failures),{devices:n,platform:r.platform,target:r.target}}catch(t){let n=l(t);return $(e,{id:`device`,status:`fail`,summary:n.message,hint:n.hint,command:`agent-device devices`,evidence:{code:n.code,details:n.details}}),{devices:[],platform:r.platform,target:r.target}}}function Zv(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:x(e),id:e.id,name:e.name}))}})}function Qv(e,t){let n=e.flags??{};return zi({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 $v(e,t){return e.filter(e=>C(e,t,{includeExplicitSelectors:!0}))}async function ey(e){if(e.platform)return{devices:await Fi(e),failures:[]};let t=[],n=[];for(let r of gn)try{t.push(...await Fi({...e,platform:r}))}catch(e){n.push(ry(r,e))}return{devices:t,failures:n}}function ty(e,t){for(let n of t)$(e,ny(n))}function ny(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${uy(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${uy(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function ry(e,t){let n=l(t);return{platform:e,message:n.message,hint:n.hint,code:n.code}}function iy(e,t,n){if(e.length===0)return n.length>0?`No ${ay(t)} devices found; ${oy(n)}.`:`No ${ay(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${ay(t)} ${dy(e.length,`device`)} available; ${r} booted`,a=cy(e,t);return a?`${i} (${a}).`:`${i}.`}function ay(e){let t=e.platform?uy(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function oy(e){return e.slice(0,2).map(e=>`${uy(e.platform)} inventory failed: ${e.message}`).join(`; `)}function sy(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function cy(e,t){if(t.platform||t.target)return;let n=hn(e),r=ly();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 ly(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function uy(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 dy(e,t){return e===1?t:`${t}s`}function fy(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function py(e,t){let n=new Map;for(let t of e){let e=x(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 my=1500;async function hy(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await gy(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?_y(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function gy(e,t,n){try{return await(n.resolveProcessInfo??vy)(e,t)}catch{return}}function _y(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 vy(e,t){if(!yy(e))return;let n=await by(t);if(n!==void 0)return{pid:n,cwd:await xy(n)}}function yy(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function by(e){let t=await Sn(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:my});if(t.exitCode===0)return t.stdout.split(`
4
4
  `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function xy(e){let t=await Sn(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:my});if(t.exitCode===0)return t.stdout.split(`