agent-device 0.19.2 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -70
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.apk +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.apk.sha256 +1 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.manifest.json +10 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.apk.sha256 +1 -0
- package/{android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.2.manifest.json → android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.manifest.json} +6 -6
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +2 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +5 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -10
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +154 -185
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +113 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +82 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +275 -113
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +2 -2
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +150 -104
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +56 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +73 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +44 -14
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +2 -2
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +2 -106
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +126 -11
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +51 -8
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +24 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +1 -1
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +43 -35
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +14 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +3 -0
- package/dist/src/android-adb.d.ts +1 -1
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-method-overlays.js +1 -0
- package/dist/src/android-input-ownership.js +1 -6
- package/dist/src/android-system-chrome.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/app-lifecycle.js +5 -5
- package/dist/src/app-log-request-scope.js +1 -0
- package/dist/src/app-resolution.js +1 -0
- package/dist/src/apple-multitouch-support.js +1 -0
- package/dist/src/apps.js +5 -5
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/boot-diagnostics.js +2 -0
- package/dist/src/cli-config.js +1 -0
- package/dist/src/cli-help.js +64 -30
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +15 -11
- package/dist/src/command-schema.js +3 -3
- package/dist/src/config.js +1 -0
- package/dist/src/context.js +1 -0
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -0
- package/dist/src/debug-symbols.js +1 -1
- package/dist/src/device-input-state.js +1 -1
- package/dist/src/devices2.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/helper.js +1 -1
- package/dist/src/index.d.ts +412 -289
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +4 -3
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-artifact.js +1 -0
- package/dist/src/install-source.d.ts +5 -1
- package/dist/src/install-source.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction.d.ts +230 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +43 -17
- package/dist/src/internal/png-worker.d.ts +22 -0
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/launch-console.js +1 -0
- package/dist/src/lease-context.js +1 -0
- package/dist/src/lease.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/logcat.js +5 -0
- package/dist/src/metro.d.ts +2 -2
- package/dist/src/notifications.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/process-lock.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/register-builtins.js +1 -0
- package/dist/src/registry.js +24 -24
- package/dist/src/reporting.js +8 -7
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +2 -0
- package/dist/src/runner-lease.js +1 -0
- package/dist/src/runner-sequence.js +1 -1
- package/dist/src/runtime-transport.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +1 -0
- package/dist/src/sdk-android-adb.d.ts +119 -33
- package/dist/src/sdk-android-adb.js +4 -4
- package/dist/src/sdk-app-inventory.js +1 -1
- package/dist/src/sdk-batch-runner.d.ts +2 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +105 -98
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -0
- package/dist/src/sdk-finders.d.ts +3 -3
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.d.ts +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.d.ts +9 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selector-vocabulary.js +1 -0
- package/dist/src/selectors.d.ts +12 -3
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/session-target-evidence.js +1 -0
- package/dist/src/session.js +8 -10
- package/dist/src/setting-state.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-diagnostics.js +5 -2
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -2
- package/dist/src/tool-provider.js +2 -2
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tv-remote.js +13 -12
- package/dist/src/url.js +1 -1
- package/dist/src/web.js +1 -1
- package/package.json +33 -20
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.2.apk +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.2.apk.sha256 +0 -1
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.2.manifest.json +0 -10
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.2.apk +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.2.apk.sha256 +0 -1
- package/dist/src/apple-runner-options.js +0 -1
- package/dist/src/cli-output.js +0 -1
- package/dist/src/client.js +0 -3
- package/dist/src/handler-utils.js +0 -1
- package/dist/src/output-path.js +0 -1
- package/dist/src/points.js +0 -4
- package/dist/src/provider.js +0 -1
- package/dist/src/providers.js +0 -1
- package/dist/src/record-trace-recording.js +0 -23
- package/dist/src/recording-provider.js +0 -1
- package/dist/src/selectors2.js +0 -1
- package/dist/src/simctl.js +0 -1
- package/dist/src/snapshot-helper.js +0 -5
- package/dist/src/ttl-memo.js +0 -1
- package/dist/src/xml.js +0 -2
- /package/{macos-helper → apple/macos-helper}/Package.swift +0 -0
- /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +0 -0
- /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +0 -0
- /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/main.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
- /package/{src/platforms/linux → linux}/atspi-dump.py +0 -0
package/dist/src/session.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{B as e,F as t,I as n,S as r,b as i,f as a,h as o,m as s,p as c,t as l,v as u,y as d}from"./sdk-contracts.js";import{C as f,N as p,c as m,j as h,p as g,v as _}from"./sdk-android-adb.js";import{C as v,T as y,_ as b,w as x}from"./sdk-batch.js";import{$t as S,Bt as C,Gt as ee,Ht as te,It as ne,Jn as re,Jt as ie,Kt as ae,Qn as w,Rn as oe,Rt as se,Tn as ce,Ut as le,Yt as ue,Zn as de,an as fe,ct as pe,dt as me,f as he,ht as ge,in as _e,q as ve,qt as ye,ut as be,wn as xe,zn as Se}from"./tv-remote.js";import{i as Ce,r as we}from"./output-path.js";import{a as Te,n as Ee,t as De}from"./snapshot-diagnostics.js";import{n as Oe}from"./version.js";import{t as T}from"./timeouts.js";import{N as ke,d as Ae,g as je,h as Me,i as Ne,l as Pe,t as Fe}from"./sdk-selectors.js";import{n as Ie,t as Le}from"./sdk-batch-runner.js";import{t as Re}from"./project-runtime.js";import{n as ze,t as Be}from"./runtime-transport.js";import{i as Ve}from"./sdk-finders.js";import{a as He,s as Ue,t as We}from"./selectors2.js";import{n as Ge}from"./sdk-app-inventory.js";import{f as Ke,h as qe}from"./runtime.js";import{f as Je,p as Ye,s as Xe}from"./app-lifecycle.js";import{D as Ze,O as Qe,S as $e,b as et,k as tt,p as nt,v as rt,x as it}from"./android-input-ownership.js";import{d as at,s as ot}from"./providers.js";import{C as st,S as ct,b as lt,c as ut,g as dt,h as ft,m as E,n as pt,o as mt,p as ht,r as gt,s as _t,t as vt,u as yt,v as bt,w as xt,x as St,y as Ct}from"./runner-client.js";import{o as wt}from"./tool-provider.js";import{r as Tt}from"./helper.js";import{n as Et}from"./simctl.js";import{n as Dt,s as Ot}from"./agent-browser-tool.js";import{$t as D,A as kt,B as At,C as jt,Cn as Mt,D as Nt,E as Pt,F as Ft,Gt as O,I as It,Kt as Lt,L as Rt,M as zt,Mt as Bt,N as Vt,Nt as Ht,O as Ut,P as Wt,R as Gt,S as Kt,Sn as qt,St as k,T as Jt,Tn as Yt,Wt as Xt,Xt as Zt,Zt as Qt,_ as $t,_n as en,_t as tn,a as nn,an as rn,at as an,b as on,bn as sn,c as cn,cn as ln,ct as un,d as dn,dn as fn,dt as pn,f as mn,fn as hn,g as gn,gn as _n,gt as vn,h as yn,hn as bn,ht as xn,i as Sn,in as Cn,it as wn,j as Tn,k as En,l as Dn,ln as On,lt as kn,m as An,mn as jn,mt as Mn,n as Nn,nn as Pn,nt as Fn,o as In,on as Ln,ot as Rn,p as zn,pn as Bn,pt as Vn,r as Hn,rn as Un,rt as Wn,s as Gn,sn as Kn,st as qn,tn as A,u as Jn,un as Yn,ut as Xn,v as Zn,vn as Qn,vt as $n,w as er,wn as tr,x as nr,xn as j,y as rr,z as ir,zt as M}from"./internal/daemon.js";import{C as ar,D as or,E as sr,S as cr,T as lr,a as N,b as ur,c as dr,d as fr,f as pr,g as mr,h as P,i as F,l as hr,m as gr,n as _r,o as I,p as L,r as vr,s as R,u as yr,v as br,w as xr,x as Sr,y as Cr}from"./points.js";import{n as wr}from"./provider.js";import{a as z,i as Tr,n as Er,r as Dr,t as Or}from"./apple-runner-options.js";import{t as kr}from"./handler-utils.js";import{l as Ar}from"./apps.js";import{a as jr,n as Mr}from"./simulator.js";import{t as Nr}from"./record-trace-recording.js";import B from"node:fs";import V from"node:path";import{access as Pr}from"node:fs/promises";import{setTimeout as Fr}from"node:timers/promises";import Ir from"node:vm";function Lr(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Rr(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Lr(n)}}function zr(e){let t=Rr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:sn(n,e.meta?.tenantId)},cleanup:()=>{Qn(n)}}}function Br(e){return e===`ios`||e===`android`?e:void 0}function Vr(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,ttlMs:r}}async function Hr(e){let n=Br(e.flags?.platform);if(e.session){if(n&&e.session.device.platform!==n)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${e.session.device.platform}`);return await z(e.session.device),e.session.device}if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);let r=await On(e.flags??{});return await z(r),r}async function Ur(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await dn({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function Wr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Gr(e){let{session:t,sessionStore:n,req:r,data:i}=e;kr(n,t,r,`install_source`,i,{positionals:[]})}async function Kr(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r);try{let e=zr(n),t=Vr(n),o=await Hr({session:a,flags:n.flags}),s=A(`install`,o,{message:`install_from_source is not supported on this device`});if(s)return s;let l=lt(n.meta?.requestId);if(c(o)){let{prepareIosInstallArtifact:s}=await import(`./apps.js`).then(e=>e.a),c=await s(e.source,{signal:l});return await qr({prepared:c,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Jr(o,c,e)})}let{prepareAndroidInstallArtifact:u}=await import(`./android-input-ownership.js`).then(e=>e.l),d=await u(e.source,{signal:l});return await qr({prepared:d,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Yr(o,d,e)})}catch(t){return{ok:!1,error:e(t)}}}async function qr(e){let t;try{t=await Ur(e);let n=await e.buildResult(t),r=ce(n,ei(n));return Gr({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await Dn(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function Jr(e,t,n){let r=await bn(e,t.installablePath,{appIdentifierHint:t.bundleId});if(!r){let{installIosInstallablePath:n}=await import(`./apps.js`).then(e=>e.t);await n(e,t.installablePath)}return Xr(t,r,n)}async function Yr(e,t,n){let r=await bn(e,t.installablePath,{packageNameHint:t.packageName}),i=await $r(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...Wr(n),packageName:i,...Qr(r?.appName??o),launchTarget:r?.launchTarget??i}}function Xr(e,t,n){let r=Zr(e,t),i=t?.appName??e.appName;return{...Wr(n),bundleId:r,...Qr(i),launchTarget:t?.launchTarget??r}}function Zr(e,n){let r=n?.bundleId??e.bundleId;if(r)return r;throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`)}function Qr(e){return e?{appName:e}:{}}async function $r(e,n,r){let i=r?.packageName??r?.launchTarget;if(i)return i;let{installAndroidInstallablePathAndResolvePackageName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=await a(e,n.installablePath,n.packageName);if(!o)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return o}function ei(e){return`Installed: ${fe(e)}`}async function ti(n){let{req:r}=n;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Dn(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(t){return{ok:!1,error:e(t)}}}function H(e){return c(e)&&e.kind===`simulator`}function ni(e){return e.platform===`android`&&e.kind===`emulator`}function U(e,t,n){return t||Qt(n)?null:D(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function ri(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function ii(e,t){!H(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function W(e){let t=Qt(e.flags)||!e.session?await On(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await ai(e.session.device);return e.ensureReady!==!1&&await z(t),t}async function ai(e){if(!c(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(mt(e.id)?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await On(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await On({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function oi(e){let t=e.flags?.device?.trim();if(t)return t;if(e.resolvedDevice?.platform===`android`&&e.resolvedDevice.kind===`emulator`)return e.resolvedDevice.name;if(e.sessionDevice?.platform===`android`&&e.sessionDevice.kind===`emulator`)return e.sessionDevice.name}function si(e,t){return t?tn(t,e).length===0:!1}const ci=`shared_prefs/ReactNativeDevPrefs.xml`,li=`debug_http_host`,ui=`dev_server_https`,di=`RCT_jsLocation`,fi=`RCT_packager_scheme`,pi=`React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.`,mi=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
|
|
2
|
-
`);function hi(e){return Be(e)!==void 0}async function gi(e){let{device:t,appId:n,runtime:r}=e;if(_n(t)||!n)return;let i=Be(r);if(i){if(t.platform===`android`){await vi(t,n,i);return}c(t)&&t.kind===`simulator`&&await Si(t,n,i)}}async function _i(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await yi(t,n);return}c(t)&&t.kind===`simulator`&&await Ci(t,n)}}async function vi(e,t,n){ki(t);let r=Ti(await bi(e,t),li,`${n.host}:${n.port}`);r=Ei(r,ui,n.scheme===`https`),await xi(e,t,r)}async function yi(e,t){ki(t);let n=await bi(e,t),r=Oi(Oi(n,li),ui);r!==n&&await xi(e,t,r)}async function bi(e,t){let n=await nt(e,[`shell`,`run-as`,t,`cat`,ci],{allowFailure:!0});return n.exitCode===0?wi(n.stdout):mi}async function xi(e,r,i){let a=[`shell`,`run-as`,r,`id`],o=await nt(e,a,{allowFailure:!0});if(o.exitCode!==0){let e=Mi(o.stdout,o.stderr);throw new t(`COMMAND_FAILED`,e?`Failed to access Android app sandbox for ${r}`:`Failed to probe Android app sandbox for ${r}`,g(o,{package:r,cmd:`adb`,args:a,hint:e?pi:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}try{await nt(e,[`shell`,`run-as`,r,`mkdir`,`-p`,`shared_prefs`]),await nt(e,[`shell`,`run-as`,r,`tee`,ci],{stdin:i.trimEnd()})}catch(e){let i=n(e);if(i.code===`TOOL_MISSING`)throw i;let a=Mi(typeof i.details?.stdout==`string`?i.details.stdout:``,typeof i.details?.stderr==`string`?i.details.stderr:``);throw new t(`COMMAND_FAILED`,a?`Failed to access Android app sandbox for ${r}`:`Failed to write Android runtime hints for ${r}`,{...i.details??{},package:r,cmd:`adb`,phase:`write-runtime-hints`,hint:a?pi:`adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command.`},i)}}async function Si(e,t,n){await wt(Et(e,[`spawn`,e.id,`defaults`,`write`,t,di,`-string`,`${n.host}:${n.port}`])),await wt(Et(e,[`spawn`,e.id,`defaults`,`write`,t,fi,`-string`,n.scheme]))}async function Ci(e,t){await wt(Et(e,[`spawn`,e.id,`defaults`,`delete`,t,di]),{allowFailure:!0}),await wt(Et(e,[`spawn`,e.id,`defaults`,`delete`,t,fi]),{allowFailure:!0})}function wi(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?mi:`${t}\n`}function Ti(e,t,n){let r=` <string name="${ji(t)}">${ji(n)}</string>`;return Di(Oi(e,t),r)}function Ei(e,t,n){let r=` <boolean name="${ji(t)}" value="${n?`true`:`false`}" />`;return Di(Oi(e,t),r)}function Di(e,t){return wi(e).replace(`</map>`,`${t}\n</map>`)}function Oi(e,t){let n=Ai(t);return wi(e).replace(RegExp(`^\\s*<string name="${n}">[\\s\\S]*?<\\/string>\\n?`,`m`),``).replace(RegExp(`^\\s*<boolean name="${n}" value="(?:true|false)"\\s*\\/?>\\n?`,`m`),``)}function ki(e){if(Je(e)!==`binary`)return;let n=Ye(e);throw new t(`INVALID_ARGS`,n,{package:e,hint:n})}function Ai(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ji(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function Mi(e,t){let n=`${e}\n${t}`.toLowerCase();return[`run-as: package not debuggable`,`run-as: permission denied`,`run-as: package is unknown`,`run-as: unknown package`,`is unknown`,`is not an application`,`could not set capabilities`].some(e=>n.includes(e))}const Ni=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Pi(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Fi(e,n){if(e!==void 0){if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`Invalid open runtime ${n}: expected string.`);return ze(e)}}function Ii(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Li(e){if(e!==void 0){if(typeof e!=`number`)throw new t(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Ii(e)}}function Ri(e,n,r){if(e===void 0)return r;if(e!==`ios`&&e!==`android`)throw new t(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios" or "android".`);if(r&&e!==r)throw new t(`INVALID_ARGS`,`open runtime targets ${e}, but session "${n}" is bound to ${r}.`);return e}function zi(e){if(e===`ios`||e===`android`)return e}function Bi(e,t){return{platform:t,metroHost:ze(e?.metroHost),metroPort:Ii(e?.metroPort),bundleUrl:ze(e?.bundleUrl),launchUrl:ze(e?.launchUrl)}}function Vi(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Hi(e){let{runtime:n,sessionName:r,platform:i}=e;if(n===void 0)return;if(!n||typeof n!=`object`||Array.isArray(n))throw new t(`INVALID_ARGS`,`open runtime must be an object.`);let a=n,o=Object.keys(a).find(e=>!Ni.includes(e));if(o)throw new t(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Ni.join(`, `)}.`);return{platform:Ri(a.platform,r,i),metroHost:Fi(a.metroHost,`metroHost`),metroPort:Li(a.metroPort),bundleUrl:Fi(a.bundleUrl,`bundleUrl`),launchUrl:Fi(a.launchUrl,`launchUrl`)}}function Ui(e,t,n){if(n){if(Pi(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function Wi(e,n,r){let a=e.getRuntimeHints(n);if(!a)return;let o=r?i(r):void 0,s=zi(o);if(a.platform&&r&&!s)throw new t(`INVALID_ARGS`,`Session runtime hints are only supported on iOS and Android sessions, but session "${n}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new t(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${n}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Gi(e){let{req:t,sessionStore:n,sessionName:r,device:a}=e,o=n.getRuntimeHints(r),s=Hi({runtime:t.runtime,sessionName:r,platform:zi(i(a))});return t.runtime===void 0?{runtime:Wi(n,r,a),previousRuntime:o,replacedStoredRuntime:!1}:{runtime:s&&Pi(s)>0?s:void 0,previousRuntime:o,replacedStoredRuntime:!0}}function Ki(e){try{return{ok:!0,data:Gi(e)}}catch(e){let t=n(e);return D(t.code,t.message,t.details)}}async function qi(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!hi(n)||hi(r)||await _i({device:i.device,appId:i.appBundleId})}async function Ji(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(Xi(i))return await ta(t,i);if(!Yi(i))return D(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or port-reverse-remove`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Zi(n,r,a,o):i===`show`?Qi(n,o):ea({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function Yi(e){return e===`set`||e===`show`||e===`clear`}function Xi(e){return e===`port-reverse`||e===`port-reverse-remove`}async function Zi(e,t,n,r){return hi(r)&&n?.appBundleId&&await _i({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function Qi(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function $i(e){return e?i(e.device):void 0}function ea(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=$i(i),s=zi(t.flags?.platform??a?.platform??o);if(!s)return D(`INVALID_ARGS`,`runtime set only supports iOS and Android sessions. Pass --platform ios|android or open an iOS/Android session first.`);if(o!==void 0&&o!==s)return D(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Vi(a,Bi(t.flags,s));return Pi(c)===0?D(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}async function ta(e,t){let n=na(e);if(!n.ok)return n.response;let r=await aa(t,n.options);return r?{ok:!0,data:{action:t,...r}}:D(`UNSUPPORTED_OPERATION`,`No active provider device runtime supports port reverse for this lease.`)}function na(e){let t=ra(e);if(!t.ok)return t;let n=ia(e);if(!n.ok)return n;let r=e.flags?.portReverseName?.trim()||`runtime`;return{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:r}}}function ra(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:D(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:D(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function ia(e){let t=oa(e.flags?.devicePort),n=oa(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:D(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}async function aa(e,t){return e===`port-reverse`?await Bn(t):await en(t)}function oa(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const sa=`open-command-roundtrip`,ca=`Not implemented for this platform in this release.`;function la(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:a,eventLogPath:o,appName:s,appBundleId:l,surface:u,startup:d,timing:f,device:p,runtime:m,runtimeHintCount:h}=e,g={session:t,surface:u,sessionStateDir:n,runnerLogPath:r,requestLogPath:a,eventLogPath:o};return s&&(g.appName=s),l&&(g.appBundleId=l),d&&(g.startup=d),f&&(g.timing=f),m&&h(m)>0&&(g.runtime=m),p&&(g.platform=i(p),g.target=p.target??`mobile`,g.device=p.name,g.id=p.id,g.kind=p.kind,p.platform===`android`&&(g.serial=p.id)),p&&c(p)&&(g.device_udid=p.id,g.ios_simulator_device_set=p.simulatorSetPath??null),{...g,...xe(`Opened: ${s??l??t}`)}}function ua(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s,saveScript:c}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,recordSession:t.recordSession||c,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,recordSession:c,actions:[]}}const da=new Set([`app`,`desktop`,`frontmost-app`]);function fa(e,n,r){if(e.platform===`linux`){if(!n)return`app`;let e=S(n);if(!da.has(e))throw new t(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${n}")`);if(e!==`app`&&r)throw new t(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`);return e}if(!s(e)){if(n)throw new t(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}let i=n?S(n):`app`;if(i!==`app`&&i!==`menubar`&&r)throw new t(`INVALID_ARGS`,`open --surface ${i} does not accept an app target`);return i}function pa(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(s(t)||t.platform===`linux`)&&!n?i??`app`:fa(t,n,r)}async function ma(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Tt();return{appBundleId:t.bundleId,appName:t.appName}}async function ha(e,t,n){if(!(!a(e.platform)||!t))return Ze(t)?s(e)?void 0:e.kind===`device`?tt(n,t):Qe(t)?void 0:n??await ga(e,t):await _a(e,t)}async function ga(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function _a(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function va(e,t){if(!(e.platform!==`android`||!t||Ze(t)))try{let{resolveAndroidApp:n}=await import(`./app-lifecycle.js`).then(e=>e.t),r=await n(e,t);return r.type===`package`?r.value:void 0}catch{return}}async function ya(e,t,n){if(n||e.platform!==`android`||!t||!Ze(t))return n;try{let{getAndroidAppState:t}=await import(`./app-lifecycle.js`).then(e=>e.t);return(await t(e)).package?.trim()||n}catch{return n}}function ba(e,t){return e.platform===`android`&&!!(t&&Ze(t))}async function xa(e,t,n,r){return await ha(e,t,n)??await r(e,t)??(ba(e,t)?n:void 0)}function Sa(e){return D(`INVALID_ARGS`,e)}function Ca(e,n,r,i){try{return pa({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return D(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}function wa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&Ze(n)?Sa(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&Je(n)===`binary`?Sa(Ye(n)):null:Sa(`open --relaunch is supported only for app surfaces.`):null}function Ta(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&Ze(n)?Sa(`open --relaunch does not support URL targets.`):r===`android`&&n&&Je(n)===`binary`?Sa(Ye(n)):null:null}async function Ea(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await z(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await Da({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=Ki({req:t,sessionStore:r,sessionName:n,device:i});if(!d.ok)return{type:`response`,response:d};if(s){let{runtime:e,previousRuntime:t,replacedStoredRuntime:n}=d.data;await qi({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function Da(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await ma(n);return{appBundleId:a.appBundleId??await xa(t,r,i,va),appName:a.appName??r}}const Oa=new Map;async function ka(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;a(t.platform)&&!H(t)&&await ut(t.id),await O(t,`close`,[n],r,i),await ii(t,300)}async function Aa(e){let{runtime:t,device:n,req:r,logPath:i,appBundleId:a,traceLogPath:o,openPositionals:s}=e,c=t?.launchUrl;if(!c||s.length===0||s.length>1)return;let l=s[0]?.trim();!l||Ze(l)||await O(n,`open`,[c],r.flags?.out,{...ja(i,r.flags,a,o)})}function ja(e,t,n,r){let i=M(e,t,n,r);return delete i.launchConsole,delete i.launchArgs,i}function Ma(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:sa,appTarget:t,appBundleId:n}}async function Na(e){let{req:t,sessionName:n,sessionStore:r,logPath:i,device:a,openTarget:o,openPositionals:s,appName:l,surface:u,appBundleId:d,runtime:f,existingSession:m}=e,g=t.flags?.relaunch===!0,_=m?.trace?.outPath,v=d,y=Date.now(),b={},x=c(a)&&u===`app`&&s.length>0&&!!v,S=Er({req:t,logPath:i,appBundleId:v,traceLogPath:_}),C=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,ee,te=!1,ne=!1,re=(e=S)=>{te=!0,b.runnerPrewarmKind=`session`,b.runnerPrewarmScheduled=!0,ee=gt(a,e)},ie=async()=>{if(!ee||ne)return;ne=!0;let e=Date.now();await ee,b.runnerPrewarmWaited=!0,b.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};x&&H(a)&&!C&&re();let ae=g&&!!o&&s.length===1&&H(a)&&t.flags?.clearAppState!==!0;if(g&&o&&!ae){let e=v??o,n=Date.now();await ka({device:a,closeTarget:e,outFlag:t.flags?.out,context:{...M(i,t.flags,v??m?.appBundleId,_)}}),b.relaunchCloseDurationMs=Math.max(0,Date.now()-n)}let w=Date.now();await gi({device:a,appId:v,runtime:f}),b.runtimeHintsDurationMs=Math.max(0,Date.now()-w),x&&C&&(re({...S,propagateError:!0}),await ie());let oe=Date.now(),se=await Pa({req:t,sessionName:n,sessionStore:r,device:a,surface:u,sessionAppBundleId:v,appName:l,existingSession:m});if(se.type===`response`)return se.response;let ce=se.session??m;await O(a,`open`,s,t.flags?.out,{...M(i,t.flags,v),...ae?{terminateRunningApp:!0}:{}}),b.openDispatchDurationMs=Math.max(0,Date.now()-oe);let le=Date.now();await Aa({runtime:f,device:a,req:t,logPath:i,appBundleId:v,traceLogPath:_,openPositionals:s}),b.launchUrlDurationMs=Math.max(0,Date.now()-le),x&&!te&&re(),g?await ie():ee&&!ne&&(b.runnerPrewarmWaited=!1),v=await ya(a,o,v),a.platform===`android`&&v&&await Pt(a,v);let ue=o?Ma(oe,o,v):void 0,de=Date.now();if(await ii(a,300),b.postOpenSettleDurationMs=Math.max(0,Date.now()-de),St(t.meta?.requestId)){let e=Ct();return D(e.code,e.message,e.details)}m&&Xt(m,`open`,m.snapshot);let fe=ua({existingSession:ce,sessionName:m?.name??xn(t),sessionScope:m?.sessionScope??Mn(t),device:a,surface:u,appBundleId:v,appName:l,saveScript:!!t.flags?.saveScript});fe.lease=pn({req:t,existingLease:m?.lease}),t.runtime!==void 0&&Ui(r,n,f);let pe=r.ensureSessionDir(n),me=qt(pe,t.meta?.requestId??p().requestId);b.totalDurationMs=Math.max(0,Date.now()-y),h({level:`info`,phase:`open_timing`,durationMs:b.totalDurationMs,data:b});let he=la({sessionName:fe.name,sessionStateDir:pe,runnerLogPath:Mt(pe),requestLogPath:me,eventLogPath:r.resolveEventLogPath(n),appName:l,appBundleId:v,surface:u,startup:ue,timing:b,device:a,runtime:f,runtimeHintCount:Pi});return r.set(n,fe),r.recordAction(fe,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:he}),{ok:!0,data:he}}async function Pa(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,sessionAppBundleId:o,appName:s,existingSession:c}=e,l=t.internal?.openLifecycle?.beforeDispatch;if(!l)return{type:`session`,session:c};let u=ua({existingSession:c,sessionName:c?.name??xn(t),sessionScope:c?.sessionScope??Mn(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=pn({req:t,existingLease:c?.lease}),r.set(n,u);let d=await l(u);return d&&!d.ok?{type:`response`,response:d}:{type:`session`,session:r.get(n)??u}}async function Fa(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n);if(a){let e=t.flags?.relaunch===!0,o=t.positionals?.[0],s=o??(e?a.appName:void 0),c=Ca(a.device,t.flags?.surface,s,a.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return Sa(e?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let l=wa({shouldRelaunch:e,openTarget:s,surface:c,device:a.device});if(l)return l;let u=await ai(a.device),d=await Ea({req:t,sessionName:n,sessionStore:i,device:u,surface:c,openTarget:s,existingSession:a,onIosSimulatorColdBootStart:Dr({req:t,logPath:r,device:u,surface:c,openTarget:s,traceLogPath:a.trace?.outPath})});return d.type===`response`?d.response:await Na({req:t,sessionName:n,sessionStore:i,logPath:r,device:u,openTarget:s,openPositionals:o?t.positionals??[]:s?[s]:[],appBundleId:d.details.appBundleId,appName:d.details.appName,runtime:d.details.runtime,surface:c,existingSession:a})}let o=t.flags?.relaunch===!0,s=t.positionals?.[0];if(o&&!s)return Sa(`open --relaunch requires an app argument.`);let c=Ta({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform===`android`?`android`:void 0});if(c)return c;let l=await On(t.flags??{}),u=Ca(l,t.flags?.surface,s);return typeof u==`string`?wa({shouldRelaunch:o,openTarget:s,surface:u,device:l})||await ht(Oa,l.id,async()=>{let e=i.toArray().find(e=>e.device.id===l.id);if(e)return Vn(t,e)?D(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:l.id,deviceName:l.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):D(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:l.id,deviceName:l.name,hint:$n(e,`device-in-use`)});let a=await Ea({req:t,sessionName:n,sessionStore:i,device:l,surface:u,openTarget:s,onIosSimulatorColdBootStart:Dr({req:t,logPath:r,device:l,surface:u,openTarget:s})});return a.type===`response`?a.response:await Na({req:t,sessionName:n,sessionStore:i,logPath:r,device:l,openTarget:s,openPositionals:t.positionals??[],appBundleId:a.details.appBundleId,appName:a.details.appName,runtime:a.details.runtime,surface:u})}):u}function Ia(e){return H(e)||ni(e)}async function La(t){if(t.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return H(t)?await Ra(t):await Ba(t)}catch(t){let n=e(t);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function Ra(e){let t=await jr(e);return t.success?t:await za(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function za(e){try{return await Mr(e)}catch{return null}}async function Ba(e){let t=await nt(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}async function Va(e){let{device:t,shutdownRequested:n}=e;if(n&&Ia(t))return await La(t)}function Ha(e,t){return H(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function Ua(e){return a(e.device.platform)&&!H(e.device)}async function Wa(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=i.get(n);if(!c)return await qa(t,r);let l;try{await nn(c),await cn(c,`session-close`),await In(c),await Hn(c),await Sn(c),Ga(t,c)&&(Ua(c)&&await Nn(c),await O(c.device,`close`,t.positionals??[],t.flags?.out,{...M(r,t.flags,c.appBundleId,c.trace?.outPath)}),await ii(c.device,300)),a(c.device.platform)&&!Ha(t,c)?await Nn(c):a(c.device.platform)&&(h({level:`debug`,phase:`ios_runner_retained_after_close`,data:{session:c.name,deviceId:c.device.id}}),_t(c.device.id)),hi(i.getRuntimeHints(n))&&c.appBundleId&&await _i({device:c.device,appId:c.appBundleId}).catch(()=>{}),kr(i,c,t,`close`,{session:c.name,...xe(`Closed: ${c.name}`)}),t.flags?.saveScript&&(c.recordSession=!0),i.writeSessionLog(c),await Jn(n).catch(()=>{})}finally{try{l=await Xn({session:c,leaseRegistry:o,leaseLifecycleProvider:s})}finally{i.delete(n)}}let u=await Va({device:c.device,shutdownRequested:t.flags?.shutdown});return u?{ok:!0,data:ce({session:c.name,shutdown:u,...l?{provider:l}:{}},`Closed: ${c.name}`)}:{ok:!0,data:{session:c.name,...xe(`Closed: ${c.name}`),...l?{provider:l}:{}}}}function Ga(e,t){return Ka(e)||t.device.platform===`web`}function Ka(e){return(e.positionals?.length??0)>0}async function qa(e,t){if(!e.positionals||e.positionals.length===0)return D(`SESSION_NOT_FOUND`,`No active session`);let n=await W({session:void 0,flags:e.flags,ensureReady:!0});return await O(n,`close`,e.positionals,e.flags?.out,{...M(t,e.flags)}),await ii(n,300),{ok:!0,data:{app:e.positionals[0],...xe(`Closed: ${e.positionals[0]}`)}}}const Ja={ios:async(e,t,n)=>{let r=await jn(e,t,n,{relaunch:!0,appIdentifierHint:t});if(r)return{bundleId:r.bundleId??r.launchTarget??t};let{reinstallIosApp:i}=await import(`./apps.js`).then(e=>e.t);return await i(e,t,n)},android:async(e,t,n)=>{let r=await jn(e,t,n,{relaunch:!0,packageNameHint:t});if(r)return{package:r.packageName??r.launchTarget??t};let{reinstallAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t);return await i(e,t,n)}},Ya={ios:async(e,t,n)=>{let r=await jn(e,t,n,{appIdentifierHint:t});if(r)return{bundleId:r.bundleId,appName:r.appName,launchTarget:r.launchTarget};let{installIosApp:i}=await import(`./apps.js`).then(e=>e.t),a=await i(e,n,{appIdentifierHint:t});return{bundleId:a.bundleId,appName:a.appName,launchTarget:a.launchTarget}},android:async(e,t,n)=>{let r=await jn(e,t,n,{packageNameHint:t});if(r)return{package:r.packageName,appName:r.appName,launchTarget:r.launchTarget};let{installAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t),a=await i(e,n);return{package:a.packageName,appName:a.appName,launchTarget:a.launchTarget}}};async function Xa(e){let{req:t,command:n,sessionName:r,sessionStore:i,deployOps:a}=e,o=i.get(r),s=t.flags??{},l=U(n,o,s);if(l)return l;let u=eo(n,t.positionals??[]);if(!u.ok)return u.response;let{app:d,appPathInput:f}=u,p=t.meta?.uploadedArtifactId;try{let e=p?sn(p,t.meta?.tenantId):j.expandHome(f);if(!B.existsSync(e))return D(`INVALID_ARGS`,`App binary not found: ${e}`);let r=await W({session:o,flags:s,ensureReady:!1}),l=A(n,r);if(l)return l;let u=c(r)?Qa(d,e,await a.ios(r,d,e)):$a(d,e,await a.android(r,d,e)),m=ce(u,Za(u));return kr(i,o,t,n,m),{ok:!0,data:m}}finally{p&&Qn(p)}}function Za(e){return`Installed: ${e.appName??_e(e)}`}function Qa(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 $a(e,t,n){let r=n.package;return{app:e||r||n.launchTarget||t,appPath:t,platform:`android`,...r?{appId:r,package:r,packageName:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function eo(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:D(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:D(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}async function to(e,t,n){return await Ie(e,t,n)}async function no(e){let{req:t,sessionName:o,sessionStore:c}=e;if(t.command===`session_list`){let e=Mn(t);return{ok:!0,data:{sessions:c.toArray().filter(t=>vn(t,e)).map(e=>{let t=c.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:Mt(t),platform:i(e.device),...a(e.device.platform)&&e.device.appleOs?{appleOs:e.device.appleOs}:{},target:e.device.target??`mobile`,surface:e.surface??`app`,device:e.device.name,id:e.device.id,device_id:e.device.id,createdAt:e.createdAt,...a(e.device.platform)&&!s(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if(t.command===`devices`)try{let e=et(t.flags?.androidDeviceAllowlist),n=t.flags?.platform,i=r({simulatorSetPath:it(t.flags?.iosSimulatorDeviceSet),platform:n,target:t.flags?.target}),a=await ln({platform:n,target:t.flags?.target,deviceName:t.flags?.device,udid:t.flags?.udid,serial:t.flags?.serial,iosSimulatorSetPath:i,androidSerialAllowlist:e?Array.from(e).sort():void 0}),o=n?a.filter(e=>io(e,n)):a;return{ok:!0,data:{devices:(t.flags?.target?o.filter(e=>(e.target??`mobile`)===t.flags?.target):o).map(ro)}}}catch(e){let t=n(e);return D(t.code,t.message,t.details)}if(t.command===`capabilities`){let e=c.get(o),n=t.flags??{},r=U(t.command,e,n);if(r)return r;let i=await W({session:e,flags:n,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0});return{ok:!0,data:{device:ro(i),availableCommands:Un().filter(e=>Pn(e,i))}}}if(t.command===`apps`){let e=c.get(o),n=t.flags??{},r=U(t.command,e,n);if(r)return r;let i=await W({session:e,flags:n,ensureReady:!0}),s=A(`apps`,i);if(s)return s;let l=Ge(t.flags?.appsFilter);return a(i.platform)?{ok:!0,data:{apps:(await Ar(i,l)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await Xe(i,l)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}function ro({simulatorSetPath:e,appleOs:t,...n}){return{...n,platform:i({platform:n.platform,appleOs:t}),...a(n.platform)&&t?{appleOs:t}:{}}}function io(e,t){return d(e,t)}async function ao(e){let{ensureAndroidEmulatorBooted:t}=await import(`./android-input-ownership.js`).then(e=>e.m);return await t(e)}const oo=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,so=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function co(e){let{req:t,sessionName:n,sessionStore:r}=e,o=r.get(n),l=t.flags??{},u=l.platform;if(!o&&ri(l))return D(`SESSION_NOT_FOUND`,u===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`);let d=U(`appstate`,o,l);if(d)return d;let f=a(o?.device.platform)&&si(l,o),p=u===`ios`,m=u===`macos`;if(p&&!f)return D(`SESSION_NOT_FOUND`,oo);if(m&&!f)return D(`SESSION_NOT_FOUND`,so);if(f&&o){let e=o.appName??o.appBundleId;return!o.appName&&!o.appBundleId?s(o.device)&&o.surface&&o.surface!==`app`&&o.surface!==`frontmost-app`?{ok:!0,data:{platform:i(o.device),appName:o.surface,appBundleId:o.appBundleId,source:`session`,surface:o.surface}}:D(`COMMAND_FAILED`,`No foreground app is tracked for this ${s(o.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:i(o.device),appName:e??`unknown`,appBundleId:o.appBundleId,source:`session`,surface:o.surface??`app`,...c(o.device)?{device_udid:o.device.id,ios_simulator_device_set:o.device.simulatorSetPath??null}:{}}}}let h=await W({session:o,flags:l,ensureReady:!0});if(c(h))return D(`SESSION_NOT_FOUND`,oo);if(s(h))return D(`SESSION_NOT_FOUND`,so);if(h.platform===`web`)return D(`UNSUPPORTED_OPERATION`,`appstate is not supported on web.`);let{getAndroidAppState:g}=await import(`./app-lifecycle.js`).then(e=>e.t),_=await g(h);return{ok:!0,data:{platform:`android`,package:_.package,activity:_.activity}}}async function lo(e){let{req:t,sessionName:r,logPath:o,sessionStore:s}=e;if(t.command===`boot`){let e=s.get(r),l=t.flags??{},u=U(t.command,e,l);if(u)return u;let d=(l.platform??e?.device.platform)===`android`,f=l.headless===!0;if(f&&!d)return D(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);let p=oi({flags:l,sessionDevice:e?.device}),m=d&&!!p,h,g=!1;try{h=await W({session:e,flags:l,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(e){let t=n(e);if(d&&f&&!p&&t.code===`DEVICE_NOT_FOUND`)return D(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);if(!m||t.code!==`DEVICE_NOT_FOUND`||!p)throw e;h=await ao({avdName:p,serial:l.serial,headless:f}),g=!0}if(l.target&&(h.target??`mobile`)!==l.target)return D(`DEVICE_NOT_FOUND`,`No ${h.platform} device found matching --target ${l.target}.`);if(d&&f){if(h.platform!==`android`||h.kind!==`emulator`)return D(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);if(!g){let t=oi({flags:l,sessionDevice:e?.device,resolvedDevice:h});if(!t)return D(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);h=await ao({avdName:t,serial:l.serial,headless:!0})}await z(h)}else h.platform===`android`&&h.kind===`emulator`&&h.booted!==!0?(h=await ao({avdName:h.name,serial:l.serial,headless:!1}),await z(h)):(h.platform!==`android`||h.booted!==!0)&&await z(h,{onIosSimulatorColdBootStart:Tr({req:t,logPath:o,device:h,enabled:!0})});return A(`boot`,h)||(c(h)&&h.kind===`simulator`&&pt(h,{}),{ok:!0,data:{platform:i(h),target:h.target??`mobile`,device:h.name,id:h.id,kind:h.kind,booted:!0,...a(h.platform)&&h.appleOs?{appleOs:h.appleOs}:{}}})}if(t.command===`shutdown`){let e=s.get(r),n=t.flags??{},o=U(t.command,e,n);if(o)return o;let c=await W({ensureReady:!1,flags:n,session:e}),l=A(`shutdown`,c,{message:`shutdown is supported only for Apple simulators and Android emulators.`});if(l)return l;if(e&&e.device.platform===c.platform&&e.device.id===c.id)return D(`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 ${r}`,session:r,platform:i(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let u=await La(c);return u.success?{ok:!0,data:{platform:i(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u,...a(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:D(u.error?.code??`COMMAND_FAILED`,uo(u),{platform:i(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u})}return t.command===`appstate`?await co({req:t,sessionName:r,sessionStore:s}):null}function uo(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}Cn();function fo(e){let t=[];for(let n of e){if(n.command!==`open`)continue;let e=n.result?.startup;if(!e||typeof e!=`object`)continue;let r=e;typeof r.durationMs!=`number`||!Number.isFinite(r.durationMs)||typeof r.measuredAt!=`string`||r.measuredAt.trim().length===0||r.method!==`open-command-roundtrip`||t.push({durationMs:Math.max(0,Math.round(r.durationMs)),measuredAt:r.measuredAt,method:sa,appTarget:typeof r.appTarget==`string`&&r.appTarget.length>0?r.appTarget:void 0,appBundleId:typeof r.appBundleId==`string`&&r.appBundleId.length>0?r.appBundleId:void 0})}return t.slice(-20)}async function po(e,t={}){let n=go(e);return Eo(e)?e.appBundleId?e.device.platform===`android`?(await So(n,e,e.appBundleId,t),n):(await Co(n,e,e.appBundleId),n):(xo(n,e),n):n}async function mo(e,t={}){let n=yo(e);return Eo(e)?e.appBundleId?(await To(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:Do(e)},n):n}async function ho(e,t){let n=bo(e);return Eo(e)?t.action===`sample`?(n.metrics={memory:await Po(e,t)},n):(n.artifact=await Io(e,t),n.support=Ho(n.artifact.support)??Vo(e),n):t.action===`snapshot`?(n.artifact=zo(e,Lo(e,t.kind)),n.support=Ho(n.artifact.support)??Vo(e),n):(n.metrics={memory:{available:!1,reason:ca}},n)}function go(e){let t=fo(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:sa,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:sa};return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,..._o()},sampling:{startup:{method:sa,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Oo(e)}}}function _o(){return{fps:vo(),memory:{available:!1,reason:ca},cpu:{available:!1,reason:ca}}}function vo(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function yo(e){return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:vo()},sampling:{fps:jo(e)}}}function bo(e){return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:ko(e),snapshot:Ao(e)}}}function xo(e,t){let n=Do(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}async function So(e,t,n,r){wo(e,t,await Mo(t,n,r))}async function Co(e,t,n){wo(e,t,await No(t,n))}function wo(e,t,n){e.metrics.memory=Wo(n.memory),e.metrics.cpu=Wo(n.cpu),e.metrics.fps=Go(Wo(n.fps),t)}async function To(e,t,n,r){let i=t.device.platform===`android`?await Uo(Nt(t.device,n,{adb:r.androidAdb})):await Uo(ir(t.device,n));e.metrics.fps=Go(Wo(i),t)}function Eo(e){return Ln(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function Do(e){return e.device.platform===`android`?`No Android app package is associated with this session. Run open <app> first.`:`No Apple app bundle ID is associated with this session. Run open <app> first.`}function Oo(e){return e.device.platform===`android`?{memory:{method:$t,description:gn,unit:`kB`},cpu:{method:zn,description:mn,unit:`percent`},fps:{method:En,description:Ut,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:Rt(e.device)}function ko(e){return e.device.platform===`android`?{method:$t,description:gn,unit:`kB`,topConsumerLimit:5}:Rt(e.device).memory}function Ao(e){return e.device.platform===`android`?{method:yn,description:An,defaultKind:`android-hprof`,artifactOnly:!0}:{method:Wt,description:Vt,defaultKind:`memgraph`,artifactOnly:!0}}function jo(e){return e.device.platform===`android`?{method:En,description:Ut,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:Ft(e.device)}async function Mo(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([on(e.device,t,r),rr(e.device,t,r),Nt(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function No(e,t){let n=await Uo(ir(e.device,t)),r=await Uo(At(e.device,t));if(r.status===`fulfilled`){let e=r.value;return{memory:{status:`fulfilled`,value:e.memory},cpu:{status:`fulfilled`,value:e.cpu},fps:n}}return{memory:{status:`rejected`,reason:r.reason},cpu:{status:`rejected`,reason:r.reason},fps:n}}async function Po(e,t){return e.appBundleId?Wo(e.device.platform===`android`?await Uo(on(e.device,e.appBundleId,{adb:t.androidAdb})):await Uo(Fo(e))):{available:!1,reason:Do(e)}}async function Fo(e){if(!e.appBundleId)throw new t(`INVALID_ARGS`,Do(e));return(await At(e.device,e.appBundleId)).memory}async function Io(e,n){if(!e.appBundleId)throw new t(`INVALID_ARGS`,Do(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Lo(e,n.kind),i=Ro(n,r);return e.device.platform===`android`?r===`android-hprof`?await Zn(e.device,e.appBundleId,i,{adb:n.androidAdb}):zo(e,r):r===`memgraph`?await Gt(e.device,e.appBundleId,i):zo(e,r)}function Lo(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Ro(e,t){if(e.out)return j.expandHome(e.out,e.cwd);let n=t===`android-hprof`?`hprof`:t===`memgraph`?`memgraph`:`artifact`,r=new Date().toISOString().replace(/[:.]/g,`-`),i=e.sessionStore.ensureSessionDir(e.sessionName);return V.join(i,`artifacts`,`memory-${t}-${r}.${n}`)}function zo(e,t){let n=Vo(e),r=Bo(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Bo(e,t){return e.device.platform===`android`?{reason:`Android perf memory snapshot supports android-hprof, not ${t}.`,hint:`Use perf memory snapshot --kind android-hprof for Android Java heap artifacts.`}:a(e.device.platform)?{reason:`Apple perf memory snapshot supports memgraph, not ${t}.`,hint:`Use perf memory snapshot --kind memgraph for supported Apple app sessions.`}:{reason:`Memory snapshot artifacts are not supported on ${e.device.platform}.`,hint:`Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS.`}}function Vo(e){return e.device.platform===`android`?{platform:e.device.platform,defaultKind:`android-hprof`,androidHprof:!0,memgraph:!1,heapprofd:!1,heapprofdDecision:`Deferred until Android Perfetto/heapprofd plumbing is available in the perf trace slice.`}:a(e.device.platform)?{...It(e.device),androidHprof:!1,heapprofd:!1,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}:{platform:e.device.platform,defaultKind:`memgraph`,androidHprof:!1,memgraph:!1,heapprofd:!1,reason:`Memory snapshot artifacts are available only on Android, iOS simulator, and macOS.`,hint:`Use perf memory sample where supported, or switch to a platform with memory artifact support.`,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}}function Ho(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Uo(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Wo(t){if(t.status===`fulfilled`)return{available:!0,...t.value};let n=e(t.reason);return{available:!1,reason:n.message,error:n}}function Go(e,t){if(e.available!==!0)return e;let n=Ko(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Ko(e,t){let n=qo(t.windowStartedAt),r=qo(t.windowEndedAt)??qo(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(e=>e.ts>=n&&e.ts<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:Jo(e)})).slice(-12)}function qo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Jo(e){let t=e.result;if(t)for(let e of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}}async function Yo(t){let n=Xo(t.req,t.area);if(!n.ok)return n;let{session:r}=t;if(r.device.platform!==`android`)return D(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return D(`COMMAND_FAILED`,`No Android app package is associated with this session.`,{hint:`Run open <app> first so perf can resolve the package and process identity.`});try{return{ok:!0,data:n.area===`cpu`?await as(t,r,r.appBundleId,n):await os(t,r,r.appBundleId,n)}}catch(t){return{ok:!1,error:e(t)}}}function Xo(e,t){let n=is(e,t);return t===`cpu`?Zo(e,n):Qo(e,n)}function Zo(e,t){let n=$o(e,1),r=$o(e,2),i=$o(e,3);return ue(n)?es(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:D(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):D(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):D(`INVALID_ARGS`,le)}function Qo(e,t){let n=$o(e,1),r=$o(e,2);return ts(n)?ye(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:D(`INVALID_ARGS`,`perf trace requires --kind perfetto`):D(`INVALID_ARGS`,C):D(`INVALID_ARGS`,`perf trace action must be start or stop`)}function $o(e,t){return(e.positionals?.[t]??``).toLowerCase()}function es(e){return e===`start`||e===`stop`||e===`report`}function ts(e){return e===`start`||e===`stop`}function ns(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),ds(t)}function rs(e,t,n){return t?j.expandHome(t,e.req.meta?.cwd):us(e.sessionStore,e.sessionName,n)}function is(e,t){return typeof e.flags?.out==`string`&&e.flags.out.length>0?e.flags.out:(e.positionals??[])[t===`cpu`?5:4]||void 0}async function as(e,t,n,r){if(r.action===`start`){cs(t);let i=rs(e,r.outPath,`cpu.perf.data`);return ns(e,await nr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=fs(t,`cpu-profile`,r.kind);if(r.action===`report`){await ss(i);let n=rs(e,r.outPath,`cpu-report.json`);return await jt(t.device,i,n,{adb:e.androidAdbExecutor})}let a=ls(e,r.outPath,i);return ns(e,await Kt(t.device,i,a,{adb:e.androidAdbExecutor}))}async function os(e,t,n,r){if(r.action===`start`){cs(t);let i=rs(e,r.outPath,`app.perfetto-trace`);return ns(e,await er(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=fs(t,`trace`,r.kind),a=ls(e,r.outPath,i);return ns(e,await Jt(t.device,i,a,{adb:e.androidAdbExecutor}))}function ss(e){if(e.state===`running`)throw new t(`COMMAND_FAILED`,`Stop the Android Simpleperf CPU profile before generating a report.`,{hint:`Run perf cpu profile stop --kind simpleperf, then retry perf cpu profile report --kind simpleperf.`})}function cs(e){let n=e.nativePerf?.android;if(n?.state===`running`)throw new t(`COMMAND_FAILED`,`Android ${n.kind} ${n.type} is already running for this session.`,{hint:n.type===`cpu-profile`?`Run perf cpu profile stop --kind simpleperf before starting another Android native perf capture.`:`Run perf trace stop --kind perfetto before starting another Android native perf capture.`})}function ls(e,t,n){return t?rs(e,t,n.outPath):n.outPath}function us(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return V.join(e.ensureSessionDir(t),`${r}-${n}`)}function ds(e){return{action:e.action,platform:`android`,type:e.type,kind:e.kind,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,durationMs:e.durationMs,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,summary:e.summary,message:e.message}}function fs(e,n,r){let i=e.nativePerf?.android;if(i?.type===n&&i.kind===r)return i;throw new t(`COMMAND_FAILED`,`No Android ${r} ${n} is active for this session.`,{hint:n===`cpu-profile`?`Run perf cpu profile start --kind simpleperf first, then stop or report in the same session.`:`Run perf trace start --kind perfetto first, then stop in the same session.`})}async function ps(e){if(!rn(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const ms=[`probe`],hs=[`start`,`status`,`stop`],gs=`audio probe requires ${hs.join(`, `)}`;async function _s(t){let n=vs(t);if(!n.ok)return n;let r=await ps(n.session.device);if(r)return await bs(t,n,r);let i=wr();if(!i.probeAudio)return D(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);try{return{ok:!0,data:await i.probeAudio({action:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function vs(e){let t=ys(e);if(!t.ok)return t;let n=xs(e.req);if(!n.ok)return n;let r=Ss(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function ys(e){let t=e.sessionStore.get(e.sessionName);return t?Pn(`audio`,t.device)?{ok:!0,session:t}:D(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):D(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function bs(t,n,r){try{return{ok:!0,data:await Gn({session:n.session,sessionName:t.sessionName,sessionStore:t.sessionStore,backend:r,probeAction:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function xs(e){if(!Cs(e.positionals?.[0]))return D(`INVALID_ARGS`,`audio requires probe`);let t=ws(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:D(`INVALID_ARGS`,gs)}function Ss(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return D(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=Ts(e.positionals?.[2],{defaultValue:1e4,min:100,max:12e4,message:`audio probe duration must be an integer in range 100..120000 ms`});if(n instanceof Error)return D(`INVALID_ARGS`,n.message);let r=Ts(e.positionals?.[3],{defaultValue:1e3,min:100,max:1e4,message:`audio probe bucket must be an integer in range 100..10000 ms`});return r instanceof Error?D(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function Cs(e){let t=(e??`probe`).toLowerCase();return ms.includes(t)?`probe`:void 0}function ws(e){let t=(e??`status`).toLowerCase();return hs.includes(t)?t:void 0}function Ts(e,t){if(e===void 0)return t.defaultValue;let n=Number.parseInt(e,10);return!Number.isInteger(n)||String(n)!==e||n<t.min||n>t.max?Error(t.message):n}async function Es(t,n){let r=Ds(t.req);if(!r.ok)return r;if(n.device.platform===`android`)return D(`UNSUPPORTED_OPERATION`,`Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.`);if(!a(n.device.platform))return D(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return D(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await Ms(t,n,r):r.action===`stop`?await Ns(t,n,r):await Rs(t,n,r)}catch(t){return{ok:!1,error:e(t)}}}function Ds(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Os(t):n===`trace`?ks(t):D(`INVALID_ARGS`,se)}function Os(e){if(e[1]?.toLowerCase()!==`profile`)return D(`INVALID_ARGS`,`perf cpu requires profile`);let t=As(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=js(e[3]);return n.ok?{ok:!0,area:`cpu`,mode:`cpu-profile`,action:t.value,kind:`xctrace`,template:e[4]||void 0,outPath:e[5]||void 0,tracePath:e[6]||void 0}:n}function ks(e){let t=As(e[1],`perf trace`,!1);if(!t.ok)return t;let n=js(e[2]);return n.ok?{ok:!0,area:`trace`,mode:`trace`,action:t.value,kind:`xctrace`,template:e[3]||void 0,outPath:e[4]||void 0,tracePath:e[5]||void 0}:n}function As(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:D(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function js(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:D(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function Ms(e,t,n){if(t.applePerf?.active)return D(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??Hs(n.mode),i=Vs(e,n),a=await kt({device:t.device,appBundleId:t.appBundleId,mode:n.mode,template:r,outPath:i});t.applePerf={...t.applePerf??{},active:a},e.sessionStore.set(e.sessionName,t);let o=Us(`started`,a);return Bs(e,t,o),{ok:!0,data:o}}async function Ns(e,t,n){let r=t.applePerf?.active;if(!r)return D(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?j.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await Tn(r,i)}catch(n){throw Fs(n)&&Ps(e,t),n}Is(e,t,a);let o=Us(`stopped`,a);return Bs(e,t,o),{ok:!0,data:o}}function Ps(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function Fs(e){return n(e).details?.captureCleanedUp===!0}function Is(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...Ls(n)},e.sessionStore.set(e.sessionName,t)}function Ls(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function Rs(e,t,n){if(n.mode!==`cpu-profile`)return D(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return D(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=Vs(e,n),i=zs(t,n);if(!i.ok)return i;let a={perf:`reported`,...await zt({tracePath:j.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return Bs(e,t,a),{ok:!0,data:a}}function zs(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:D(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function Bs(e,t,n){kr(e.sessionStore,t,e.req,`perf`,n)}function Vs(e,t){if(t.outPath)return j.expandHome(t.outPath,e.req.meta?.cwd);let n=e.sessionStore.ensureSessionDir(e.sessionName),r=new Date().toISOString().replace(/[:.]/g,`-`),i=t.action===`report`?`json`:`trace`;return`${n}/perf-${t.mode}-${r}.${i}`}function Hs(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function Us(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}const Ws=`logs requires ${he.slice(0,-1).join(`, `)}, or ${he.at(-1)}`,Gs=[`dump`,`log`],Ks=`network requires ${Gs.join(` or `)}`,qs=`network include mode must be one of: ${l.join(`, `)}`,Js={path:({session:e,sessionName:t,sessionStore:n})=>bc(e,t,n),doctor:({session:e,sessionName:t,sessionStore:n})=>xc(e,t,n),mark:({req:e,sessionName:t,sessionStore:n})=>Sc(e,t,n),clear:({session:e,sessionName:t,sessionStore:n,restart:r})=>Cc(e,t,n,r),start:({session:e,sessionName:t,sessionStore:n})=>wc(e,t,n),stop:({session:e,sessionName:t,sessionStore:n})=>Tc(e,t,n)};function Ys(e){if(e.appLog){let t=e.appLog.getState();return{active:t===`active`||t===`recovering`,state:t,backend:e.appLog.backend,startedAt:e.appLog.startedAt,notes:Qs(t)}}return e.appLogFailure?{active:!1,state:`failed`,backend:e.appLogFailure.backend,failureCode:e.appLogFailure.code,failureMessage:e.appLogFailure.message,hint:e.appLogFailure.hint,notes:[Zs(e.appLogFailure)]}:{active:!1,state:`inactive`,backend:Rn(e.device)}}function Xs(e,t){return{backend:t,code:e.code,message:e.message,hint:e.hint}}function Zs(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Qs(e){if(e===`failed`)return[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`];if(e===`ended`)return[`The app log stream process ended. Run logs clear --restart before the next capture window.`]}function $s(e,t){return Yt([...e,...t.notes??[]])}function ec(e,t,n){return{...n,platform:e.device.platform,outPath:t}}function tc(t,n,r,i){let a=e(i);return t.set(n,{...r,appLog:void 0,appLogFailure:Xs(a,Rn(r.device))}),{ok:!1,error:a}}async function nc(e){let{req:t}=e;return t.command===`perf`?ic(e):t.command===`logs`?vc(e):t.command===`events`?await rc(e):t.command===`network`?Ec(e):t.command===`audio`?await _s(e):null}async function rc(t){let{req:n,sessionName:r,sessionStore:i}=t;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(t){return{ok:!1,error:e(t)}}}async function ic(t){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=t,o=i.get(r);if(!o)return D(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=(n.positionals?.[0]??`metrics`).toLowerCase();if(ac(s))return o.device.platform===`android`?await Yo({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await Es(t,o);let c=oc(n);if(!c.ok)return c;if(c.native)return await Es(t,o);try{return{ok:!0,data:await sc(t,o,c)}}catch(t){return{ok:!1,error:e(t)}}}function ac(e){return e===`cpu`||e===`trace`}function oc(n){let r=cc(n.positionals?.[0]);if(!r)return D(`INVALID_ARGS`,se);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=lc(n.positionals?.[1]);if(!i)return D(`INVALID_ARGS`,ne);let a=uc(n.flags?.kind);return a instanceof t?{ok:!1,error:e(a)}:(dc(r,i)??mc(n,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:_c(n.flags?.out)}}async function sc(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await ho(t,{action:pc(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await mo(t,{androidAdb:a}):await po(t,{androidAdb:a})}function cc(e){let t=(e??`metrics`).toString().toLowerCase();return ae(t)?t:void 0}function lc(e){let t=(e??`sample`).toString().toLowerCase();return ee(t)?t:void 0}function uc(e){if(e!==void 0)return typeof e!=`string`||!ye(e)?new t(`INVALID_ARGS`,C):e}function dc(e,t){if(e===`memory`)return fc(t)?void 0:D(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return D(`INVALID_ARGS`,`perf metrics and perf frames only support sample`)}function fc(e){return e===`sample`||e===`snapshot`}function pc(e){if(fc(e))return e;throw new t(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function mc(e,t,n,r){return hc(e.flags?.out,t,n)??gc(r,t,n)}function hc(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return D(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function gc(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return D(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!ie(e))return D(`INVALID_ARGS`,te)}}function _c(e){return typeof e==`string`&&e.length>0?e:void 0}async function vc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return D(`SESSION_NOT_FOUND`,`logs requires an active session`);let a=A(`logs`,i.device);if(a)return a;let o=yc(t);return o.ok?await Js[o.action]({...e,session:i,restart:o.restart}):o}function yc(e){let t=(e.positionals?.[0]??`path`).toLowerCase(),n=!!e.flags?.restart;return he.includes(t)?n&&t!==`clear`?D(`INVALID_ARGS`,`logs --restart is only supported with logs clear`):{ok:!0,action:t,restart:n}:D(`INVALID_ARGS`,Ws)}function bc(e,t,n){let r=n.resolveAppLogPath(t),i=wn(r),a=Ys(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,sizeBytes:i.sizeBytes,modifiedAt:i.modifiedAt,startedAt:a.startedAt?new Date(a.startedAt).toISOString():void 0,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint??`Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>`,notes:a.notes}}}async function xc(e,t,n){let r=n.resolveAppLogPath(t),i=await kn(e.device,e.appBundleId),a=Ys(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,checks:i.checks,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint,notes:$s(i.notes,a)}}}function Sc(e,t,n){let r=e.positionals?.slice(1).join(` `)??``,i=n.resolveAppLogPath(t);return Fn(i,r),{ok:!0,data:{path:i,marked:!0}}}async function Cc(e,t,n,r){if(e.appLog&&!r)return D(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=n.resolveAppLogPath(t);if(!r){let r=Wn(i);return n.set(t,{...e,appLogFailure:void 0}),{ok:!0,data:r}}let a=e.appBundleId;if(!a)return D(`INVALID_ARGS`,`logs clear --restart requires an app session; run open <app> first`);e.appLog&&await un(e.appLog);let o=Wn(i),s=n.resolveAppLogPidPath(t);try{let r=await qn(e.device,a,i,s);return n.set(t,{...e,appLog:ec(e,i,r),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(r){return tc(n,t,e,r)}}async function wc(e,t,n){if(e.appLog)return D(`INVALID_ARGS`,`app log already streaming; run logs stop first`);if(!e.appBundleId)return D(`INVALID_ARGS`,`logs start requires an app session; run open <app> first`);let r=n.resolveAppLogPath(t),i=n.resolveAppLogPidPath(t);try{let a=await qn(e.device,e.appBundleId,r,i);return n.set(t,{...e,appLog:ec(e,r,a),appLogFailure:void 0}),{ok:!0,data:{path:r,started:!0}}}catch(r){return tc(n,t,e,r)}}async function Tc(e,t,n){if(!e.appLog)return D(`INVALID_ARGS`,`no app log stream active`);let r=e.appLog.outPath;return await un(e.appLog),n.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:r,stopped:!0}}}async function Ec(e){let t=Oc(e);if(!t.ok)return t;let{include:n,maxEntries:r,session:i}=t;if(i.device.platform===`web`)return await Dc({include:n,maxEntries:r});let a=await an({device:i.device,appBundleId:i.appBundleId,appLogState:i.appLog?.getState(),appLogStartedAt:i.appLog?.startedAt,appLogPath:e.sessionStore.resolveAppLogPath(e.sessionName),maxEntries:r,include:n,maxPayloadChars:2048,maxScanLines:4e3});return{ok:!0,data:{...a.dump,active:!!i.appLog,state:i.appLog?.getState()??`inactive`,backend:a.backend,notes:a.notes}}}async function Dc(t){let n=wr();if(!n.dumpNetwork)return D(`UNSUPPORTED_OPERATION`,`network is not supported by this web provider`);try{let e=await n.dumpNetwork({include:t.include,limit:t.maxEntries});return{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend??`agent-browser`,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:2048,maxScanLines:e.entries.length},notes:e.notes}}}catch(t){return{ok:!1,error:e(t)}}}function Oc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return D(`SESSION_NOT_FOUND`,`network requires an active session`);let a=A(`network`,i.device);if(a)return a;let o=(t.positionals?.[0]??`dump`).toLowerCase();if(!Gs.includes(o))return D(`INVALID_ARGS`,Ks);let s=t.positionals?.[1]?Number.parseInt(t.positionals[1],10):25;if(!Number.isInteger(s)||s<1||s>200)return D(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`);let c=kc(t);return c.ok?{ok:!0,session:i,maxEntries:s,include:c.include}:c}function kc(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return D(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return l.includes(r)?{ok:!0,include:r}:D(`INVALID_ARGS`,qs)}function Ac(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=j.expandHome(t??`.agent-device/test-artifacts`,n);return V.join(i,r)}function jc(e,t){let n=t?V.relative(t,e):V.basename(e);return(n.length===0||n.startsWith(`..`)?V.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``)||`test`}function Mc(e,t){B.mkdirSync(t,{recursive:!0}),Ic(e,t)}function Nc(e){let{response:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=[...Pc(t)];!t.ok&&typeof t.error.logPath==`string`&&s.push(t.error.logPath);let c=Fc(s,o),l=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${t.ok?`passed`:`failed`}`];if(t.ok){let e=typeof t.data?.replayed==`number`?t.data.replayed:0,n=typeof t.data?.healed==`number`?t.data.healed:0;l.push(`replayed: ${e}`,`healed: ${n}`)}else l.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&l.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&l.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&l.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&l.push(`timeoutMode: cooperative`);c.length>0&&l.push(`copiedArtifacts: ${c.map(e=>V.basename(e)).join(`, `)}`);let u=V.join(o,`result.txt`),d=`${l.join(`
|
|
3
|
-
`)}\n`;B.writeFileSync(u,d),t.ok||B.writeFileSync(V.join(o,`failure.txt`),d)}function Pc(e){let t=e.ok?e.data?.artifactPaths:e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`))]:[]}function Fc(e,t){let n=[],r=new Map;for(let i of e){if(!zc(i))continue;let e=Rc(V.basename(i),r),a=V.join(t,e);V.resolve(i)!==V.resolve(a)&&B.copyFileSync(i,a),n.push(a)}return n}function Ic(e,t){let n=V.join(t,`replay.ad`);if(B.copyFileSync(e,n),!Lc(e))return;let r=V.join(t,V.basename(e));V.resolve(r)!==V.resolve(n)&&B.copyFileSync(e,r)}function Lc(e){let t=V.extname(e).toLowerCase();return t===`.yml`||t===`.yaml`}function Rc(e,t){let n=V.extname(e),r=n?e.slice(0,-n.length):e,i=t.get(e)??0;return t.set(e,i+1),i===0?e:`${r}-${i+1}${n}`}function zc(e){try{return B.statSync(e).isFile()}catch{return!1}}function Bc(e,n,r){if(e==null)return F(`open`,[L(fr(n,`launchApp`),r)]);if(typeof e==`string`)return F(`open`,[L(e,r)]);if(!I(e))throw new t(`INVALID_ARGS`,`launchApp expects a string or map.`);N(e,`launchApp`,[`appId`,`stopApp`,`clearState`,`clearKeychain`,`arguments`,`permissions`,`launchArguments`]),Gc(e,`permissions`),Gc(e,`clearKeychain`);let i=L(typeof e.appId==`string`?e.appId:fr(n,`launchApp`),r),a=Hc(e,r),o=e.clearState===!0,s=!o&&(e.stopApp===!0||a.length>0);return F(`open`,[i],{...s?{relaunch:!0}:{},...o?{clearAppState:!0}:{},...a.length>0?{launchArgs:a}:{}})}function Vc(e,n,r){if(e==null)return F(`close`,[L(fr(n,`stopApp`),r)]);if(typeof e==`string`)return F(`close`,[L(e,r)]);throw new t(`INVALID_ARGS`,`stopApp expects a string appId or no value.`)}function Hc(e,t){return[...Uc(e.arguments,`launchApp.arguments`,t),...Uc(e.launchArguments,`launchApp.launchArguments`,t)]}function Uc(e,n,r){if(e==null)return[];if(typeof e==`string`)return[L(e,r)];if(Array.isArray(e))return e.map((e,t)=>Wc(e,`${n}[${t}]`,r));if(I(e))return Object.entries(e).flatMap(([e,t])=>[L(e,r),Wc(t,`${n}.${e}`,r)]);throw new t(`INVALID_ARGS`,`${n} expects a string, list, or map.`)}function Wc(e,n,r){if(typeof e==`string`)return L(e,r);if(typeof e==`number`||typeof e==`boolean`)return String(e);throw new t(`INVALID_ARGS`,`${n} must be a string, number, or boolean.`)}function Gc(e,t){if(e[t]!==void 0)throw P(`Maestro launchApp field "${t}" is not supported yet.`)}const G={runScript:`__maestroRunScript`,assertVisible:`__maestroAssertVisible`,assertNotVisible:`__maestroAssertNotVisible`,pressEnter:`__maestroPressEnter`,waitForAnimationToEnd:`__maestroWaitForAnimationToEnd`,scrollUntilVisible:`__maestroScrollUntilVisible`,swipeScreen:`__maestroSwipeScreen`,swipeOn:`__maestroSwipeOn`,tapOn:`__maestroTapOn`,tapPointPercent:`__maestroTapPointPercent`};function Kc(e,t){if(typeof e==`string`)return F(G.tapOn,[ll(L(e,t))],ml(e));if(I(e)&&typeof e.point==`string`){N(e,`tapOn`,[`point`,`repeat`,`delay`,`optional`,`label`]);let t=vr(e.point);return t.kind===`percent`?F(G.tapPointPercent,[String(t.x),String(t.y)],pl(e)):F(`click`,[String(t.x),String(t.y)],pl(e))}I(e)&&N(e,`tapOn`,[`id`,`text`,`childOf`,`enabled`,`index`,`selected`,`repeat`,`delay`,`optional`,`label`]);let n=ml(e);return F(G.tapOn,[K(e,`tapOn`,[`repeat`,`delay`,`optional`,`label`,`index`,`childOf`],t),...ul(e,t)],n)}function qc(e,t){if(I(e)&&typeof e.point==`string`){N(e,`doubleTapOn`,[`point`,`delay`]);let t=_r(e.point);return F(`click`,[String(t.x),String(t.y)],hl(e))}return I(e)&&N(e,`doubleTapOn`,[`id`,`text`,`enabled`,`selected`,`delay`]),F(`click`,[K(e,`doubleTapOn`,[`delay`],t)],hl(e))}function Jc(e,t){if(I(e)&&typeof e.point==`string`){N(e,`longPressOn`,[`point`]);let t=_r(e.point);return F(`longpress`,[String(t.x),String(t.y),`3000`])}return I(e)&&N(e,`longPressOn`,[`id`,`text`,`enabled`,`selected`]),F(`click`,[K(e,`longPressOn`,[],t)],{holdMs:3e3})}function Yc(e){if(typeof e==`string`)return e;if(!I(e))throw new t(`INVALID_ARGS`,`inputText expects a string or map.`);if(N(e,`inputText`,[`text`,`label`]),typeof e.text!=`string`)throw new t(`INVALID_ARGS`,`inputText map requires a string text field.`);return e.text}function Xc(e){if(e==null)return F(`type`,[`\b`.repeat(50)]);if(typeof e==`number`&&Number.isInteger(e)&&e>0)return F(`type`,[`\b`.repeat(e)]);if(!I(e))throw new t(`INVALID_ARGS`,`eraseText expects empty, a positive count, or a map.`);if(N(e,`eraseText`,[`charactersToErase`]),e.charactersToErase===void 0)return F(`type`,[`\b`.repeat(50)]);if(typeof e.charactersToErase!=`number`||!Number.isInteger(e.charactersToErase)||e.charactersToErase<=0)throw new t(`INVALID_ARGS`,`eraseText.charactersToErase must be a positive integer.`);return F(`type`,[`\b`.repeat(e.charactersToErase)])}function Zc(e,n){if(!I(e))throw new t(`INVALID_ARGS`,`extendedWaitUntil expects a map.`);N(e,`extendedWaitUntil`,[`visible`,`notVisible`,`timeout`]);let r=e.visible??e.notVisible;if(r===void 0)throw P(`Only Maestro extendedWaitUntil.visible/notVisible is supported.`);let i=K(r,`extendedWaitUntil`,[],n),a=String(yr(e,17e3));return e.notVisible===void 0?[F(G.assertVisible,[i,a],{maestro:{allowAlreadyPastLoading:!0}})]:[F(G.assertNotVisible,[i,a])]}function Qc(e){if(e!=null)throw P(`Maestro scroll options are not supported yet.`);return F(`scroll`,[`down`])}function $c(e,n){if(typeof e==`string`)return[F(G.scrollUntilVisible,[ll(L(e,n)),`5000`,`down`])];if(!I(e))throw new t(`INVALID_ARGS`,`scrollUntilVisible expects a string or map.`);N(e,`scrollUntilVisible`,[`element`,`direction`,`timeout`]);let r=K(e.element,`scrollUntilVisible.element`,[],n),i=typeof e.direction==`string`?ol(e.direction,`scrollUntilVisible.direction`):`down`,a=String(yr(e,5e3));return[F(G.scrollUntilVisible,[r,a,i])]}function el(e,n){if(!I(e))throw new t(`INVALID_ARGS`,`swipe expects a map.`);N(e,`swipe`,[`start`,`end`,`direction`,`duration`,`from`,`label`]);let r=e.from??(typeof e.label==`string`?e.label:void 0);return r===void 0?typeof e.direction==`string`?F(G.swipeScreen,[`direction`,sl(e.direction),...dl(e)]):nl(e):tl(e,r,n)}function tl(e,t,n){let r=sl(typeof e.direction==`string`?e.direction:`up`);return F(G.swipeOn,[K(t,`swipe.from`,[],n),r,...dl(e)])}function nl(e){let{start:t,end:n}=rl(e);return al(t,n,il(e.duration))}function rl(e){if(typeof e.start==`string`&&typeof e.end==`string`)return{start:vr(e.start),end:vr(e.end)};throw P(`Only Maestro swipe start/end coordinates are supported.`)}function il(e){return typeof e==`number`&&Number.isFinite(e)?String(Math.max(16,Math.floor(e))):void 0}function al(e,t,n){if(e.kind===`absolute`&&t.kind===`absolute`)return F(`swipe`,[String(e.x),String(e.y),String(t.x),String(t.y),...n?[n]:[]]);if(e.kind===`percent`&&t.kind===`percent`)return F(G.swipeScreen,[`percent`,String(e.x),String(e.y),String(t.x),String(t.y),...n?[n]:[]]);throw P(`Maestro swipe start/end must both be absolute pixels or both be percentages.`)}function ol(e,t){let n=e.toLowerCase();switch(n){case`up`:case`down`:case`left`:case`right`:return n;default:throw P(`Maestro ${t} must be UP, DOWN, LEFT, or RIGHT.`)}}function sl(e){return ol(e,`swipe direction`)}function cl(e){let t=pr(`pressKey`,e).toLowerCase();if(t===`back`)return F(`back`);if(t===`enter`||t===`return`)return F(G.pressEnter);if(t===`home`)return F(`home`);throw P(`Maestro pressKey "${t}" is not supported yet.`)}function K(e,n,r=[],i){if(typeof e==`string`)return ll(L(e,i));if(!I(e))throw new t(`INVALID_ARGS`,`${n} expects a string or selector map.`);N(e,n,[`id`,`text`,`enabled`,`selected`,...r]);let a=[],o=[];if(typeof e.enabled==`boolean`&&o.push(fl(`enabled`,String(e.enabled))),typeof e.selected==`boolean`&&o.push(fl(`selected`,String(e.selected))),typeof e.id==`string`&&a.push(fl(`id`,L(e.id,i)),...o),typeof e.text==`string`&&a.length===0)return ll(L(e.text,i),o);if(typeof e.label==`string`&&a.length===0&&a.push(fl(`label`,L(e.label,i)),...o),a.length===0&&o.length>0&&a.push(...o),a.length===0)throw new t(`INVALID_ARGS`,`${n} selector map must include one of id, text, label, enabled, or selected.`);return a.join(` `)}function ll(e,t=[]){return[[fl(`label`,e),...t].join(` `),[fl(`text`,e),...t].join(` `),[fl(`id`,e),...t].join(` `)].join(` || `)}function ul(e,n){if(!I(e))return[];let r={};if(e.index!==void 0){if(typeof e.index!=`number`||!Number.isInteger(e.index)||e.index<0)throw new t(`INVALID_ARGS`,`tapOn.index must be a non-negative integer.`);r.index=e.index}return e.childOf!==void 0&&(r.childOf=K(e.childOf,`tapOn.childOf`,[],n)),Object.keys(r).length>0?[JSON.stringify(r)]:[]}function dl(e){let t=il(e.duration);return t?[t]:[]}function fl(e,t){return`${e}=${JSON.stringify(t)}`}function pl(e){if(!I(e))return;let t={},n=gl(e.repeat),r=_l(e.delay);return n&&n>1&&(t.count=n),r!==void 0&&(t.intervalMs=r),e.optional===!0&&(t.maestro={optional:!0}),Object.keys(t).length>0?t:void 0}function ml(e){let t=pl(e)??{};return{...t,maestro:{...t.maestro??{},allowNonHittableCoordinateFallback:!0}}}function hl(e){let t={doubleTap:!0};return I(e)&&typeof e.delay==`number`&&Number.isInteger(e.delay)&&(t.intervalMs=Math.max(0,e.delay)),t}function gl(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}function _l(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:void 0}const vl=1e3;function yl(e,n,r,i,a){if(typeof e==`string`)return i.parseRunFlowFile(L(e,r),r).actions;if(!I(e))throw new t(`INVALID_ARGS`,`runFlow expects a file path string or map.`);N(e,`runFlow`,[`file`,`commands`,`env`,`when`,`label`]);let o=Cl(e.when,r);return o.shouldRun?Rl(Sl(e,n,{...r,env:{...r.env,...hr(e.env,`runFlow.env`),...r.envOverrides}},i,a),o):[]}function bl(e,n,r,i,a){if(!I(e))throw new t(`INVALID_ARGS`,`repeat expects a map.`);if(N(e,`repeat`,[`times`,`commands`,`while`]),e.while!==void 0)throw P(`Maestro repeat.while is not supported yet. Only deterministic repeat.times is supported.`);let o=Bl(e.times,r);if(!Array.isArray(e.commands))throw new t(`INVALID_ARGS`,`repeat requires a commands list.`);if(o>vl)throw new t(`INVALID_ARGS`,`repeat.times must be <= ${vl} for deterministic replay expansion.`);let s=R(e.commands);return Array.from({length:o}).flatMap(()=>a(s,n,r,i))}function xl(e,n,r,i,a){if(!I(e))throw new t(`INVALID_ARGS`,`retry expects a map.`);if(N(e,`retry`,[`maxRetries`,`commands`]),!Array.isArray(e.commands))throw new t(`INVALID_ARGS`,`retry requires a commands list.`);let o=Vl(e.maxRetries,r),s=a(R(e.commands),n,r,i);return[zl(`retry`,[String(o)],{kind:`retry`,maxRetries:o,actions:s})]}function Sl(e,n,r,i,a){if(typeof e.file==`string`)return i.parseRunFlowFile(L(e.file,r),r).actions;if(Array.isArray(e.commands))return a(R(e.commands),n,r,i);throw new t(`INVALID_ARGS`,`runFlow map requires either file or commands.`)}function Cl(e,n){if(e==null)return{shouldRun:!0};if(!I(e))throw new t(`INVALID_ARGS`,`runFlow.when expects a map.`);return N(e,`runFlow.when`,[`platform`,`visible`,`notVisible`,`true`]),wl(e,n)?{shouldRun:!0,...Tl(e,n)}:{shouldRun:!1}}function wl(e,n){if(e.true!==void 0&&!Dl(e.true,n))return!1;if(e.platform===void 0)return!0;let r=El(e.platform,`runFlow.when.platform`);if(!n.platform)throw new t(`INVALID_ARGS`,`Maestro runFlow.when.platform requires replay to be run with --platform ios|android.`);return r===n.platform}function Tl(e,t){return{...e.visible===void 0?{}:{visibleSelector:K(e.visible,`runFlow.when.visible`,[],t)},...e.notVisible===void 0?{}:{notVisibleSelector:K(e.notVisible,`runFlow.when.notVisible`,[],t)}}}function El(e,n){if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`${n} expects Android, iOS, or Web.`);let r=e.trim().toLowerCase();if(r===`android`||r===`ios`||r===`web`)return r;throw new t(`INVALID_ARGS`,`${n} expects Android, iOS, or Web.`)}function Dl(e,n){if(typeof e==`boolean`)return e;if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`runFlow.when.true expects a boolean or expression string.`);return new Ll(kl(Ol(L(e,n))),{platform:n.platform}).parse()}function Ol(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function kl(e){let n=[],r=0;for(;r<e.length;){let i=e.slice(r),a=Al(i);if(a>0){r+=a;continue}let o=jl(i);if(o){n.push(o.token),r+=o.length;continue}throw new t(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`)}return n}function Al(e){return/^\s+/.exec(e)?.[0].length??0}function jl(e){return Ml(e)??Nl(e)??Pl(e)??Fl(e)??Il(e)}function Ml(e){return e.startsWith(`maestro.platform`)?{token:{type:`platform`},length:16}:null}function Nl(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{token:{type:`operator`,value:t},length:t.length}:null}function Pl(e){let t=e[0];return t===`(`||t===`)`?{token:{type:`paren`,value:t},length:1}:null}function Fl(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{token:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Il(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{token:{type:`boolean`,value:t===`true`},length:t.length}:null}var Ll=class{index=0;tokens;context;constructor(e,t){this.tokens=e,this.context=t}parse(){let e=this.parseOr();if(this.peek())throw new t(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new t(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new t(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.expectPlatform();let e=this.expectEqualityOperator(),t=this.expectString().toLowerCase(),n=this.context.platform;return e===`==`?n===t:n!==t}expectPlatform(){if(this.peek()?.type!==`platform`)throw new t(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}expectEqualityOperator(){let e=this.peek();if(e?.type===`operator`&&(e.value===`==`||e.value===`!=`))return this.index+=1,e.value;throw new t(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`)}expectString(){let e=this.peek();if(e?.type===`string`)return this.index+=1,e.value;throw new t(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`)}consumeOperator(e){let t=this.peek();return t?.type!==`operator`||t.value!==e?!1:(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type!==`paren`||t.value!==e?!1:(this.index+=1,!0)}peek(){return this.tokens[this.index]}};function Rl(e,t){let{visibleSelector:n,notVisibleSelector:r}=t;if(!n&&!r)return e;if(n&&r)throw P(`Maestro runFlow.when cannot combine visible and notVisible yet.`);let i=n?`visible`:`notVisible`,a=n??r??``;return[zl(`runFlow.when`,[i,a],{kind:`maestroRunFlowWhen`,mode:i,selector:a,actions:e})]}function zl(e,t,n){return{...F(e,t),replayControl:n}}function Bl(e,t){return Hl(e,t,`repeat.times`)}function Vl(e,t){return e===void 0?1:Hl(e,t,`retry.maxRetries`)}function Hl(e,n,r){let i=typeof e==`string`?L(e,n):e,a=typeof i==`number`?i:typeof i==`string`&&/^\d+$/.test(i)?Number(i):void 0;if(a===void 0||!Number.isInteger(a)||a<0)throw new t(`INVALID_ARGS`,`${r} must be a non-negative integer or \${VAR} resolving to one.`);return a}const Ul=3e4;function Wl(e,t){let n=Kl(e,t),r=ql(n.file,t);return F(G.runScript,[r],{...Object.keys(n.env).length>0?{maestro:{runScriptEnv:n.env}}:{}})}function Gl(e){let{scriptPath:n,env:r}=e,i=B.readFileSync(n,`utf8`),a=Object.create(null);try{Ir.runInNewContext(i,Jl(r,a),{filename:n,timeout:Ul})}catch(e){throw new t(`COMMAND_FAILED`,`Maestro runScript failed for ${n}: ${e instanceof Error?e.message:String(e)}`,{scriptPath:n},e instanceof Error?e:void 0)}return Ql(a,n),Object.fromEntries(Object.entries(a).map(([e,t])=>[`output.${e}`,$l(t)]))}function Kl(e,n){if(typeof e==`string`)return{file:L(e,n),env:{}};if(!I(e))throw new t(`INVALID_ARGS`,`runScript expects a file path string or map.`);N(e,`runScript`,[`file`,`env`]);let r=L(pr(`runScript.file`,e.file),n),i=hr(e.env,`runScript.env`);return{file:r,env:Object.fromEntries(Object.entries(i).map(([e,t])=>[e,L(t,n)]))}}function ql(e,n){if(V.isAbsolute(e))return e;if(!n.baseDir)throw new t(`INVALID_ARGS`,`runScript file paths require replay input to have a source path.`);return V.resolve(n.baseDir,e)}function Jl(e,t){return{...e,output:t,json:Yl,http:{post:(e,t)=>Zl(`POST`,e,t)}}}function Yl(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`COMMAND_FAILED`,`Maestro runScript json() received an empty body. Check the preceding http response status and setup server output.`);try{return JSON.parse(e,Xl)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,1e3)},n instanceof Error?n:void 0)}}function Xl(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Zl(e,n,r){let i=f(process.execPath,[`-e`,`
|
|
1
|
+
import{S as e,T as t,_ as n,c as r,d as i,p as a,t as o,v as s}from"./sdk-contracts.js";import{C as c,N as l,j as u,p as d,s as f,v as p}from"./sdk-android-adb.js";import{N as m,P as h,T as g,y as _}from"./sdk-batch.js";import{An as v,Bn as y,Gn as b,Hn as x,Jn as S,L as C,Mt as ee,Qt as te,Un as w,Vn as ne,an as re,b as ie,cn as ae,dn as oe,en as se,f as ce,g as le,ht as ue,in as de,jn as fe,jt as pe,ln as me,nn as he,nr as ge,pn as _e,qn as ve,rr as T,sn as ye,un as be}from"./tv-remote.js";import{$ as xe,A as Se,B as Ce,F as we,K as Te,L as Ee,O as E,Q as De,R as Oe,W as ke,a as Ae,j as je,n as Me,t as Ne}from"./snapshot-diagnostics.js";import{n as Pe}from"./version.js";import{c as Fe,f as Ie,g as Le,l as Re,m as D,o as O,p as ze,s as k}from"./sdk-device.js";import{A as Be,D as Ve,F as He,L as Ue,T as We,Z as Ge,_ as Ke,b as qe,ct as Je,g as Ye,j as Xe,m as Ze,ot as Qe,p as $e,s as et,t as tt}from"./sdk-selectors.js";import{n as nt,t as rt,u as it,x as A}from"./sdk-batch-runner.js";import{t as at}from"./timeouts.js";import{t as ot}from"./project-runtime.js";import{n as st,t as ct}from"./runtime-transport.js";import{t as lt}from"./snapshot-quality.js";import{o as ut}from"./android-input-method-overlays.js";import{n as dt}from"./sdk-app-inventory.js";import{c as ft}from"./runtime.js";import{f as pt,p as mt,s as ht}from"./app-lifecycle.js";import{d as gt,f as _t,p as vt,s as yt}from"./logcat.js";import{a as bt,o as xt,r as St,s as Ct}from"./boot-diagnostics.js";import{G as wt,H as Tt,J as Et,K as Dt,L as j,M as Ot,P as kt,R as At,U as jt,W as Mt,Y as Nt,q as Pt,u as Ft,z as It}from"./runner-disposal.js";import{C as M,S as Lt,a as Rt,c as zt,d as Bt,g as Vt,h as Ht,i as Ut,l as Wt,m as Gt,n as Kt,s as N,t as qt,u as Jt,x as Yt,y as Xt}from"./context.js";import{i as Zt,n as Qt,o as $t,s as en,t as tn}from"./register-builtins.js";import{a as nn}from"./tool-provider.js";import{r as rn}from"./helper.js";import{c as an,i as on,l as sn,n as cn,r as ln,s as un,t as dn}from"./runner-client.js";import{n as fn,s as pn}from"./agent-browser-tool.js";import{$ as mn,$t as hn,A as gn,B as _n,C as vn,Ct as yn,D as bn,Dn as xn,F as Sn,G as Cn,H as wn,I as Tn,J as En,K as Dn,L as On,M as kn,N as An,Ot as jn,P as Mn,Q as Nn,R as Pn,S as Fn,Sn as In,St as Ln,T as Rn,U as zn,V as Bn,W as Vn,X as Hn,Xt as Un,Y as Wn,Z as Gn,_ as Kn,_n as qn,_t as Jn,a as Yn,an as Xn,b as Zn,bn as Qn,bt as $n,c as er,ct as tr,d as nr,dt as rr,et as ir,f as ar,ft as or,g as sr,gn as cr,h as lr,hn as ur,ht as dr,i as fr,in as pr,j as mr,k as hr,kn as gr,l as _r,lt as vr,m as yr,mn as br,mt as xr,n as Sr,nn as Cr,nt as wr,o as Tr,on as Er,p as Dr,pn as Or,pt as kr,q as Ar,qt as jr,r as Mr,rt as Nr,s as Pr,sn as Fr,t as Ir,tt as Lr,u as Rr,ut as zr,v as Br,vn as Vr,vt as Hr,w as Ur,wt as Wr,x as Gr,xn as Kr,xt as qr,y as Jr,yn as Yr,yt as Xr,z as Zr}from"./internal/daemon.js";import{_ as Qr,c as $r,d as ei,f as ti,g as ni,h as ri,l as ii,m as ai,o as P,p as oi,r as si,s as ci,t as li,u as ui,v as di}from"./selector-vocabulary.js";import"./apps.js";import{a as fi,n as pi}from"./simulator.js";import{r as mi}from"./app-resolution.js";import{a as hi,c as gi,i as _i,l as vi,n as yi,r as bi,s as xi,t as Si}from"./session-target-evidence.js";import{createHash as Ci}from"node:crypto";import F,{promises as wi}from"node:fs";import Ti from"node:os";import I from"node:path";import{access as Ei}from"node:fs/promises";import{setTimeout as Di}from"node:timers/promises";import{LineCounter as Oi,isMap as ki,isNode as Ai,isScalar as L,isSeq as ji,parseAllDocuments as Mi}from"yaml";import Ni from"node:vm";function Pi(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Fi(e){let t=e.meta?.installSource;if(!t)throw new n(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new n(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new n(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new n(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Pi(t)}}function Ii(e){let t=Fi(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:gr(n,e.meta?.tenantId)},cleanup:()=>{xn(n)}}}function Li(e){return e===`ios`||e===`android`?e:void 0}function Ri(e){let t=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(r!==void 0&&r<=0)throw new n(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,ttlMs:r}}async function zi(e){let t=Li(e.flags?.platform);if(e.session){if(t&&e.session.device.platform!==t)throw new n(`INVALID_ARGS`,`install_from_source requested platform ${t}, but session is bound to ${e.session.device.platform}`);return await sr(e.session.device),e.session.device}if(!t)throw new n(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);let r=await Vt(e.flags??{});return await sr(r),r}async function Bi(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await Gr({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function Vi(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Hi(e){let{session:t,sessionStore:n,req:r,data:i}=e;lr(n,t,r,`install_source`,i,{positionals:[]})}async function Ui(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r);try{let e=Ii(n),t=Ri(n),o=await zi({session:a,flags:n.flags}),s=Wt(`install`,o,{message:`install_from_source is not supported on this device`});if(s)return s;let c=Mt(n.meta?.requestId);if(k(o)){let{prepareIosInstallArtifact:s}=await import(`./install-artifact.js`).then(e=>e.t),l=await s(e.source,{signal:c});return await Wi({prepared:l,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Gi(o,l,e)})}let{prepareAndroidInstallArtifact:l}=await import(`./logcat.js`).then(e=>e.r),u=await l(e.source,{signal:c});return await Wi({prepared:u,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Ki(o,u,e)})}catch(t){return{ok:!1,error:e(t)}}}async function Wi(e){let t;try{t=await Bi(e);let n=await e.buildResult(t),r=S(n,Zi(n));return Hi({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await Jr(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function Gi(e,t,n){let r=await Lt(e,t.installablePath,{appIdentifierHint:t.bundleId});if(!r){let{installIosInstallablePath:n}=await import(`./apps.js`).then(e=>e.t);await n(e,t.installablePath)}return qi(t,r,n)}async function Ki(e,t,n){let r=await Lt(e,t.installablePath,{packageNameHint:t.packageName}),i=await Xi(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...Vi(n),packageName:i,...Yi(r?.appName??o),launchTarget:r?.launchTarget??i}}function qi(e,t,n){let r=Ji(e,t),i=t?.appName??e.appName;return{...Vi(n),bundleId:r,...Yi(i),launchTarget:t?.launchTarget??r}}function Ji(e,t){let r=t?.bundleId??e.bundleId;if(r)return r;throw new n(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`)}function Yi(e){return e?{appName:e}:{}}async function Xi(e,t,r){let i=r?.packageName??r?.launchTarget;if(i)return i;let{installAndroidInstallablePathAndResolvePackageName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=await a(e,t.installablePath,t.packageName);if(!o)throw new n(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return o}function Zi(e){return`Installed: ${ee(e)}`}async function Qi(t){let{req:r}=t;try{let e=r.meta?.materializationId?.trim();if(!e)throw new n(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Jr(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(t){return{ok:!1,error:e(t)}}}function R(e){return k(e)&&e.kind===`simulator`}function $i(e){return e.platform===`android`&&e.kind===`emulator`}function z(e,t,n){return t||br(n)?null:N(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function ea(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function ta(e,t){M(e)||!R(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function B(e){let t=br(e.flags)||!e.session?await Vt(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await na(e.session.device);return e.ensureReady!==!1&&await sr(t),t}async function na(e){if(M(e)||!k(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(un(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 Vt(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Vt({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function ra(e){let t=e.flags?.device?.trim();if(t)return t;if(e.resolvedDevice?.platform===`android`&&e.resolvedDevice.kind===`emulator`)return e.resolvedDevice.name;if(e.sessionDevice?.platform===`android`&&e.sessionDevice.kind===`emulator`)return e.sessionDevice.name}function ia(e,t){return t?yn(t,e).length===0:!1}const aa=`debug_http_host`,oa=`dev_server_https`,sa=`RCT_jsLocation`,ca=`RCT_packager_scheme`,la=`React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.`,ua=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
|
|
2
|
+
`);function da(e){return ct(e)!==void 0}async function fa(e){let{device:t,appId:n,runtime:r}=e;if(M(t)||!n)return;let i=ct(r);if(i){if(t.platform===`android`){await ha(t,n,i);return}k(t)&&t.kind===`simulator`&&await Ca(t,n,i)}}async function pa(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await ga(t,n);return}k(t)&&t.kind===`simulator`&&await wa(t,n)}}function ma(e){return[`shared_prefs/${e}_preferences.xml`,`shared_prefs/ReactNativeDevPrefs.xml`]}async function ha(e,t,n){Aa(t);let r=[];for(let i of ma(t)){let a=Ea(await _a(e,t,i),aa,`${n.host}:${n.port}`);a=Da(a,oa,n.scheme===`https`),r.push({path:i,xml:a})}await va(e,t,r)}async function ga(e,t){Aa(t);let n=[];for(let r of ma(t)){let i=await _a(e,t,r),a=ka(ka(i,aa),oa);a!==i&&n.push({path:r,xml:a})}n.length!==0&&await va(e,t,n)}async function _a(e,t,n){let r=await yt(e,[`shell`,`run-as`,t,`cat`,n],{allowFailure:!0});return r.exitCode===0?Ta(r.stdout):ua}async function va(e,t,n){await ya(e,t);try{await xa(e,t,n)}catch(e){throw Sa(e,t)}}async function ya(e,t){let n=[`shell`,`run-as`,t,`id`],r=await yt(e,n,{allowFailure:!0});if(r.exitCode!==0)throw ba(r,t,n)}function ba(e,t,r){let i=Na(e.stdout,e.stderr);return new n(`COMMAND_FAILED`,i?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,d(e,{package:t,cmd:`adb`,args:r,hint:i?la:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}async function xa(e,t,n){await yt(e,[`shell`,`run-as`,t,`mkdir`,`-p`,`shared_prefs`]);for(let r of n)await yt(e,[`shell`,`run-as`,t,`tee`,r.path],{stdin:r.xml.trimEnd()})}function Sa(e,t){let r=s(e);if(r.code===`TOOL_MISSING`)return r;let i=Na(typeof r.details?.stdout==`string`?r.details.stdout:``,typeof r.details?.stderr==`string`?r.details.stderr:``);return new n(`COMMAND_FAILED`,i?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...r.details??{},package:t,cmd:`adb`,phase:`write-runtime-hints`,hint:i?la:`adb run-as succeeded, but writing React Native dev-server preferences failed. Inspect stderr/details for the failing shell command.`},r)}async function Ca(e,t,n){await nn(Ot(e,[`spawn`,e.id,`defaults`,`write`,t,sa,`-string`,`${n.host}:${n.port}`])),await nn(Ot(e,[`spawn`,e.id,`defaults`,`write`,t,ca,`-string`,n.scheme]))}async function wa(e,t){await nn(Ot(e,[`spawn`,e.id,`defaults`,`delete`,t,sa]),{allowFailure:!0}),await nn(Ot(e,[`spawn`,e.id,`defaults`,`delete`,t,ca]),{allowFailure:!0})}function Ta(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?ua:`${t}\n`}function Ea(e,t,n){let r=` <string name="${Ma(t)}">${Ma(n)}</string>`;return Oa(ka(e,t),r)}function Da(e,t,n){let r=` <boolean name="${Ma(t)}" value="${n?`true`:`false`}" />`;return Oa(ka(e,t),r)}function Oa(e,t){return Ta(e).replace(`</map>`,`${t}\n</map>`)}function ka(e,t){let n=ja(t);return Ta(e).replace(RegExp(`^\\s*<string name="${n}">[\\s\\S]*?<\\/string>\\n?`,`m`),``).replace(RegExp(`^\\s*<boolean name="${n}" value="(?:true|false)"\\s*\\/?>\\n?`,`m`),``)}function Aa(e){if(pt(e)!==`binary`)return;let t=mt(e);throw new n(`INVALID_ARGS`,t,{package:e,hint:t})}function ja(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Ma(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function Na(e,t){let n=`${e}\n${t}`.toLowerCase();return[`run-as: package not debuggable`,`run-as: permission denied`,`run-as: package is unknown`,`run-as: unknown package`,`is unknown`,`is not an application`,`could not set capabilities`].some(e=>n.includes(e))}const Pa=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Fa(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Ia(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return st(e)}}function La(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new n(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Ra(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return La(e)}}function za(e,t,r){if(e===void 0)return r;if(e!==`ios`&&e!==`android`)throw new n(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios" or "android".`);if(r&&e!==r)throw new n(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${r}.`);return e}function Ba(e){if(e===`ios`||e===`android`)return e}function Va(e,t){return{platform:t,metroHost:st(e?.metroHost),metroPort:La(e?.metroPort),bundleUrl:st(e?.bundleUrl),launchUrl:st(e?.launchUrl)}}function Ha(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Ua(e){if($i(e))return`10.0.2.2`;if(R(e))return`127.0.0.1`}function Wa(e,t){if(!e||st(e.metroHost)||st(e.bundleUrl)||e.metroPort===void 0)return e;let n=Ua(t);return n?{...e,metroHost:n}:e}function Ga(e){let{runtime:t,sessionName:r,platform:i}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new n(`INVALID_ARGS`,`open runtime must be an object.`);let a=t,o=Object.keys(a).find(e=>!Pa.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Pa.join(`, `)}.`);return{platform:za(a.platform,r,i),metroHost:Ia(a.metroHost,`metroHost`),metroPort:Ra(a.metroPort),bundleUrl:Ia(a.bundleUrl,`bundleUrl`),launchUrl:Ia(a.launchUrl,`launchUrl`)}}function Ka(e,t,n){if(n){if(Fa(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function qa(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?D(r):void 0,s=Ba(o)??i;if(a.platform&&r&&!s)throw new n(`INVALID_ARGS`,`Session runtime hints are only supported on iOS and Android sessions, but session "${t}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new n(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Ja(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Ba(D(i)):e.platform,o=n.getRuntimeHints(r),s=Ga({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=qa(n,r,i,a);return{runtime:i?Wa(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Fa(s)>0?s:void 0;return{runtime:i?Wa(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Ya(e){return Ja(e).runtime}function Xa(e){try{return{ok:!0,data:Ja(e)}}catch(e){let t=s(e);return N(t.code,t.message,t.details)}}async function Za(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!da(n)||da(r)||await pa({device:i.device,appId:i.appBundleId})}async function Qa(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await io(t);if(!$a(i))return N(`INVALID_ARGS`,`runtime requires set, show, clear, or port-reverse`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await eo(n,r,a,o):i===`show`?to(n,o):ro({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function $a(e){return e===`set`||e===`show`||e===`clear`}async function eo(e,t,n,r){return da(r)&&n?.appBundleId&&await pa({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function to(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function no(e){return e?D(e.device):void 0}function ro(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=no(i),s=Ba(t.flags?.platform??a?.platform??o);if(!s)return N(`INVALID_ARGS`,`runtime set only supports iOS and Android sessions. Pass --platform ios|android or open an iOS/Android session first.`);if(o!==void 0&&o!==s)return N(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Ha(a,Va(t.flags,s));return Fa(c)===0?N(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}async function io(e){let t=ao(e);if(!t.ok)return t.response;let n=await Xt(t.options);return n?{ok:!0,data:{action:`port-reverse`,...n}}:N(`UNSUPPORTED_OPERATION`,`No active provider device runtime supports port reverse for this lease.`)}function ao(e){let t=oo(e);if(!t.ok)return t;let n=so(e);if(!n.ok)return n;let r=e.flags?.portReverseName?.trim()||`runtime`;return{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:r}}}function oo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:N(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:N(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function so(e){let t=co(e.flags?.devicePort),n=co(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:N(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function co(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const lo=`open-command-roundtrip`,uo=`Not implemented for this platform in this release.`;function fo(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m}=e,h={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m};return o&&(h.appName=o),s&&(h.appBundleId=s),l&&(h.startup=l),u&&(h.timing=u),f&&p(f)>0&&(h.runtime=f),d&&(h.platform=D(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,d.platform===`android`&&(h.serial=d.id)),d&&k(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...ve(`Opened: ${o??s??t}`)}}function po(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s,saveScript:c}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,recordSession:t.recordSession||c,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,recordSession:c,actions:[]}}const mo=new Set([`app`,`desktop`,`frontmost-app`]);function ho(e,t,r){if(e.platform===`linux`){if(!t)return`app`;let e=_e(t);if(!mo.has(e))throw new n(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${t}")`);if(e!==`app`&&r)throw new n(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`);return e}if(!Fe(e)){if(t)throw new n(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}let i=t?_e(t):`app`;if(i!==`app`&&i!==`menubar`&&r)throw new n(`INVALID_ARGS`,`open --surface ${i} does not accept an app target`);return i}function go(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(Fe(t)||t.platform===`linux`)&&!n?i??`app`:ho(t,n,r)}async function _o(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await rn();return{appBundleId:t.bundleId,appName:t.appName}}async function vo(e,t,n){if(!(!O(e.platform)||!t))return gt(t)?Fe(e)?void 0:e.kind===`device`?vt(n,t):_t(t)?void 0:n??await yo(e,t):await bo(e,t)}async function yo(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function bo(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function xo(e,t){if(!(e.platform!==`android`||!t||gt(t)))try{let{resolveAndroidApp:n}=await import(`./app-lifecycle.js`).then(e=>e.t),r=await n(e,t);return r.type===`package`?r.value:void 0}catch{return}}async function So(e,t,n){if(n||e.platform!==`android`||!t||!gt(t))return n;try{let{getAndroidAppState:t}=await import(`./app-lifecycle.js`).then(e=>e.t);return(await t(e)).package?.trim()||n}catch{return n}}function Co(e,t){return e.platform===`android`&&!!(t&>(t))}async function wo(e,t,n,r){return k(e)&&M(e)?n:await vo(e,t,n)??await r(e,t)??(Co(e,t)?n:void 0)}function To(e){return N(`INVALID_ARGS`,e)}function Eo(e,t,r,i){try{return go({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return N(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}function Do(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&>(n)?To(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&pt(n)===`binary`?To(mt(n)):null:To(`open --relaunch is supported only for app surfaces.`):null}function Oo(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&>(n)?To(`open --relaunch does not support URL targets.`):r===`android`&&n&&pt(n)===`binary`?To(mt(n)):null:null}async function ko(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await sr(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await Ao({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=Xa({req:t,sessionStore:r,sessionName:n,device:i});if(!d.ok)return{type:`response`,response:d};if(s){let{runtime:e,previousRuntime:t,replacedStoredRuntime:n}=d.data;await Za({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function Ao(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await _o(n);return{appBundleId:a.appBundleId??await wo(t,r,i,xo),appName:a.appName??r}}const jo=new Map;function Mo(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){t.scriptRecordingState=`armed`,t.recordSession=!0;return}n?.scriptRecordingState===`armed`&&(t.scriptRecordingState=`aborted`,t.recordSession=!1,i.warnings=[...Array.isArray(i.warnings)?i.warnings.filter(e=>typeof e==`string`):[],`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`])}async function No(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;O(t.platform)&&!R(t)&&await sn(t.id),await Kt(t,`close`,[n],r,i),await ta(t,300)}async function Po(e){let{runtime:t,device:n,req:r,logPath:i,appBundleId:a,traceLogPath:o,openPositionals:s}=e,c=t?.launchUrl;if(!c||s.length===0||s.length>1)return;let l=s[0]?.trim();!l||gt(l)||await Kt(n,`open`,[c],r.flags?.out,{...Fo(i,r.flags,a,o)})}function Fo(e,t,n,r){let i=qt(e,t,n,r);return delete i.launchConsole,delete i.launchArgs,i}function Io(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}async function Lo(e,t,n){if(Io(e,t))try{await vn(e,{stateDir:n})}catch(t){u({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,error:t instanceof Error?t.message:String(t)}})}}function Ro(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:lo,appTarget:t,appBundleId:n}}function zo(e){return!(!e.shouldRelaunch||!e.openTarget||e.collapseSimulatorRelaunch||!e.existingSession&&M(e.device))}async function Bo(e){let{req:t,sessionName:n,sessionStore:r,logPath:i,device:a,openTarget:o,openPositionals:s,appName:c,surface:d,appBundleId:f,runtime:p,existingSession:m,deviceClaim:h}=e,g=t.flags?.relaunch===!0,_=m?.trace?.outPath,v=f,y=Date.now(),b={},x=k(a)&&!M(a)&&d===`app`&&s.length>0&&!!v,S=nr({req:t,logPath:i,appBundleId:v,traceLogPath:_}),C=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,ee,te=!1,w=!1,ne=(e=S)=>{te=!0,b.runnerPrewarmKind=`session`,b.runnerPrewarmScheduled=!0,ee=on(a,e)},re=async()=>{if(!ee||w)return;w=!0;let e=Date.now();await ee,b.runnerPrewarmWaited=!0,b.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};x&&R(a)&&!C&&ne();let ie=g&&!!o&&s.length===1&&R(a)&&!M(a)&&t.flags?.clearAppState!==!0;if(zo({shouldRelaunch:g,openTarget:o,collapseSimulatorRelaunch:ie,device:a,existingSession:m})&&o){m&&hn(m);let e=v??o,n=Date.now();await No({device:a,closeTarget:e,outFlag:t.flags?.out,context:{...qt(i,t.flags,v??m?.appBundleId,_)}}),b.relaunchCloseDurationMs=Math.max(0,Date.now()-n)}let ae=Date.now();await fa({device:a,appId:v,runtime:p}),b.runtimeHintsDurationMs=Math.max(0,Date.now()-ae),x&&C&&(ne({...S,propagateError:!0}),await re());let oe=w,se=Date.now(),ce=await Vo({req:t,sessionName:n,sessionStore:r,device:a,surface:d,sessionAppBundleId:v,appName:c,existingSession:m});if(ce.type===`response`)return ce.response;let le=ce.session??m;le&&hn(le),await Kt(a,`open`,s,t.flags?.out,{...qt(i,t.flags,v),...ie?{terminateRunningApp:!0}:{}}),b.openDispatchDurationMs=Math.max(0,Date.now()-se),await Lo(a,t,r.resolveDaemonStateDir());let ue=Date.now();await Po({runtime:p,device:a,req:t,logPath:i,appBundleId:v,traceLogPath:_,openPositionals:s}),b.launchUrlDurationMs=Math.max(0,Date.now()-ue),x&&!te&&ne(),g?await re():ee&&!w&&(b.runnerPrewarmWaited=!1),!M(a)&&R(a)&&(g||oe)&&await dn(a,S),v=await So(a,o,v),a.platform===`android`&&v&&await zn(a,v);let de=o?Ro(se,o,v):void 0,fe=Date.now();if(await ta(a,300),b.postOpenSettleDurationMs=Math.max(0,Date.now()-fe),wt(t.meta?.requestId)){let e=jt();return N(e.code,e.message,e.details)}m&&Or(m,`open`,m.snapshot);let pe=po({existingSession:le,sessionName:m?.name??$n(t),sessionScope:m?.sessionScope??Xr(t),device:a,surface:d,appBundleId:v,appName:c,saveScript:!!t.flags?.saveScript});pe.lease=cr({req:t,existingLease:m?.lease}),h&&(pe.deviceClaim=h),t.runtime!==void 0&&Ka(r,n,p);let me=r.ensureSessionDir(n),he=Se(me,t.meta?.requestId??l().requestId);b.totalDurationMs=Math.max(0,Date.now()-y),u({level:`info`,phase:`open_timing`,durationMs:b.totalDurationMs,data:b});let ge=fo({sessionName:pe.name,sessionStateDir:me,runnerLogPath:je(me),requestLogPath:he,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:v,surface:d,startup:de,timing:b,device:a,runtime:p,runtimeHintCount:Fa,sessionReused:m!==void 0});return Mo({session:pe,existingSession:m,saveScriptRequested:!!t.flags?.saveScript,responseData:ge}),r.set(n,pe),r.recordAction(pe,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:ge}),{ok:!0,data:ge}}async function Vo(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,sessionAppBundleId:o,appName:s,existingSession:c}=e,l=t.internal?.openLifecycle?.beforeDispatch;if(!l)return{type:`session`,session:c};let u=po({existingSession:c,sessionName:c?.name??$n(t),sessionScope:c?.sessionScope??Xr(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=cr({req:t,existingLease:c?.lease}),r.set(n,u);let d=await l(u);return d&&!d.ok?{type:`response`,response:d}:{type:`session`,session:r.get(n)??u}}function Ho(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return Hr(t,i)?N(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):N(`DEVICE_IN_USE`,`Device is already in use by session "${i.name}".`,{session:i.name,deviceId:n.id,deviceName:n.name,hint:Wr(i,`device-in-use`)})}async function Uo(e){let{req:t,device:n,sessionName:r,logPath:i}=e;return Kr(t.meta,M(n))?await Yr({device:n,session:r,workspace:t.meta?.cwd??process.cwd(),stateDir:I.dirname(i)}):{}}async function Wo(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s}=e,c=Ho({req:t,device:a,sessionStore:i});if(c)return c;let l=await Uo({req:t,device:a,sessionName:n,logPath:r}),u={mayHaveStarted:!1};try{let e=await ko({req:t,sessionName:n,sessionStore:i,device:a,surface:o,openTarget:s,onIosSimulatorColdBootStart:ar({req:t,logPath:r,device:a,surface:o,openTarget:s})});if(e.type===`response`)return await Go(l.ownership,u),e.response;u.mayHaveStarted=!0;let c=await Bo({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:s,openPositionals:t.positionals??[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtime:e.details.runtime,surface:o,deviceClaim:l.ownership});return c.ok||await Go(l.ownership,u),c}catch(e){throw await Go(l.ownership,u),e}}async function Go(e,t){if(e){if(t.mayHaveStarted){u({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await Qn(e)}}async function Ko(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n);if(a){if(t.flags?.saveScript)return N(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let e=t.flags?.relaunch===!0,o=t.positionals?.[0],s=o??(e?a.appName:void 0),c=Eo(a.device,t.flags?.surface,s,a.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return To(e?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let l=Do({shouldRelaunch:e,openTarget:s,surface:c,device:a.device});if(l)return l;let u=await na(a.device),d=await ko({req:t,sessionName:n,sessionStore:i,device:u,surface:c,openTarget:s,existingSession:a,onIosSimulatorColdBootStart:ar({req:t,logPath:r,device:u,surface:c,openTarget:s,traceLogPath:a.trace?.outPath})});return d.type===`response`?d.response:await Bo({req:t,sessionName:n,sessionStore:i,logPath:r,device:u,openTarget:s,openPositionals:o?t.positionals??[]:s?[s]:[],appBundleId:d.details.appBundleId,appName:d.details.appName,runtime:d.details.runtime,surface:c,existingSession:a})}let o=t.flags?.relaunch===!0,s=t.positionals?.[0];if(o&&!s)return To(`open --relaunch requires an app argument.`);let c=Oo({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform===`android`?`android`:void 0});if(c)return c;let l=await Vt(t.flags??{}),u=Eo(l,t.flags?.surface,s);return typeof u==`string`?Do({shouldRelaunch:o,openTarget:s,surface:u,device:l})||await kt(jo,l.id,async()=>await Wo({req:t,sessionName:n,logPath:r,sessionStore:i,device:l,surface:u,openTarget:s})):u}function qo(e){return R(e)||$i(e)}async function Jo(t){if(t.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return R(t)?await Yo(t):await Zo(t)}catch(t){let n=e(t);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function Yo(e){let t=await fi(e);return t.success?t:await Xo(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function Xo(e){try{return await pi(e)}catch{return null}}async function Zo(e){let t=await yt(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}async function Qo(e){let{device:t,shutdownRequested:n}=e;if(n&&!M(t)&&qo(t))return await Jo(t)}function $o(e,t){return!!(e.flags?.force||t.saveScriptForce)}function es(e,t){return R(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function ts(e){return O(e.device.platform)&&!R(e.device)}function ns(e,t,n){if(t.saveScriptBoundary===void 0)return{kind:`not-armed`};let r=t.actions.length;lr(e,t,n,`close`,{session:t.name,...ve(`Closed: ${t.name}`)});let i=e.writeSessionLog(t,{force:$o(n,t)});return i.written?{kind:`committed`,path:i.path}:i.error?(t.actions.length=r,{kind:`failed`,error:i.error}):{kind:`committed`}}function rs(t,n){let r=e(n);return{ok:!1,error:{...r,details:{...r.details,session:t.name,...t.saveScriptPath?{savedScript:t.saveScriptPath}:{}},retriable:!0}}}function is(e){return e instanceof n?e:new n(`COMMAND_FAILED`,`The platform close failed: ${e instanceof Error?e.message:String(e)}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}async function as(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,cleanupFailures:o,repairArmed:s}=e,c=async(e,t)=>{try{await t()}catch(t){o.push({step:e,error:t})}},l=es(t,n);await os(n,a,c);let u=e.skipPlatformClose?void 0:await us({req:t,session:n,logPath:i});return await fs(l,n,c),await ds(n,a,r),s||(u||lr(a,n,t,`close`,{session:n.name,...ve(`Closed: ${n.name}`)}),t.flags?.saveScript&&(n.recordSession=!0),a.writeSessionLog(n,{force:$o(t,n)})),await c(`materialized_paths`,()=>Zn(r)),u}async function os(e,t,n){await n(`recording`,()=>_r(e)),await n(`app_log`,()=>Tr(e)),await n(`audio_probe`,async()=>{await Br(e,`session-close`)}),await n(`apple_perf`,()=>Pr(e)),await n(`android_native_perf`,()=>fr(e)),await n(`android_snapshot_helper`,()=>Yn(e)),await n(`android_ime`,()=>Sr(e,t.resolveDaemonStateDir()))}function ss(e){return JSON.stringify(e.positionals??[])}async function cs(e){let{req:t,session:n,logPath:r,sessionStore:i}=e,a=n.saveScriptBoundary!==void 0,o=ss(t);if(a&&!(n.repairPlatformCloseSucceeded&&n.repairPlatformCloseIdentity===o)){let e=await us({req:t,session:n,logPath:r});if(e)return{response:rs(n,is(e))};n.repairPlatformCloseSucceeded=!0,n.repairPlatformCloseIdentity=o}let s=ns(i,n,t);return s.kind===`failed`?{response:rs(n,s.error)}:(n.repairPlatformCloseSucceeded=!1,n.repairPlatformCloseIdentity=void 0,{repairArmed:a,...s.kind===`committed`?{healedScriptPath:s.path}:{}})}async function ls(t){try{return{providerData:await ur(t)}}catch(n){let r=e(n);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:t.session.name},retriable:!0}}}}}async function us(e){let{req:t,session:n,logPath:r}=e;if(gs(t,n)){if(ts(n))try{await Mr(n)}catch(e){return e}try{hn(n),await Kt(n.device,`close`,t.positionals??[],t.flags?.out,{...qt(r,t.flags,n.appBundleId,n.trace?.outPath)}),await ta(n.device,300);return}catch(e){return e}}}async function ds(e,t,n){!da(t.getRuntimeHints(n))||!e.appBundleId||await pa({device:e.device,appId:e.appBundleId}).catch(()=>{})}async function fs(e,t,n){if(O(t.device.platform)){if(!e){await n(`apple_runner`,()=>Mr(t));return}u({level:`debug`,phase:`ios_runner_retained_after_close`,data:{session:t.name,deviceId:t.device.id}}),an(t.device.id)}}function ps(e,t){if(e.flags?.saveScript&&!(t.scriptRecordingState!==`aborted`&&t.scriptRecordingState!==`published`))throw new n(`INVALID_ARGS`,`close --save-script cannot ${t.scriptRecordingState===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function ms(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await vs(t,r);if(ps(t,s),t.internal?.closeAppOnly===!0)return await hs({req:t,session:s,logPath:r});let c=await cs({req:t,session:s,logPath:r,sessionStore:i});if(`response`in c)return c.response;let l=[],u=await as({req:t,session:s,sessionName:n,logPath:r,sessionStore:i,cleanupFailures:l,repairArmed:c.repairArmed,skipPlatformClose:c.repairArmed}),d=await ls({session:s,leaseRegistry:a,leaseLifecycleProvider:o});if(d.response)return d.response;let f=Ir({sessionName:n,phase:`session_close_cleanup_failed`,failures:l});if(!u&&!f&&await Qn(s.deviceClaim),i.delete(n),u)throw u;if(f)throw f;let p=await Qo({device:s.device,shutdownRequested:t.flags?.shutdown}),m=c.healedScriptPath?{savedScript:c.healedScriptPath}:{};return p?{ok:!0,data:S({session:s.name,shutdown:p,...m,...d.providerData?{provider:d.providerData}:{}},`Closed: ${s.name}`)}:{ok:!0,data:{session:s.name,...ve(`Closed: ${s.name}`),...m,...d.providerData?{provider:d.providerData}:{}}}}async function hs(e){let{req:t,session:n,logPath:r}=e,i=t.positionals?.[0];if(!i)return N(`INVALID_ARGS`,`App-only close requires an app target`);let a=await us({req:t,session:n,logPath:r});if(a)throw a;return{ok:!0,data:{app:i,...ve(`Closed: ${i}`)}}}function gs(e,t){return _s(e)||t.device.platform===`web`}function _s(e){return(e.positionals?.length??0)>0}async function vs(e,t){if(!e.positionals||e.positionals.length===0)return N(`SESSION_NOT_FOUND`,`No active session`);let n=await B({session:void 0,flags:e.flags,ensureReady:!0});return await Kt(n,`close`,e.positionals,e.flags?.out,{...qt(t,e.flags)}),await ta(n,300),{ok:!0,data:{app:e.positionals[0],...ve(`Closed: ${e.positionals[0]}`)}}}const ys={ios:async(e,t,n)=>{let r=await Yt(e,t,n,{relaunch:!0,appIdentifierHint:t});if(r)return{bundleId:r.bundleId??r.launchTarget??t};let{reinstallIosApp:i}=await import(`./apps.js`).then(e=>e.t);return await i(e,t,n)},android:async(e,t,n)=>{let r=await Yt(e,t,n,{relaunch:!0,packageNameHint:t});if(r)return{package:r.packageName??r.launchTarget??t};let{reinstallAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t);return await i(e,t,n)}},bs={ios:async(e,t,n)=>{let r=await Yt(e,t,n,{appIdentifierHint:t});if(r)return{bundleId:r.bundleId,appName:r.appName,launchTarget:r.launchTarget};let{installIosApp:i}=await import(`./apps.js`).then(e=>e.t),a=await i(e,n,{appIdentifierHint:t});return{bundleId:a.bundleId,appName:a.appName,launchTarget:a.launchTarget}},android:async(e,t,n)=>{let r=await Yt(e,t,n,{packageNameHint:t});if(r)return{package:r.packageName,appName:r.appName,launchTarget:r.launchTarget};let{installAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t),a=await i(e,n);return{package:a.packageName,appName:a.appName,launchTarget:a.launchTarget}}};async function xs(e){let{req:t,command:n,sessionName:r,sessionStore:i,deployOps:a}=e,o=i.get(r),s=t.flags??{},c=z(n,o,s);if(c)return c;let l=Ts(n,t.positionals??[]);if(!l.ok)return l.response;let{app:u,appPathInput:d}=l,f=t.meta?.uploadedArtifactId;try{let e=f?gr(f,t.meta?.tenantId):E.expandHome(d);if(!F.existsSync(e))return N(`INVALID_ARGS`,`App binary not found: ${e}`);let r=await B({session:o,flags:s,ensureReady:!1}),c=Wt(n,r);if(c)return c;o&&hn(o);let l=k(r)?Cs(u,e,await a.ios(r,u,e)):ws(u,e,await a.android(r,u,e)),p=S(l,Ss(l));return lr(i,o,t,n,p),{ok:!0,data:p}}finally{f&&xn(f)}}function Ss(e){return`Installed: ${e.appName??pe(e)}`}function Cs(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 ws(e,t,n){let r=n.package;return{app:e||r||n.launchTarget||t,appPath:t,platform:`android`,...r?{appId:r,package:r,packageName:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Ts(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:N(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:N(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}async function Es(e,t,n){return await nt(e,t,n)}async function Ds(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`session_list`){let e=Xr(t);return{ok:!0,data:{sessions:r.toArray().filter(t=>qr(t,e)).map(e=>{let t=r.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:je(t),platform:D(e.device),...O(e.device.platform)&&e.device.appleOs?{appleOs:e.device.appleOs}:{},target:e.device.target??`mobile`,surface:e.surface??`app`,device:e.device.name,id:e.device.id,device_id:e.device.id,createdAt:e.createdAt,...O(e.device.platform)&&!Fe(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if(t.command===`devices`)try{let e=bt(t.flags?.androidDeviceAllowlist),n=t.flags?.platform,r=Le({simulatorSetPath:xt(t.flags?.iosSimulatorDeviceSet),platform:n,target:t.flags?.target}),i=await Ht({platform:n,target:t.flags?.target,deviceName:t.flags?.device,udid:t.flags?.udid,serial:t.flags?.serial,iosSimulatorSetPath:r,androidSerialAllowlist:e?Array.from(e).sort():void 0}),a=n?i.filter(e=>ks(e,n)):i;return{ok:!0,data:{devices:(t.flags?.target?a.filter(e=>(e.target??`mobile`)===t.flags?.target):a).map(Os)}}}catch(e){let t=s(e);return N(t.code,t.message,t.details)}if(t.command===`capabilities`){let e=r.get(n),i=t.flags??{},a=z(t.command,e,i);if(a)return a;let o=await B({session:e,flags:i,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0});return{ok:!0,data:{device:Os(o),availableCommands:Bt().filter(e=>Jt(e,o))}}}if(t.command===`apps`){let e=r.get(n),i=t.flags??{},a=z(t.command,e,i);if(a)return a;let o=await B({session:e,flags:i,ensureReady:!0}),s=Wt(`apps`,o);if(s)return s;let c=dt(t.flags?.appsFilter);return O(o.platform)?{ok:!0,data:{apps:(await mi(o,c)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await ht(o,c)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}function Os({simulatorSetPath:e,appleOs:t,...n}){return{...n,platform:D({platform:n.platform,appleOs:t}),...O(n.platform)&&t?{appleOs:t}:{}}}function ks(e,t){return ze(e,t)}async function As(e){let{ensureAndroidEmulatorBooted:t}=await import(`./logcat.js`).then(e=>e.c);return await t(e)}const js=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Ms=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function Ns(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&ea(a))return N(`SESSION_NOT_FOUND`,o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`);let s=z(`appstate`,i,a);if(s)return s;let c=O(i?.device.platform)&&ia(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return N(`SESSION_NOT_FOUND`,js);if(u&&!c)return N(`SESSION_NOT_FOUND`,Ms);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?Fe(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:D(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:N(`COMMAND_FAILED`,`No foreground app is tracked for this ${Fe(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:D(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...k(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await B({session:i,flags:a,ensureReady:!0});if(k(d))return N(`SESSION_NOT_FOUND`,js);if(Fe(d))return N(`SESSION_NOT_FOUND`,Ms);if(d.platform===`web`)return N(`UNSUPPORTED_OPERATION`,`appstate is not supported on web.`);let{getAndroidAppState:f}=await import(`./app-lifecycle.js`).then(e=>e.t),p=await f(d);return{ok:!0,data:{platform:`android`,package:p.package,activity:p.activity}}}async function Ps(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;if(t.command===`boot`){let e=i.get(n),a=t.flags??{},o=z(t.command,e,a);if(o)return o;let c=(a.platform??e?.device.platform)===`android`,l=a.headless===!0;if(l&&!c)return N(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);let u=ra({flags:a,sessionDevice:e?.device}),d=c&&!!u,f,p=!1;try{f=await B({session:e,flags:a,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(e){let t=s(e);if(c&&l&&!u&&t.code===`DEVICE_NOT_FOUND`)return N(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);if(!d||t.code!==`DEVICE_NOT_FOUND`||!u)throw e;f=await As({avdName:u,serial:a.serial,headless:l}),p=!0}if(a.target&&(f.target??`mobile`)!==a.target)return N(`DEVICE_NOT_FOUND`,`No ${f.platform} device found matching --target ${a.target}.`);if(c&&l){if(f.platform!==`android`||f.kind!==`emulator`)return N(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);if(!p){let t=ra({flags:a,sessionDevice:e?.device,resolvedDevice:f});if(!t)return N(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);f=await As({avdName:t,serial:a.serial,headless:!0})}await sr(f)}else f.platform===`android`&&f.kind===`emulator`&&f.booted!==!0?(f=await As({avdName:f.name,serial:a.serial,headless:!1}),await sr(f)):(f.platform!==`android`||f.booted!==!0)&&await sr(f,{onIosSimulatorColdBootStart:Dr({req:t,logPath:r,device:f,enabled:!0})});return Wt(`boot`,f)||(k(f)&&f.kind===`simulator`&&ln(f,{}),{ok:!0,data:{platform:D(f),target:f.target??`mobile`,device:f.name,id:f.id,kind:f.kind,booted:!0,...O(f.platform)&&f.appleOs?{appleOs:f.appleOs}:{}}})}if(t.command===`shutdown`){let e=i.get(n),r=t.flags??{},a=z(t.command,e,r);if(a)return a;let o=await B({ensureReady:!1,flags:r,session:e}),s=Wt(`shutdown`,o,{message:`shutdown is supported only for Apple simulators and Android emulators.`});if(s)return s;if(e&&e.device.platform===o.platform&&e.device.id===o.id)return N(`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:D(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind});let c=await Jo(o);return c.success?{ok:!0,data:{platform:D(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c,...O(o.platform)&&o.appleOs?{appleOs:o.appleOs}:{}}}:N(c.error?.code??`COMMAND_FAILED`,Fs(c),{platform:D(o),target:o.target??`mobile`,device:o.name,id:o.id,kind:o.kind,shutdown:c})}return t.command===`appstate`?await Ns({req:t,sessionName:n,sessionStore:i}):null}function Fs(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}tn();function Is(e){let t=[];for(let n of e){if(n.command!==`open`)continue;let e=n.result?.startup;if(!e||typeof e!=`object`)continue;let r=e;typeof r.durationMs!=`number`||!Number.isFinite(r.durationMs)||typeof r.measuredAt!=`string`||r.measuredAt.trim().length===0||r.method!==`open-command-roundtrip`||t.push({durationMs:Math.max(0,Math.round(r.durationMs)),measuredAt:r.measuredAt,method:lo,appTarget:typeof r.appTarget==`string`&&r.appTarget.length>0?r.appTarget:void 0,appBundleId:typeof r.appBundleId==`string`&&r.appBundleId.length>0?r.appBundleId:void 0})}return t.slice(-20)}async function Ls(e,t={}){let n=Vs(e);if(!Ys(e))return n;if(!e.appBundleId)return Ks(n,e),n;let r=Rs(e.device);return r&&qs(n,e,await r(e,e.appBundleId,t)),n}function Rs(e){let t=Zt(e.platform)?.perf?.metricsSamplerTag(e);return t?rc[t]:void 0}async function zs(e,t={}){let n=Ws(e);return Ys(e)?e.appBundleId?(await Js(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:Xs(e)},n):n}async function Bs(e,t){let n=Gs(e);return Ys(e)?t.action===`sample`?(n.metrics={memory:await ic(e,t)},n):(n.artifact=await oc(e,t),n.support=fc(n.artifact.support)??dc(e),n):t.action===`snapshot`?(n.artifact=lc(e,sc(e,t.kind)),n.support=fc(n.artifact.support)??dc(e),n):(n.metrics={memory:{available:!1,reason:uo}},n)}function Vs(e){let t=Is(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:lo,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:lo};return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,...Hs()},sampling:{startup:{method:lo,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Zs(e)}}}function Hs(){return{fps:Us(),memory:{available:!1,reason:uo},cpu:{available:!1,reason:uo}}}function Us(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function Ws(e){return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:Us()},sampling:{fps:ec(e)}}}function Gs(e){return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:Qs(e),snapshot:$s(e)}}}function Ks(e,t){let n=Xs(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}function qs(e,t,n){e.metrics.memory=mc(n.memory),e.metrics.cpu=mc(n.cpu),e.metrics.fps=hc(mc(n.fps),t)}async function Js(e,t,n,r){let i=t.device.platform===`android`?await pc(Vn(t.device,n,{adb:r.androidAdb})):await pc(wr(t.device,n));e.metrics.fps=hc(mc(i),t)}function Ys(e){return Zt(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function Xs(e){return e.device.platform===`android`?`No Android app package is associated with this session. Run open <app> first.`:`No Apple app bundle ID is associated with this session. Run open <app> first.`}function Zs(e){return e.device.platform===`android`?{memory:{method:Mn,description:An,unit:`kB`},cpu:{method:gn,description:hr,unit:`percent`},fps:{method:Dn,description:Cn,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:ir(e.device)}function Qs(e){return e.device.platform===`android`?{method:Mn,description:An,unit:`kB`,topConsumerLimit:5}:ir(e.device).memory}function $s(e){return e.device.platform===`android`?{method:kn,description:mr,defaultKind:`android-hprof`,artifactOnly:!0}:{method:Gn,description:Hn,defaultKind:`memgraph`,artifactOnly:!0}}function ec(e){return e.device.platform===`android`?{method:Dn,description:Cn,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:Nn(e.device)}async function tc(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([On(e.device,t,r),Tn(e.device,t,r),Vn(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function nc(e,t){let n=await pc(wr(e.device,t)),r=await pc(Nr(e.device,t));if(r.status===`fulfilled`){let e=r.value;return{memory:{status:`fulfilled`,value:e.memory},cpu:{status:`fulfilled`,value:e.cpu},fps:n}}return{memory:{status:`rejected`,reason:r.reason},cpu:{status:`rejected`,reason:r.reason},fps:n}}const rc={android:tc,apple:nc};async function ic(e,t){return e.appBundleId?mc(e.device.platform===`android`?await pc(On(e.device,e.appBundleId,{adb:t.androidAdb})):await pc(ac(e))):{available:!1,reason:Xs(e)}}async function ac(e){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Xs(e));return(await Nr(e.device,e.appBundleId)).memory}async function oc(e,t){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Xs(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=sc(e,t.kind),i=cc(t,r);return e.device.platform===`android`?r===`android-hprof`?await Sn(e.device,e.appBundleId,i,{adb:t.androidAdb}):lc(e,r):r===`memgraph`?await Lr(e.device,e.appBundleId,i):lc(e,r)}function sc(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function cc(e,t){if(e.out)return E.expandHome(e.out,e.cwd);let n=t===`android-hprof`?`hprof`:t===`memgraph`?`memgraph`:`artifact`,r=new Date().toISOString().replace(/[:.]/g,`-`),i=e.sessionStore.ensureSessionDir(e.sessionName);return I.join(i,`artifacts`,`memory-${t}-${r}.${n}`)}function lc(e,t){let n=dc(e),r=uc(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function uc(e,t){return e.device.platform===`android`?{reason:`Android perf memory snapshot supports android-hprof, not ${t}.`,hint:`Use perf memory snapshot --kind android-hprof for Android Java heap artifacts.`}:O(e.device.platform)?{reason:`Apple perf memory snapshot supports memgraph, not ${t}.`,hint:`Use perf memory snapshot --kind memgraph for supported Apple app sessions.`}:{reason:`Memory snapshot artifacts are not supported on ${e.device.platform}.`,hint:`Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS.`}}function dc(e){return e.device.platform===`android`?{platform:e.device.platform,defaultKind:`android-hprof`,androidHprof:!0,memgraph:!1,heapprofd:!1,heapprofdDecision:`Deferred until Android Perfetto/heapprofd plumbing is available in the perf trace slice.`}:O(e.device.platform)?{...mn(e.device),androidHprof:!1,heapprofd:!1,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}:{platform:e.device.platform,defaultKind:`memgraph`,androidHprof:!1,memgraph:!1,heapprofd:!1,reason:`Memory snapshot artifacts are available only on Android, iOS simulator, and macOS.`,hint:`Use perf memory sample where supported, or switch to a platform with memory artifact support.`,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}}function fc(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function pc(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function mc(t){if(t.status===`fulfilled`)return{available:!0,...t.value};let n=e(t.reason);return{available:!1,reason:n.message,error:n}}function hc(e,t){if(e.available!==!0)return e;let n=gc(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function gc(e,t){let n=_c(t.windowStartedAt),r=_c(t.windowEndedAt)??_c(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(e=>e.ts>=n&&e.ts<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:vc(e)})).slice(-12)}function _c(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function vc(e){let t=e.result;if(t)for(let e of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}}async function yc(t){let n=bc(t.req,t.area);if(!n.ok)return n;let{session:r}=t;if(r.device.platform!==`android`)return N(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return N(`COMMAND_FAILED`,`No Android app package is associated with this session.`,{hint:`Run open <app> first so perf can resolve the package and process identity.`});try{return{ok:!0,data:n.area===`cpu`?await kc(t,r,r.appBundleId,n):await Ac(t,r,r.appBundleId,n)}}catch(t){return{ok:!1,error:e(t)}}}function bc(e,t){let n=Oc(e,t);return t===`cpu`?xc(e,n):Sc(e,n)}function xc(e,t){let n=Cc(e,1),r=Cc(e,2),i=Cc(e,3);return oe(n)?wc(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:N(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):N(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):N(`INVALID_ARGS`,re)}function Sc(e,t){let n=Cc(e,1),r=Cc(e,2);return Tc(n)?me(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:N(`INVALID_ARGS`,`perf trace requires --kind perfetto`):N(`INVALID_ARGS`,he):N(`INVALID_ARGS`,`perf trace action must be start or stop`)}function Cc(e,t){return(e.positionals?.[t]??``).toLowerCase()}function wc(e){return e===`start`||e===`stop`||e===`report`}function Tc(e){return e===`start`||e===`stop`}function Ec(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),Fc(t)}function Dc(e,t,n){return t?E.expandHome(t,e.req.meta?.cwd):Pc(e.sessionStore,e.sessionName,n)}function Oc(e,t){return typeof e.flags?.out==`string`&&e.flags.out.length>0?e.flags.out:(e.positionals??[])[t===`cpu`?5:4]||void 0}async function kc(e,t,n,r){if(r.action===`start`){Mc(t);let i=Dc(e,r.outPath,`cpu.perf.data`);return Ec(e,await Pn(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Ic(t,`cpu-profile`,r.kind);if(r.action===`report`){await jc(i);let n=Dc(e,r.outPath,`cpu-report.json`);return await _n(t.device,i,n,{adb:e.androidAdbExecutor})}let a=Nc(e,r.outPath,i);return Ec(e,await Zr(t.device,i,a,{adb:e.androidAdbExecutor}))}async function Ac(e,t,n,r){if(r.action===`start`){Mc(t);let i=Dc(e,r.outPath,`app.perfetto-trace`);return Ec(e,await Bn(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Ic(t,`trace`,r.kind),a=Nc(e,r.outPath,i);return Ec(e,await wn(t.device,i,a,{adb:e.androidAdbExecutor}))}function jc(e){if(e.state===`running`)throw new n(`COMMAND_FAILED`,`Stop the Android Simpleperf CPU profile before generating a report.`,{hint:`Run perf cpu profile stop --kind simpleperf, then retry perf cpu profile report --kind simpleperf.`})}function Mc(e){let t=e.nativePerf?.android;if(t?.state===`running`)throw new n(`COMMAND_FAILED`,`Android ${t.kind} ${t.type} is already running for this session.`,{hint:t.type===`cpu-profile`?`Run perf cpu profile stop --kind simpleperf before starting another Android native perf capture.`:`Run perf trace stop --kind perfetto before starting another Android native perf capture.`})}function Nc(e,t,n){return t?Dc(e,t,n.outPath):n.outPath}function Pc(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return I.join(e.ensureSessionDir(t),`${r}-${n}`)}function Fc(e){return{action:e.action,platform:`android`,type:e.type,kind:e.kind,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,durationMs:e.durationMs,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,summary:e.summary,message:e.message}}function Ic(e,t,r){let i=e.nativePerf?.android;if(i?.type===t&&i.kind===r)return i;throw new n(`COMMAND_FAILED`,`No Android ${r} ${t} is active for this session.`,{hint:t===`cpu-profile`?`Run perf cpu profile start --kind simpleperf first, then stop or report in the same session.`:`Run perf trace start --kind perfetto first, then stop in the same session.`})}async function Lc(e){if(!Qt(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const Rc=[`probe`],zc=[`start`,`status`,`stop`],Bc=`audio probe requires ${zc.join(`, `)}`;async function Vc(t){let n=Hc(t);if(!n.ok)return n;let r=await Lc(n.session.device);if(r)return await Wc(t,n,r);let i=yr();if(!i.probeAudio)return N(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);try{return{ok:!0,data:await i.probeAudio({action:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function Hc(e){let t=Uc(e);if(!t.ok)return t;let n=Gc(e.req);if(!n.ok)return n;let r=Kc(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function Uc(e){let t=e.sessionStore.get(e.sessionName);return t?Jt(`audio`,t.device)?{ok:!0,session:t}:N(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):N(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function Wc(t,n,r){try{return{ok:!0,data:await Kn({session:n.session,sessionName:t.sessionName,sessionStore:t.sessionStore,backend:r,probeAction:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function Gc(e){if(!qc(e.positionals?.[0]))return N(`INVALID_ARGS`,`audio requires probe`);let t=Jc(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:N(`INVALID_ARGS`,Bc)}function Kc(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return N(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=Yc(e.positionals?.[2],{defaultValue:1e4,min:100,max:12e4,message:`audio probe duration must be an integer in range 100..120000 ms`});if(n instanceof Error)return N(`INVALID_ARGS`,n.message);let r=Yc(e.positionals?.[3],{defaultValue:1e3,min:100,max:1e4,message:`audio probe bucket must be an integer in range 100..10000 ms`});return r instanceof Error?N(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function qc(e){let t=(e??`probe`).toLowerCase();return Rc.includes(t)?`probe`:void 0}function Jc(e){let t=(e??`status`).toLowerCase();return zc.includes(t)?t:void 0}function Yc(e,t){if(e===void 0)return t.defaultValue;let n=Number.parseInt(e,10);return!Number.isInteger(n)||String(n)!==e||n<t.min||n>t.max?Error(t.message):n}async function Xc(t,n){let r=Zc(t.req);if(!r.ok)return r;if(n.device.platform===`android`)return N(`UNSUPPORTED_OPERATION`,`Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.`);if(!O(n.device.platform))return N(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return N(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await nl(t,n,r):r.action===`stop`?await rl(t,n,r):await cl(t,n,r)}catch(t){return{ok:!1,error:e(t)}}}function Zc(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Qc(t):n===`trace`?$c(t):N(`INVALID_ARGS`,se)}function Qc(e){if(e[1]?.toLowerCase()!==`profile`)return N(`INVALID_ARGS`,`perf cpu requires profile`);let t=el(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=tl(e[3]);return n.ok?{ok:!0,area:`cpu`,mode:`cpu-profile`,action:t.value,kind:`xctrace`,template:e[4]||void 0,outPath:e[5]||void 0,tracePath:e[6]||void 0}:n}function $c(e){let t=el(e[1],`perf trace`,!1);if(!t.ok)return t;let n=tl(e[2]);return n.ok?{ok:!0,area:`trace`,mode:`trace`,action:t.value,kind:`xctrace`,template:e[3]||void 0,outPath:e[4]||void 0,tracePath:e[5]||void 0}:n}function el(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:N(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function tl(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:N(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function nl(e,t,n){if(t.applePerf?.active)return N(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??fl(n.mode),i=dl(e,n),a=await Ar({device:t.device,appBundleId:t.appBundleId,mode:n.mode,template:r,outPath:i});t.applePerf={...t.applePerf??{},active:a},e.sessionStore.set(e.sessionName,t);let o=pl(`started`,a);return ul(e,t,o),{ok:!0,data:o}}async function rl(e,t,n){let r=t.applePerf?.active;if(!r)return N(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?E.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await En(r,i)}catch(n){throw al(n)&&il(e,t),n}ol(e,t,a);let o=pl(`stopped`,a);return ul(e,t,o),{ok:!0,data:o}}function il(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function al(e){return s(e).details?.captureCleanedUp===!0}function ol(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...sl(n)},e.sessionStore.set(e.sessionName,t)}function sl(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function cl(e,t,n){if(n.mode!==`cpu-profile`)return N(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return N(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=dl(e,n),i=ll(t,n);if(!i.ok)return i;let a={perf:`reported`,...await Wn({tracePath:E.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return ul(e,t,a),{ok:!0,data:a}}function ll(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:N(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function ul(e,t,n){lr(e.sessionStore,t,e.req,`perf`,n)}function dl(e,t){if(t.outPath)return E.expandHome(t.outPath,e.req.meta?.cwd);let n=e.sessionStore.ensureSessionDir(e.sessionName),r=new Date().toISOString().replace(/[:.]/g,`-`),i=t.action===`report`?`json`:`trace`;return`${n}/perf-${t.mode}-${r}.${i}`}function fl(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function pl(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}const ml=`logs requires ${ce.slice(0,-1).join(`, `)}, or ${ce.at(-1)}`,hl=[`dump`,`log`],gl=`network requires ${hl.join(` or `)}`,_l=`network include mode must be one of: ${o.join(`, `)}`,vl={path:({session:e,sessionName:t,sessionStore:n})=>Wl(e,t,n),doctor:({session:e,sessionName:t,sessionStore:n})=>Gl(e,t,n),mark:({req:e,sessionName:t,sessionStore:n})=>Kl(e,t,n),clear:({session:e,sessionName:t,sessionStore:n,restart:r})=>ql(e,t,n,r),start:({session:e,sessionName:t,sessionStore:n})=>Jl(e,t,n),stop:({session:e,sessionName:t,sessionStore:n})=>Yl(e,t,n)};function yl(e){if(e.appLog){let t=e.appLog.getState();return{active:t===`active`||t===`recovering`,state:t,backend:e.appLog.backend,startedAt:e.appLog.startedAt,notes:Sl(t)}}return e.appLogFailure?{active:!1,state:`failed`,backend:e.appLogFailure.backend,failureCode:e.appLogFailure.code,failureMessage:e.appLogFailure.message,hint:e.appLogFailure.hint,notes:[xl(e.appLogFailure)]}:{active:!1,state:`inactive`,backend:kr(e.device)}}function bl(e,t){return{backend:t,code:e.code,message:e.message,hint:e.hint}}function xl(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Sl(e){if(e===`failed`)return[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`];if(e===`ended`)return[`The app log stream process ended. Run logs clear --restart before the next capture window.`]}function Cl(e,t){return tr([...e,...t.notes??[]])}function wl(e,t,n){return{...n,platform:e.device.platform,outPath:t}}function Tl(t,n,r,i){let a=e(i);return t.set(n,{...r,appLog:void 0,appLogFailure:bl(a,kr(r.device))}),{ok:!1,error:a}}async function El(e){let{req:t}=e;return t.command===`perf`?Ol(e):t.command===`logs`?Hl(e):t.command===`events`?await Dl(e):t.command===`network`?Xl(e):t.command===`audio`?await Vc(e):null}async function Dl(t){let{req:n,sessionName:r,sessionStore:i}=t;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(t){return{ok:!1,error:e(t)}}}async function Ol(t){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=t,o=i.get(r);if(!o)return N(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=(n.positionals?.[0]??`metrics`).toLowerCase();if(kl(s))return o.device.platform===`android`?await yc({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await Xc(t,o);let c=Al(n);if(!c.ok)return c;if(c.native)return await Xc(t,o);try{return{ok:!0,data:await jl(t,o,c)}}catch(t){return{ok:!1,error:e(t)}}}function kl(e){return e===`cpu`||e===`trace`}function Al(t){let r=Ml(t.positionals?.[0]);if(!r)return N(`INVALID_ARGS`,se);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=Nl(t.positionals?.[1]);if(!i)return N(`INVALID_ARGS`,te);let a=Pl(t.flags?.kind);return a instanceof n?{ok:!1,error:e(a)}:(Fl(r,i)??Rl(t,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:Vl(t.flags?.out)}}async function jl(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await Bs(t,{action:Ll(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await zs(t,{androidAdb:a}):await Ls(t,{androidAdb:a})}function Ml(e){let t=(e??`metrics`).toString().toLowerCase();return ae(t)?t:void 0}function Nl(e){let t=(e??`sample`).toString().toLowerCase();return ye(t)?t:void 0}function Pl(e){if(e!==void 0)return typeof e!=`string`||!me(e)?new n(`INVALID_ARGS`,he):e}function Fl(e,t){if(e===`memory`)return Il(t)?void 0:N(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return N(`INVALID_ARGS`,`perf metrics and perf frames only support sample`)}function Il(e){return e===`sample`||e===`snapshot`}function Ll(e){if(Il(e))return e;throw new n(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function Rl(e,t,n,r){return zl(e.flags?.out,t,n)??Bl(r,t,n)}function zl(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return N(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function Bl(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return N(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!be(e))return N(`INVALID_ARGS`,de)}}function Vl(e){return typeof e==`string`&&e.length>0?e:void 0}async function Hl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return N(`SESSION_NOT_FOUND`,`logs requires an active session`);let a=Wt(`logs`,i.device);if(a)return a;let o=Ul(t);return o.ok?await vl[o.action]({...e,session:i,restart:o.restart}):o}function Ul(e){let t=(e.positionals?.[0]??`path`).toLowerCase(),n=!!e.flags?.restart;return ce.includes(t)?n&&t!==`clear`?N(`INVALID_ARGS`,`logs --restart is only supported with logs clear`):{ok:!0,action:t,restart:n}:N(`INVALID_ARGS`,ml)}function Wl(e,t,n){let r=n.resolveAppLogPath(t),i=rr(r),a=yl(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,sizeBytes:i.sizeBytes,modifiedAt:i.modifiedAt,startedAt:a.startedAt?new Date(a.startedAt).toISOString():void 0,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint??`Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>`,notes:a.notes}}}async function Gl(e,t,n){let r=n.resolveAppLogPath(t),i=await Jn(e.device,e.appBundleId),a=yl(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,checks:i.checks,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint,notes:Cl(i.notes,a)}}}function Kl(e,t,n){let r=e.positionals?.slice(1).join(` `)??``,i=n.resolveAppLogPath(t);return vr(i,r),{ok:!0,data:{path:i,marked:!0}}}async function ql(e,t,n,r){if(e.appLog&&!r)return N(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=n.resolveAppLogPath(t);if(!r){let r=zr(i);return n.set(t,{...e,appLogFailure:void 0}),{ok:!0,data:r}}let a=e.appBundleId;if(!a)return N(`INVALID_ARGS`,`logs clear --restart requires an app session; run open <app> first`);e.appLog&&await dr(e.appLog);let o=zr(i),s=n.resolveAppLogPidPath(t);try{let r=await xr(e.device,a,i,s);return n.set(t,{...e,appLog:wl(e,i,r),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(r){return Tl(n,t,e,r)}}async function Jl(e,t,n){if(e.appLog)return N(`INVALID_ARGS`,`app log already streaming; run logs stop first`);if(!e.appBundleId)return N(`INVALID_ARGS`,`logs start requires an app session; run open <app> first`);let r=n.resolveAppLogPath(t),i=n.resolveAppLogPidPath(t);try{let a=await xr(e.device,e.appBundleId,r,i);return n.set(t,{...e,appLog:wl(e,r,a),appLogFailure:void 0}),{ok:!0,data:{path:r,started:!0}}}catch(r){return Tl(n,t,e,r)}}async function Yl(e,t,n){if(!e.appLog)return N(`INVALID_ARGS`,`no app log stream active`);let r=e.appLog.outPath;return await dr(e.appLog),n.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:r,stopped:!0}}}async function Xl(e){let t=Ql(e);if(!t.ok)return t;let{include:n,maxEntries:r,session:i}=t;if(i.device.platform===`web`)return await Zl({include:n,maxEntries:r});let a=await or({device:i.device,appBundleId:i.appBundleId,appLogState:i.appLog?.getState(),appLogStartedAt:i.appLog?.startedAt,appLogPath:e.sessionStore.resolveAppLogPath(e.sessionName),maxEntries:r,include:n,maxPayloadChars:2048,maxScanLines:4e3});return{ok:!0,data:{...a.dump,active:!!i.appLog,state:i.appLog?.getState()??`inactive`,backend:a.backend,notes:a.notes}}}async function Zl(t){let n=yr();if(!n.dumpNetwork)return N(`UNSUPPORTED_OPERATION`,`network is not supported by this web provider`);try{let e=await n.dumpNetwork({include:t.include,limit:t.maxEntries});return{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend??`agent-browser`,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:2048,maxScanLines:e.entries.length},notes:e.notes}}}catch(t){return{ok:!1,error:e(t)}}}function Ql(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return N(`SESSION_NOT_FOUND`,`network requires an active session`);let a=Wt(`network`,i.device);if(a)return a;let o=(t.positionals?.[0]??`dump`).toLowerCase();if(!hl.includes(o))return N(`INVALID_ARGS`,gl);let s=t.positionals?.[1]?Number.parseInt(t.positionals[1],10):25;if(!Number.isInteger(s)||s<1||s>200)return N(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`);let c=$l(t);return c.ok?{ok:!0,session:i,maxEntries:s,include:c.include}:c}function $l(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return N(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return o.includes(r)?{ok:!0,include:r}:N(`INVALID_ARGS`,_l)}function eu(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=E.expandHome(t??`.agent-device/test-artifacts`,n);return I.join(i,r)}function tu(e,t){let n=t?I.relative(t,e):I.basename(e);return(n.length===0||n.startsWith(`..`)?I.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``)||`test`}function nu(e,t){F.mkdirSync(t,{recursive:!0}),ou(e,t)}function ru(e){let{response:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=[...iu(t)];!t.ok&&typeof t.error.logPath==`string`&&s.push(t.error.logPath);let c=au(s,o),l=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${t.ok?`passed`:`failed`}`];if(t.ok){let e=typeof t.data?.replayed==`number`?t.data.replayed:0,n=typeof t.data?.healed==`number`?t.data.healed:0;l.push(`replayed: ${e}`,`healed: ${n}`)}else l.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&l.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&l.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&l.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&l.push(`timeoutMode: cooperative`);c.length>0&&l.push(`copiedArtifacts: ${c.map(e=>I.basename(e)).join(`, `)}`);let u=I.join(o,`result.txt`),d=`${l.join(`
|
|
3
|
+
`)}\n`;F.writeFileSync(u,d),t.ok||F.writeFileSync(I.join(o,`failure.txt`),d)}function iu(e){let t=e.ok?e.data?.artifactPaths:e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`))]:[]}function au(e,t){let n=[],r=new Map;for(let i of e){if(!lu(i))continue;let e=cu(I.basename(i),r),a=I.join(t,e);I.resolve(i)!==I.resolve(a)&&F.copyFileSync(i,a),n.push(a)}return n}function ou(e,t){let n=I.join(t,`replay.ad`);if(F.copyFileSync(e,n),!su(e))return;let r=I.join(t,I.basename(e));I.resolve(r)!==I.resolve(n)&&F.copyFileSync(e,r)}function su(e){let t=I.extname(e).toLowerCase();return t===`.yml`||t===`.yaml`}function cu(e,t){let n=I.extname(e),r=n?e.slice(0,-n.length):e,i=t.get(e)??0;return t.set(e,i+1),i===0?e:`${r}-${i+1}${n}`}function lu(e){try{return F.statSync(e).isFile()}catch{return!1}}function V(e,t){return uu(e?.range?.[0],t)}function uu(e,t){let n=t.lineCounter.linePos(e!==void 0&&e>=0?e:0).line;return t.sourcePath===void 0?{line:n}:{path:t.sourcePath,line:n}}function du(e){return`${e.path===void 0?``:`${e.path}:`}line ${e.line}`}function H(e,t,r){throw new n(`INVALID_ARGS`,`${e} (${du(V(t,r))})`)}function U(e,t,n){ki(e)||H(`Maestro ${t} expects a map.`,e,n);let r=[];for(let i of e.items){let e=i.key;L(e)||H(`Maestro ${t} map keys must be strings.`,void 0,n);let a=e.value;typeof a!=`string`&&typeof a!=`number`&&typeof a!=`boolean`&&H(`Maestro ${t} map keys must be strings.`,e,n),i.value!==null&&!Ai(i.value)&&H(`Maestro ${t} values must be YAML nodes.`,e,n),r.push({key:String(a),keyNode:e,value:i.value})}return r}function fu(e,t,n){return ji(e)||H(`Maestro ${t} expects a list.`,e,n),e.items}function pu(e,t,n){return fu(e,t,n).map((e,r)=>J(e,`${t}[${r}]`,n))}function W(e,t,n,r){let i=new Set(n),a=new Set;for(let n of e)a.has(n.key)&&H(`Maestro ${t} contains duplicate field "${n.key}".`,n.keyNode,r),a.add(n.key),i.has(n.key)||H(`Maestro ${t} field "${n.key}" is not supported.`,n.keyNode,r)}function G(e,t){return e.some(e=>e.key===t)}function K(e,t){return e.find(e=>e.key===t)?.value}function q(e,t,n){return G(e,t)?n(K(e,t)):void 0}function mu(e,t,n){return A({optional:q(e,`optional`,e=>vu(e,`${t}.optional`,n))})}function hu(e){return e===null||L(e)&&e.value===null}function gu(e,t,n){if(e==null)return null;L(e)||H(`Maestro ${t} expects a scalar value.`,e,n);let r=e.value;if(r===null||typeof r==`string`||typeof r==`number`||typeof r==`boolean`)return r;H(`Maestro ${t} contains an unsupported scalar value.`,e,n)}function J(e,t,n){let r=gu(e,t,n);return typeof r!=`string`&&H(`Maestro ${t} expects a string.`,e,n),r}function _u(e,t,n){let r=gu(e,t,n);if(r!==null)return typeof r!=`string`&&H(`Maestro ${t} expects a string.`,e,n),r}function vu(e,t,n){let r=gu(e,t,n);if(r!==null)return typeof r!=`boolean`&&H(`Maestro ${t} expects a boolean.`,e,n),r}const yu=/^\$\{[A-Za-z_][A-Za-z0-9_.]*\}$/,bu=/^-?\d+(\.\d+)?$/,xu=/^-?\d+$/,Su={"tapOn.index":{integer:!0,nonNegative:!0},"tapOn.repeat":{integer:!0,positive:!0},"tapOn.delay":{integer:!0,nonNegative:!0},"doubleTapOn.delay":{integer:!0,nonNegative:!0},eraseText:{integer:!0,positive:!0},"eraseText.charactersToErase":{integer:!0,positive:!0},"extendedWaitUntil.timeout":{nonNegative:!0},"scrollUntilVisible.timeout":{nonNegative:!0},waitForAnimationToEnd:{nonNegative:!0},"waitForAnimationToEnd.timeout":{nonNegative:!0},"swipe.duration":{nonNegative:!0},"repeat.times":{integer:!0,nonNegative:!0},"retry.maxRetries":{integer:!0,nonNegative:!0}};function Cu(e){return e.positive&&e.integer?`a positive integer`:e.positive?`a positive number`:e.nonNegative&&e.integer?`a non-negative integer`:e.nonNegative?`a non-negative finite number`:e.integer?`an integer`:`a finite number`}function wu(e,t,n,r,i){let a=`Maestro ${t} expects ${Cu(i)} or a variable expression.`;Number.isFinite(e)||H(a,n,r),Math.abs(e)>2**53-1&&H(a,n,r),i.integer&&!Number.isSafeInteger(e)&&H(a,n,r),i.nonNegative&&e<0&&H(a,n,r),i.positive&&e<=0&&H(a,n,r)}function Tu(e,t,n,r,i){if(typeof e==`number`)return wu(e,t,n,r,i),e;if(typeof e==`string`){if(yu.test(e))return e;if((i.integer?xu:bu).test(e)){let a=Number(e);return wu(a,t,n,r,i),a}}H(`Maestro ${t} expects ${Cu(i)} or a variable expression.`,n,r)}function Eu(e,t,n){let r=gu(e,t,n);if(r!==null)return Tu(r,t,e,n,Su[t]??{})}function Du(e,t,n){let r=Su[t]??{},i=gu(e,t,n);return i===null&&H(`Maestro ${t} expects ${Cu(r)} or a variable expression.`,e,n),Tu(i,t,e,n,r)}function Ou(e,t,n){let r=U(e,t,n),i={};for(let e of r){let r=gu(e.value,`${t}.${e.key}`,n);r===null&&H(`Maestro ${t}.${e.key} expects a string, number, or boolean.`,e.value,n),i[e.key]=r}return i}const ku={id:(e,t,n,r)=>Vu(e,`id`,t,n,r),text:(e,t,n,r)=>Vu(e,`text`,t,n,r),label:(e,t,n,r)=>Vu(e,`label`,t,n,r),enabled:(e,t,n,r)=>Hu(e,`enabled`,t,n,r),selected:(e,t,n,r)=>Hu(e,`selected`,t,n,r),optional:(e,t,n,r)=>Hu(e,`optional`,t,n,r)};function Au(e,t,n,r=li){if(L(e))return{text:J(e,t,n)};let i=U(e,t,n);return W(i,t,r,n),ju(i,t,n)}function ju(e,t,n){e.length===0&&H(`Maestro ${t} selector is empty.`,void 0,n);let r={};for(let i of e){let e=ku[i.key];e||H(`Maestro ${t} selector field "${i.key}" is not supported.`,i.keyNode,n),e(r,i,t,n)}return Object.keys(r).filter(e=>e!==`optional`).length===0&&H(`Maestro ${t} selector must contain a selector value.`,e[0]?.keyNode,n),r}function Mu(e,t,n){let r=Fu(e,t,n,{name:`tapOn`,selectorKeys:si,pointConflictingSelectorKeys:li,pointAllowedKeys:[`point`,`retryTapIfNoChange`,`repeat`,`delay`,`optional`,`label`],selectorAllowedKeys:[...si,`retryTapIfNoChange`,`repeat`,`delay`,`optional`,`index`,`childOf`],parsePoint:Wu});if(r.entries.length===0)return{kind:`tapOn`,source:r.source,target:r.target};if(r.target.space!==`target`)return{kind:`tapOn`,source:r.source,target:r.target,...Bu(r.entries,n,!0)};let i=G(r.entries,`childOf`)?Au(K(r.entries,`childOf`),`tapOn.childOf`,n):void 0,a=Bu(r.entries,n,!1),o=G(r.entries,`index`)?Eu(K(r.entries,`index`),`tapOn.index`,n):void 0;return A({kind:`tapOn`,source:r.source,target:r.target,...a,index:o,childOf:i})}function Nu(e,t,n){let r=Fu(e,t,n,{name:`doubleTapOn`,selectorKeys:li,pointAllowedKeys:[`point`,`delay`,`optional`],selectorAllowedKeys:[...li,`delay`,`optional`],parsePoint:Gu}),i=mu(r.entries,`doubleTapOn`,n),a=G(r.entries,`delay`)?Eu(K(r.entries,`delay`),`doubleTapOn.delay`,n):void 0;return A({kind:`doubleTapOn`,source:r.source,target:r.target,...i,delay:a})}function Pu(e,t,n){let r=Fu(e,t,n,{name:`longPressOn`,selectorKeys:li,pointAllowedKeys:[`point`,`optional`],selectorAllowedKeys:[...li,`optional`],parsePoint:Gu});return{kind:`longPressOn`,source:r.source,target:r.target,...mu(r.entries,`longPressOn`,n)}}function Fu(e,t,n,r){let i=V(t,n);if(L(e))return{source:i,entries:[],target:qu(Au(e,r.name,n,r.selectorKeys))};let a=U(e,r.name,n),o=G(a,`point`);if(W(a,r.name,o?r.pointAllowedKeys:r.selectorAllowedKeys,n),o){let e=r.pointConflictingSelectorKeys??r.selectorKeys;return a.some(t=>Uu(t.key,e))&&H(`Maestro ${r.name}.point cannot be combined with a selector.`,t,n),{source:i,entries:a,target:r.parsePoint(K(a,`point`),`${r.name}.point`,n)}}return{source:i,entries:a,target:qu(ju(a.filter(e=>Uu(e.key,r.selectorKeys)),r.name,n))}}function Iu(e,t,n){let r=V(t,n),i=U(e,`swipe`,n);W(i,`swipe`,[`start`,`end`,`direction`,`duration`,`from`,`label`,`optional`],n);let a=mu(i,`swipe`,n),o=G(i,`duration`)?Eu(K(i,`duration`),`swipe.duration`,n):void 0;if(G(i,`start`)||G(i,`end`))return{...Lu(i,r,o,t,n),...a};let s=G(i,`direction`)?Ku(K(i,`direction`),`swipe.direction`,n):void 0;return G(i,`from`)||G(i,`label`)?{...Ru(i,r,s,o,t,n),...a}:{...zu(r,s,o,t,n),...a}}function Lu(e,t,n,r,i){G(e,`direction`)&&H(`Maestro swipe cannot combine direction with start/end coordinates.`,r,i),(!G(e,`start`)||!G(e,`end`))&&H(`Maestro swipe requires both start and end coordinates.`,r,i);let a=Wu(K(e,`start`),`swipe.start`,i),o=Wu(K(e,`end`),`swipe.end`,i);return a.space!==o.space&&H(`Maestro swipe start/end must use the same coordinate space.`,r,i),{kind:`swipe`,source:t,gesture:A({kind:`coordinates`,start:a,end:o,duration:n})}}function Ru(e,t,n,r,i,a){n===void 0&&H(`Maestro target swipe requires direction.`,i,a);let o=G(e,`label`)?_u(K(e,`label`),`swipe.label`,a):void 0;return{kind:`swipe`,source:t,gesture:A({kind:`target`,from:G(e,`from`)?Au(K(e,`from`),`swipe.from`,a):{text:o??``},direction:n,duration:r,label:o})}}function zu(e,t,n,r,i){return t===void 0&&H(`Maestro swipe requires direction, target, or start/end coordinates.`,r,i),{kind:`swipe`,source:e,gesture:A({kind:`screen`,direction:t,duration:n})}}function Bu(e,t,n){let r=q(e,`retryTapIfNoChange`,e=>vu(e,`tapOn.retryTapIfNoChange`,t)),i=q(e,`repeat`,e=>Du(e,`tapOn.repeat`,t)),a=q(e,`delay`,e=>Eu(e,`tapOn.delay`,t)),o=mu(e,`tapOn`,t).optional;return A({retryTapIfNoChange:r,repeat:i,delay:a,optional:o,label:n?q(e,`label`,e=>_u(e,`tapOn.label`,t)):void 0})}function Vu(e,t,n,r,i){let a=_u(n.value,`${r}.${t}`,i);a!==void 0&&(e[t]=a)}function Hu(e,t,n,r,i){let a=vu(n.value,`${r}.${t}`,i);a!==void 0&&(e[t]=a)}function Uu(e,t){return t.includes(e)}function Wu(e,t,n){let r=J(e,t,n),i=/^\s*(\d+)\s*,\s*(\d+)\s*$/.exec(r);if(i)return{space:`absolute`,x:Number(i[1]),y:Number(i[2])};let a=/^\s*(\d+)%\s*,\s*(\d+)%\s*$/.exec(r);if(a){let r=Number(a[1]),i=Number(a[2]);return(r>100||i>100)&&H(`Maestro ${t} percentage coordinates must be between 0% and 100%.`,e,n),{space:`percent`,x:r,y:i}}/^\s*\d+(?:\.\d+)?%\s*,\s*\d+(?:\.\d+)?%\s*$/.test(r)&&H(`Maestro ${t} percentage coordinates must be whole numbers.`,e,n),H(`Maestro ${t} expects absolute or percentage coordinates.`,e,n)}function Gu(e,t,n){let r=Wu(e,t,n);return r.space!==`absolute`&&H(`Maestro ${t} only supports absolute coordinates.`,e,n),r}function Ku(e,t,n){let r=J(e,t,n).toLowerCase();if(r===`up`||r===`down`||r===`left`||r===`right`)return r;H(`Maestro ${t} must be UP, DOWN, LEFT, or RIGHT.`,e,n)}function qu(e){return{space:`target`,selector:e}}function Ju(e,t,n){let r=V(t,n);if(L(e))return{kind:`runScript`,source:r,file:J(e,`runScript`,n)};let i=U(e,`runScript`,n);return W(i,`runScript`,[`file`,`env`],n),G(i,`file`)||H(`Maestro runScript requires a file.`,t,n),A({kind:`runScript`,source:r,file:J(K(i,`file`),`runScript.file`,n),env:G(i,`env`)?Ou(K(i,`env`),`runScript.env`,n):void 0})}function Yu(e,t,n,r){let i=V(t,n);if(L(e))return{kind:`runFlow`,source:i,include:{kind:`file`,path:J(e,`runFlow`,n)}};let a=U(e,`runFlow`,n);W(a,`runFlow`,[`file`,`commands`,`env`,`when`,`label`],n);let o=G(a,`file`);return o===G(a,`commands`)&&H(`Maestro runFlow requires exactly one of file or commands.`,t,n),A({kind:`runFlow`,source:i,include:o?{kind:`file`,path:J(K(a,`file`),`runFlow.file`,n)}:{kind:`commands`,commands:r(K(a,`commands`),`runFlow.commands`,n)},env:G(a,`env`)?Ou(K(a,`env`),`runFlow.env`,n):void 0,when:G(a,`when`)?Qu(K(a,`when`),n):void 0,label:G(a,`label`)?_u(K(a,`label`),`runFlow.label`,n):void 0})}function Xu(e,t,n,r){let i=V(t,n),a=U(e,`repeat`,n);return W(a,`repeat`,[`times`,`commands`,`while`],n),G(a,`while`)&&H(`Maestro repeat.while is not supported; use repeat.times.`,K(a,`while`),n),G(a,`times`)||H(`Maestro repeat requires times.`,t,n),G(a,`commands`)||H(`Maestro repeat requires commands.`,t,n),{kind:`repeat`,source:i,times:Du(K(a,`times`),`repeat.times`,n),commands:r(K(a,`commands`),`repeat.commands`,n)}}function Zu(e,t,n,r){let i=V(t,n),a=U(e,`retry`,n);W(a,`retry`,[`maxRetries`,`commands`],n),G(a,`commands`)||H(`Maestro retry requires commands.`,t,n);let o=G(a,`maxRetries`)?Du(K(a,`maxRetries`),`retry.maxRetries`,n):void 0;return A({kind:`retry`,source:i,commands:r(K(a,`commands`),`retry.commands`,n),maxRetries:o})}function Qu(e,t){let n=U(e,`runFlow.when`,t);return W(n,`runFlow.when`,[`platform`,`visible`,`notVisible`,`true`],t),n.length===0&&H(`Maestro runFlow.when cannot be empty.`,e,t),A({platform:q(n,`platform`,e=>ed(e,t)),visible:q(n,`visible`,e=>Au(e,`runFlow.when.visible`,t)),notVisible:q(n,`notVisible`,e=>Au(e,`runFlow.when.notVisible`,t)),true:q(n,`true`,e=>$u(e,t))})}function $u(e,t){let n=gu(e,`runFlow.when.true`,t);if(typeof n==`boolean`||typeof n==`string`)return n;H(`Maestro runFlow.when.true expects a boolean or expression string.`,e,t)}function ed(e,t){let n=J(e,`runFlow.when.platform`,t).toLowerCase();if(n===`android`||n===`ios`||n===`web`)return n;H(`Maestro runFlow.when.platform expects Android, iOS, or Web.`,e,t)}function td(e,t,n){return fu(e,t,n).map(e=>nd(e,n))}function nd(e,t){if(L(e))return typeof e.value!=`string`&&H(`Maestro command names must be strings.`,e,t),rd(e.value,e,t);ki(e)||H(`Maestro commands must be a scalar or one-key map.`,e,t);let n=U(e,`command`,t);n.length!==1&&H(`Maestro command maps must contain exactly one command.`,e,t);let r=n[0];return ad(r.key,r.value,e,t)}function rd(e,t,n){return ad(e,null,t,n)}const id={launchApp:od,tapOn:Mu,doubleTapOn:Nu,longPressOn:Pu,inputText:sd,eraseText:cd,openLink:ld,assertVisible:(e,t,n)=>ud(`assertVisible`,e,t,n),assertNotVisible:(e,t,n)=>ud(`assertNotVisible`,e,t,n),extendedWaitUntil:md,takeScreenshot:hd,scroll:gd,scrollUntilVisible:_d,swipe:Iu,hideKeyboard:vd,pressKey:yd,back:bd,waitForAnimationToEnd:xd,stopApp:Sd,runScript:Ju,runFlow:(e,t,n)=>Yu(e,t,n,td),repeat:(e,t,n)=>Xu(e,t,n,td),retry:(e,t,n)=>Zu(e,t,n,td)};Object.keys(id);function ad(e,t,n,r){let i=id[e];return i||H(`Maestro command "${e}" is not supported.`,n,r),i(t,n,r)}function od(e,t,n){let r=V(t,n);if(hu(e))return{kind:`launchApp`,source:r};if(L(e))return{kind:`launchApp`,source:r,appId:J(e,`launchApp`,n)};let i=U(e,`launchApp`,n);return W(i,`launchApp`,[`appId`,`stopApp`,`clearState`,`arguments`,`launchArguments`],n),A({kind:`launchApp`,source:r,appId:q(i,`appId`,e=>_u(e,`launchApp.appId`,n)),stopApp:q(i,`stopApp`,e=>vu(e,`launchApp.stopApp`,n)),clearState:q(i,`clearState`,e=>vu(e,`launchApp.clearState`,n)),arguments:q(i,`arguments`,e=>Cd(e,`launchApp.arguments`,n)),launchArguments:q(i,`launchArguments`,e=>Cd(e,`launchApp.launchArguments`,n))})}function sd(e,t,n){let r=V(t,n);if(L(e))return{kind:`inputText`,source:r,text:J(e,`inputText`,n)};let i=U(e,`inputText`,n);return W(i,`inputText`,[`text`,`label`],n),G(i,`text`)||H(`Maestro inputText requires text.`,t,n),A({kind:`inputText`,source:r,text:J(K(i,`text`),`inputText.text`,n),label:G(i,`label`)?_u(K(i,`label`),`inputText.label`,n):void 0})}function cd(e,t,n){let r=V(t,n);if(hu(e))return{kind:`eraseText`,source:r};if(L(e))return{kind:`eraseText`,source:r,charactersToErase:Du(e,`eraseText`,n)};let i=U(e,`eraseText`,n);return W(i,`eraseText`,[`charactersToErase`],n),A({kind:`eraseText`,source:r,charactersToErase:G(i,`charactersToErase`)?Eu(K(i,`charactersToErase`),`eraseText.charactersToErase`,n):void 0})}function ld(e,t,n){let r=V(t,n);if(L(e))return{kind:`openLink`,source:r,link:J(e,`openLink`,n)};let i=U(e,`openLink`,n);return W(i,`openLink`,[`link`],n),{kind:`openLink`,source:r,link:J(K(i,`link`),`openLink.link`,n)}}function ud(e,t,n,r){let i=V(n,r);if(L(t))return{kind:e,source:i,target:Au(t,e,r)};let a=U(t,e,r);W(a,e,[`id`,`text`,`enabled`,`selected`,`optional`,`childOf`],r);let o=mu(a,e,r),s=G(a,`childOf`)?Au(K(a,`childOf`),`${e}.childOf`,r):void 0;return A({kind:e,source:i,target:ju(a.filter(e=>e.key!==`optional`&&e.key!==`childOf`),e,r),...o,childOf:s})}const dd=[...li,`optional`];function fd(e,t,n,r){if(!G(e,t))return;let{optional:i,...a}=Au(K(e,t),n,r,dd);return{selector:a,optional:i}}function pd(e,t,n){let r=fd(e,`visible`,`extendedWaitUntil.visible`,n),i=fd(e,`notVisible`,`extendedWaitUntil.notVisible`,n);return r&&i&&H(`Maestro extendedWaitUntil cannot specify both visible and notVisible.`,t,n),!r&&!i&&H(`Maestro extendedWaitUntil requires visible or notVisible.`,t,n),r?{key:`visible`,selector:r.selector,optional:r.optional}:{key:`notVisible`,selector:i.selector,optional:i.optional}}function md(e,t,n){let r=U(e,`extendedWaitUntil`,n);W(r,`extendedWaitUntil`,[`visible`,`notVisible`,`timeout`,`optional`],n);let i=mu(r,`extendedWaitUntil`,n),a=pd(r,t,n),o=G(r,`timeout`)?Eu(K(r,`timeout`),`extendedWaitUntil.timeout`,n):void 0,s=i.optional===!0||a.optional===!0?!0:void 0,c={kind:`extendedWaitUntil`,source:V(t,n),timeout:o,optional:s};return c[a.key]=a.selector,A(c)}function hd(e,t,n){return{kind:`takeScreenshot`,source:V(t,n),path:J(e,`takeScreenshot`,n)}}function gd(e,t,n){return hu(e)||H(`Maestro scroll does not accept options yet.`,t,n),{kind:`scroll`,source:V(t,n)}}function _d(e,t,n){let r=V(t,n);if(L(e))return{kind:`scrollUntilVisible`,source:r,element:Au(e,`scrollUntilVisible.element`,n)};let i=U(e,`scrollUntilVisible`,n);W(i,`scrollUntilVisible`,[`element`,`direction`,`timeout`,`optional`],n);let a=mu(i,`scrollUntilVisible`,n),o=fd(i,`element`,`scrollUntilVisible.element`,n);o||H(`Maestro scrollUntilVisible requires element.`,t,n);let s=G(i,`direction`)?Ku(K(i,`direction`),`scrollUntilVisible.direction`,n):void 0,c=G(i,`timeout`)?Eu(K(i,`timeout`),`scrollUntilVisible.timeout`,n):void 0,l=a.optional===!0||o.optional===!0?!0:void 0;return A({kind:`scrollUntilVisible`,source:r,element:o.selector,direction:s,timeout:c,optional:l})}function vd(e,t,n){return hu(e)||H(`Maestro hideKeyboard does not accept options.`,t,n),{kind:`hideKeyboard`,source:V(t,n)}}function yd(e,t,n){let r=J(e,`pressKey`,n).toLowerCase();return r!==`back`&&r!==`enter`&&r!==`return`&&r!==`home`&&H(`Maestro pressKey "${r}" is not supported.`,e,n),{kind:`pressKey`,source:V(t,n),key:r}}function bd(e,t,n){return hu(e)||H(`Maestro back does not accept options.`,t,n),{kind:`back`,source:V(t,n)}}function xd(e,t,n){let r=V(t,n);if(hu(e))return{kind:`waitForAnimationToEnd`,source:r};if(L(e))return A({kind:`waitForAnimationToEnd`,source:r,timeout:Eu(e,`waitForAnimationToEnd`,n)});let i=U(e,`waitForAnimationToEnd`,n);return W(i,`waitForAnimationToEnd`,[`timeout`],n),A({kind:`waitForAnimationToEnd`,source:r,timeout:G(i,`timeout`)?Eu(K(i,`timeout`),`waitForAnimationToEnd.timeout`,n):void 0})}function Sd(e,t,n){let r=V(t,n);return hu(e)?{kind:`stopApp`,source:r}:{kind:`stopApp`,source:r,appId:J(e,`stopApp`,n)}}function Cd(e,t,n){if(ji(e))return{kind:`list`,values:fu(e,t,n).map((e,r)=>{let i=gu(e,`${t}[${r}]`,n);return i===null&&H(`${t}[${r}] expects a scalar value.`,e,n),i})};if(ki(e))return{kind:`map`,values:Ou(e,t,n)};let r=gu(e,t,n);return r===null&&H(`${t} expects a scalar, list, or map.`,e,n),{kind:`scalar`,value:r}}function wd(e,t={}){let r=new Oi,i=A({lineCounter:r,sourcePath:t.sourcePath}),a=Mi(e,{lineCounter:r});for(let e of a)if(e.errors.length>0){let t=e.errors[0];throw new n(`INVALID_ARGS`,`Invalid Maestro YAML flow: ${t?.message??`Invalid Maestro YAML flow.`} (${du(uu(t?.pos[0],i))})`)}let o=a.map(e=>e.contents).filter(e=>e!==null);o.length===0&&H(`Maestro flow is empty.`,void 0,i);let s,c;o.length===1&&ji(o[0])?c=o[0]:o.length===2&&ki(o[0])&&ji(o[1])?(s=o[0],c=o[1]):H(`Maestro flow must contain a command list, optionally preceded by one config document.`,o[0],i);let l=s?Td(s,i):{};return{kind:`program`,source:V(s??c,i),config:l,commands:td(c,`commands`,i)}}function Td(e,t){let n=U(e,`flow config`,t);return W(n,`flow config`,[`name`,`appId`,`tags`,`env`,`onFlowStart`,`onFlowComplete`],t),A({name:q(n,`name`,e=>_u(e,`name`,t)),appId:q(n,`appId`,e=>_u(e,`appId`,t)),tags:q(n,`tags`,e=>pu(e,`tags`,t)),env:q(n,`env`,e=>Ou(e,`env`,t)),onFlowStart:q(n,`onFlowStart`,e=>td(e,`onFlowStart`,t)),onFlowComplete:q(n,`onFlowComplete`,e=>td(e,`onFlowComplete`,t))})}const Ed=/[*?[\]{}]/;function Dd(e){let{inputs:t,cwd:r,platformFilter:i,replayBackend:a}=e,o=Ld(a),s=Nd(t,r??process.cwd(),o,a),c=[];for(let e of s){let t=F.readFileSync(e,`utf8`),n=ei(t),r=Wd(t,e,a);if(!i){c.push({kind:`run`,path:e,title:r,metadata:n});continue}if(!n.platform){Ud(a)?c.push({kind:`run`,path:e,title:r,metadata:n}):c.push({kind:`skip`,path:e,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${i}`});continue}Kd(i,n.platform)&&c.push({kind:`run`,path:e,title:r,metadata:n})}if(c.filter(e=>e.kind===`run`).length===0)throw new n(`INVALID_ARGS`,`No replay tests matched${i?` for --platform ${i}`:``}.`);return c}function Od(e,t,n,r,i=0){let a=I.basename(n,I.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``);return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function kd(e){return(e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`suite`}function Ad(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e,s=o===void 0?``:`:shard:${o+1}`;return Nt(`${t??n}${s}:test:${i+1}:${I.basename(r)}:attempt:${a+1}`,n)}function jd(e,t){return typeof e==`number`?e:t}function Md(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Nd(e,t,n,r){if(!Ud(r))return[...new Set(e.flatMap(e=>Id(e,t,n).paths))].map(e=>I.normalize(e)).sort((e,t)=>e.localeCompare(t));let i=[],a=[];for(let r of e){let e=Pd(r,t,n);e.source===`file`?i.push(...e.paths):a.push(e.source===`directory`?Hd(e.paths):zd(e.paths))}return Hd([...i,...a.flat()])}function Pd(e,t,n){let r=E.expandHome(e,t);return F.existsSync(r)&&F.statSync(r).isDirectory()?{paths:Fd(r,n),source:`directory`}:Id(e,t,n)}function Fd(e,t){let n=[],r=F.opendirSync(e);try{let i;for(;(i=r.readSync())!==null;){let r=I.join(e,i.name);i.isDirectory()?n.push(...Fd(r,t)):i.isFile()&&t.has(I.extname(i.name))&&n.push(r)}}finally{r.closeSync()}return n}function Id(e,t,r){let i=E.expandHome(e,t);if(F.existsSync(i)){let t=F.statSync(i);if(t.isDirectory())return{paths:Rd(r).flatMap(e=>F.globSync(e,{cwd:i}).map(e=>I.join(i,e))),source:`directory`};if(t.isFile()){if(!r.has(I.extname(i)))throw new n(`INVALID_ARGS`,`test does not support this file type: ${e}`);return{paths:[i],source:`file`}}return{paths:[],source:`file`}}if(!Gd(e)&&!Gd(i))throw new n(`INVALID_ARGS`,`test input not found: ${e}`);let a=I.isAbsolute(i)?i:e;return{paths:F.globSync(a,{cwd:I.isAbsolute(i)?void 0:t}).map(e=>I.isAbsolute(e)?e:I.resolve(t,e)).filter(e=>r.has(I.extname(e))&&qd(e)),source:`glob`}}function Ld(e){return Ud(e)?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`])}function Rd(e){return[...e].map(e=>`**/*${e}`)}function zd(e){return e.map(e=>I.normalize(e)).sort(Bd)}function Bd(e,t){let n=Vd(e),r=Vd(t);return n===r?e.localeCompare(t):n-r}function Vd(e){return+(I.extname(e)===`.ad`)}function Hd(e){return[...new Set(e.map(e=>I.normalize(e)))]}function Ud(e){return e===`maestro`}function Wd(e,t,n){return Ud(n)&&I.extname(t)!==`.ad`?wd(e,{sourcePath:t}).config.name:void 0}function Gd(e){return Ed.test(e)}function Kd(e,t){return e===`apple`?O(t):t===e}function qd(e){try{return F.statSync(e).isFile()}catch{return!1}}const Jd=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Yd(e){let t=Xd(e);return t?Zd(t.details)||Qd(t.code,t.message):!1}function Xd(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Zd(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?St(t):!1}function Qd(e,t){let n=`${e}\n${t}`.toLowerCase();return Jd.some(e=>n.includes(e))}const $d=2e3;async function ef(t){let{filePath:n,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:d,progress:f,runReplay:p,cleanupSession:m,finalizeAttempt:h}=t;Et(i);let g=tf(i,a),_=new Set,v,y=!1,b,x=Date.now(),S=cf({artifactsDir:l,artifactPaths:_,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),C=It(f,async()=>await p({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:_,tracePath:S,shard:d})).catch(t=>({ok:!1,error:e(t)})).finally(()=>{g(),Tt(i)});try{b=typeof o==`number`?await Promise.race([C,new Promise(e=>{v=setTimeout(()=>{y=!0,Pt(i),e(uf(o,[..._]))},o)})]):await C,lf(S,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:b.ok,timedOut:y,durationMs:Date.now()-x,errorCode:b.ok?void 0:b.error.code})}finally{v&&clearTimeout(v),y&&(await nf(C)||(of(b),u({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:$d}}),rf({replayPromise:C,cleanupSession:m,sessionName:r,requestId:i})));let t=await af({finalizeAttempt:h,sessionName:r,artifactPaths:_,artifactsDir:l,tracePath:S});b?.ok&&t&&!t.ok&&sf(b,`Replay test finalization failed: ${t.error.message}`);let n=Date.now();try{lf(S,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await m(r),lf(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(t){let i=e(t);lf(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-n,errorCode:i.code}),u({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}})}}return b??{ok:!1,error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}}}function tf(e,t){if(!t||t===e)return()=>{};let n=Mt(t);if(!n)return()=>{};let r=()=>{Pt(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}async function nf(e){return await Promise.race([e.then(()=>!0),Di($d).then(()=>!1)])}async function rf(t){let{replayPromise:n,cleanupSession:r,sessionName:i,requestId:a}=t;try{await n}finally{try{await r(i)}catch(t){u({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:e(t).message}})}}}async function af(t){let{finalizeAttempt:n,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o}=t;if(!n)return;let s=Date.now();lf(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await n({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o});return lf(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e?.ok??!0,durationMs:Date.now()-s,errorCode:e?.ok===!1?e.error.code:void 0}),e}catch(t){let n=e(t);return lf(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-s,errorCode:n.code}),u({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:n.message}}),{ok:!1,error:n}}}function of(e){!e||e.ok||(e.error.details={...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0})}function sf(e,t){let n=e.data??={};n.warnings=[...Array.isArray(n.warnings)?n.warnings.filter(e=>typeof e==`string`):[],t]}function cf(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=I.join(t,`replay-timing.ndjson`);return F.mkdirSync(I.dirname(l),{recursive:!0}),F.writeFileSync(l,``),n.add(l),lf(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function lf(e,t){e&&F.appendFileSync(e,`${JSON.stringify(t)}\n`)}function uf(e,t=[]){return{ok:!1,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 df(e){let t=ff(e);return yf(e,t,await pf(e,t))}function ff(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:I.join(i,...a?[`shard-${a.shardIndex+1}`]:[],tu(t.path,n)),maxAttempts:r+1}}async function pf(e,t){hf(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!wt(e.requestId);r+=1){let i=await mf(e,t,r);if(gf(n,i),_f(e,i.response,r))break;vf(e,t,i)}return n}async function mf(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=Od(i,a,r.path,o,n),h=I.join(t.testArtifactsDir,`attempt-${f}`);nu(r.path,h);let g=Ad({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_=await ef({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.metadata.platform,target:r.metadata.target,artifactsDir:h,shard:d,progress:{file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Of(d)},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt}),v=Date.now()-p;return ru({response:_,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{response:_,sessionName:m,attempt:f,durationMs:v}}function hf(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;j({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:Od(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Of(c)})}function gf(e,t){e.finalResponse=t.response,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,!t.response.ok&&e.attemptFailures.push({attempt:t.attempt,message:t.response.error.message,durationMs:t.durationMs})}function _f(e,t,n){return t.ok||wt(e.requestId)||Yd(t)||n>=e.retries}function vf(e,t,n){n.response.ok||j({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.response.error.message,hint:n.response.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Of(e.shard)})}function yf(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalResponse?.ok?bf(e,t,n,r):xf(e,t,n,r)}function bf(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalResponse;if(!c?.ok)throw Error(`Expected passing replay test response.`);return j({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,...Of(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,...Cf(c),...wf(c.data?.warnings),...Tf(c.data?.snapshotDiagnostics),...Df(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function xf(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=Sf(n.finalResponse);return j({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:c.message,hint:c.hint,...Of(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:c,...Tf(Ef(n.finalResponse)),...Df(s)}}function Sf(e){return e&&!e.ok?e.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}}function Cf(e){return{replayed:typeof e.data?.replayed==`number`?e.data.replayed:0,healed:typeof e.data?.healed==`number`?e.data.healed:0}}function wf(e){if(!Array.isArray(e))return{};let t=e.filter(e=>typeof e==`string`);return t.length>0?{warnings:t}:{}}function Tf(e){let t=Me(e);return t?{snapshotDiagnostics:t}:{}}function Ef(e){return e?.ok?e.data?.snapshotDiagnostics:e?.error.details?.snapshotDiagnostics}function Df(e){return Of(e)}function Of(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function kf(e,t,n){let r=jf(e);if(!r||t.length===0)return;let i=await Nf(e,r.count);return{mode:r.kind,shardCount:r.count,total:n+(r.kind===`all`?t.length*r.count:t.length),shards:i.map((e,n)=>({shardIndex:n,shardCount:r.count,device:e,entries:r.kind===`all`?t:t.filter((e,t)=>t%r.count===n)}))}}function Af(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}}function jf(e){let t=Mf(e?.shardAll,`--shard-all`),r=Mf(e?.shardSplit,`--shard-split`);if(t!==void 0&&r!==void 0)throw new n(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{kind:`all`,count:t};if(r!==void 0)return{kind:`split`,count:r}}function Mf(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new n(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}async function Nf(e,t){let r=Lf(e),i=Ff(await Ht(Pf(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${If(t)}, but only ${i.length} matched`);return i.slice(0,t)}function Pf(e){let t=bt(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:Le({simulatorSetPath:xt(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Ff(e,t,n){return t.length>0?Rf(e,t,n):e.filter(e=>zf(e,n)).sort(Hf)}function If(e){return`${e} device${e===1?``:`s`}`}function Lf(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Rf(e,t,r){return t.map(t=>{let i=Vf(t),a=e.find(e=>Bf(e,r)&&(e.id===t||Vf(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function zf(e,t){return!Bf(e,t)||!Re(e)?!1:e.booted!==!1}function Bf(e,t){return!(!ze(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Vf(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function Hf(e,t){return e.id.localeCompare(t.id)}async function Uf(e){let{req:t,sessionName:n,runReplay:r,cleanupSession:i,finalizeAttempt:a}=e;if((t.positionals?.length??0)===0)return N(`INVALID_ARGS`,`test requires at least one path or glob`);try{let e=Date.now(),o=await Wf(t);Jf(o);let s=o.shardPlan?Yf({entries:o.entries,total:o.total}):[];return o.shardPlan?s.push(...await Xf({shards:o.shardPlan.shards,sessionName:n,suiteInvocationId:o.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:o.suiteArtifactsDir,suiteTotal:o.total,runReplay:r,cleanupSession:i,finalizeAttempt:a})):s.push(...await ep({discoveryEntries:o.entries,sessionName:n,suiteInvocationId:o.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:o.suiteArtifactsDir,suiteTotal:o.total,runReplay:r,cleanupSession:i,finalizeAttempt:a})),{ok:!0,data:rp(o.total,s,Date.now()-e)}}catch(e){let t=s(e);return N(t.code,t.message)}}async function Wf(e){let t=Gf(e),n=Kf(t),r=t.length-n.length,i=kd(e.meta?.requestId),a=await kf(e.flags,n,r);return{entries:t,runnable:n,shardPlan:a,suiteInvocationId:i,suiteArtifactsDir:qf(e,i),total:a?.total??t.length}}function Gf(e){return Dd({inputs:e.positionals??[],cwd:e.meta?.cwd,platformFilter:e.flags?.platform,replayBackend:e.flags?.replayBackend})}function Kf(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function qf(e,t){return eu({artifactsDir:typeof e.flags?.artifactsDir==`string`?e.flags.artifactsDir:void 0,cwd:e.meta?.cwd,suiteInvocationId:t})}function Jf(e){j({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 Yf(e){let{entries:t,total:n}=e,r=[];for(let[e,i]of t.entries())i.kind===`skip`&&(j({type:`replay-test`,file:i.path,status:`skip`,index:e+1,total:n,message:i.message}),r.push({file:i.path,status:`skipped`,durationMs:0,reason:i.reason,message:i.message}));return r}async function Xf(e){return(await Promise.allSettled(e.shards.map(async t=>await Qf({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Zf(r,e.sessionName,t.reason)]:[]})}function Zf(t,n,r){let i=e(r);return{file:t.entries[0]?.entry.path??`shard-${t.shardIndex+1}`,session:$f(n,t),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:t.shardIndex,shardCount:t.shardCount,deviceId:t.device.id,deviceName:t.device.name}}async function Qf(e){let{shard:t,sessionName:n}=e;return await tp({...e,entries:t.entries,sessionName:$f(n,t),shard:t})}function $f(e,t){return`${e}:shard-${t.shardIndex+1}`}async function ep(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,flags:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d}=e,f=[],p=0;for(let[e,m]of t.entries()){if(wt(a))break;if(m.kind===`skip`){j({type:`replay-test`,file:m.path,status:`skip`,index:e+1,total:c,message:m.message}),f.push({file:m.path,status:`skipped`,durationMs:0,reason:m.reason,message:m.message});continue}p+=1;let t=await df({entry:m,sessionName:n,suiteInvocationId:r,caseIndex:p-1,cwd:i,requestId:a,retries:Md(o?.retries,m.metadata.retries),timeoutMs:jd(o?.timeoutMs,m.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d});if(f.push(t),np(t,o,a))break}return f}async function tp(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,flags:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f}=e,p=[];for(let[e,m]of t.entries()){if(wt(a))break;let{entry:t,suiteIndex:h}=m,g=await df({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Md(o?.retries,t.metadata.retries),timeoutMs:jd(o?.timeoutMs,t.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:h,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f});if(p.push(g),np(g,o,a))break}return p}function np(e,t,n){return wt(n)||t?.failFast===!0&&e.status===`failed`||Yd(e)}function rp(e,t,n){let r=t.filter(e=>e.status===`passed`).length,i=t.filter(e=>e.status===`failed`),a=i.length,o=t.filter(e=>e.status===`skipped`).length,s=r+a,c=Ne(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:s,passed:r,failed:a,skipped:o,notRun:Math.max(0,e-s-o),durationMs:n,failures:i,tests:t,...c?{snapshotDiagnostics:c}:{}}}function ip(e,t){if(t?.replayBackend&&t.replayBackend!==`maestro`)throw new n(`INVALID_ARGS`,`Unsupported replay backend "${t.replayBackend}".`);return{...ui(e),metadata:ei(e)}}function ap(e){return JSON.stringify(op(e))}function op(e){if(Array.isArray(e))return e.map(op);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,op(t[e])]))}function sp(e){let t=ap(cp(e));return Ci(`sha256`).update(t,`utf8`).digest(`hex`)}function cp(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)=>lp(e,n[t]??null,r?.[t]??null))}}function lp(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,source:{path:n,line:t}}}function up(e,n){if(e)try{F.appendFileSync(e,`${JSON.stringify(t(n))}\n`)}catch(t){u({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function dp(t){let{req:r,sessionName:i,action:a,scope:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=t,p=di(a,o,{file:u??s,line:c}),m=Date.now();up(d,{type:`replay_action_start`,ts:new Date(m).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:p.command,positionals:we(p)??[]});let h;try{h=await pp({req:r,sessionName:i,resolved:p,scope:o,line:c,step:l,invoke:f})}catch(t){if(!(t instanceof n))throw t;h={ok:!1,error:e(t)}}let g=Date.now();return up(d,{type:`replay_action_stop`,ts:new Date(g).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:p.command,ok:h.ok,durationMs:g-m,resultTiming:h.ok?hp(h.data):void 0,errorCode:h.ok?void 0:h.error.code}),fp(h,u??s,c)}function fp(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 pp(e){let{req:t,sessionName:n,resolved:r,invoke:i}=e,a=gp(t.flags,r.flags);return await i(mp({token:t.token,session:n,flags:a,runtime:r.runtime,meta:t.meta,internal:{...t.internal,replayPlanStep:!0}},r))}function mp(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:le(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ie(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function hp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function gp(e,t){return rt(e,{...t??{}})}function _p(e){return wp(e.ok?yp(e.data):vp(e.error.details?.artifactPaths))}function vp(e){return Array.isArray(e)?e.filter(Cp):[]}function yp(e){return e?[Sp(e.path),Sp(e.outPath),...bp(e.artifacts)].filter(Cp):[]}function bp(e){return Array.isArray(e)?e.map(xp).filter(Cp):[]}function xp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Sp(t.localPath)??Sp(t.path)}function Sp(e){return typeof e==`string`?e:void 0}function Cp(e){return typeof e==`string`}function wp(e){return[...new Set(e.filter(Tp))]}function Tp(e){try{return F.statSync(e).isFile()}catch{return!1}}function Ep(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e[e.length-1],n=t!==void 0&&/^\d+$/.test(t)?t:null,r=m(n===null?e.slice():e.slice(0,-1));return!r||r.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:r.selectorExpression,selectorTimeout:n}}function Dp(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),Ce(e.command)){let n=Op(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let{split:n}=Ke([...e.positionals]);n&&t.push(n.selectorExpression)}if(e.command===`wait`){let{selectorExpression:n}=Ep([...e.positionals]);n&&t.push(n)}return tr(t).filter(e=>e.trim().length>0)}function Op(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&kp(n)?t.slice(0,-1):t}function kp(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Ap(e){let t=e.sessionStore.get(e.sessionName),n=jp({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:t!==void 0});return t&&(Np({session:t,resume:n,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),e.sessionStore.set(e.sessionName,t)),n}function jp(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Mp({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Mp(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 Np(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Pp({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Pp(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}}const Fp={id:0,"role-label":1,label:2,other:3};function Ip(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Lp(n.basis)<Lp(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Lp(e.basis)-Lp(t.basis)||e.nodeIndex-t.nodeIndex)}function Lp(e){return Fp[e]}function Rp(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!zp(n))return`manual`;let i=Bp(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function zp(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&Vp(e.scrollRegion)}function Bp(e,t){let n=bi(t),r=Up(e.ancestry,n,t),i=e.scrollRegion;return i&&Vp(i)?r&&Hp(i,n,t):r}function Vp(e){return e.id!==void 0||e.label!==void 0}function Hp(e,t,n){return n.some(n=>vi(_i(n,t),e))}function Up(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=yi(n,t,e.length);return!r.broken&&Je(r.chain,e)})}async function Wp(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,logPath:l,responseLevel:u,scrubVars:d=[],planActions:f,planDigest:p}=e,m=w(d),h={code:t.code,message:m(t.message),...t.hint?{hint:m(t.hint)}:{}},g=o?await qp({session:o,sessionName:s,sessionStore:c,logPath:l,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},_=Xp(g,m),v=g.state===`available`&&o?nm({action:n,session:o,nodes:g.nodes,sanitize:m}):[],y=Rp({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Kp(g)}),b=Ap({failedIndex:r+1,actions:f,planDigest:p,repairHint:y,sessionStore:c,sessionName:s});return Gp({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:m(i),line:a}},action:m(Ee(n)),cause:h,screen:_,suggestions:v.slice(0,5),suggestionCount:v.length,resume:b,repairHint:y},responseLevel:u})}function Gp(e){let{sessionStore:t,sessionName:n,divergence:r,responseLevel:i}=e;return x({divergence:r,level:i,writeOverflowArtifact:e=>cm(t,n,e)})}function Kp(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}async function qp(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a}=e,o=Jp(a);try{let e=(await Cr({device:t.device,session:t,flags:o,logPath:i})).snapshot;return lt(e.snapshotQuality)?{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`}:(Un(t,e),jr(t,$p(e.nodes,t.appBundleId).nodes.map(e=>e.ref)),r.set(n,t),{state:`available`,nodes:e.nodes,refsGeneration:t.snapshotGeneration??0,appBundleId:t.appBundleId})}catch(e){return{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`}}}function Jp(e){return{snapshotInteractiveOnly:Yp(e)}}function Yp(e){return rm(e.command)?im(e).requiresRect:!0}function Xp(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=em(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function Zp(e){return!!y(e,ne(e.type??`Element`))||e.hittable===!0}function Qp(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function $p(e,t){let n=C(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&Zp(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=>Qp(e,t)),...o.filter(e=>!Qp(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function em(e,t,n){let{nodes:r,truncated:i}=$p(e,n);return{refs:r.map(e=>{let n=ne(e.type??`Element`),r=y(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function tm(e){let t=new Set(e.terms.map(e=>e.key));if(t.has(`id`))return`id`;let n=t.has(`role`),r=t.has(`label`)||t.has(`text`);return n&&r?`role-label`:r||t.has(`value`)?`label`:`other`}function nm(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!rm(t.command))return[];let a=Dp(t);return a.length===0?[]:am({candidates:a,nodes:r,session:n,action:t,matching:im(t),sanitize:i})}function rm(e){return Ce(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function im(e){let t=Ce(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function am(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=om({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Ip(s).map(e=>e.suggestion)}function om(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=h(t);if(!s)return;let c=Ze(n,s,{platform:r.device.platform,requireRect:a.requiresRect,requireUnique:!0,disambiguateAmbiguous:a.allowDisambiguation});if(!c)return;let l=tm(c.selector);return{suggestion:sm({node:c.node,nodes:n,session:r,action:i,basis:l,sanitize:o}),basis:l,nodeIndex:c.node.index}}function sm(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=tt(t,r.device.platform,{action:i.command===`fill`?`fill`:Ce(i.command)?`click`:`get`,nodes:n}),c=ne(t.type??`Element`),l=y(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function cm(e,n,r){try{let i=I.join(e.ensureSessionDir(n),`replay-divergence`);F.mkdirSync(i,{recursive:!0});let a=`${Date.now()}-step${r.step.index}.json`,o=I.join(i,a);return F.writeFileSync(o,`${JSON.stringify(t(r),null,2)}\n`),{artifactPath:o}}catch{return{artifactUnavailable:!0}}}function lm(e){return{...e,hint:e.hint??fm(e.details,`hint`),diagnosticId:e.diagnosticId??fm(e.details,`diagnosticId`),logPath:e.logPath??fm(e.details,`logPath`)}}function um(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return dm({error:t,actionLabel:Ee(n),action:n.command,positionals:we(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function dm(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:b(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:b(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...mm(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function fm(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const pm=[`reason`,`retriable`,`supportedOn`];function mm(e){if(!e)return{};let t={};for(let n of pm)e[n]!==void 0&&(t[n]=e[n]);return t}async function hm(e){return await gm({...e,snapshotDiagnostics:Ae(e.snapshotDiagnosticSamples)})}async function gm(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scope:l,req:u,sessionName:d,sessionStore:f,logPath:p,planActions:m,planDigest:h}=e;if(t.ok)return t;let g=_m(t.error.details?.replaySource),_=oi(l),v=lm(t.error),y=await Wp({error:v,action:n,index:r,sourcePath:g?.path??a,sourceLine:g?.line??o,session:f.get(d),sessionName:d,sessionStore:f,logPath:p,responseLevel:u.meta?.responseLevel,scrubVars:_,planActions:m,planDigest:h});return um({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:_})}function _m(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 vm(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function ym(e){return{platform:typeof e?.platform==`string`?e.platform:void 0,target:typeof e?.target==`string`?e.target:void 0}}function bm(e,t,n,r,i){let a=e?.replayFrom,o=e?.replayPlanDigest;if(a===void 0&&o===void 0)return{ok:!0,value:0};if(a===void 0||o===void 0)return xm(`replay --from requires --plan-digest (and --plan-digest requires --from).`);let s=Sm({from:a,digest:o,planDigest:n,actionCount:t,pendingRecordAndHeal:r,sessionActionsLength:i});return s?xm(s):{ok:!0,value:a-1}}function xm(e){return{ok:!1,response:N(`INVALID_ARGS`,e)}}function Sm(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Cm({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>wm({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Tm(n,r)];for(let e of s){let t=e();if(t)return t}}function Cm(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 wm(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 Tm(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 Em(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Dm({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=bi(r),u=Am(t),d=xi(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>hi(r,e)===t.sibling),p=d.filter(e=>vi(_i(e,l),t.scrollRegion)),m=gi(p)[t.viewportOrder]?.ref,h=Qe({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,...jm({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Dm(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Om(n,t,i,a):km(n,t,r,a,o)}function Om(e,t,n,r){let o=e=>e!==null&&(!r||!!e.rect),s=a(t),c=s?i(e,s):null;if(o(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Be(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function km(e,t,n,r,i){let a=h(t);if(!a)return{matchedNodes:[],winnerRef:``};let o=Ze(e,a,{platform:n,requireRect:r,requireUnique:!0,disambiguateAmbiguous:i});return o?{matchedNodes:e.filter(e=>r&&!e.rect?!1:Ye(e,o.selector,n)),winnerRef:o.node.ref}:{matchedNodes:$e(e,a,{platform:n,requireRect:r})?.matchedNodes??[],winnerRef:``}}function Am(e){return{...e.id===void 0?{}:{id:e.id},role:e.role,...e.label===void 0?{}:{label:e.label}}}function jm(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?Mm(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?Mm(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?Mm(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 Mm(e,t,n){let r=Si(t),i=yi(t,n,Math.max(e.ancestry.length,1)).chain;return[...Nm(e,r),...Im(e.ancestry,i)].slice(0,5)}function Nm(e,t){let n=[];return e.id!==t.id&&n.push(`id: recorded=${e.id??`(none)`} observed=${t.id??`(none)`}`),e.role!==t.role&&n.push(`role: recorded=${e.role} observed=${t.role}`),e.label!==t.label&&n.push(`label: recorded=${e.label??`(none)`} observed=${t.label??`(none)`}`),n}function Pm(e){return e?`${e.role}${e.label?`/${e.label}`:``}`:`(missing)`}function Fm(e,t){return!t||t.role!==e.role?!0:e.label!==void 0&&t.label!==e.label}function Im(e,t){for(let[n,r]of e.entries()){let e=t[n];if(Fm(r,e))return[`ancestry[${n}]: recorded=${Pm(r)} observed=${Pm(e)}`]}return[]}function Lm(e){let t=e.positionals??[];if(e.command===`get`)return t[1];if(!Ce(e.command)&&e.command!==`fill`)return;let n=t[0];if(n!==void 0&&!(zm(n)&&zm(t[1])))return n}function Rm(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function zm(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Bm(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionName:l,sessionStore:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=w(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:Jm(qm(n),h),...t.observed?{observed:Jm(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>Ym(e,h))},_=Rp({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Ap({failedIndex:i,actions:p,planDigest:m,repairHint:_,sessionStore:u,sessionName:l}),y=Gp({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(Ee(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},responseLevel:d});return um({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:y,scrubVars:f})}async function Vm(e){let{action:t,scope:n,sourcePath:r,sourceLine:i,replayPath:a,step:o,sessionName:s,sessionStore:c,logPath:l,artifactPaths:u,responseLevel:d,planActions:f,planDigest:p}=e,m=t.targetEvidence;if(!m)return{verified:!0};let g=c.get(s);if(!g)return{verified:!0};let _=Lm(di(t,n,{file:r,line:i}));if(_===void 0||!_.startsWith(`@`)&&!h(_))return{verified:!0};let v=oi(n),y=w(v),b={recorded:m,action:t,step:o,sourcePath:r,sourceLine:i,replayPath:a,artifactPaths:u,sessionName:s,sessionStore:c,responseLevel:d,scrubVars:v,planActions:f,planDigest:p};if(m.verification===`unverifiable`){let e=await qp({session:g,sessionName:s,sessionStore:c,logPath:l,action:t});return{verified:!1,response:Bm(b,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`,screen:Xp(e,y),repairCapture:Kp(e)})}}let x=await qp({session:g,sessionName:s,sessionStore:c,logPath:l,action:t});if(x.state!==`available`)return{verified:!1,response:Bm(b,{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 (${x.reason}).`,causeHint:x.hint,screen:Xp(x,y),repairCapture:Kp(x)})};let S=im(t),C=Em({recorded:m,token:_,nodes:x.nodes,platform:g.device.platform,refLabel:Rm(t),requireRect:S.requiresRect,allowDisambiguation:S.allowDisambiguation});return C.verified?{verified:!0,guard:{expected:{identity:Si(C.winnerNode),structural:et(C.winnerNode,x.nodes)},matchCount:C.matchCount}}:{verified:!1,response:Bm(b,{kind:C.kind,matchCount:C.matchCount,observed:C.observedNode?Si(C.observedNode):void 0,candidateNodes:C.candidateNodes,mismatches:C.mismatches,causeCode:C.causeCode,causeMessage:C.causeMessage,screen:Xp(x,y),repairCapture:Kp(x)})}}function Hm(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}async function Um(e){let{action:t,scope:n,guard:r,failedResponse:i,sourcePath:a,sourceLine:o,replayPath:s,step:c,sessionName:l,sessionStore:u,logPath:d,artifactPaths:f,responseLevel:p,planActions:m,planDigest:h}=e,g=t.targetEvidence;if(!g)return i;let _=oi(n),v=w(_),y=i.ok?void 0:i.error.details,b=Wm(y?.observed),x=Gm(y?.expectedStructural,y?.observedStructural),S=u.get(l),C=S?await qp({session:S,sessionName:l,sessionStore:u,logPath:d,action:t}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`};return Bm({recorded:g,action:t,step:c,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:f,sessionName:l,sessionStore:u,responseLevel:p,scrubVars:_,planActions:m,planDigest:h},{kind:`identity-mismatch`,matchCount:r.matchCount,observed:b,candidateNodes:[],mismatches:[...b?Nm(g,b):[],...x?[x]:[]],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`,screen:Xp(C,v),repairCapture:Kp(C)})}function Wm(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 Gm(e,t){let n=Km(e),r=Km(t);if(!(!n||!r)&&!(n.documentOrder===r.documentOrder&&n.sibling===r.sibling))return`position: recorded=doc${n.documentOrder}/sibling${n.sibling} observed=doc${r.documentOrder}/sibling${r.sibling}`}function Km(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 qm(e){return{...e.id===void 0?{}:{id:e.id},role:e.role,...e.label===void 0?{}:{label:e.label}}}function Jm(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function Ym(e,t){let n=ne(e.type??`Element`),r=y(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function Xm(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Zm(t,i)};return $m(o,`AD_PLATFORM`,a.platform??r.platform),$m(o,`AD_TARGET`,a.target??r.target),$m(o,`AD_DEVICE`,a.device),$m(o,`AD_DEVICE_ID`,Qm(a)),eh(o,`AD_SHARD_INDEX`,a.shardIndex),eh(o,`AD_SHARD_COUNT`,a.shardCount),$m(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Zm(e,t){let n=e.meta?.cwd??process.cwd();return I.relative(n,t)||t}function Qm(e){return typeof e.serial==`string`?e.serial:e.udid}function $m(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function eh(e,t,n){typeof n==`number`&&(e[t]=String(n))}const th=3e4,nh=1e3;function rh(t){let{scriptPath:r,env:i}=t,a=F.readFileSync(r,`utf8`),o=Object.create(null);try{Ni.runInNewContext(a,ih(i,o),{filename:r,timeout:th})}catch(t){let i=e(t);throw new n(i.code,`Maestro runScript failed: ${i.message}`,A({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),t instanceof Error?t:void 0)}return ch(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,lh(t)]))}function ih(e,t){return{...e,output:t,json:ah,http:{post:(e,t)=>sh(`POST`,e,t)}}}function ah(e){if(typeof e!=`string`)throw new n(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new n(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,oh)}catch(t){throw new n(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,nh)},t instanceof Error?t:void 0)}}function oh(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function sh(e,t,r){let i=c(process.execPath,[`-e`,`
|
|
4
4
|
const fs = require('node:fs');
|
|
5
5
|
const input = JSON.parse(fs.readFileSync(0, 'utf8'));
|
|
6
6
|
if (typeof fetch !== 'function') {
|
|
@@ -21,10 +21,8 @@ fetch(input.url, {
|
|
|
21
21
|
console.error(error && error.stack ? error.stack : String(error));
|
|
22
22
|
process.exit(1);
|
|
23
23
|
});
|
|
24
|
-
`],{stdin:JSON.stringify({method:e,url:n,headers:r?.headers??{},body:r?.body??``}),timeoutMs:Ul,allowFailure:!0});if(i.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${eu(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:i.stdout.slice(0,1e3),stderr:i.stderr.slice(0,1e3)},r instanceof Error?r:void 0)}}function Ql(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function $l(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function eu(e){let t=e.trim();return t.length>0?t.slice(0,1e3):`request process exited without stderr`}const tu={launchApp:({value:e,config:t,context:n})=>[Bc(e,t,n)],tapOn:({value:e,context:t})=>[Kc(e,t)],doubleTapOn:({value:e,context:t})=>[qc(e,t)],longPressOn:({value:e,context:t})=>[Jc(e,t)],inputText:({value:e,context:t})=>[F(`type`,[L(Yc(e),t)])],eraseText:({value:e})=>[Xc(e)],pasteText:({value:e,context:t,name:n})=>[F(`type`,[L(pr(n,e),t)])],openLink:({value:e,config:t,context:n,name:r})=>[ou(e,t,n,r)],assertVisible:({value:e,context:t,name:n})=>[F(G.assertVisible,[K(e,n,[],t),`17000`])],assertNotVisible:({value:e,context:t,name:n})=>[F(G.assertNotVisible,[K(e,n,[],t)])],extendedWaitUntil:({value:e,context:t})=>Zc(e,t),takeScreenshot:({value:e,context:t,name:n})=>[F(`screenshot`,[L(pr(n,e),t)])],scroll:({value:e})=>[Qc(e)],scrollUntilVisible:({value:e,context:t})=>$c(e,t),swipe:({value:e,context:t})=>[el(e,t)],hideKeyboard:()=>[F(`keyboard`,[`dismiss`])],pressKey:({value:e})=>[cl(e)],back:()=>[F(`back`)],waitForAnimationToEnd:({value:e})=>[F(G.waitForAnimationToEnd,[String(yr(e,15e3))])],stopApp:({value:e,config:t,context:n})=>[Vc(e,t,n)],runScript:({value:e,context:t})=>[Wl(e,t)],runFlow:({value:e,config:t,context:n,deps:r})=>yl(e,t,n,r,cu),repeat:({value:e,config:t,context:n,deps:r})=>bl(e,t,n,r,cu),retry:({value:e,config:t,context:n,deps:r})=>xl(e,t,n,r,cu)},nu={launchApp:(e,t)=>[Bc(void 0,e,t)],scroll:()=>[F(`scroll`,[`down`])],hideKeyboard:()=>[F(`keyboard`,[`dismiss`])],eraseText:()=>[Xc(void 0)],back:()=>[F(`back`)],waitForAnimationToEnd:()=>[F(G.waitForAnimationToEnd,[`15000`])],stopApp:(e,t)=>[Vc(void 0,e,t)]};function ru(e,n,r,i,a){try{return iu(e,n,i,a)}catch(e){throw e instanceof t&&!/\bline \d+\b/.test(e.message)?new t(e.code,`${e.message} (line ${r})`,e.details):e}}function iu(e,n,r,i){if(typeof e==`string`)return au(e,n,r);let a=Object.entries(e);if(a.length!==1)throw new t(`INVALID_ARGS`,`Maestro command maps must contain exactly one command.`);let[o,s]=a[0],c=tu[o];return c?c({value:s,config:n,context:r,deps:i,name:o}):gr(o)}function au(e,t,n){let r=nu[e];return r?r(t,n):gr(e)}function ou(e,t,n,r){let i=L(su(e,r),n);return(n.platform===`ios`||n.platform===`android`)&&t.appId?F(`open`,[L(fr(t,r),n),i],n.platform===`ios`?{maestro:{prewarmRunnerBeforeOpen:!0}}:void 0):F(`open`,[i])}function su(e,t){return typeof e==`string`?e:I(e)?(N(e,t,[`link`]),pr(`${t}.link`,e.link)):pr(t,e)}function cu(e,t,n,r){return e.flatMap((e,i)=>ru(e,t,i+1,n,r))}function lu(e,t={}){return du(e,bu(t))}function uu(e){let{config:t}=Su(mr(e));return t.name}function du(e,t){let{config:n,commands:r}=Su(mr(e)),i={...t,env:{...t.env,...n.env??{},...t.envOverrides}},{actions:a,actionLines:o}=fu({config:n,commands:r,commandLines:xu(e),context:i});return{actions:a,actionLines:o,metadata:{env:n.env}}}function fu(e){let{config:t,commands:n,commandLines:r,context:i}=e,a=[...t.onFlowStart??[],...n,...t.onFlowComplete??[]],o=[...Array.from({length:t.onFlowStart?.length??0},()=>1),...r,...Array.from({length:t.onFlowComplete?.length??0},()=>r.at(-1)??1)],s=[],c=[];for(let[e,n]of a.entries()){let r=o[e]??e+1,a=ru(n,t,r,i,{parseRunFlowFile:wu});s.push(...a),a.forEach(()=>c.push(r))}return pu(s,c)}function pu(e,t){let n=[],r=[];for(let i=0;i<e.length;i+=1){let a=e[i],o=mu(e,t,i);if(o){n.push(...o.actions),r.push(...o.actionLines),i+=o.consumed-1;continue}n.push(a),r.push(t[i]??1)}return{actions:n,actionLines:r}}function mu(e,t,n){let r=hu(e,t,n);if(!r)return null;let{action:i,nextAction:a,pressEnterAction:o,tapSelector:s,typedAfterTap:c,line:l}=r;return yu(s)?{actions:[{...i,command:`wait`,positionals:[s,`30000`]},{...a,command:`fill`,positionals:[s,c],flags:i.flags},o],actionLines:[l,l,t[n+2]??l],consumed:3}:{actions:[gu(i)],actionLines:[l],consumed:1}}function hu(e,t,n){let r=e[n],i=e[n+1],a=e[n+2];if(a?.command!==G.pressEnter||r.flags?.maestro?.optional===!0)return null;let o=vu(i),s=_u(r);return!i||o===null||s===null?null:{action:r,nextAction:i,pressEnterAction:a,tapSelector:s,typedAfterTap:o,line:t[n]??1}}function gu(e){let t={...e.flags?.maestro??{}};return delete t.allowNonHittableCoordinateFallback,{...e,flags:{...e.flags??{},maestro:{...t}}}}function _u(e){if(e?.command!==G.tapOn)return null;let[t,...n]=e.positionals??[];return n.length>0||typeof t!=`string`?null:t}function vu(e){if(e?.command!==`type`||e.flags&&Object.keys(e.flags).length>0)return null;let[t,...n]=e.positionals??[];return n.length>0||typeof t!=`string`?null:t}function yu(e){return/\b(input|textfield|textarea|field|email|password|username|search|query)\b/i.test(e.replace(/([a-z])([A-Z])/g,`$1 $2`))}function bu(e){let t=e.visitedPaths??new Set;return e.sourcePath&&t.add(V.resolve(e.sourcePath)),{baseDir:e.sourcePath?V.dirname(e.sourcePath):void 0,platform:dr(e.platform),env:{},envOverrides:e.env??{},visitedPaths:t}}function xu(e){let t=e.split(/\r?\n/),n=t.findIndex(e=>e.trim()===`---`),r=n===-1?0:n+1,i=[];for(let e=r;e<t.length;e+=1)/^-\s+/.test(t[e]??``)&&i.push(e+1);return i}function Su(e){if(e.length===0)throw new t(`INVALID_ARGS`,`Maestro flow is empty.`);if(Array.isArray(e[0]))return{config:{},commands:R(e[0])};let n=Cu(e[0]),r=e[1];if(!Array.isArray(r))throw new t(`INVALID_ARGS`,`Maestro flow must contain a command list after the YAML document separator.`);return{config:n,commands:R(r)}}function Cu(e){if(!I(e))throw new t(`INVALID_ARGS`,`Maestro flow config must be a YAML map.`);return{...typeof e.name==`string`&&e.name.length>0?{name:e.name}:{},...typeof e.appId==`string`&&e.appId.length>0?{appId:e.appId}:{},...I(e.env)?{env:hr(e.env,`env`)}:{},...Array.isArray(e.onFlowStart)?{onFlowStart:R(e.onFlowStart)}:{},...Array.isArray(e.onFlowComplete)?{onFlowComplete:R(e.onFlowComplete)}:{}}}function wu(e,n){let r=Tu(e,n);if(n.visitedPaths.has(r))throw new t(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);let i=B.readFileSync(r,`utf8`),a=new Set(n.visitedPaths);return a.add(r),du(i,{...n,baseDir:V.dirname(r),visitedPaths:a})}function Tu(e,n){if(V.isAbsolute(e))return e;if(!n.baseDir)throw new t(`INVALID_ARGS`,`runFlow file paths require replay input to have a source path.`);return V.resolve(n.baseDir,e)}const Eu=/[*?[\]{}]/;function Du(e){let{inputs:n,cwd:r,platformFilter:i,replayBackend:a}=e,o=Lu(a),s=Nu(n,r??process.cwd(),o,a),c=[];for(let e of s){let t=B.readFileSync(e,`utf8`),n=Cr(t),r=Wu(t,e,a);if(!i){c.push({kind:`run`,path:e,title:r,metadata:n});continue}if(!n.platform){Uu(a)?c.push({kind:`run`,path:e,title:r,metadata:n}):c.push({kind:`skip`,path:e,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${i}`});continue}Ku(i,n.platform)&&c.push({kind:`run`,path:e,title:r,metadata:n})}if(c.filter(e=>e.kind===`run`).length===0)throw new t(`INVALID_ARGS`,`No replay tests matched${i?` for --platform ${i}`:``}.`);return c}function Ou(e,t,n,r,i=0){let a=V.basename(n,V.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``);return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function ku(e){return(e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`suite`}function Au(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e,s=o===void 0?``:`:shard:${o+1}`;return xt(`${t??n}${s}:test:${i+1}:${V.basename(r)}:attempt:${a+1}`,n)}function ju(e,t){return typeof e==`number`?e:t}function Mu(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Nu(e,t,n,r){if(!Uu(r))return[...new Set(e.flatMap(e=>Iu(e,t,n).paths))].map(e=>V.normalize(e)).sort((e,t)=>e.localeCompare(t));let i=[],a=[];for(let r of e){let e=Pu(r,t,n);e.source===`file`?i.push(...e.paths):a.push(e.source===`directory`?Hu(e.paths):zu(e.paths))}return Hu([...i,...a.flat()])}function Pu(e,t,n){let r=j.expandHome(e,t);return B.existsSync(r)&&B.statSync(r).isDirectory()?{paths:Fu(r,n),source:`directory`}:Iu(e,t,n)}function Fu(e,t){let n=[],r=B.opendirSync(e);try{let i;for(;(i=r.readSync())!==null;){let r=V.join(e,i.name);i.isDirectory()?n.push(...Fu(r,t)):i.isFile()&&t.has(V.extname(i.name))&&n.push(r)}}finally{r.closeSync()}return n}function Iu(e,n,r){let i=j.expandHome(e,n);if(B.existsSync(i)){let n=B.statSync(i);if(n.isDirectory())return{paths:Ru(r).flatMap(e=>B.globSync(e,{cwd:i}).map(e=>V.join(i,e))),source:`directory`};if(n.isFile()){if(!r.has(V.extname(i)))throw new t(`INVALID_ARGS`,`test does not support this file type: ${e}`);return{paths:[i],source:`file`}}return{paths:[],source:`file`}}if(!Gu(e)&&!Gu(i))throw new t(`INVALID_ARGS`,`test input not found: ${e}`);let a=V.isAbsolute(i)?i:e;return{paths:B.globSync(a,{cwd:V.isAbsolute(i)?void 0:n}).map(e=>V.isAbsolute(e)?e:V.resolve(n,e)).filter(e=>r.has(V.extname(e))&&qu(e)),source:`glob`}}function Lu(e){return Uu(e)?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`])}function Ru(e){return[...e].map(e=>`**/*${e}`)}function zu(e){return e.map(e=>V.normalize(e)).sort(Bu)}function Bu(e,t){let n=Vu(e),r=Vu(t);return n===r?e.localeCompare(t):n-r}function Vu(e){return+(V.extname(e)===`.ad`)}function Hu(e){return[...new Set(e.map(e=>V.normalize(e)))]}function Uu(e){return e===`maestro`}function Wu(e,t,n){return Uu(n)&&V.extname(t)!==`.ad`?uu(e):void 0}function Gu(e){return Eu.test(e)}function Ku(e,t){return e===`apple`?a(t):t===e}function qu(e){try{return B.statSync(e).isFile()}catch{return!1}}const Ju=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Yu(e){let t=Xu(e);return t?Zu(t.details)||Qu(t.code,t.message):!1}function Xu(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Zu(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?rt(t):!1}function Qu(e,t){let n=`${e}\n${t}`.toLowerCase();return Ju.some(e=>n.includes(e))}const $u=2e3;async function ed(t){let{filePath:n,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,progress:d,runReplay:f,cleanupSession:p,finalizeAttempt:m}=t;st(i);let g=td(i,a),_=new Set,v,y=!1,b,x=Date.now(),S=sd({artifactsDir:l,artifactPaths:_,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),C=dt(d,async()=>await f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:_,tracePath:S,shard:u})).catch(t=>({ok:!1,error:e(t)})).finally(()=>{g(),bt(i)});try{b=typeof o==`number`?await Promise.race([C,new Promise(e=>{v=setTimeout(()=>{y=!0,ct(i),e(cd(o,[..._]))},o)})]):await C,q(S,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:b.ok,timedOut:y,durationMs:Date.now()-x,errorCode:b.ok?void 0:b.error.code})}finally{v&&clearTimeout(v),y&&(await nd(C)||(ad(b),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:$u}}),rd({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i})));let t=await id({finalizeAttempt:m,sessionName:r,artifactPaths:_,artifactsDir:l,tracePath:S});b?.ok&&t&&!t.ok&&od(b,`Replay test finalization failed: ${t.error.message}`);let n=Date.now();try{q(S,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),q(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(t){let i=e(t);q(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-n,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}})}}return b??{ok:!1,error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}}}function td(e,t){if(!t||t===e)return()=>{};let n=lt(t);if(!n)return()=>{};let r=()=>{ct(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}async function nd(e){return await Promise.race([e.then(()=>!0),Fr($u).then(()=>!1)])}async function rd(t){let{replayPromise:n,cleanupSession:r,sessionName:i,requestId:a}=t;try{await n}finally{try{await r(i)}catch(t){h({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:e(t).message}})}}}async function id(t){let{finalizeAttempt:n,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o}=t;if(!n)return;let s=Date.now();q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await n({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o});return q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e?.ok??!0,durationMs:Date.now()-s,errorCode:e?.ok===!1?e.error.code:void 0}),e}catch(t){let n=e(t);return q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-s,errorCode:n.code}),h({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:n.message}}),{ok:!1,error:n}}}function ad(e){!e||e.ok||(e.error.details={...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0})}function od(e,t){let n=e.data??={};n.warnings=[...Array.isArray(n.warnings)?n.warnings.filter(e=>typeof e==`string`):[],t]}function sd(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=V.join(t,`replay-timing.ndjson`);return B.mkdirSync(V.dirname(l),{recursive:!0}),B.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&&B.appendFileSync(e,`${JSON.stringify(t)}\n`)}function cd(e,t=[]){return{ok:!1,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 ld(e){let t=ud(e);return _d(e,t,await dd(e,t))}function ud(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:V.join(i,...a?[`shard-${a.shardIndex+1}`]:[],jc(t.path,n)),maxAttempts:r+1}}async function dd(e,t){pd(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!St(e.requestId);r+=1){let i=await fd(e,t,r);if(md(n,i),hd(e,i.response,r))break;gd(e,t,i)}return n}async function fd(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=Ou(i,a,r.path,o,n),h=V.join(t.testArtifactsDir,`attempt-${f}`);Mc(r.path,h);let g=Au({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_=await ed({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.metadata.platform,target:r.metadata.target,artifactsDir:h,shard:d,progress:{file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Ed(d)},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt}),v=Date.now()-p;return Nc({response:_,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{response:_,sessionName:m,attempt:f,durationMs:v}}function pd(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;E({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:Ou(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Ed(c)})}function md(e,t){e.finalResponse=t.response,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,!t.response.ok&&e.attemptFailures.push({attempt:t.attempt,message:t.response.error.message,durationMs:t.durationMs})}function hd(e,t,n){return t.ok||St(e.requestId)||Yu(t)||n>=e.retries}function gd(e,t,n){n.response.ok||E({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.response.error.message,hint:n.response.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Ed(e.shard)})}function _d(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalResponse?.ok?vd(e,t,n,r):yd(e,t,n,r)}function vd(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalResponse;if(!c?.ok)throw Error(`Expected passing replay test response.`);return E({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,...Ed(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,...xd(c),...Sd(c.data?.warnings),...Cd(c.data?.snapshotDiagnostics),...Td(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function yd(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=bd(n.finalResponse);return E({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:c.message,hint:c.hint,...Ed(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:c,...Cd(wd(n.finalResponse)),...Td(s)}}function bd(e){return e&&!e.ok?e.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}}function xd(e){return{replayed:typeof e.data?.replayed==`number`?e.data.replayed:0,healed:typeof e.data?.healed==`number`?e.data.healed:0}}function Sd(e){if(!Array.isArray(e))return{};let t=e.filter(e=>typeof e==`string`);return t.length>0?{warnings:t}:{}}function Cd(e){let t=Ee(e);return t?{snapshotDiagnostics:t}:{}}function wd(e){return e?.ok?e.data?.snapshotDiagnostics:e?.error.details?.snapshotDiagnostics}function Td(e){return Ed(e)}function Ed(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Dd(e,t,n){let r=kd(e);if(!r||t.length===0)return;let i=await jd(e,r.count);return{mode:r.kind,shardCount:r.count,total:n+(r.kind===`all`?t.length*r.count:t.length),shards:i.map((e,n)=>({shardIndex:n,shardCount:r.count,device:e,entries:r.kind===`all`?t:t.filter((e,t)=>t%r.count===n)}))}}function Od(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}}function kd(e){let n=Ad(e?.shardAll,`--shard-all`),r=Ad(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{kind:`all`,count:n};if(r!==void 0)return{kind:`split`,count:r}}function Ad(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}async function jd(e,n){let r=Fd(e),i=Nd(await ln(Md(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${Pd(n)}, but only ${i.length} matched`);return i.slice(0,n)}function Md(e){let t=et(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:r({simulatorSetPath:it(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Nd(e,t,n){return t.length>0?Id(e,t,n):e.filter(e=>Ld(e,n)).sort(Bd)}function Pd(e){return`${e} device${e===1?``:`s`}`}function Fd(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Id(e,n,r){return n.map(n=>{let i=zd(n),a=e.find(e=>Rd(e,r)&&(e.id===n||zd(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function Ld(e,t){return!Rd(e,t)||!o(e)?!1:e.booted!==!1}function Rd(e,t){return!(!d(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function zd(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function Bd(e,t){return e.id.localeCompare(t.id)}async function Vd(e){let{req:t,sessionName:r,runReplay:i,cleanupSession:a,finalizeAttempt:o}=e;if((t.positionals?.length??0)===0)return D(`INVALID_ARGS`,`test requires at least one path or glob`);try{let e=Date.now(),n=await Hd(t);Kd(n);let s=n.shardPlan?qd({entries:n.entries,total:n.total}):[];return n.shardPlan?s.push(...await Jd({shards:n.shardPlan.shards,sessionName:r,suiteInvocationId:n.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:n.suiteArtifactsDir,suiteTotal:n.total,runReplay:i,cleanupSession:a,finalizeAttempt:o})):s.push(...await Qd({discoveryEntries:n.entries,sessionName:r,suiteInvocationId:n.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:n.suiteArtifactsDir,suiteTotal:n.total,runReplay:i,cleanupSession:a,finalizeAttempt:o})),{ok:!0,data:tf(n.total,s,Date.now()-e)}}catch(e){let t=n(e);return D(t.code,t.message)}}async function Hd(e){let t=Ud(e),n=Wd(t),r=t.length-n.length,i=ku(e.meta?.requestId),a=await Dd(e.flags,n,r);return{entries:t,runnable:n,shardPlan:a,suiteInvocationId:i,suiteArtifactsDir:Gd(e,i),total:a?.total??t.length}}function Ud(e){return Du({inputs:e.positionals??[],cwd:e.meta?.cwd,platformFilter:e.flags?.platform,replayBackend:e.flags?.replayBackend})}function Wd(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Gd(e,t){return Ac({artifactsDir:typeof e.flags?.artifactsDir==`string`?e.flags.artifactsDir:void 0,cwd:e.meta?.cwd,suiteInvocationId:t})}function Kd(e){E({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 qd(e){let{entries:t,total:n}=e,r=[];for(let[e,i]of t.entries())i.kind===`skip`&&(E({type:`replay-test`,file:i.path,status:`skip`,index:e+1,total:n,message:i.message}),r.push({file:i.path,status:`skipped`,durationMs:0,reason:i.reason,message:i.message}));return r}async function Jd(e){return(await Promise.allSettled(e.shards.map(async t=>await Xd({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Yd(r,e.sessionName,t.reason)]:[]})}function Yd(t,n,r){let i=e(r);return{file:t.entries[0]?.entry.path??`shard-${t.shardIndex+1}`,session:Zd(n,t),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:t.shardIndex,shardCount:t.shardCount,deviceId:t.device.id,deviceName:t.device.name}}async function Xd(e){let{shard:t,sessionName:n}=e;return await $d({...e,entries:t.entries,sessionName:Zd(n,t),shard:t})}function Zd(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Qd(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,flags:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d}=e,f=[],p=0;for(let[e,m]of t.entries()){if(St(a))break;if(m.kind===`skip`){E({type:`replay-test`,file:m.path,status:`skip`,index:e+1,total:c,message:m.message}),f.push({file:m.path,status:`skipped`,durationMs:0,reason:m.reason,message:m.message});continue}p+=1;let t=await ld({entry:m,sessionName:n,suiteInvocationId:r,caseIndex:p-1,cwd:i,requestId:a,retries:Mu(o?.retries,m.metadata.retries),timeoutMs:ju(o?.timeoutMs,m.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d});if(f.push(t),ef(t,o,a))break}return f}async function $d(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,flags:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f}=e,p=[];for(let[e,m]of t.entries()){if(St(a))break;let{entry:t,suiteIndex:h}=m,g=await ld({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Mu(o?.retries,t.metadata.retries),timeoutMs:ju(o?.timeoutMs,t.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:h,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f});if(p.push(g),ef(g,o,a))break}return p}function ef(e,t,n){return St(n)||t?.failFast===!0||Yu(e)}function tf(e,t,n){let r=t.filter(e=>e.status===`passed`).length,i=t.filter(e=>e.status===`failed`),a=i.length,o=t.filter(e=>e.status===`skipped`).length,s=r+a,c=De(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:s,passed:r,failed:a,skipped:o,notRun:Math.max(0,e-s-o),durationMs:n,failures:i,tests:t,...c?{snapshotDiagnostics:c}:{}}}const nf={maestro:{parse:lu}};function rf(e,t,n={}){let r=of(t);return r?{...r.parse(e,{...n,platform:t?.platform,env:af(t)}),updateUnsupportedMessage:`replay -u is not supported for compat flow input. Convert to .ad first, then update that replay file.`}:{...br(e),metadata:Cr(e)}}function af(e){return{...cr(sr(e?.replayShellEnv)),...xr(lr(e?.replayEnv))}}function of(e){let n=e?.replayBackend;if(typeof n!=`string`)return;let r=nf[n];if(!r)throw new t(`INVALID_ARGS`,`Unsupported replay backend "${n}".`);return r}function sf(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e[e.length-1],n=t!==void 0&&/^\d+$/.test(t)?t:null,r=x(n===null?e.slice():e.slice(0,-1));return!r||r.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:r.selectorExpression,selectorTimeout:n}}function cf(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),at(e.command)){let n=df(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let{split:n}=Fe(e.positionals);n&&t.push(n.selectorExpression)}if(e.command===`wait`){let{selectorExpression:n}=sf(e.positionals??[]);n&&t.push(n)}return Yt(t).filter(e=>e.trim().length>0)}function lf(e){return cf(e).map(e=>y(e)).filter(e=>e!==null)}async function uf(e){let{action:t,sessionName:n,logPath:r,sessionStore:i}=e;if(!(at(t.command)||[`fill`,`get`,`is`,`wait`].includes(t.command)))return null;let a=i.get(n);if(!a)return null;let o=lf(t);if(o.length===0)return null;let s=at(t.command)||t.command===`fill`,c=at(t.command)||t.command===`fill`||t.command===`get`&&t.positionals?.[0]===`text`,l=await hf(a,t,r,s,i);for(let e of o){let n=He(l.nodes,e,{platform:a.device.platform,requireRect:s,requireUnique:!0,disambiguateAmbiguous:c});if(!n)continue;let r=We(n.node,a.device.platform,{action:t.command===`fill`?`fill`:at(t.command)?`click`:`get`}).join(` || `);if(at(t.command))return{...t,positionals:t.command===`longpress`?ff(t,r):[r]};if(t.command===`fill`){let e=tr(t);if(!e)continue;return{...t,positionals:[r,e]}}if(t.command===`get`){let e=t.positionals?.[0];if(e!==`text`&&e!==`attrs`)continue;return{...t,positionals:[e,r]}}if(t.command===`is`){let{predicate:e,split:n}=Fe(t.positionals);if(!e)continue;let i=n?.rest.join(` `).trim()??``,a=[e,r];return e===`text`&&i.length>0&&a.push(i),{...t,positionals:a}}if(t.command===`wait`){let{selectorTimeout:e}=sf(t.positionals??[]),n=[r];return e&&n.push(e),{...t,positionals:n}}}return null}function df(e){let t=e.positionals??[];if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&mf(n)?t.slice(0,-1):t}function ff(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):pf(e.positionals??[]);return n?[t,n]:[t]}function pf(e){let t=e.at(-1);return e.length>1&&mf(t)?t:void 0}function mf(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function hf(e,t,n,r,i){let a=Ht(await O(e.device,`snapshot`,[],t.flags?.out,{...M(n,{...t.flags??{},snapshotInteractiveOnly:r},e.appBundleId,e.trace?.outPath)}),{...t.flags??{},snapshotInteractiveOnly:r});return Bt(e,a),i.set(e.name,e),a}const gf={swipe:{screenRatio:.35,minDistancePx:120,maxDistancePx:360,marginPx:8}};function _f(e,t){let n=ve(e.rect),r=e.frame,i=yf(r?.referenceWidth,e.rect.width),a=yf(r?.referenceHeight,e.rect.height),o=gf.swipe.marginPx,s=o,c=o,l=r?r.referenceWidth-o:n.x+i,u=r?r.referenceHeight-o:n.y+a;switch(t.toLowerCase()){case`up`:return{ok:!0,start:n,end:{x:n.x,y:me(n.y-a,c,u)}};case`down`:return{ok:!0,start:n,end:{x:n.x,y:me(n.y+a,c,u)}};case`left`:return{ok:!0,start:n,end:{x:me(n.x-i,s,l),y:n.y}};case`right`:return{ok:!0,start:n,end:{x:me(n.x+i,s,l),y:n.y}};default:return{ok:!1,message:`swipe.label direction must be up, down, left, or right.`}}}function vf(e){return ve(e.rect)}function yf(e,t){let n=typeof e==`number`?e*gf.swipe.screenRatio:0;return Math.round(Math.min(gf.swipe.maxDistancePx,Math.max(gf.swipe.minDistancePx,n,t*1.5)))}const bf=new WeakMap,xf=new WeakMap,Sf=new WeakMap;function J(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}async function Cf(e){let t=e.raw===!0||process.env.AGENT_DEVICE_MAESTRO_RAW_SNAPSHOTS===`1`,n=await e.invoke({...e.baseReq,command:`snapshot`,positionals:[],flags:{...e.baseReq.flags,noRecord:!0,...t?{snapshotRaw:!0}:{}}});return n.ok&&e.scope&&Mf(e.scope,n.data),n}function wf(e){return Array.isArray(e?.nodes)?e:void 0}function Tf(e){return e?bf.get(e):void 0}function Ef(e,t){e&&xf.set(e,{selector:t})}function Df(e){return e?xf.get(e):void 0}function Of(e){e&&xf.delete(e)}function kf(e,t){e&&Sf.set(e,t)}function Af(e){if(!e)return;let t=Sf.get(e);return Sf.delete(e),t}function jf(e){e&&Sf.delete(e)}function Mf(e,t){let n=k(wf(t));n&&bf.set(e,n)}const Nf=new Map([[`button`,0],[`link`,0],[`textfield`,0],[`textview`,0],[`searchfield`,0],[`switch`,0],[`slider`,0],[`cell`,1],[`statictext`,2]]);function Pf(e,t,n,r,i,a={}){let o=Vf(e,t,r);if(n.childOf){let t=Vf(e,n.childOf,r);if(t.length===0)return{ok:!1,message:`Maestro childOf parent did not match: ${n.childOf}`};let i=Pe(e.nodes);o=o.filter(n=>t.some(t=>je(e.nodes,n,t,i)))}let s=Rf({nodes:e.nodes,matches:o,platform:r}),c=Qf(e.nodes,s.matches,n.index,Y(t),i,a.requireOnScreen===!0,a.promoteTapTarget,a.preferredContext);if(!c){let e=n.index??0;return{ok:!1,message:s.blockedByReactNativeOverlay?`React Native overlay is covering app content: ${t}`:o.length>0&&s.matches.length===0?`Maestro selector matched ${o.length} element(s), but none were visible: ${t}`:`Maestro selector did not match index ${e}: ${t}`}}return{ok:!0,node:c.node,rect:c.rect}}function Ff(e,t,n,r,i={}){let a=Hf(e,t),o=Rf({nodes:e.nodes,matches:a,platform:n}),s=Qf(e.nodes,o.matches,void 0,t,r,i.requireOnScreen===!0,i.promoteTapTarget,i.preferredContext);return s?{ok:!0,node:s.node,rect:s.rect}:{ok:!1,message:`Maestro fuzzy text did not match: ${t}`}}function If(e,t,n,r){let i=Vf(e,t,n,{allowLeadingCompositeLabelMatch:!1}),a=Rf({nodes:e.nodes,matches:i,platform:n}),o=Qf(e.nodes,a.matches,void 0,Y(t),r,!0);return o?{ok:!0,node:o.node,rect:o.rect,matches:a.matches.length}:{ok:!1,message:a.blockedByReactNativeOverlay?`React Native overlay is covering app content: ${t}`:i.length>0?`Maestro selector matched ${i.length} element(s), but none were visible: ${t}`:`Maestro selector did not match: ${t}`}}function Lf(e,t,n){return Vf(e,t,n,{allowLeadingCompositeLabelMatch:!1}).length>0}function Rf(e){let t=e.matches.filter(t=>Ne({predicate:`visible`,node:t,nodes:e.nodes,platform:e.platform}).pass),n=zf(e.nodes,t,e.platform);return{matches:n.matches,blockedByReactNativeOverlay:n.blockedByReactNativeOverlay}}function zf(e,t,n){let r=Ke(e);if(!r.detected||!r.redBox)return{matches:t,blockedByReactNativeOverlay:!1};let i=qe(r),a=i.filter(t=>Ne({predicate:`visible`,node:t,nodes:e,platform:n}).pass);if(a.length===0)return i.length===0?{matches:[],blockedByReactNativeOverlay:!0}:{matches:t,blockedByReactNativeOverlay:!1};let o=new Set(a.map(e=>e.index)),s=t.filter(e=>o.has(e.index));return{matches:s,blockedByReactNativeOverlay:t.length>0&&s.length===0}}function Bf(e){return e?.platform===`android`?`android`:`ios`}function Y(e){let t=v(e).selectors.flatMap(e=>e.terms);if(t.length===0||!t.some(e=>e.key===`label`||e.key===`text`)||!t.every(e=>[`label`,`text`,`id`].includes(e.key)))return null;let n=t.map(e=>typeof e.value==`string`?e.value:``),r=n[0];return!r||!n.every(e=>e===r)?null:r}function Vf(e,t,n,r={}){let i=v(t);for(let t of i.selectors){let i=e.nodes.filter(e=>Uf(e,t,n,r));if(i.length>0)return i}return[]}function Hf(e,t){let n=Ve(t);if(!n)return[];let r=[],i=[];for(let t of e.nodes){let e=[t.label,Ae(t),t.identifier,t.value].filter(e=>!!e).map(e=>Ve(e));e.some(e=>e===n)?r.push(t):e.some(e=>e.includes(n))&&i.push(t)}return r.length>0?r:i}function Uf(e,t,n,r){return Ue(e,t,n)?!0:t.terms.every(t=>Wf(e,t,n,r))}function Wf(e,t,n,r){return typeof t.value!=`string`||!Gf(t.key)?Ue(e,{raw:t.key,terms:[t]},n):qf(Kf(e,t.key),t.value,r)}function Gf(e){return e===`id`||e===`label`||e===`text`||e===`value`}function Kf(e,t){return t===`id`?e.identifier:t===`label`?e.label:t===`value`?e.value:Ae(e)}function qf(e,t,n={}){let r=e??``,i=Ve(r),a=Ve(t);if(i===a||n.allowLeadingCompositeLabelMatch!==!1&&Jf(i,a))return!0;if(!Yf(t))return!1;try{return new RegExp(t).test(r)}catch{return!1}}function Jf(e,t){if(!e||!t||!e.startsWith(t))return!1;let n=e.at(t.length);return n===`,`||n===`:`||n===`;`}function Yf(e){return/(?:\.\*|\.\+|\[[^\]]+\]|\([^)]*\)|\||\^|\$|\\[dDsSwWbB])/.test(e)}function Xf(e,t,n){if(t.rect&&t.rect.width>0&&t.rect.height>0)return{rect:t.rect,inherited:!1};if(t.rect)return null;let r=Zf(e,t,n);return r?{rect:r,inherited:!0}:null}function Zf(e,t,n){let r=t;for(;typeof r.parentIndex==`number`;){if(r=n.get(r.parentIndex)??e[r.parentIndex],!r)return null;if(r.rect)return r.rect.width>0&&r.rect.height>0?r.rect:null}return null}function Qf(e,t,n,r,i,a=!1,o=!1,s){let c=Pe(e);return Fp(e,tp(e,$f(e,t,c,r,n,i,a),n,r,o,s),c,o,i)}function $f(e,t,n,r,i,a,o){let s=t.map(t=>ep(e,t,n)).filter(e=>!!e),c=s.filter(e=>!e.inheritedRect),l=c.length>0?c:s;return!r||i!==void 0?s:gp(l,a,o)}function ep(e,t,n){let r=Xf(e,t,n);return r?{node:t,rect:r.rect,inheritedRect:r.inherited}:null}function tp(e,t,n,r,i,a){if(n!==void 0)return t[n]??null;let o=np(e,t,r,i,a);return rp(o,r,i)?Sp(e,o,r)??o:o}function np(e,t,n,r,i){return!r||!n?ip(e,t,n,i):ap(e,t,n,i)??ip(e,t,n,i)}function rp(e,t,n){return!!(n&&t&&e)}function ip(e,t,n,r){return sp(e,t,n,r).sort((e,t)=>vp(e,t,n))[0]??null}function ap(e,t,n,r){let i=t.filter(e=>Z(e.node,n)===0);if(i.length>=2){let t=op(e,i,n,r);if(t)return t}let a=t.filter(e=>Z(e.node,n)===1);return i.length>0||a.length<2?null:op(e,a,n,r)}function op(e,t,n,r){let i=Pe(e);return ip(e,t.filter(n=>mp(n)&&t.some(t=>hp(e,t,n,i))),n,r)}function sp(e,t,n,r){if(!n||t.length<2)return t;let i=t.filter(e=>Z(e.node,n)===0);if(i.length<2)return t;let a=Pe(e),o=i.map(t=>({candidate:t,container:fp(e,t.node,a)})).filter(e=>!!e.container);if(o.length<2||o.length!==i.length)return t;let s=o.filter(e=>dp(e,o));if(s.length<2)return t;let c=up(s);if(c.length>0)return c;let l=cp(e,s,r,a);if(l.length>0)return l;let u=Math.max(...s.map(e=>e.container.index)),d=s.filter(e=>e.container.index===u).map(e=>e.candidate);return d.length>0?d:t}function cp(e,t,n,r){if(!n)return[];let i=fp(e,n.node,r),a=i&&Bp(i.rect,n.rect)?i:null,o=t.map(e=>({entry:e,score:lp(e.container,n,a)})),s=Math.min(...o.map(e=>e.score));return Number.isFinite(s)?o.filter(e=>e.score===s).map(e=>e.entry.candidate):[]}function lp(e,t,n){if(n)return e.index===n.index?0:Vp(e.rect,n.rect)<.6?1/0:Math.abs(e.index-n.index);if(Vp(e.rect,t.rect)>=.6)return 0;let r=e.index-t.node.index;return r>=0?r:1e5+Math.abs(r)}function up(e){let t=e.map(e=>X(e.container.rect)),n=Math.max(...t),r=Math.min(...t);return r<=0||n<r*1.2?[]:e.filter(e=>X(e.container.rect)===n).map(e=>e.candidate)}function dp(e,t){return t.some(t=>t!==e&&e.container.index!==t.container.index&&Vp(e.container.rect,t.container.rect)>=.6)}function fp(e,t,n){return Me(e,t,n,e=>!e.rect||!pp(e)||e.rect.width<240||e.rect.height<320?null:e)}function pp(e){let t=ke(e.type??``);return t===`scrollview`||t===`scroll-area`||t===`list`}function mp(e){return e.rect.width>=16&&e.rect.width<=260&&e.rect.height>=24&&e.rect.height<=80}function hp(e,t,n,r){return t.node.index===n.node.index||!Bp(t.rect,n.rect)||X(t.rect)<X(n.rect)*2?!1:je(e,n.node,t.node,r)}function gp(e,t,n){let r=e.filter(e=>_p(e.rect,t));return n||r.length>0?r:e}function _p(e,t){let n=t?.referenceWidth??1/0,r=t?.referenceHeight??1/0;return e.x<n&&e.y<r&&e.x+e.width>0&&e.y+e.height>0}function vp(e,t,n){let r=bp(e,t,n);if(r!==0)return r;if(!yp(e.rect,t.rect))return e.node.index-t.node.index;let i=(t.node.depth??0)-(e.node.depth??0);return i===0?t.node.index-e.node.index:i}function yp(e,t){return Math.round(e.x)===Math.round(t.x)&&Math.round(e.y)===Math.round(t.y)&&Math.round(e.width)===Math.round(t.width)&&Math.round(e.height)===Math.round(t.height)}function bp(e,t,n){if(n){let r=Z(e.node,n)-Z(t.node,n);if(r!==0)return r}let r=xp(e.node)-xp(t.node);if(r!==0)return r;let i=Number(e.inheritedRect)-Number(t.inheritedRect);if(i!==0)return i;let a=n&&xp(e.node)===xp(t.node)?X(t.rect)-X(e.rect):X(e.rect)-X(t.rect);return a===0?0:a}function X(e){return e.width*e.height}function xp(e){return Nf.get(ke(e.type??``))??3}function Sp(e,t,n){if(!kp(t,n))return null;let r=Cp(e,t,n,Pe(e));if(r.length===0)return null;let i=Np(r.map(e=>e.rect.width)),a=wp(t,n,jp(t.rect,r.map(e=>e.rect)),i);return a?Op(t,a):null}function Cp(e,t,n,r){return e.filter(i=>i.index!==t.node.index&&!!i.rect&&je(e,i,t.node,r)&&Ap(i,t.rect,n)).sort((e,t)=>e.rect.x-t.rect.x)}function wp(e,t,n,r){let i=n.filter(e=>Mp(e.width,r)),a=Tp(e,t,n),o=i.some(t=>Dp(e.rect,t));return a&&!o?a:i.length===1?i[0]??null:a}function Tp(e,t,n){let r=n.find(t=>Math.abs(t.x-e.rect.x)<1),i=Math.max(48,Math.min(220,t.length*8+24));return Ep(e,t,r,i)?{x:e.rect.x,width:Math.min(i,r.width)}:null}function Ep(e,t,n,r){return n?ke(e.node.type??``)===`scrollview`&&Z(e.node,t)<=1&&e.rect.width>=240&&e.rect.height>=32&&e.rect.height<=80&&n.width<=e.rect.width*.55&&n.width>=r*.6:!1}function Dp(e,t){return Math.abs(t.x-e.x)<1}function Op(e,t){return{...e,rect:{x:t.x,y:e.rect.y,width:t.width,height:e.rect.height}}}function kp(e,t){let n=ke(e.node.type??``);return n!==`cell`&&n!==`other`&&n!==`scrollview`&&n!==`scroll-area`||e.rect.width<120||e.rect.height<32||e.rect.height>80?!1:Z(e.node,t)<=1}function Ap(e,t,n){let r=ke(e.type??``);return r!==`button`&&r!==`cell`&&r!==`other`||Z(e,n)<=1||e.rect.width<16||e.rect.height<16||!Bp(t,e.rect)?!1:Pp(t,e.rect)>=.5}function jp(e,t){let n=[],r=e.x,i=e.x+e.width;for(let a of t){let t=Math.max(e.x,a.x),o=Math.min(i,a.x+a.width);t>r&&n.push({x:r,width:t-r}),r=Math.max(r,o)}return i>r&&n.push({x:r,width:i-r}),n}function Mp(e,t){return e<24||t<24?!1:e>=t*.4&&e<=t*1.6}function Np(e){let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??0}function Pp(e,t){let n=Math.max(e.y,t.y),r=Math.min(e.y+e.height,t.y+t.height);return Math.max(0,r-n)/Math.max(1,Math.min(e.height,t.height))}function Fp(e,t,n,r,i){return t?r?Ip(e,t,n,i)??{node:t.node,rect:t.rect}:{node:t.node,rect:t.rect}:null}function Ip(e,t,n,r){return Lp(t.node)?null:Me(e,t.node,n,i=>{if(!Lp(i))return null;let a=Xf(e,i,n);return!a||!Rp(t.rect,a.rect,r)?null:{node:i,rect:a.rect}})}function Lp(e){let t=ke(e.type??``);return e.hittable===!0||t===`button`||t===`link`||t===`cell`||t===`textfield`||t===`searchfield`||t===`switch`||t===`slider`}function Rp(e,t,n){if(!Bp(t,e)||zp(e,t))return!1;let r=X(t),i=X(e);if(i>0&&r>i*30)return!1;if(n){let e=n.referenceWidth*n.referenceHeight;if(e>0&&r>e*.5)return!1}return!0}function zp(e,t){return t.height<32||t.height>80||e.height<t.height*.75||Pp(e,t)<.75||t.width<240?!1:t.width>=e.width*3}function Bp(e,t){return t.x>=e.x-1&&t.y>=e.y-1&&t.x+t.width<=e.x+e.width+1&&t.y+t.height<=e.y+e.height+1}function Vp(e,t){let n=Math.max(e.x,t.x),r=Math.min(e.x+e.width,t.x+t.width),i=Math.max(e.y,t.y),a=Math.min(e.y+e.height,t.y+t.height);return Math.max(0,r-n)*Math.max(0,a-i)/Math.max(1,Math.min(X(e),X(t)))}function Z(e,t){let n=[e.label,Ae(e),e.identifier,e.value].filter(e=>!!e);return n.some(e=>e===t)?0:n.some(e=>Ve(e)===Ve(t))?1:n.some(e=>qf(e,t))?2:3}const Q={animationPollMs:250,assertVisibleGraceMs:1e3,assertVisiblePollMs:250,assertVisibleRetryTimeoutMs:5e3,assertNotVisiblePollMs:250,defaultAssertNotVisibleTimeoutMs:3e3};async function Hp(e){let t=um(e.positionals,{command:`assertVisible`,defaultTimeoutMs:17e3});if(!t.ok)return t.response;let n=cm(e.baseReq,t.selector);return n?await Up(e,t,n):await Kp(e,t)}async function Up(e,t,n){let r=Date.now(),i=await Gp(e,t,n);if(i.ok){if(Wp(e.baseReq)){let n=await dm(e,t.selector,`assertVisible`);if(!n.visible){let i=nm(e.baseReq,t,n,r);return i.kind===`return`?i.response:await Kp(e,am(t))}}return Ef(e.scope,t.selector),ym({ok:!0,data:{selector:t.selector,nativeWait:!0,query:n,response:i.data}},t.selector,r)}return await qp(e,t,i,r)}function Wp(e){return e.flags?.platform===`android`}async function Gp(e,t,n){return await e.invoke({...e.baseReq,command:`wait`,positionals:[n,String(t.timeoutMs)]})}async function Kp(e,t){let n=Date.now(),r=t.timeoutMs+Q.assertVisibleGraceMs,i,a,o=!1;for(;;){let s=Date.now(),c=await dm(e,t.selector,`assertVisible`);if(c.visible)return ym(c.response,t.selector,n);i=c.response,a=c.snapshot??a;let l=nm(e.baseReq,t,c,n);if(l.kind===`return`)return l.response;let u=im({captureStartedAt:s,capturedAfterDeadline:o,startedAt:n,deadlineMs:r});if(u===`capture-again`){o=!0;continue}if(u===`finish`)break;await T(Q.assertVisiblePollMs)}let s=i??J(`COMMAND_FAILED`,`Expected visible but did not match: ${t.selector}`,{selector:t.selector,timeoutMs:t.timeoutMs});return await Jp(e,t,a)||bm(s,a,e.baseReq)}async function qp(e,t,n,r){let i=await dm(e,t.selector,`assertVisible`);if(i.visible)return ym(i.response,t.selector,r);let a=nm(e.baseReq,t,i,r);return a.kind===`return`?a.response:await Jp(e,t,i.snapshot)||bm(n,i.snapshot,e.baseReq)}async function Jp(e,t,n){if(e.baseReq.flags?.platform!==`android`)return null;let r=Af(e.scope);return r?r.kind===`tap`?await Yp(e,t,n,r):await Xp(e,t,r):null}async function Yp(e,t,n,r){if(!n)return null;let i=Qp(e,n,r);return!i.ok||(h({level:`info`,phase:`maestro_assert_visible_retry_tap`,data:{selector:t.selector,tapSelector:r.selector,originalPoint:r.point,retryTarget:i.target,timeoutMs:Q.assertVisibleRetryTimeoutMs}}),!(await $p(e,i.target)).ok)?null:await Zp(e,t,`retryTap`)}async function Xp(e,t,n){return h({level:`info`,phase:`maestro_assert_visible_retry_swipe`,data:{selector:t.selector,swipePositionals:n.positionals,timeoutMs:Q.assertVisibleRetryTimeoutMs}}),(await em(e,n)).ok?await Zp(e,t,`retrySwipe`):null}async function Zp(e,t,n){let r={...t,timeoutMs:om(t.timeoutMs)},i=cm(e.baseReq,r.selector);if(!i)return await Kp(e,r);let a=Date.now(),o=await Gp(e,r,i);return o.ok?(Ef(e.scope,r.selector),ym({ok:!0,data:{selector:r.selector,nativeWait:!0,[n]:!0,query:i,response:o.data}},r.selector,a)):await qp(e,r,o,a)}function Qp(e,t,n){let r=Bf(e.baseReq.flags),i=k(t),a=Pf(t,n.selector,n.options??{},r,i,{promoteTapTarget:!0});if(a.ok)return{ok:!0,target:{kind:`point`,point:vf(a)}};let o=Y(n.selector);return!o||!tm(t,o)?{ok:!1}:{ok:!0,target:{kind:`text`,query:o}}}async function $p(e,t){return t.kind===`text`?await e.invoke({...e.baseReq,command:`find`,positionals:[t.query,`click`],flags:{...e.baseReq.flags,findFirst:!0,postGestureStabilization:!0}}):await e.invoke({...e.baseReq,command:`click`,positionals:[String(t.point.x),String(t.point.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}})}async function em(e,t){return await e.invoke({...e.baseReq,command:`swipe`,positionals:t.positionals})}function tm(e,t){let n=t.trim().toLowerCase();return n?e.nodes.some(e=>[e.label,e.value,e.identifier].some(e=>e?.trim().toLowerCase().includes(n))):!1}function nm(e,t,n,r){return sm(n.response)?{kind:`return`,response:n.response}:rm(e,t.selector,n.snapshot)?{kind:`return`,response:lm(t.selector,t.timeoutMs,r)}:{kind:`continue`}}function rm(e,t,n){return e.flags?.maestro?.allowAlreadyPastLoading===!0&&n!==void 0&&gm(t,n)}function im(e){return Date.now()-e.startedAt<e.deadlineMs?`wait`:wm(e.capturedAfterDeadline,e.captureStartedAt,e.startedAt,e.deadlineMs)?`capture-again`:`finish`}function am(e){return{...e,timeoutMs:om(e.timeoutMs)}}function om(e){return Math.min(e,Q.assertVisibleRetryTimeoutMs)}function sm(e){return!e.ok&&e.error.code===`COMMAND_FAILED`&&e.error.message.includes(`React Native overlay`)}function cm(e,t){return e.flags?.platform!==`ios`&&e.flags?.platform!==`android`?null:Y(t)}function lm(e,t,n){return{ok:!0,data:{selector:e,alreadyPastLoading:!0,waitedMs:Date.now()-n,timeoutMs:t}}}function um(e,t){let[n,r=String(t.defaultTimeoutMs)]=e;if(!n)return{ok:!1,response:J(`INVALID_ARGS`,`${t.command} requires a selector.`)};let i=Number(r);return!Number.isFinite(i)||i<0?{ok:!1,response:J(`INVALID_ARGS`,`${t.command} timeout must be a non-negative number.`)}:{ok:!0,selector:n,timeoutMs:i}}async function dm(e,t,n){let r=fm(e,t,n,await Cf(e));return pm(e.baseReq,t,n,r)?fm(e,t,n,await Cf({...e,raw:!0})):r}function fm(e,t,n,r){if(!r.ok)return{visible:!1,response:r,infrastructureFailure:!0};let i=wf(r.data);if(!i)return{visible:!1,response:J(`COMMAND_FAILED`,`Unable to read snapshot data for ${n}.`),infrastructureFailure:!0};let a=Bf(e.baseReq.flags),o=If(i,t,a,k(i));if(!o.ok){let e=hm(i,t,a);return{visible:!1,response:J(`COMMAND_FAILED`,o.message,{selector:t}),infrastructureFailure:!1,...e?{missKind:e}:{},snapshot:i}}return Ef(e.scope,t),{visible:!0,response:{ok:!0,data:{selector:t,matches:o.matches,nodeIndex:o.node.index,nodeType:o.node.type,nodeLabel:o.node.label,nodeIdentifier:o.node.identifier,rect:o.rect}}}}function pm(e,t,n,r){return n===`assertVisible`&&e.flags?.platform===`android`&&!r.visible&&!r.infrastructureFailure&&r.missKind===`missing`&&mm(t)}function mm(e){let t=y(e);return t?t.selectors.length>0&&t.selectors.every(e=>e.terms.length>0&&e.terms.every(e=>e.key===`id`&&typeof e.value==`string`)):!1}function hm(e,t,n){if(n===`android`)return Lf(e,t,n)?`notVisible`:`missing`}function gm(e,t){let n=_m(Y(e));if(!vm(n))return!1;let r=t.nodes.flatMap(e=>[e.label,e.value,e.identifier]).filter(e=>!!e?.trim()).map(e=>_m(e));return r.some(e=>e.includes(`something went wrong`))?!1:r.some(e=>e!==n&&!vm(e))}function _m(e){return e?.trim().toLowerCase().replace(/\u2026/g,`...`)??``}function vm(e){return e===`loading`||e===`loading...`}function ym(e,t,n){return e.ok?{ok:!0,data:{selector:t,...e.data,waitedMs:Date.now()-n}}:e}function bm(e,t,n){if(e.ok||!t)return e;let r=typeof n.flags?.artifactsDir==`string`?n.flags.artifactsDir:void 0;if(!r)return e;let i=xm(t,r);return i.length===0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},artifactPaths:Cm([...Sm(e.error.details?.artifactPaths),...i])}}}}function xm(e,t){try{B.mkdirSync(t,{recursive:!0});let n=V.join(t,`failure-snapshot.json`),r=V.join(t,`failure-snapshot.txt`);B.writeFileSync(n,`${JSON.stringify(e,null,2)}\n`);let i=re(e.nodes,{summarizeTextSurfaces:!0}).map(e=>e.text);return B.writeFileSync(r,`${i.join(`
|
|
25
|
-
`)}
|
|
26
|
-
`]})}function ch(e){let[t]=e.positionals;if(!t)return J(`INVALID_ARGS`,`runScript requires a file path.`);try{return{ok:!0,data:{outputEnv:Gl({scriptPath:t,env:{...e.scope.values,...e.baseReq.flags?.maestro?.runScriptEnv??{}}})}}}catch(e){let t=n(e);return J(t.code,t.message,t.details)}}async function lh(e){for(let[t,n]of e.actions.entries()){let r=await e.invokeReplayAction({action:n,line:e.line,step:e.step+t/1e3});if(!r.ok)return r}return{ok:!0,data:{ran:e.actions.length}}}async function uh(e){let t;for(let n=0;n<=e.maxRetries;n+=1){let r=await lh({actions:e.actions,line:e.line,step:e.step+n,invokeReplayAction:e.invokeReplayAction});if(r.ok)return{ok:!0,data:{attempts:n+1,retried:n>0}};t=r}return t??{ok:!1,error:{code:`COMMAND_FAILED`,message:`retry commands failed.`}}}const dh={visibleTimeoutMs:3e3,visiblePollMs:250};async function fh(e){let t=await ph(e,e.control);return t.ok?t.matched?await _h(e):{ok:!0,data:{skipped:!0,condition:e.control.mode,selector:e.control.selector}}:t.response}async function ph(e,t){if(t.mode===`visible`)return await mh(e,t);let n=await hh(e,t.selector);return n.ok?{ok:!0,matched:!n.matched}:{ok:!1,response:n.response}}async function mh(e,t){let n=Date.now();for(;;){let r=await hh(e,t.selector);if(!r.ok)return{ok:!1,response:r.response};if(r.matched)return{ok:!0,matched:!0};if(Date.now()-n>=dh.visibleTimeoutMs)return{ok:!0,matched:!1};await T(dh.visiblePollMs)}}async function hh(e,t){let n=await Cf(e);return n.ok?gh(e,t,n):{ok:!1,response:n}}function gh(e,t,n){let r=wf(n.data);return r?{ok:!0,matched:If(r,t,Bf(e.baseReq.flags),k(r)).ok}:{ok:!1,response:J(`COMMAND_FAILED`,`Unable to read snapshot data for runFlow.when.`)}}async function _h(e){let t=await lh({actions:e.control.actions,line:e.line,step:e.step,invokeReplayAction:e.invokeReplayAction});return t.ok?{ok:!0,data:{ran:t.data?.ran,condition:e.control.mode,selector:e.control.selector}}:t}async function vh(e){let{req:t,sessionName:n,action:r,scope:i,filePath:a,line:o,step:s,tracePath:c,invoke:l}=e,u=or(r,i,{file:a,line:o}),d=e=>vh({req:t,sessionName:n,action:e.action,scope:i,filePath:a,line:e.line,step:e.step,tracePath:c,invoke:l}),f=Date.now();Ch(c,{type:`replay_action_start`,ts:new Date(f).toISOString(),replayPath:a,line:o,step:s,command:u.command,positionals:u.positionals??[]});let p=await yh({req:t,sessionName:n,resolved:u,scope:i,line:o,step:s,invoke:l,invokeReplayAction:d}),m=Date.now();return Ch(c,{type:`replay_action_stop`,ts:new Date(m).toISOString(),replayPath:a,line:o,step:s,command:u.command,ok:p.ok,durationMs:m-f,resultTiming:p.ok?Sh(p.data):void 0,errorCode:p.ok?void 0:p.error.code}),p}async function yh(e){let{req:t,sessionName:n,resolved:r,scope:i,line:a,step:o,invoke:s,invokeReplayAction:c}=e,l=wh(t.flags,r.flags),u={token:t.token,session:n,flags:l,runtime:r.runtime,meta:t.meta,internal:t.internal},d=await bh({control:r.replayControl,baseReq:u,line:a,step:o,invoke:s,invokeReplayAction:c})??await oh({command:r.command,baseReq:u,positionals:r.positionals??[],scope:i,line:a,step:o,invoke:s,invokeReplayAction:c})??await s({...u,command:r.command,positionals:r.positionals??[]});if(d.ok){let e=xh(d.data);e&&ar(i,e)}return d}async function bh(e){let{control:t,baseReq:n,line:r,step:i,invoke:a,invokeReplayAction:o}=e;if(t){switch(t.kind){case`retry`:return await uh({actions:t.actions,maxRetries:t.maxRetries,line:r,step:i,invokeReplayAction:o});case`maestroRunFlowWhen`:return await fh({baseReq:n,control:t,line:r,step:i,invoke:a,invokeReplayAction:o})}return t}}function xh(e){if(!e||typeof e!=`object`)return null;let t=e.outputEnv;if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=Object.entries(t).filter(e=>typeof e[1]==`string`);return n.length>0?Object.fromEntries(n):null}function Sh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function Ch(e,t){e&&B.appendFileSync(e,`${JSON.stringify(t)}\n`)}function wh(e,t){return Le(e,{...t??{}})}async function Th(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,tracePath:o,invoke:s}=e,c=t.positionals?.[0];if(!c)return D(`INVALID_ARGS`,`replay requires a path`);let l=``,u=new Set;try{l=j.expandHome(c,t.meta?.cwd);let e=B.readFileSync(l,`utf8`),n=e.trimStart()[0];if(n===`{`||n===`[`)return D(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let d=rf(e,t.flags,{sourcePath:l}),f=d.metadata,p=f.platform||f.target?{...t,flags:Mh(t.flags,f)}:t,m=d.actions,h=d.actionLines;if(t.flags?.replayUpdate===!0&&d.updateUnsupportedMessage)return D(`INVALID_ARGS`,d.updateUnsupportedMessage);if(t.flags?.replayUpdate===!0&&f.env&&Object.keys(f.env).length>0)return D(`INVALID_ARGS`,`replay -u does not yet preserve env directives. Temporarily remove the env lines, run replay -u, then restore them.`);if(t.flags?.replayUpdate===!0&&zh(m))return D(`INVALID_ARGS`,"replay -u does not yet preserve ${VAR} substitutions. Resolve or inline the variables before running with -u.");let g=Sr({builtins:Eh({req:p,sessionName:r,metadata:f,resolvedPath:l}),fileEnv:f.env,shellEnv:cr(sr(t.flags?.replayShellEnv)),cliEnv:xr(lr(t.flags?.replayEnv))}),_=t.flags?.replayUpdate===!0,v=o??a.get(r)?.trace?.outPath,y=[],b=0;for(let e=0;e<m.length;e+=1){let t=m[e];if(!t||t.command===`replay`)continue;Dh(l,e,m.length,t);let n=Ih(a,r),o=await vh({req:p,sessionName:r,action:t,scope:g,filePath:l,line:h[e]??0,step:e+1,tracePath:v,invoke:s});if(y.push(...Lh(a,r,n)),o.ok){Fh(o).forEach(e=>u.add(e));continue}if(Fh(o).forEach(e=>u.add(e)),!_)return Nh(o,t,e,l,[...u],y);let c=await uf({action:t,sessionName:r,logPath:i,sessionStore:a});if(!c)return Nh(o,t,e,l,[...u],y);m[e]=c;let d=Ih(a,r);if(o=await vh({req:p,sessionName:r,action:c,scope:g,filePath:l,line:h[e]??0,step:e+1,tracePath:v,invoke:s}),y.push(...Lh(a,r,d)),!o.ok)return Fh(o).forEach(e=>u.add(e)),Nh(o,c,e,l,[...u],y);Fh(o).forEach(e=>u.add(e)),b+=1}_&&b>0&&ur(l,m,a.get(r));let x=Te(y);return{ok:!0,data:{replayed:m.length,healed:b,session:r,artifactPaths:[...u],...x?{snapshotDiagnostics:x}:{}}}}catch(e){let t=n(e);return D(t.code,t.message,u.size>0?{artifactPaths:[...u]}:void 0)}}function Eh(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o=t.meta?.cwd??process.cwd(),s={AD_SESSION:n,AD_FILENAME:V.relative(o,i)||i},c=a.platform??r.platform;c&&(s.AD_PLATFORM=c);let l=a.target??r.target;l&&(s.AD_TARGET=l);let u=a.device;typeof u==`string`&&u.length>0&&(s.AD_DEVICE=u);let d=typeof a.serial==`string`?a.serial:a.udid;typeof d==`string`&&d.length>0&&(s.AD_DEVICE_ID=d),typeof a.shardIndex==`number`&&(s.AD_SHARD_INDEX=String(a.shardIndex)),typeof a.shardCount==`number`&&(s.AD_SHARD_COUNT=String(a.shardCount));let f=a.artifactsDir;return typeof f==`string`&&f.length>0&&(s.AD_ARTIFACTS=f),s}function Dh(e,t,n,r){let i=ft();i&&E({type:`replay-test`,...i,file:i.file||e,status:`progress`,stepIndex:t+1,stepTotal:n,...Oh(r)})}function Oh(e){return{stepCommand:kh(e.command),...Ah(e)}}function kh(e){if(!e.startsWith(`__maestro`))return e;let t=e.slice(9);return t.length>0?t[0].toLowerCase()+t.slice(1):e}function Ah(e){let t=e.positionals??[],n=jh(t[0]);return n?{stepValue:n}:e.command===`__maestroTapPointPercent`&&t.length>=2?{stepValue:`${t[0]},${t[1]}%`}:t.length===0?{}:{stepValue:t.join(` `)}}function jh(e){if(!e)return;let t=y(e);if(!t)return;let n=t.selectors.flatMap(e=>e.terms.flatMap(e=>(e.key===`label`||e.key===`text`||e.key===`id`)&&typeof e.value==`string`?[e.value]:[]));if(n.length===0)return;let r=n[0];return r&&n.every(e=>e===r)?r:void 0}function Mh(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function Nh(e,t,n,r,i,a){return Ph(e,t,n,r,i,Te(a))}function Ph(e,t,n,r,i=[],a){if(e.ok)return e;let o=n+1;return{ok:!1,error:{code:e.error.code,message:`Replay failed at step ${o} (${ot(t)}): ${e.error.message}`,hint:e.error.hint,diagnosticId:e.error.diagnosticId,logPath:e.error.logPath,details:{...e.error.details??{},replayPath:r,step:o,action:t.command,positionals:t.positionals??[],artifactPaths:i,...a?{snapshotDiagnostics:a}:{}}}}}function Fh(e){if(!e.ok){let t=e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`&&Rh(e)))]:[]}if(!e.data)return[];let t=[];if(typeof e.data.path==`string`&&t.push(e.data.path),typeof e.data.outPath==`string`&&t.push(e.data.outPath),Array.isArray(e.data.artifacts))for(let n of e.data.artifacts){if(!n||typeof n!=`object`)continue;let e=n,r=typeof e.localPath==`string`?e.localPath:void 0,i=typeof e.path==`string`?e.path:void 0;r?t.push(r):i&&t.push(i)}return[...new Set(t.filter(e=>Rh(e)))]}function Ih(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function Lh(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function Rh(e){try{return B.statSync(e).isFile()}catch{return!1}}function zh(e){for(let t of e){for(let e of t.positionals??[])if(typeof e==`string`&&e.includes("${"))return!0;if(Bh(t.flags)||Bh(t.runtime))return!0}return!1}function Bh(e){return typeof e==`string`?e.includes("${"):Array.isArray(e)?e.some(Bh):e&&typeof e==`object`?Object.values(e).some(Bh):!1}const Vh=1e3,Hh=3e3;function Uh(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Wh(e)}}async function Wh(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o}=e;if(t.flags?.recordVideo!==!0)return;let s=i.get(n);if(!s||s.recording)return;let c=Ce(s.device.platform),l=a?V.join(a,`recording${c}`):we(s.device.platform);Kh(o,{type:`video_recording_start`,session:n,videoPath:l}),h({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let u=await Nr({req:{token:t.token,session:n,command:`record`,positionals:[`start`,l],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});if(!u.ok)return Kh(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:u.error.code}),u;let d=Date.now();return await T(Vh),Kh(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-d,requestedDurationMs:Vh}),h({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-d,data:{session:n,requestedDurationMs:Vh}}),u}async function Gh(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,artifactPaths:o}=e;if(t.flags?.recordVideo!==!0||!i.get(n)?.recording)return;Kh(a,{type:`video_tail_start`,session:n,requestedDurationMs:Hh});let s=Date.now();await T(Hh);let c=Date.now(),l=await Nr({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return Fh(l).forEach(e=>o.add(e)),Kh(a,{type:`video_recording_stop`,session:n,ok:l.ok,durationMs:Date.now()-c,tailDurationMs:c-s,errorCode:l.ok?void 0:l.error.code}),h({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-c,data:{session:n,ok:l.ok,tailDurationMs:c-s}}),l}function Kh(e,t){q(e,{...t,ts:new Date().toISOString()})}function qh(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=Jh(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:Od({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function Jh(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function Yh(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;return t.command===`replay`?await Th({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o}):t.command===`test`?await Vd({req:t,sessionName:n,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:c,artifactsDir:l,artifactPaths:u,tracePath:d,shard:f})=>{let p=e=>(u&&Fh(e).forEach(e=>u.add(e)),e),m=qh({parentFlags:t.flags,platform:a,target:s,artifactsDir:l,shard:f}),h={req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:l,tracePath:d},g=Uh(h);return await Th({req:{...t,command:`replay`,session:n,positionals:[e],flags:m,meta:{...t.meta??{},...c?{requestId:c}:{}},...t.internal||g?{internal:{...t.internal??{},...g?{openLifecycle:g}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:d,invoke:async e=>{let t=await Wh(h);return t&&!t.ok?t:p(await o(e))}})},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o})=>await Gh({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,artifactPaths:n}),cleanupSession:async e=>{i.get(e)&&await Wa({req:{token:t.token,session:e,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a})}}):null}function Xh(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Zh(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Qh(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function $h(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),E({type:`command`,status:`progress`,message:eg(t)})}function eg(e){return[Se(e),...oe(e)].join(`
|
|
27
|
-
`)
|
|
28
|
-
`).map(e=>e.
|
|
29
|
-
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Mg=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Ng=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Pg(e,t){let n=Re(e.meta?.cwd);return{targetApp:zg(e.flags?.targetApp)??t?.appBundleId,metroHost:zg(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Bg(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Lg(e,n)}}function Fg(e,t={}){let n=Rg(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Ig(e,t,n,r={}){let a=n?e.toArray().filter(e=>e.name!==n.name&&e.device.platform===n.device.platform&&e.device.id===n.device.id).map(e=>e.name):[];return n?[{id:`session`,status:a.length>0?`warn`:`pass`,summary:a.length>0?`Other active sessions target the same device: ${a.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:a.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:a.length>0?`agent-device close --session ${a[0]} --platform ${i(n.device)}`:void 0,evidence:{session:n.name,sameDeviceSessions:a,sessionStateDir:e.resolveSessionDir(n.name)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Lg(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Rg(e){let t={...Object.fromEntries([...Mg,...Ng].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function zg(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Bg(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Vg(e,t){if(t===`android`){$(e,await Hg());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await qg())}async function Hg(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await Qg(e),n=await $g(`adb`,[`version`]);return n?Ug({license:t,sdkRoot:e,versionLine:n}):Kg(e,t)}function Ug(e){return{id:`toolchain`,status:Wg(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${Gg(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function Wg(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function Gg(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function Kg(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function qg(){let e=await $g(`xcodebuild`,[`-version`]);return e?Jg({selectedPath:await $g(`xcode-select`,[`-p`]),versionLine:e}):Zg()}function Jg(e){return{id:`toolchain`,status:Yg(e),summary:Xg(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function Yg(e){return e.versionLine?`pass`:`info`}function Xg(e){return e.versionLine?e.selectedPath?`Apple toolchain: ${e.versionLine}; xcode-select ${e.selectedPath}.`:`Apple toolchain: ${e.versionLine}; xcode-select path unavailable.`:`Apple toolchain: xcodebuild version check failed.`}function Zg(){return{id:`toolchain`,status:`info`,summary:`Apple toolchain: xcodebuild version check failed.`,hint:`Install/select Xcode and complete first launch/license setup if xcodebuild reports it.`,command:`xcodebuild -version`}}async function Qg(e){if(!e)return`unknown`;try{return await Pr(V.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function $g(e,t){try{let n=await _(e,t,{allowFailure:!0,timeoutMs:3e3});return n.exitCode===0?n.stdout.split(`
|
|
30
|
-
`).map(e=>e.trim()).find(Boolean):void 0}catch{return}}async function e_(e,t){$(e,await t_(t))}async function t_(e){let t=Dt({stateDir:e});if(!t.installed)return{id:`web-agent-browser-processes`,status:`info`,summary:`Managed web backend is not installed; no agent-device-owned browser processes counted.`,evidence:{stateDir:e,installed:!1}};try{let n=await Ot(t);return{id:`web-agent-browser-processes`,status:n.count>0?`info`:`pass`,summary:n.count>0?`${n.count} live agent-device-owned Chrome process${n.count===1?``:`es`} detected.`:`No live agent-device-owned Chrome processes detected.`,evidence:{stateDir:e,installed:!0,count:n.count,pids:n.pids,matchReasons:n.processes.map(e=>e.reason)}}}catch(t){return{id:`web-agent-browser-processes`,status:`info`,summary:`Could not inspect live agent-device-owned Chrome processes.`,hint:`Run doctor again from a shell with permission to inspect local processes.`,evidence:{stateDir:e,error:t instanceof Error?t.message:String(t)}}}}async function n_(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==w.doctor)return null;let a=r.get(n),o=Pg(t,a),s=a_(r,n),c=[];if($h(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${Oe()} using ${s}`,evidence:{version:Oe(),stateDir:s}},...Fg(t,{required:o.remote}),...Ig(r,n,a,{remote:o.remote})),o.remote)return c_(c,o);let l=await og(c,t,a);await Vg(c,a?.device.platform??l?.platform);let u=await o_({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await i_(c,u??r_(l)),c_(c,o,{device:u,includeMetro:!0,inventory:l})}function r_(e){let t=(e?.devices??[]).filter(e=>c(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function i_(e,t){if(!(!t||!c(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||_n(t))){if(E({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await yt(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}pt(t,{}),E({type:`command`,status:`progress`,message:`Warming iOS runner build cache in the background (${t.name})...`}),$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner build started in the background; the first open gets faster once it completes`,hint:"Run `agent-device prepare ios-runner` to wait for a fully warmed runner instead."})}}function a_(e,t){let n=V.dirname(e.resolveSessionDir(t));return V.basename(n)===`sessions`?V.dirname(n):n}async function o_(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??sg(t,n,r.targetApp);return s&&await s_(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await Tg(r.metroHost,r.metroPort,r.kind)),await e_(t,o),s}async function s_(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await rg(e,{device:r,session:a,targetApp:i.targetApp}),await tg(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function c_(e,t,n={}){let r=Xh(e);return{ok:!0,data:{status:r,summary:Zh(r),kind:t.kind,platform:n.device?i(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:Qh(e)}}}async function l_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return D(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=i.get(n),c=t.flags??{},l=U(w.prepare,s,c);if(l)return l;let u=await W({session:s,flags:c,ensureReady:!0});if(!a(u.platform))return D(`UNSUPPORTED_OPERATION`,`prepare ios-runner is only supported on Apple runner platforms`);let d=Date.now(),f=await vt(u,u_(t,s,r,d));return{ok:!0,data:f_(o,u,Math.max(0,Date.now()-d),f)}}function u_(e,t,n,r){let i=d_(e);return{...Or({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:$e.fromTimeoutMs(i,r),startupTimeoutMs:i}}function d_(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:b}function f_(e,t,n,r){return{action:e,platform:i(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:p_(n,r),message:`Prepared Apple runner: ${t.name}`}}function p_(e,t){let n=m_(t.buildMs),r=h_(t.connectMs),i=h_(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function m_(e){return e===void 0?void 0:h_(e)}function h_(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function g_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,command:a,positionals:o,recordPositionals:s,deriveNextSession:c}=e,l=i.get(n),u=t.flags??{},d=U(a,l,u);if(d)return d;let f=await W({session:l,flags:u,ensureReady:!0}),p=A(a,f);if(p)return p;let m=await O(f,a,o,t.flags?.out,{...M(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;kr(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function __(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,o=a.get(n),s=t.flags??{},c=U(w.clipboard,o,s);if(c)return c;let l=(t.positionals?.[0]??``).toLowerCase();if(l!==`read`&&l!==`write`)return D(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let u=await W({session:o,flags:s,ensureReady:!0}),d=A(w.clipboard,u);if(d)return d;let f=await O(u,w.clipboard,t.positionals??[],t.flags?.out,{...M(r,t.flags,o?.appBundleId,o?.trace?.outPath)});return kr(a,o,t,t.command,f??{}),{ok:!0,data:{platform:i(u),...f??{}}}}async function v_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new hn,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}=e;if(t.command===w.doctor)return await n_({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(Zt(t.command)===`inventory`)return await no({req:t,sessionName:n,sessionStore:i});if(t.command===`runtime`)return await Ji({req:t,sessionName:n,sessionStore:i});if(Zt(t.command)===`state`)return await lo({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===w.clipboard)return await __({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===w.keyboard){let e=i.get(n),a=t.positionals?.[0]?.trim().toLowerCase();return!e&&(a===`dismiss`||a===`enter`||a===`return`)&&(t.flags??{}).platform===`ios`?D(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await g_({req:t,sessionName:n,logPath:r,sessionStore:i,command:w.keyboard,positionals:t.positionals??[]})}if(Zt(t.command)===`observability`)return await nc({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(t.command===w.prepare)return await l_({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===w.install||t.command===w.reinstall)return await Xa({req:t,command:t.command,sessionName:n,sessionStore:i,deployOps:t.command===w.install?Ya:Ja});if(t.command===de.installSource)return await Kr({req:t,sessionName:n,sessionStore:i});if(t.command===de.releaseMaterializedPaths)return await ti({req:t});if(t.command===w.push){let e=t.positionals?.[0]?.trim(),a=t.positionals?.[1]?.trim();return!e||!a?D(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`):await g_({req:t,sessionName:n,logPath:r,sessionStore:i,command:w.push,positionals:[e,y_(a,t.meta?.cwd)],recordPositionals:[e,a]})}return t.command===w.triggerAppEvent?await g_({req:t,sessionName:n,logPath:r,sessionStore:i,command:w.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await xa(e.device,n,e.appBundleId,va)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}}):t.command===w.open?await Fa({req:t,sessionName:n,logPath:r,sessionStore:i}):Zt(t.command)===`replay`?await Yh({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:c??s}):t.command===w.batch?await to(t,n,s):t.command===w.close?await Wa({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}):null}function y_(e,t){let n=Lt(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>j.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{v_ as handleSessionCommands};
|
|
24
|
+
`],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??``}),timeoutMs:th,allowFailure:!0});if(i.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${uh(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(r){throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:i.stdout.slice(0,nh),stderr:i.stderr.slice(0,nh)},r instanceof Error?r:void 0)}}function ch(e,t){for(let r of Object.keys(e))if(r.includes(`.`))throw new n(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:t,key:r})}function lh(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function uh(e){let t=e.trim();return t.length>0?t.slice(0,nh):`request process exited without stderr`}const dh=`maestro-test-failure`;function fh(e,t={}){return new n(`COMMAND_FAILED`,e,{...t,reason:dh})}function ph(e){return e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===dh}function mh(e,t,n){return new Ch(gh(hh(t.resolve(e))),n).parse()}function hh(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function gh(e){let t=[],r=0;for(;r<e.length;){let i=e.slice(r),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){r+=a;continue}let o=_h(i);if(!o)throw new n(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);t.push(o.value),r+=o.length}return t}function _h(e){return vh(e)??yh(e)??bh(e)??xh(e)??Sh(e)}function vh(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function yh(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function bh(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function xh(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Sh(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Ch=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let e=this.parseOr();if(this.peek())throw new n(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new n(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new n(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.consumePlatformToken();let e=this.consumeComparisonOperator(),t=this.consumeStringLiteral(),n=this.platform===t.toLowerCase();return e.value===`==`?n:!n}consumePlatformToken(){if(this.peek()?.type!==`platform`)throw new n(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}consumeComparisonOperator(){let e=this.peek();if(e?.type!==`operator`||e.value!==`==`&&e.value!==`!=`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,e}consumeStringLiteral(){let e=this.peek();if(e?.type!==`string`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`);return this.index+=1,e.value}consumeOperator(e){let t=this.peek();return t?.type!==`operator`||t.value!==e?!1:(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type!==`paren`||t.value!==e?!1:(this.index+=1,!0)}peek(){return this.tokens[this.index]}};function wh(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function Th(e,t){return{...Ph(e,t),source:e.source}}function Y(e,t,r){if(e===void 0)return;let i=r??Su[t]??{},a=Cu(i),o;if(typeof e==`number`)o=e;else{let r=e.trim();if(r===``)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);o=Number(r)}if(!Number.isFinite(o)||Math.abs(o)>2**53-1||i.integer&&!Number.isSafeInteger(o)||i.nonNegative&&o<0||i.positive&&o<=0)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);return o}function Eh(e,t,n,r){return Y(e===void 0?t:n.resolve(String(e)),r)}function X(e){if(e?.aborted)throw jt()}async function Dh(e,t){if(e.include.kind===`commands`)return{kind:`program`,source:e.source,config:{},commands:e.include.commands};if(!t.loadProgram)throw new n(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return X(t.signal),t.signal?await t.loadProgram(e.include.path,e.source.path,t.signal):await t.loadProgram(e.include.path,e.source.path)}function Oh(e,t){if(e.include.kind===`file`)return I.resolve(t?I.dirname(t):process.cwd(),e.include.path)}function kh(e){return e===void 0?void 0:I.resolve(e)}function Ah(e,t){let r=Oh(e,e.source.path);if(r&&t.has(r))throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);return r}function jh(e,t,r,i){let a=e.include.kind===`file`?kh(t.source.path):void 0,o=new Set([r,a].filter(e=>e!==void 0)),s=[...o].find(e=>i.has(e));if(s)throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function Mh(e,t,n){return e.platform&&e.platform!==n.platform?!1:e.true===void 0?!0:typeof e.true==`boolean`?e.true:mh(e.true,t,n.platform)}function Nh(e){return[...e.visible?[{kind:`visible`,selector:e.visible}]:[],...e.notVisible?[{kind:`notVisible`,selector:e.notVisible}]:[]]}function Ph(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>Ph(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Ph(n,t)])):e}function Fh(e,t){return A({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function Ih(e){return A({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Lh(e,t){let n=Hh(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},Ih(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{},...e.condition.childOf?{childOf:e.condition.childOf}:{}};return{generation:e.generation,matched:Rh(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function Rh(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function zh(e,t,n,r){let i=Hh(await r.resolveTarget({selector:e,...t},Fh(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw fh(`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 Bh(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{},...e.query.childOf?{childOf:e.query.childOf}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function Vh(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 Hh(e,t){return Uh(e,t),Wh(e),Gh(e),Kh(e),e}function Uh(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Wh(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Gh(e){if(e.rect!==void 0&&!Vh(e.rect)||e.viewport!==void 0&&!Vh(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Kh(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}const qh=new Set(`^$\\.*+?()[]{}|`);function Jh(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function Yh(e){try{new RegExp(e)}catch{return e}let t=``;for(let n=0;n<e.length;n+=1){let r=e[n];if(r!==`\\`){if(qh.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!qh.has(i))return;t+=i,n+=1}return t}function Xh(e,t){let n=[t.id===void 0?void 0:Qh(e.identifier,t.id),t.text===void 0?void 0:$h(e,t.text),t.label===void 0?void 0:Qh(e.label,t.label)].filter(e=>e!==void 0);return!(n.length===0&&t.enabled===void 0&&t.selected===void 0||n.some(e=>!e)||t.enabled!==void 0&&e.enabled!==!1!==t.enabled||t.selected!==void 0&&e.selected===!0!==t.selected)}function Zh(e){return e.matches.filter(t=>qe({predicate:`visible`,node:t,nodes:e.nodes,platform:e.platform}).pass)}function Qh(e,t){let n=e??``;return g(n)===g(t)?!0:Jh(n,t)}function $h(e,t){return[e.label,Ve(e),e.identifier].filter(e=>!!e).some(e=>Qh(e,t))}function eg(e,t,n,r,i){let a=tg(e,t,n,i);if(!a)return;let{start:o,end:s}=ag(a,n);return{gesture:{from:o,to:s,durationMs:r},viewport:a}}function tg(e,t,n,r){let i=n===`up`||n===`down`,a=Zh({nodes:e.nodes,matches:e.nodes.filter(e=>Fr(e.type)),platform:r}),o=Xn(e.nodes)??ng(a);if(!o||!He(o))return;let s=a.flatMap(e=>{if(!He(e.rect))return[];let t=rg(e.rect,o);return!t||(i?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),c=new Map(e.nodes.map(e=>[e.index,e])),l=new Map(s.map(e=>[e.node.index,e]));for(let n of e.nodes.filter(e=>Xh(e,t))){let e=Er(n,c,{includeSelf:!0}),t=e?l.get(e.index):void 0;if(t)return t.viewport}return s.sort(ig)[0]?.viewport}function ng(e){let t;for(let n of e)He(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function rg(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 ig(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function ag(e,t){let n=ug(e,.5,.5),r=P.scrollUntilVisibleSwipe.nearEdgeFraction,i=P.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:ug(e,.5,i)};case`down`:return{start:n,end:ug(e,.5,r)};case`left`:return{start:n,end:ug(e,i,.5)};case`right`:return{start:n,end:ug(e,r,.5)}}}async function og(e,t,r){let i=Y(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new n(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(Fh(t,t.command)):void 0;return{authored:e,gesture:cg(await sg(e.start,t,r,a),await sg(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(Fh(t,t.command)),{start:a,end:o}=lg(n,e.direction,r.platform);return{authored:e,gesture:cg(a,o,i),viewport:n}}let a=await zh(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?P.command.optionalTargetLookupTimeoutMs:P.command.targetLookupTimeoutMs},t,r),o=a.viewport??await r.resolveGestureViewport(Fh(t,t.command)),{start:s,end:c}=dg(a,e.direction,o);return{authored:e,gesture:cg(s,c,i),target:a,viewport:o}}async function sg(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(Fh(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 cg(e,t,n){return{from:e,to:t,durationMs:n??P.command.swipeDurationMs}}function lg(e,t,n){if(t===`left`||t===`right`){let n=ue(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=P.screenSwipe,i=ug(e,r.centerFraction,r.nearEdgeFraction),a=ug(e,r.centerFraction,r.farEdgeFraction),o=ug(e,r.centerFraction,r.downStartFraction),s=ug(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function ug(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function dg(e,t,n){let r=ut(e.rect),i=n.x+Math.trunc(n.width*P.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*P.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*P.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*P.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 fg={launchApp:_g,stopApp:_g,openLink:_g,tapOn:yg,doubleTapOn:yg,longPressOn:yg,swipe:wg,inputText:Tg,eraseText:Tg,scroll:Eg,scrollUntilVisible:Eg,hideKeyboard:Eg,pressKey:Eg,back:Eg,waitForAnimationToEnd:Eg,takeScreenshot:kg,runScript:kg,assertVisible:Ag,assertNotVisible:Ag,extendedWaitUntil:Ag},pg={launchApp:!0,stopApp:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,assertVisible:!1,assertNotVisible:!1,extendedWaitUntil:!1};function mg(e){return pg[e.kind]}async function hg(e,t){let n=e.command;return await gg(n,e,t,Fh(e,n))}function gg(e,t,n,r){let i=fg[e.kind];return i(e,t,n,r)}async function _g(e,t,n,r){switch(e.kind){case`launchApp`:return await Z(n.launchApp,vg(e,t),r,`invalidate`);case`stopApp`:return await Z(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await Z(n.openLink,{link:e.link},r,`invalidate`)}}function vg(e,t){return A({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function yg(e,t,n,r){switch(e.kind){case`tapOn`:return await bg(e,t,n,r);case`doubleTapOn`:{let i=await Rg(e.target,{purpose:`doubleTap`,timeoutMs:Sg(e)},t,n),a=Y(e.delay,`doubleTapOn.delay`)??P.command.repeatDelayMs;return await Z(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?Bh(i.resolution):void 0)}case`longPressOn`:{let i=await Rg(e.target,{purpose:`longPress`,timeoutMs:Sg(e)},t,n);return await Z(n.longPressOn,{target:i},r,`invalidate`,i.resolution?Bh(i.resolution):void 0)}}}async function bg(e,t,n,r){let i=await xg(e,t,n);return await Z(n.tapOn,Cg(e,i),r,`invalidate`,i.resolution?Bh(i.resolution):void 0)}async function xg(e,t,n){let r={purpose:`tap`,timeoutMs:Sg(e),index:Y(e.index,`tapOn.index`),childOf:e.childOf,allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await Rg(e.target,r,t,n)}function Sg(e){return e.optional===!0?P.command.optionalTargetLookupTimeoutMs:P.command.targetLookupTimeoutMs}function Cg(e,t){let n=Y(e.repeat,`tapOn.repeat`),r=Y(e.delay,`tapOn.delay`),i=n===void 0?r:r??P.command.repeatDelayMs;return A({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function wg(e,t,n,r){let i=await og(e.gesture,t,n);return await Z(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?Bh(i.target):void 0)}async function Tg(e,t,n,r){switch(e.kind){case`inputText`:return await Z(n.inputText,A({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await Z(n.eraseText,A({charactersToErase:Y(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function Eg(e,t,n,r){switch(e.kind){case`scroll`:return await Z(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await Z(n.scrollUntilVisible,Dg(e),r,`invalidate`);case`hideKeyboard`:return await Z(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await Z(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await Z(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await Z(n.waitForAnimationToEnd,Og(e),r,`preserve`)}}function Dg(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:Y(e.timeout,`scrollUntilVisible.timeout`)??P.command.scrollUntilVisibleTimeoutMs,durationMs:$r(P.command.scrollUntilVisibleSpeed)}}function Og(e){return A({timeoutMs:Y(e.timeout,`waitForAnimationToEnd.timeout`)})}async function kg(e,t,n,r){switch(e.kind){case`takeScreenshot`:return Mg(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await Z(n.runScript,A({file:e.file,env:e.env}),r,`preserve`)}}async function Ag(e){throw new n(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}async function Z(e,t,n,r,i){let a=jg(n,r);return Mg(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function jg(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function Mg(e,t,n,r){let i=e?.observation;return Ng(i,r),{...Pg(n??i),...Fg(e?.outputEnv),...Ig(t,e?.artifactPaths),...Lg(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function Ng(e,t){if(!(!e||t===void 0||e.generation===t))throw new n(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function Pg(e){return e?{observation:e}:{}}function Fg(e){return e?{outputEnv:{...e}}:{}}function Ig(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function Lg(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function Rg(e,t,n,r){if(e.space===`target`){let i=await zh(e.selector,t,n,r);return{authored:e,point:ut(i.rect),resolution:i}}return{authored:e,point:await sg(e,n,r)}}async function zg(e){return await Bg(`tap`,async t=>{let n=I.join(t,`before.png`),r=I.join(t,`after.png`),i=await Hg(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Hg(e,r)))return await Vg(n,r,e.signal,`tap`)}})})}async function Bg(e,t){let n=await wi.mkdtemp(I.join(Ti.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await wi.rm(n,{recursive:!0,force:!0})}catch{}}}async function Vg(e,t,n,r){try{let[i,a]=await Promise.all([wi.readFile(e),wi.readFile(t)]);Kg(n);let o=await ft(i,a,`Maestro screenshot`);return Kg(n),Ug(o,r)}catch(e){Gg(e,n),u({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Hg(e,t){try{return await wi.rm(t,{force:!0}),Kg(e.signal),await e.capture(t),Kg(e.signal),!0}catch(t){return Gg(t,e.signal),!1}}function Ug(e,t){if(e.status!==`compared`)return Wg(t,e.status,e),!1;let n=e.differencePercent<=P.command.waitForAnimationToEndDifferencePercent;return Wg(t,n?`stable`:`changed`,e),n}function Wg(e,t,n){u({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Gg(e,t){if(t?.aborted||Dt(e))throw jt()}function Kg(e){if(e?.aborted)throw jt()}async function qg(e){Yg(e.timeoutMs),Kg(e.signal);let t=e.now()+e.timeoutMs;return await Bg(`animation`,async n=>{let r=I.join(n,`first.png`),i=I.join(n,`second.png`);for(;;){if(Kg(e.signal),await Jg(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Jg(e,t,n){let r=[await Hg(e,t),await Hg(e,n)];return!r[0]||!r[1]?!1:await Vg(t,n,e.signal,`animation`)===!0}function Yg(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}function Xg(e,t,n,r){let i=a_(e,e.nodes.filter(e=>Xh(e,t)),r),a=Zh({nodes:e.nodes,matches:i.matches,platform:n});return{matches:i.matches,visible:a,ranked:Zg(e.nodes,a,t,n),parentMatched:i.parentMatched}}function Zg(e,t,n,r){if(r!==`ios`||!e_(n))return t;let i=We(e);return t.filter(r=>{if(i_(r))return!0;let a=t.filter(e=>e!==r&&t_(r,e,n));return a.some(t=>i_(t)&&Xe(e,r,t,i))?!1:!a.some(t=>Xe(e,t,r,i))})}function Qg(e,t){let n=t===void 0?e.find($g):e[t];return!n||!$g(n)?null:{node:n,rect:n.rect}}function $g(e){return He(e.rect)}function e_(e){return e.id!==void 0||e.label!==void 0||e.text!==void 0}function t_(e,t,n){if(n.id!==void 0&&r_(e.identifier)!==r_(t.identifier)||n.label!==void 0&&r_(e.label)!==r_(t.label))return!1;if(n.text!==void 0){let n=n_(e),r=new Set(n_(t));if(!n.some(e=>r.has(e)))return!1}return!0}function n_(e){return[e.label,e.value,e.identifier].map(r_).filter(e=>e!==void 0)}function r_(e){if(e)return g(e)||void 0}function i_(e){let t=Ge(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}function a_(e,t,n){if(!n)return{matches:t,parentMatched:!0};let r=e.nodes.filter(e=>Xh(e,n));if(r.length===0)return{matches:[],parentMatched:!1};let i=We(e.nodes);return{matches:t.filter(t=>r.some(n=>Xe(e.nodes,t,n,i))),parentMatched:!0}}function o_(e,t,n,r={}){let i=Xg(e,t.selector,n,t.childOf);if(!i.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:u_(t,i.matches,[],void 0)};let{matches:a,ranked:o}=i,s=Qg(o,t.index),c=u_(t,a,o,s?.node);if(!s)return s_(t,a,o,c);let l=n===`ios`&&(r.interactiveBounds||t.allowAtomicSelectorDispatch)?pr(e.nodes):void 0,u=r.interactiveBounds===!0?l?.sourceNodes.get(s.node.index)?.rect??s.rect:s.rect;return{ok:!0,node:s.node,rect:u,matches:o.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!t.childOf?c_(e,t,{...s,rect:u},l):0,evidence:c}}function s_(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.index===void 0?``:` index ${e.index}`}.`,evidence:r}}function c_(e,t,n,i){let a=Xg({...e,nodes:r((i??pr(e.nodes)).nodes)},t.selector,`ios`).ranked;if(a.length!==1)return a.length;let o=Qg(a,void 0);return o&&o.node.hittable!==!1&&l_(o.rect,n.rect)?1:0}function l_(e,t){let n=ut(e),r=ut(t);return n.x===r.x&&n.y===r.y}function u_(e,t,n,r){return A({selector:e.selector,childOf:e.childOf,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const d_=P.observation.pollIntervalMs;async function f_(e,t){for(;;){D_(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!k_(n)||(D_(e.context.signal),!await E_(e.dependencies,t,d_,e.context.signal)))throw n}}}function p_(e){return m_({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function m_(e){let t=jn(e.snapshot);return y_(o_(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function h_(e){O_(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){D_(e.context.signal);let r=await f_(e,n),i=m_({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,Rh(e.condition,i))return i;if(e.dependencies.now()>=n)break;await E_(e.dependencies,n,d_,e.context.signal)}return D_(e.context.signal),M_(t)}async function g_(e){O_(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){D_(e.context.signal);let i=r??await f_(e,t);if(r=void 0,n=m_({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===P.command.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return D_(e.context.signal),M_(n)}async function __(e){O_(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await f_(e,t),r=A_(n);for(;;){D_(e.context.signal),await E_(e.dependencies,t,d_,e.context.signal);let i=await f_(e,t),a=A_(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function v_(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function y_(e,t,n,r,i,a,o){if(!e.ok){let t=v_(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=x_({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=v_(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:b_(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:A_(t)}:{}}}function b_(e,t){return!He(e)||!He(t)?0:Ue(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 x_(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!S_(t,n,r)||i!==1))return C_(t.selector)}function S_(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function C_(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!w_(n)||typeof r!=`string`)return;let i=Yh(r)?.trim();return i?{key:n,value:i}:void 0}function w_(e){return e===`id`||e===`label`||e===`text`}async function T_(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?jt():e}D_(n)}async function E_(e,t,n,r){let i=t-e.now();return i<=0?!1:(await T_(e,Math.min(n,i),r),!0)}function D_(e){if(e?.aborted)throw jt()}function O_(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function k_(e){return e instanceof n&&e.details?.retriable===!0}function A_(e){return Ci(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,bounds:j_(e.rect)})))).digest(`hex`)}function j_(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function M_(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function N_(e){return P_(e)?F_(e):G_(e)?K_(e):z_(e)}function P_(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function F_(e){switch(e.kind){case`launchApp`:return I_(e);case`stopApp`:return L_(e);case`openLink`:return R_(e)}}function I_(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 L_(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function R_(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function z_(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return B_(e);case`clickPoint`:return V_(e);case`swipe`:return H_(e);case`scroll`:return U_(e);case`pressKey`:return W_(e)}}function B_(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function V_(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function H_(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},internal:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function U_(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function W_(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function G_(e){return e.kind===`screenshot`||e.kind===`snapshot`}function K_(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0}}}}async function q_(e,t){let n=N_(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=J_(i,n.flags??{}),c=n.internal===void 0?a:{...a,...n.internal},l=await e.invoke(A({...o,command:n.command,positionals:n.positionals,input:n.input,flags:s,internal:c}));if(!l.ok)throw ev(l);return l.data}function J_(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=A({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Y_(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 X_(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 Z_(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 Q_(e,t,r){if(I.isAbsolute(e))return e;let i=t.source?.path??r;if(!i)throw new n(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return I.resolve(I.dirname(i),e)}function $_(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function ev(e){let t=e.error,r=A({...t.details??{},hint:t.hint??tv(t.details,`hint`),diagnosticId:t.diagnosticId??tv(t.details,`diagnosticId`),logPath:t.logPath??tv(t.details,`logPath`),retriable:t.retriable??nv(t.details,`retriable`),supportedOn:t.supportedOn??tv(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function tv(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function nv(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function rv(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await q_(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new n(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=i;return t={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let n=r.snapshot;return r=void 0,t={generation:e.generation,snapshot:n},n}return r=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await __({timeoutMs:ci,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot}}}}function iv(e){let t=rv(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),q_(e,t)),o=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},s=async(e,t,n=`none`)=>await o(()=>a(e),t,n),c=async(n,r)=>{await s({kind:`typeText`,text:n},r);let i=await __({timeoutMs:ci,context:r,snapshot:t.capture,dependencies:e.dependencies});t.prime(r.generation,i.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await av({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await h_({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async t=>{let r=await e.dependencies.resolveGestureViewport(t);if(!r)throw new n(`COMMAND_FAILED`,`Unable to resolve Maestro gesture viewport.`);return r},launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Y_(e.arguments),...Y_(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;await s({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`stopApp`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await s({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(n,i)=>await lv(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>gv(e,t.target.point,A({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>gv(e,t.target.point,{holdMs:P.command.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??P.command.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await g_({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=eg(o,n.selector,n.direction,n.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await __({timeoutMs:Math.min(ci,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==P.command.scrollUntilVisiblePercentage)throw fh(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(X_(n.selector,a))}},pressKey:async(e,t)=>{await s({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await s({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await s({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await qg({timeoutMs:t.timeoutMs??P.command.waitForAnimationToEndTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Z_(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:rh({scriptPath:Q_(t.file,n,e.sourcePath),env:{...n.env,...t.env?$_(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r})}}async function av(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 f_({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=p_({query:t,context:n,snapshot:o,platform:i.platform});if(sv(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await E_(i.dependencies,a,d_,n.signal)}}}function ov(e){return e.matched&&e.visible&&e.rect!==void 0}function sv(e,t){return ov(e)?!t||e.dispatchSelector!==void 0:!1}function cv(e){let{operations:t,snapshots:n,readMetrics:r}=iv(e);return{execute:async e=>{let r=Fh(e,e.command),i=e.command.kind===`waitForAnimationToEnd`;mg(e.command)&&!i&&await n.settlePending(r);let a=await hg(e,t);return i&&a.visualStabilityReached===!0&&n.consumeStabilityFromVisualWait(r),delete a.visualStabilityReached,a},observe:async e=>{let r=await Lh(e,t);return n.bindObservation(r)},readMetrics:r}}async function lv(e,t,n,r,i,a){let o=async()=>await pv(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await zg({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await q_(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await uv(e,t,n,r,i,a.click,o)});return}await uv(e,t,n,r,i,a.click)}async function uv(e,t,n,r,i,a,o){let s=async()=>await pv(e,t,r,i,a),c=await dv(r,t,i,o),l=async()=>await __({timeoutMs:ci,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await fv({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 dv(e,t,n,r){if(e.resolution?.surfaceSignature)return e.resolution.surfaceSignature;if(!r)return A_(await t.capture(n))}async function fv(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<P.command.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function pv(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await mv(e,o,n.point,i);return}catch(n){if(!hv(n))throw n;let o=await av({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!ov(o))throw n;t.invalidate(r.generation),await gv(e,ut(o.rect),i);return}}t.invalidate(r.generation),await gv(e,n.point,i)}async function mv(e,t,n,r){u({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await q_(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function hv(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function gv(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);u({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await q_(e,{kind:`clickPoint`,point:t,options:r})}function _v(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return Ci(`sha256`).update(ap(t),`utf8`).digest(`hex`)}function vv(e={},t={}){let r={...t},i=yv(e),a=[],o=new Map,s,c=0,l;return{get values(){return u()},get generation(){return c},get observation(){return l?.generation===c?l:void 0},get expandedVariables(){return Object.fromEntries(o)},enter(e={}){let t=d(e);return a.push(t),s=void 0,()=>{if(a.pop()!==t)throw new n(`COMMAND_FAILED`,`Maestro environment scopes were left out of order.`);s=void 0}},merge(e){i={...i,...e},s=void 0},recordObservation(e){if(e.generation!==c)throw new n(`COMMAND_FAILED`,`Maestro observation generation ${e.generation} does not match ${c}.`);l=e},invalidateObservation(){c+=1,l=void 0},resolve(e){return bv(e,u(),f)},resolveDeferred(e){return bv(e,u(),void 0,new Set,!1)}};function u(){return s||(s={...a.reduce((e,t)=>({...e,...t}),{...i}),...r},s)}function d(e){let t=yv(e),n={};for(let[e,i]of Object.entries(t))n[e]=bv(i,{...u(),...t,...n,...r},void 0,new Set,!1);return n}function f(e,t){o.set(e,t)}}function yv(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function bv(e,t,r,i=new Set,a=!0){let o=e.replace(/\$\{([A-Za-z_][A-Za-z0-9_.]*)\}/g,(e,o)=>{if(!Object.hasOwn(t,o)){if(!a)return e;throw new n(`INVALID_ARGS`,`Maestro variable "${o}" is not defined.`)}if(i.has(o)){if(!a)return e;throw new n(`INVALID_ARGS`,`Maestro variable "${o}" has a cyclic reference.`)}let s=bv(t[o],t,r,new Set([...i,o]),a);return r?.(o,s),s});return a&&xv(o),o}function xv(e){for(let t of e.matchAll(/\$\{[^{}]*\}/g))if(!Sv(t[0]))throw new n(`INVALID_ARGS`,`Maestro interpolation "${t[0]}" is unresolved or unsupported.`)}function Sv(e){return/^\$\{\s*maestro\.platform\s*(?:==|!=)\s*(['"]).*\1(?:\s*(?:&&|\|\|).*)?\s*\}$/.test(e)}async function Cv(e,t){X(t.signal);let n=kh(e.source.path),r={options:t,context:vv(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await wv(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function wv(e,t,n,r,i){X(i.options.signal);let a=Fv(t,e.config.env),o=e.config.appId??n,s=i.context.enter(e.config.env);try{let t=[...e.config.onFlowStart??[],...e.commands,...e.config.onFlowComplete??[]],n=[];for(let s of t)n.push(...await Ev(s,a,o,e.source.path??r,i));return n}finally{s()}}async function Tv(e,t,n,r,i){let a=[];for(let o of e)a.push(...await Ev(o,t,n,r,i));return a}async function Ev(e,t,n,r,i){X(i.options.signal);let a=Iv(e,r);switch(a.kind){case`runFlow`:{let e=Ov(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await Dv(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[Nv(a,t,n,o)]}case`repeat`:return[Nv(a,t,n,await Tv(a.commands,t,n,r,i))];case`retry`:return[Nv(a,t,n,await Tv(a.commands,t,n,r,i))];default:return[Mv(a,t,n)]}}async function Dv(e,t,n,r,i){let a=Av(e,i.context),o=Ah(a,i.activeIncludePaths),s=await Dh(a,i.options);X(i.options.signal);let c=jh(a,s,o,i.activeIncludePaths),l=Fv(t,e.env),u=i.context.enter(e.env);try{return await wv(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function Ov(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:kv(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function kv(e,t){if(e===!1)return`omit`;if(typeof e==`string`)return jv(t.context.resolveDeferred(e))?`opaque`:mh(e,t.context,t.options.platform)?void 0:`omit`}function Av(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function jv(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function Mv(e,t,n){return A({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function Nv(e,t,n,r){return A({kind:`opaque`,command:Pv(e),source:e.source,scopes:t,body:r,appId:n})}function Pv(e){switch(e.kind){case`runFlow`:return A({kind:e.kind,source:e.source,when:e.when,label:e.label,...e.include.kind===`file`?{includePath:e.include.path}:{}});case`repeat`:return{kind:e.kind,source:e.source,times:e.times};case`retry`:return A({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function Fv(e,t){return t===void 0?e:[...e,t]}function Iv(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function Lv(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await Cv(e,t),a=Rv(t.runtimeHints),o=A({kind:`maestroReplayPlan`,platform:t.platform,target:t.target,runtimeHints:a,initialStaticEnv:zv({...t.defaults??{},...e.config.env??{},...t.env??{}}),steps:zv(n),total:n.length,compatibility:{staticallyExecutedControls:r,staticallySkippedControls:i}}),s=_v(o);return Bv({...o,digest:s})}function Rv(e){if(!e)return;let t=Object.entries(e).filter(e=>e[1]!==void 0);return t.length===0?void 0:Object.fromEntries(t)}function zv(e){return Array.isArray(e)?e.map(e=>zv(e)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,zv(t)])):e}function Bv(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))Bv(t);return Object.freeze(e)}function Vv(e,t={}){let{from:n,planDigest:r}=t;if(n===void 0&&r===void 0)return{allowed:!0,startIndex:0};if(n===void 0||r===void 0)return{allowed:!1,reason:`replay --from requires --plan-digest (and --plan-digest requires --from).`};if(!Number.isInteger(n)||n<1||n>e.total)return{allowed:!1,reason:`replay --from ${n} is out of range for a ${e.total}-step plan.`};if(r!==e.digest)return{allowed:!1,reason:`replay --plan-digest does not match the current plan digest.`};if(n===1)return{allowed:!0,startIndex:0};for(let t=0;t<n-1;t+=1){let n=e.steps[t];if(n.kind===`opaque`)return{allowed:!1,reason:`step ${t+1} is opaque runtime control flow (${n.command.kind}) and cannot be skipped safely.`};if(n.command.kind===`runScript`)return{allowed:!1,reason:`step ${t+1} (runScript) can produce outputEnv values and cannot be skipped safely.`}}let i=e.steps[n-1];return i.kind===`opaque`?{allowed:!1,reason:`step ${n} is opaque runtime control flow (${i.command.kind}) and cannot be resumed into.`}:{allowed:!0,startIndex:n-1}}function Hv(e,t={}){let r=Vv(e,t);if(!r.allowed)throw new n(`INVALID_ARGS`,r.reason);return r.startIndex}function Uv(e,t){if(!Number.isInteger(t)||t<0||t>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${t} is out of range for a ${e.total}-step plan.`);return t}async function Wv(e,t){X(t.options.signal);try{return await iy(e,t.context,async()=>await Gv(e,t))}catch(t){throw ay(t,e)}}async function Gv(e,t){if(e.kind===`command`)return await Kv(e.command,e.appId,t);await Zv(e,t)}async function Kv(e,t,n){try{return await Yv(e,t,n)}catch(t){if(X(n.options.signal),!Jv(e)||!ph(t))throw t;n.warnings.push(qv(e,t)),n.skipped+=1;return}}function qv(e,t){let r=`${e.source.path?`${e.source.path}:`:``}line ${e.source.line}`,i=t instanceof n?t.message:String(t);return`Optional Maestro ${e.kind} skipped at ${r}: ${i}`}function Jv(e){return`optional`in e&&e.optional===!0}async function Yv(e,t,n){let r=Th(e,n.context);switch(r.kind){case`assertVisible`:await ty({kind:`visible`,selector:r.target,childOf:r.childOf},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await ty({kind:`notVisible`,selector:r.target,childOf:r.childOf},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`extendedWaitUntil`:await ty(ry(r),Y(r.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await Xv(r,t,n)}}async function Xv(e,t,n){let r=A({command:e,env:n.context.values,appId:t===void 0?void 0:n.context.resolve(t),generation:n.context.generation,invalidateObservation:n.context.invalidateObservation,cachedObservation:n.context.observation,signal:n.options.signal}),i=await n.port.execute(r);return X(n.options.signal),i.observation&&n.context.recordObservation(i.observation),i.outputEnv&&n.context.merge(i.outputEnv),i.artifactPaths?.forEach(e=>n.artifacts.add(e)),n.executed+=1,i}async function Zv(e,t){let n=Th(e.command,t.context);switch(n.kind){case`runFlow`:if(n.when&&!await ey(n.when,t)){t.skipped+=1;return}t.executed+=1,await Qv(e.body,t);return;case`repeat`:{let r=Eh(n.times,0,t.context,`repeat.times`);t.executed+=1;for(let n=0;n<r;n+=1)X(t.options.signal),await Qv(e.body,t);return}case`retry`:{let r=Math.min(Eh(n.maxRetries,1,t.context,`retry.maxRetries`),P.control.retryMaxRetries);t.executed+=1,await $v(e.body,r,t);return}}}async function Qv(e,t){for(let n of e)await Wv(n,t)}async function $v(e,t,r){let i;for(let n=0;n<=t;n+=1){X(r.options.signal);try{await Qv(e,r);return}catch(t){if(X(r.options.signal),!ph(sy(t)))throw t;i=ay(t,e[0])}}throw i||new n(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function ey(e,t){if(!Mh(e,t.context,t.options))return!1;for(let n of Nh(e))if(X(t.options.signal),!(await ny(n,t.timing.runFlowConditionTimeoutMs,t)).matched)return!1;return!0}async function ty(e,t,n){if(!(await ny(e,t,n)).matched)throw fh(`Maestro ${e.kind} condition did not match.`)}async function ny(e,t,n){let r={condition:e,timeoutMs:t,generation:n.context.generation,env:n.context.values,...n.context.observation?{cachedObservation:n.context.observation}:{},...n.options.signal?{signal:n.options.signal}:{}},i=await n.port.observe(r);return X(n.options.signal),n.context.recordObservation(i),i}function ry(e){if(e.visible)return{kind:`visible`,selector:e.visible};if(e.notVisible)return{kind:`notVisible`,selector:e.notVisible};throw new n(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function iy(e,t,n){let r=e.scopes.map(e=>t.enter({...e}));try{return await n()}finally{for(let e=r.length-1;e>=0;--e)r[e]()}}function ay(e,t){if(oy(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:cy(e,t?.command),source:n,...t?{command:t.command}:{}}}function oy(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function sy(e){return oy(e)?e.error:e}function cy(e,t){if(!(e instanceof n)||!t||/\bline \d+\b/.test(e.message))return e;let r=t.source.path?`${t.source.path}:`:``;return new n(e.code,`${e.message} (${r}line ${t.source.line})`,e.details)}async function ly(e,t,r={}){X(r.signal);let i=r.startIndex??0;if(!Number.isInteger(i)||i<0||i>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${e.total}-step plan.`);let a={plan:e,port:t,options:r,context:vv(r.defaults,r.env?{...r.env}:{}),timing:ii(r.timing),artifacts:new Set,warnings:[],executed:e.compatibility.staticallyExecutedControls,skipped:e.compatibility.staticallySkippedControls};for(let t=i;t<e.steps.length;t+=1)try{await uy(e.steps[t],t,a)}catch(e){throw sy(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function uy(e,t,n){X(n.options.signal);let r=n.options.now??Date.now,i=r(),a=n.port.readMetrics?.(),o=n.context.generation,s={command:e.command,source:e.source,generation:o,stepIndex:t+1,stepTotal:n.plan.total};fy(()=>n.options.observer?.commandStarted?.(s));try{let t=await Wv(e,n);X(n.options.signal),fy(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...dy(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=ay(t,e);throw fy(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...dy(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],expandedVariables:n.context.expandedVariables})),o}}function dy(e,t){return!e||!t?{}:{runtimeMetrics:{hierarchyCaptures:t.hierarchyCaptures-e.hierarchyCaptures,screenshotCaptures:t.screenshotCaptures-e.screenshotCaptures,tapRetries:t.tapRetries-e.tapRetries}}}function fy(e){try{e?.()}catch{}}async function py(e,t,n={}){let r=my(e,n);return await ly(e,t,{...n,startIndex:r})}function my(e,t){return t.from!==void 0||t.planDigest!==void 0?Hv(e,{from:t.from,planDigest:t.planDigest}):Uv(e,t.startIndex??0)}function hy(e){let t=new Map;return async(n,r,i)=>{if(i?.aborted)throw jt();let a=gy(n,r,e),o=t.get(a);if(o)return o;let s=wd(F.readFileSync(a,`utf8`),{sourcePath:a});return t.set(a,s),s}}function gy(e,t,n){let r=t?I.dirname(t):n;return I.resolve(r,e)}function _y(e){return wh(e)?{command:e.kind,...e.kind===`runFlow`?Q(e.label??e.includePath):{}}:{command:e.kind,...vy(e)}}function vy(e){return yy(e)?Q(Ey(e.target)):by(e)?xy(e):e.kind===`inputText`?Q(`<text>`):Sy(e)}function yy(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function by(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function xy(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return Q(Dy(e.target));case`extendedWaitUntil`:return Q(Dy(e.visible??e.notVisible));case`scrollUntilVisible`:return Q(Dy(e.element))}}function Sy(e){return Cy(e)?wy(e):e.kind===`swipe`?Ty(e):e.kind===`runFlow`?Q(e.label??(e.include.kind===`file`?e.include.path:``)):{}}function Cy(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function wy(e){switch(e.kind){case`openLink`:return Q(e.link);case`takeScreenshot`:return Q(e.path);case`runScript`:return Q(e.file);case`pressKey`:return Q(e.key)}}function Ty(e){return Q(e.gesture.kind===`coordinates`?`${Oy(e.gesture.start)} to ${Oy(e.gesture.end)}`:e.gesture.direction)}function Ey(e){return e.space===`target`?Dy(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function Dy(e){return e?.id??e?.text??e?.label}function Oy(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function Q(e){return e?{value:e}:{}}function ky(e){let{filePath:t,tracePath:n,onFailure:r}=e,i=new Map;return{commandStarted:e=>{i.set(e.stepIndex,e),Ay(()=>Ny(t,e)),Ay(()=>Py(n,t,e))},commandCompleted:e=>{let r=jy(i,e.stepIndex);Ay(()=>Fy(n,t,My(r,e),!0))},commandFailed:e=>{let a=jy(i,e.stepIndex);Ay(()=>r(e)),Ay(()=>Fy(n,t,My(a,e),!1))}}}function Ay(e){try{e()}catch{}}function jy(e,t){let n=e.get(t);return e.delete(t),n}function My(e,t){return A({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:t.data,error:t.error})}function Ny(e,t){let n=At();if(!n)return;let r=_y(t.command);j({type:`replay-test`,...n,file:n.file||e,status:`progress`,stepIndex:t.stepIndex,stepTotal:t.stepTotal,stepCommand:r.command,...r.value?{stepValue:r.value}:{}})}function Py(e,t,n){let r=_y(n.command);up(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:r.command,positionals:r.value?[r.value]:[]})}function Fy(e,t,r,i){let a=Iy(r);up(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:t,...r.source.path&&r.source.path!==t?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:_y(r.command).command,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&r.error instanceof n?{errorCode:r.error.code}:{}})}function Iy(e){let t=Ly(e.data?.timing)?e.data.timing:void 0;return A({...e.runtimeMetrics??{},...typeof t?.executionProfile==`string`?{executionProfile:t.executionProfile}:{},...typeof t?.gestureDurationMs==`number`?{gestureDurationMs:t.gestureDurationMs}:{}})}function Ly(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Ry(e,t){let n=_y(e.command);return{authoredCommand:e.command,source:e.source,progress:n,action:{command:Yy(e.command.kind),positionals:Xy(e.command.kind,n.value),flags:t.flags??{}}}}async function zy(e){let{event:t,plan:n,replayPath:r,req:i,sessionName:a,sessionStore:o,logPath:s}=e,c=Ry(t,i),l=lm(e.error),u=[...Zy(t.expandedVariables),...Qy(c.authoredCommand)].sort((e,t)=>t.value.length-e.value.length),d=w(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=o.get(a),m=p?await qp({session:p,sessionName:a,sessionStore:o,logPath:s,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`&&!wh(c.authoredCommand)?Vy({command:c.authoredCommand,platform:n.platform,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=Vv(n,{from:t.stepIndex,planDigest:n.digest}),_=[c.authoredCommand.kind,By(c.progress.value)].filter(Boolean).join(` `),v=Gp({sessionStore:o,sessionName:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(c.source.path??r),line:c.source.line}},action:d(_),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:Xp(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:g.allowed?{allowed:!0,from:t.stepIndex,planDigest:n.digest}:{allowed:!1,from:t.stepIndex,planDigest:n.digest,reason:g.reason},repairHint:Rp({kind:`action-failure`,targetEvidence:void 0,capture:Kp(m)})},responseLevel:i.meta?.responseLevel});return dm({error:f,actionLabel:_,action:c.authoredCommand.kind,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:r,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:v,scrubVars:u})}function By(e){return!e||e===`<text>`?e??``:Oe(e)}function Vy(e){let t=Uy(e.command);return!t||e.platform!==`android`&&e.platform!==`ios`?[]:Ip(Hy({createdAt:Date.now(),nodes:e.nodes},t,e.platform).map(e=>({node:e,nodeIndex:e.index,basis:Jy(t.selector,e)}))).map(({node:t,basis:n})=>sm({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Hy(e,t,n){return Xg(e,t.selector,n,t.childOf).ranked}function Uy(e){if(Wy(e))return Gy(e);if(Ky(e))return qy(e);if(e.kind===`swipe`&&e.gesture.kind===`target`)return{selector:e.gesture.from}}function Wy(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function Gy(e){if(e.target.space===`target`)return e.kind===`tapOn`?{selector:e.target.selector,index:e.index,childOf:e.childOf}:{selector:e.target.selector}}function Ky(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function qy(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return{selector:e.target};case`extendedWaitUntil`:return e.visible?{selector:e.visible}:e.notVisible?{selector:e.notVisible}:void 0;case`scrollUntilVisible`:return{selector:e.element}}}function Jy(e,t){return e.id!==void 0||e.text!==void 0&&Xh({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text!==void 0||e.label!==void 0?`label`:`other`}function Yy(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Xy(e,t){return!t||e===`inputText`?[]:[t]}function Zy(e){return Object.entries(e).filter(([,e])=>e.length>0).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function Qy(e){return e.kind!==`inputText`||e.text.length===0?[]:[{name:`${e.kind}.text`,value:e.text}]}function $y(e){let{result:t,plan:n,startIndex:r,startedAt:i,sessionName:a,sessionStore:o,snapshotStart:s}=e,c=tb(o,a,s),l=n.total-r;return{ok:!0,data:{replayed:l,healed:0,session:a,artifactPaths:t.artifactPaths,...t.warnings?{warnings:t.warnings}:{},...c?{snapshotDiagnostics:c}:{},message:rb(l,Date.now()-i)}}}async function eb(t){let{failedEvent:n,plan:r}=t.state,i=e(n?.error??t.error);return n&&r?await zy({error:i,event:n,plan:r,replayPath:E.expandHome(t.requestedPath,t.req.meta?.cwd),req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,snapshotDiagnostics:tb(t.sessionStore,t.sessionName,t.state.snapshotStart)}):N(i.code,i.message,{...i.details??{},...nb(n)})}function tb(e,t,n){return Ae(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function nb(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function rb(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function ib(e){let{req:t}=e,n=t.positionals?.[0];if(!n)return N(`INVALID_ARGS`,`replay requires a path`);if(t.flags?.saveScript!==void 0)return N(`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 ab({...e,requestedPath:n,startedAt:r,state:i})}catch(t){return await eb({...e,requestedPath:n,state:i,error:t})}}async function ab(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,invoke:a,state:o}=e,s=await ob(e),c=await Lv(s.program,{defaults:s.defaults,env:s.env,platform:s.platform,target:s.target,runtimeHints:s.runtimeHints,loadProgram:s.loadProgram,signal:s.signal});o.plan=c;let l=Hv(c,{from:t.flags?.replayFrom,planDigest:t.flags?.replayPlanDigest}),u=fb({req:t,invoke:a,logPath:e.logPath,sessionName:n,sessionStore:r,device:s.device,platform:s.platform,runtimeHints:s.runtimeHints,sourcePath:s.filePath});return o.snapshotStart=r.get(n)?.snapshotDiagnostics?.samples.length??0,$y({result:await py(c,u,{defaults:s.defaults,env:s.env,platform:s.platform,target:s.target,loadProgram:s.loadProgram,signal:s.signal,startIndex:l,observer:ky({filePath:s.filePath,tracePath:i,onFailure:e=>{o.failedEvent=e}})}),plan:c,startIndex:l,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:o.snapshotStart})}async function ob(e){let{req:t,requestedPath:n,sessionName:r,sessionStore:i}=e,a=E.expandHome(n,t.meta?.cwd),o=wd(F.readFileSync(a,`utf8`),{sourcePath:a}),s=i.get(r);s&&Ln(s,t.flags);let c=await sb({req:t,sessionStore:i,sessionName:r,session:s});return{filePath:a,program:o,...c,defaults:ub({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:db(t),signal:Mt(t.meta?.requestId),loadProgram:hy(I.dirname(a))}}async function sb(e){let{req:t,sessionStore:n,sessionName:r,session:i}=e,a=t.flags?.platform,o=i?.device??(a===`android`||a===`ios`?void 0:await Vt(t.flags??{})),s=vb(t,o),c=Ya({req:t,sessionStore:n,sessionName:r,device:o,platform:s});return await cb({req:t,sessionStore:n,sessionName:r,device:o,platform:s,target:yb(t,o),runtimeHints:c})}async function cb(e){if(e.device||!lb(e.runtimeHints))return e;let t=await Vt(e.req.flags??{});return{device:t,platform:e.platform,target:yb(e.req,t),runtimeHints:Ya({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function lb(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function ub(e){return{...Xm({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function db(e){return{...ai(Qr(e.flags?.replayShellEnv)),...ri(ni(e.flags?.replayEnv))}}function fb(e){let{req:t,invoke:r,logPath:i,sessionName:a,sessionStore:o,device:s,platform:c,runtimeHints:l,sourcePath:u}=e,{command:d,positionals:f,input:p,flags:m,...h}=t;return cv({baseReq:A({...h,flags:pb(s,c,t.flags),runtime:l}),invoke:r,platform:c,sourcePath:u,dependencies:{now:Date.now,sleep:async(e,t)=>{await Di(e,void 0,{signal:t})},resolveGestureViewport:async()=>{let e=o.get(a);if(!e)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);return await Ut(e.device,qt(i,t.flags,e.appBundleId,e.trace?.outPath))}}})}function pb(e,t,n){if(!e)return mb(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 mb(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?hb(n,t):gb(n,t)}function hb(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function gb(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function _b(e,t){return e.flags?.replayBackend===`maestro`&&(I.extname(t)===`.yaml`||I.extname(t)===`.yml`)}function vb(e,t){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new n(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function yb(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function bb(e,t,n,r){let i=e.actionSourcePaths?.[n]??e.resolved,a=e.actionLines[n]??1,o=await Vm({action:t,scope:e.scope,sourcePath:i,sourceLine:a,replayPath:e.resolved,step:n+1,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,artifactPaths:r,responseLevel:e.responseLevel,planActions:e.actions,planDigest:e.planDigest});if(!o.verified)return o.response;let s=o.guard,c=await dp({req:s?{...e.replayReq,internal:{...e.replayReq.internal,replayTargetGuard:s.expected}}:e.replayReq,sessionName:e.sessionName,action:t,scope:e.scope,filePath:e.resolved,line:a,sourcePath:e.actionSourcePaths?.[n],step:n+1,tracePath:e.actionTracePath,invoke:e.invoke});return!s||!Hm(c)?c:await Um({action:t,scope:e.scope,guard:s,failedResponse:c,sourcePath:i,sourceLine:a,replayPath:e.resolved,step:n+1,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,artifactPaths:r,responseLevel:e.responseLevel,planActions:e.actions,planDigest:e.planDigest})}async function xb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,invoke:o}=e,c=t.positionals?.[0];if(!c)return N(`INVALID_ARGS`,`replay requires a path`);let l=Date.now(),u=``,d=new Set;try{u=E.expandHome(c,t.meta?.cwd);let s=await Ab({...e,resolved:u});if(s)return s;let f=jb({req:t,sessionName:n,sessionStore:i,tracePath:a,resolved:u});if(!f.ok)return f.response;let{replayReq:p,actions:m,actionLines:h,actionSourcePaths:g,planDigest:_,preEntrySession:v,entryIndex:y,scope:b,actionTracePath:x,snapshotDiagnosticSamples:S}=f.value,C=Fb({req:t,entryIndex:y,preEntrySession:v,sessionStore:i,sessionName:n,sourcePath:u});if(!C.ok)return C.response;let ee={scope:b,replayReq:p,sessionName:n,sessionStore:i,logPath:r,resolved:u,actions:m,actionLines:h,actionSourcePaths:g,planDigest:_,actionTracePath:x,responseLevel:t.meta?.responseLevel,invoke:o};return await Sb({req:t,sessionName:n,sessionStore:i,logPath:r,resolved:u,actions:m,actionLines:h,actionSourcePaths:g,planDigest:_,entryIndex:y,scope:b,stepContext:ee,artifactPaths:d,snapshotDiagnosticSamples:S,armSaveScript:C.armSaveScript})||Tb({startedAt:l,sessionName:n,sessionStore:i,actions:m,entryIndex:y,artifactPaths:d,snapshotDiagnosticSamples:S,armSaveScript:C.armSaveScript})}catch(e){let t=s(e);return N(t.code,t.message,d.size>0?{artifactPaths:[...d]}:void 0)}}async function Sb(e){let{sessionName:t,sessionStore:n,resolved:r,actions:i,entryIndex:a,stepContext:o,artifactPaths:s,snapshotDiagnosticSamples:c,armSaveScript:l}=e;for(let u=a;u<i.length;u+=1){let a=i[u];if(!Cb(a)||(l(),Vb({action:a,index:u,totalActions:i.length,sessionStore:n,sessionName:t})))continue;Eb(r,u,i.length,a);let d=Xb(n,t),f=await bb(o,a,u,[...s]);if(c.push(...Zb(n,t,d)),_p(f).forEach(e=>s.add(e)),!f.ok)return await wb(e,a,u,f)}}function Cb(e){return!!(e&&e.command!==`replay`)}async function wb(e,t,n,r){let i=t=>Wb({response:t,sessionStore:e.sessionStore,sessionName:e.sessionName});return Yb(r)?i(r):i(await hm({response:r,action:t,index:n,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[n]??e.resolved,sourceLine:e.actionLines[n]??1,artifactPaths:[...e.artifactPaths],snapshotDiagnosticSamples:e.snapshotDiagnosticSamples,scope:e.scope,req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function Tb(e){let{startedAt:t,sessionName:n,sessionStore:r,actions:i,entryIndex:a,artifactPaths:o,snapshotDiagnosticSamples:s,armSaveScript:c}=e;c();let l=r.get(n);l?.saveScriptBoundary!==void 0&&(l.saveScriptComplete=!0,r.set(n,l));let u=i.length-a,d=Ae(s);return{ok:!0,data:{replayed:u,healed:0,session:n,artifactPaths:[...o],...d?{snapshotDiagnostics:d}:{},message:Jb(u,Date.now()-t)}}}function Eb(e,t,n,r){let i=At();i&&j({type:`replay-test`,...i,file:i.file||e,status:`progress`,stepIndex:t+1,stepTotal:n,...Db(r)})}function Db(e){return{stepCommand:e.command,...Ob(e)}}function Ob(e){let t=e.positionals??[],n=kb(t[0]);return n?{stepValue:n}:t.length===0?{}:{stepValue:t.join(` `)}}function kb(e){if(!e)return;let t=h(e);if(!t)return;let n=t.selectors.flatMap(e=>e.terms.flatMap(e=>(e.key===`label`||e.key===`text`||e.key===`id`)&&typeof e.value==`string`?[e.value]:[]));if(n.length===0)return;let r=n[0];return r&&n.every(e=>e===r)?r:void 0}async function Ab(e){if(_b(e.req,e.resolved))return e.sessionStore.get(e.sessionName)?.saveScriptBoundary===void 0?await ib(e):N(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function jb(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a}=e,o=Mb(a,t);if(!o.ok)return o;let{metadata:s,actions:c,actionLines:l,actionSourcePaths:u}=o.value,d=Nb(t,s),f=sp({actions:c,actionLines:l,actionSourcePaths:u,metadata:ym(d.flags)}),p=r.get(n),m=bm(t.flags,c.length,f,p?.pendingRecordAndHeal,p?.actions.length??0);return m.ok?{ok:!0,value:{replayReq:d,actions:c,actionLines:l,actionSourcePaths:u,planDigest:f,preEntrySession:p,entryIndex:m.value,scope:Pb({req:t,replayReq:d,sessionName:n,resolved:a,metadata:s}),actionTracePath:i??p?.trace?.outPath,snapshotDiagnosticSamples:[]}}:m}function Mb(e,t){let n=F.readFileSync(e,`utf8`),r=n.trimStart()[0];return r!==`{`&&r!==`[`?{ok:!0,value:ip(n,t.flags)}:{ok:!1,response:N(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`)}}function Nb(e,t){return!t.platform&&!t.target?e:{...e,flags:vm(e.flags,t)}}function Pb(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return ti({builtins:Xm({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:ai(Qr(t.flags?.replayShellEnv)),cliEnv:ri(ni(t.flags?.replayEnv))})}function Fb(e){let{req:t,entryIndex:n,preEntrySession:r,sessionStore:i,sessionName:a,sourcePath:o}=e,s=Ib({entryIndex:n,sessionStore:i,sessionName:a});return s?{ok:!1,response:s}:(Rb({req:t,preEntrySession:r,sessionStore:i,sessionName:a}),Lb({req:t,sessionStore:i,sessionName:a,sourcePath:o}))}function Ib(e){let t=zb(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return zt()}function Lb(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i}=e,a=n.get(r),{saveScript:o,force:s}=t.flags??{},{saveScriptForce:c,saveScriptPath:l,saveScriptBoundary:u}=a??{};if(o&&a?.scriptRecordingState!==void 0)return{ok:!1,response:N(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${a.scriptRecordingState}. Close this session and use a fresh one for repair authoring.`)};let d=Bb({saveScript:o,liveForce:s,persistedForce:c,sourcePath:i,existingSaveScriptPath:l});return d?{ok:!1,response:d}:(a&&u!==void 0&&(a.saveScriptComplete=!1),{ok:!0,armSaveScript:Hb({saveScript:o,force:s,sessionStore:n,sessionName:r,sourcePath:i})})}function Rb(e){let{req:t,preEntrySession:n,sessionStore:r,sessionName:i}=e;n&&n.pendingRecordAndHeal?.expectedFrom===t.flags?.replayFrom&&(n.pendingRecordAndHeal=void 0,r.set(i,n)),t.flags?.saveScript&&r.clearRepairTombstone(i)}function zb(e){let{entryIndex:t,sessionStore:n,sessionName:r}=e;if(!(t>0)&&n.get(r)?.saveScriptBoundary!==void 0)return N(`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 Bb(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Te(t):a??qb(i);if(!(n||r&&o===a)&&F.existsSync(o))return N(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function Vb(e){let{action:t,index:n,totalActions:r,sessionStore:i,sessionName:a}=e;return t.command!==`close`||n!==r-1?!1:i.get(a)?.saveScriptBoundary!==void 0}function Hb(e){let{saveScript:t,force:n,sessionStore:r,sessionName:i,sourcePath:a}=e;if(!t)return()=>{};let o=!0;return()=>{Ub({sessionStore:r,sessionName:i,saveScript:t,force:n,sourcePath:a,firstArm:o}),o=!1}}function Ub(e){let{sessionStore:t,sessionName:n,saveScript:r,force:i,sourcePath:a,firstArm:o}=e,s=t.get(n);s&&(s.recordSession=!0,typeof r==`string`?(ke(s,Te(r),i),s.saveScriptDefaultedHealedPath=!1):s.saveScriptPath===void 0&&(s.saveScriptPath=qb(a),s.saveScriptDefaultedHealedPath=!0),i&&(s.saveScriptForce=!0),s.saveScriptBoundary===void 0&&(s.saveScriptBoundary=o?s.actions.length:0),s.repairSourcePath===void 0&&(s.repairSourcePath=a),t.set(n,s))}function Wb(e){let{response:t,sessionStore:n,sessionName:r}=e;if(t.ok)return t;let i=n.get(r);if(i?.saveScriptBoundary===void 0||i.saveScriptCommitted)return t;let a=Gb(t);return a&&(a.repairSessionHeld=!0),t}function Gb(e){let t=e.error.details?.divergence;if(!(!it(t)||!Kb(t.resume)))return t.resume}function Kb(e){return!it(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function qb(e){let t=I.dirname(e),n=I.basename(e,I.extname(e));return I.join(t,`${n}.healed.ad`)}function Jb(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function Yb(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 Xb(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function Zb(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}const Qb=1e3,$b=3e3;function ex(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await tx(e)}}async function tx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o}=e;if(t.flags?.recordVideo!==!0)return;let s=i.get(n);if(!s||s.recording)return;let c=xe(s.device.platform),l=a?I.join(a,`recording${c}`):De(s.device.platform);rx(o,{type:`video_recording_start`,session:n,videoPath:l}),u({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let d=await er({req:{token:t.token,session:n,command:`record`,positionals:[`start`,l],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});if(!d.ok)return rx(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:d.error.code}),d;let f=Date.now();return await at(Qb),rx(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-f,requestedDurationMs:Qb}),u({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-f,data:{session:n,requestedDurationMs:Qb}}),d}async function nx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,artifactPaths:o}=e;if(t.flags?.recordVideo!==!0||!i.get(n)?.recording)return;rx(a,{type:`video_tail_start`,session:n,requestedDurationMs:$b});let s=Date.now();await at($b);let c=Date.now(),l=await er({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return _p(l).forEach(e=>o.add(e)),rx(a,{type:`video_recording_stop`,session:n,ok:l.ok,durationMs:Date.now()-c,tailDurationMs:c-s,errorCode:l.ok?void 0:l.error.code}),u({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-c,data:{session:n,ok:l.ok,tailDurationMs:c-s}}),l}function rx(e,t){lf(e,{...t,ts:new Date().toISOString()})}function ix(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=ax(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:Af({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function ax(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function ox(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;return t.command===`replay`?await xb({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o}):t.command===`test`?t.flags?.replayFrom!==void 0||t.flags?.replayPlanDigest!==void 0?N(`INVALID_ARGS`,`test does not support --from/--plan-digest; resume is replay-only. Run the failing script directly with replay --from.`):t.flags?.saveScript===void 0?await Uf({req:t,sessionName:n,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:c,artifactsDir:l,artifactPaths:u,tracePath:d,shard:f})=>{let p=e=>(u&&_p(e).forEach(e=>u.add(e)),e),m=ix({parentFlags:t.flags,platform:a,target:s,artifactsDir:l,shard:f}),h={req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:l,tracePath:d},g=ex(h);return await xb({req:{...t,command:`replay`,session:n,positionals:[e],flags:m,meta:{...t.meta??{},...c?{requestId:c}:{}},...t.internal||g?{internal:{...t.internal??{},...g?{openLifecycle:g}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:d,invoke:async e=>{let t=await tx(h);return t&&!t.ok?t:p(await o(e))}})},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o})=>await nx({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,artifactPaths:n}),cleanupSession:async e=>{i.get(e)&&await ms({req:{token:t.token,session:e,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a})}}):N(`INVALID_ARGS`,`test does not support --save-script; the agent-supervised repair loop is replay-only. Repair the failing script directly with replay --save-script.`):null}function sx(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==ge.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return lx(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return lx(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=cx(a);if(o)return lx(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return lx(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));s&&ke(a,Te(s),t.flags?.force),t.flags?.force&&(a.saveScriptForce=!0);let c=i.writeSessionLog(a,{force:!!(t.flags?.force||a.saveScriptForce),publication:`active`});return c.written?(a.scriptRecordingState=`published`,a.recordSession=!1,a.saveScriptPath=c.path,{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...ve(`Published script: ${c.path}`)}}):lx(c.error??new n(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function cx(e){if(e.saveScriptBoundary!==void 0)return new n(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`});if(e.scriptRecordingState===`aborted`)return new n(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.scriptRecordingState===`published`)return new n(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`});if(e.scriptRecordingState!==`armed`||!e.recordSession)return new n(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})}function lx(t){return{ok:!1,error:e(t)}}function ux(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function dx(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function fx(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function px(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),j({type:`command`,status:`progress`,message:mx(t)})}function mx(e){return[fe(e),...v(e)].join(`
|
|
25
|
+
`)}const hx=2e3;async function gx(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=f(n,a);i&&$(e,await Sx(o,n.id,r)),$(e,await _x(o,n))}async function _x(e,t){try{let n=await Rn(e),r=Ur(t);return n===await vx()&&!r?await yx(e,t,n):bx(t,n,r)}catch(e){return xx(e)}}async function vx(){try{return(await bn()).manifest.serviceComponent}catch{return}}async function yx(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,Fn.previousIme],{allowFailure:!0,timeoutMs:hx})).stdout.trim(),i=r&&r!==`null`?r:void 0;return{id:`android-test-ime`,status:`fail`,summary:`Android test IME helper is the active input method on ${t.id}, but no active session owns it -- likely left over from a crashed session.`,hint:`A stuck test IME leaves the real keyboard unavailable on this device until restored.`,command:i?`adb -s ${t.id} shell ime set ${i}`:`adb -s ${t.id} shell ime list -s`,evidence:{currentIme:n,previousIme:i}}}function bx(e,t,n){return{id:`android-test-ime`,status:`pass`,summary:n?`Android test IME helper is active for this session on ${e.id}.`:`Android test IME helper is not active on ${e.id}; the device's normal IME is in use.`,evidence:{currentIme:t}}}function xx(t){let n=e(t);return{id:`android-test-ime`,status:`warn`,summary:`Could not inspect the Android test IME helper state.`,hint:n.message,evidence:{code:n.code}}}async function Sx(t,n,r){try{let e=await t([`reverse`,`--list`],{allowFailure:!0,timeoutMs:hx}),i=`tcp:${r} tcp:${r}`,a=e.stdout.includes(i);return{id:`android-reverse`,status:a?`pass`:`warn`,summary:a?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:a?void 0:`adb -s ${n} reverse tcp:${r} tcp:${r}`,evidence:{stdout:e.stdout.trim()}}}catch(t){let n=e(t);return{id:`android-reverse`,status:`warn`,summary:`Could not inspect Android adb reverse mappings.`,hint:n.message,evidence:{code:n.code}}}}async function Cx(t,n){let{device:r,targetApp:i,session:a}=n;if(i)try{let e=await wx(r,i);if(!e){$(t,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${D(r)}.`,evidence:{requested:i,platform:D(r)}});return}$(t,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${e}`,evidence:{requested:i,resolved:e,sessionApp:a?.appBundleId}})}catch(n){let i=e(n);$(t,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${D(r)} --all`,evidence:{code:i.code,message:i.message}})}}async function wx(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return Tx(t,(await n(e,`all`)).map(e=>({id:e.package,name:e.name})))?.id}if(k(e)||Fe(e)){let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return Tx(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function Tx(e,t){let r=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new n(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new n(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Ex(t,n,r){let i=Ox(n,r);try{let e=await Ax(i),n=kx(e.devices,i);return $(t,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Px(n,i,e.failures),hint:n.length===0?Lx(e.failures):void 0,command:n.length===0?Hx(i):void 0,evidence:Ux(n,e.failures)}),n.length>0&&jx(t,e.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=e(n);return $(t,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function Dx(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:D(e),id:e.id,name:e.name}))}})}function Ox(e,t){let n=e.flags??{};return Gt({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 kx(e,t){return e.filter(e=>Ie(e,t,{includeExplicitSelectors:!0}))}async function Ax(e){if(e.platform)return{devices:await Ht(e),failures:[]};let t=[],n=[];for(let r of $t)try{t.push(...await Ht({...e,platform:r}))}catch(e){n.push(Nx(r,e))}return{devices:t,failures:n}}function jx(e,t){for(let n of t)$(e,Mx(n))}function Mx(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Bx(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Bx(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Nx(t,n){let r=e(n);return{platform:t,message:r.message,hint:r.hint,code:r.code}}function Px(e,t,n){if(e.length===0)return n.length>0?`No ${Fx(t)} devices found; ${Ix(n)}.`:`No ${Fx(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Fx(t)} ${Vx(e.length,`device`)} available; ${r} booted`,a=Rx(e,t);return a?`${i} (${a}).`:`${i}.`}function Fx(e){let t=e.platform?Bx(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Ix(e){return e.slice(0,2).map(e=>`${Bx(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Lx(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Rx(e,t){if(t.platform||t.target)return;let n=en(e),r=zx();return[`android`,`apple`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function zx(){return{android:`Android`,apple:`Apple`,linux:`Linux`,web:`web`}}function Bx(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function Vx(e,t){return e===1?t:`${t}s`}function Hx(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Ux(e,t){let n=new Map;for(let t of e){let e=D(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 Wx=1500;async function Gx(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 Kx(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?qx(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 Kx(e,t,n){try{return await(n.resolveProcessInfo??Jx)(e,t)}catch{return}}function qx(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 Jx(e,t){if(!Yx(e))return;let n=await Xx(t);if(n!==void 0)return{pid:n,cwd:await Zx(n)}}function Yx(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Xx(e){let t=await p(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Wx});if(t.exitCode===0)return t.stdout.split(`
|
|
26
|
+
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Zx(e){let t=await p(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Wx});if(t.exitCode===0)return t.stdout.split(`
|
|
27
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Qx=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],$x=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function eS(e,t){let n=ot(e.meta?.cwd);return{targetApp:aS(e.flags?.targetApp)??t?.appBundleId,metroHost:aS(e.runtime?.metroHost)??`127.0.0.1`,metroPort:oS(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:rS(e,n)}}function tS(e,t={}){let n=iS(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function nS(e,t,n,r={}){let i=n?e.toArray().filter(e=>e.name!==n.name&&e.device.platform===n.device.platform&&e.device.id===n.device.id).map(e=>e.name):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${D(n.device)}`:void 0,evidence:{session:n.name,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(n.name)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function rS(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function iS(e){let t={...Object.fromEntries([...Qx,...$x].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function aS(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function oS(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function sS(e,t){if(t===`android`){$(e,await cS());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await pS())}async function cS(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await vS(e),n=await yS(`adb`,[`version`]);return n?lS({license:t,sdkRoot:e,versionLine:n}):fS(e,t)}function lS(e){return{id:`toolchain`,status:uS(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${dS(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function uS(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function dS(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function fS(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function pS(){let e=await yS(`xcodebuild`,[`-version`]);return e?mS({selectedPath:await yS(`xcode-select`,[`-p`]),versionLine:e}):_S()}function mS(e){return{id:`toolchain`,status:hS(e),summary:gS(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function hS(e){return e.versionLine?`pass`:`info`}function gS(e){return e.versionLine?e.selectedPath?`Apple toolchain: ${e.versionLine}; xcode-select ${e.selectedPath}.`:`Apple toolchain: ${e.versionLine}; xcode-select path unavailable.`:`Apple toolchain: xcodebuild version check failed.`}function _S(){return{id:`toolchain`,status:`info`,summary:`Apple toolchain: xcodebuild version check failed.`,hint:`Install/select Xcode and complete first launch/license setup if xcodebuild reports it.`,command:`xcodebuild -version`}}async function vS(e){if(!e)return`unknown`;try{return await Ei(I.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function yS(e,t){try{let n=await p(e,t,{allowFailure:!0,timeoutMs:3e3});return n.exitCode===0?n.stdout.split(`
|
|
28
|
+
`).map(e=>e.trim()).find(Boolean):void 0}catch{return}}async function bS(e,t){$(e,await xS(t))}async function xS(e){let t=fn({stateDir:e});if(!t.installed)return{id:`web-agent-browser-processes`,status:`info`,summary:`Managed web backend is not installed; no agent-device-owned browser processes counted.`,evidence:{stateDir:e,installed:!1}};try{let n=await pn(t);return{id:`web-agent-browser-processes`,status:n.count>0?`info`:`pass`,summary:n.count>0?`${n.count} live agent-device-owned Chrome process${n.count===1?``:`es`} detected.`:`No live agent-device-owned Chrome processes detected.`,evidence:{stateDir:e,installed:!0,count:n.count,pids:n.pids,matchReasons:n.processes.map(e=>e.reason)}}}catch(t){return{id:`web-agent-browser-processes`,status:`info`,summary:`Could not inspect live agent-device-owned Chrome processes.`,hint:`Run doctor again from a shell with permission to inspect local processes.`,evidence:{stateDir:e,error:t instanceof Error?t.message:String(t)}}}}async function SS(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==T.doctor)return null;let a=r.get(n),o=eS(t,a),s=TS(r,n),c=[];if(px(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${Pe()} using ${s}`,evidence:{version:Pe(),stateDir:s}},...tS(t,{required:o.remote}),...nS(r,n,a,{remote:o.remote})),o.remote)return OS(c,o);let l=await Ex(c,t,a);await sS(c,a?.device.platform??l?.platform);let u=await ES({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await wS(c,u??CS(l)),OS(c,o,{device:u,includeMetro:!0,inventory:l})}function CS(e){let t=(e?.devices??[]).filter(e=>k(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function wS(e,t){if(!(!t||!k(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||M(t))){if(j({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await Ft(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}ln(t,{}),j({type:`command`,status:`progress`,message:`Warming iOS runner build cache in the background (${t.name})...`}),$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner build started in the background; the first open gets faster once it completes`,hint:"Run `agent-device prepare ios-runner` to wait for a fully warmed runner instead."})}}function TS(e,t){let n=I.dirname(e.resolveSessionDir(t));return I.basename(n)===`sessions`?I.dirname(n):n}async function ES(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??Dx(t,n,r.targetApp);return s&&await DS(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await Gx(r.metroHost,r.metroPort,r.kind)),await bS(t,o),s}async function DS(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await Cx(e,{device:r,session:a,targetApp:i.targetApp}),await gx(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function OS(e,t,n={}){let r=ux(e);return{ok:!0,data:{status:r,summary:dx(r),kind:t.kind,platform:n.device?D(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:fx(e)}}}async function kS(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return N(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=z(T.prepare,o,s);if(c)return c;let l=await B({session:o,flags:s,ensureReady:!0});if(!O(l.platform))return N(`UNSUPPORTED_OPERATION`,`prepare ios-runner is only supported on Apple runner platforms`);let u=Date.now(),d=await cn(l,AS(t,o,r,u));return{ok:!0,data:MS(a,l,Math.max(0,Date.now()-u),d)}}function AS(e,t,n,r){let i=jS(e);return{...Rr({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:Ct.fromTimeoutMs(i,r),startupTimeoutMs:i}}function jS(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:_}function MS(e,t,n,r){return{action:e,platform:D(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:NS(n,r),message:`Prepared Apple runner: ${t.name}`}}function NS(e,t){let n=PS(t.buildMs),r=FS(t.connectMs),i=FS(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function PS(e){return e===void 0?void 0:FS(e)}function FS(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function IS(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,command:a,positionals:o,recordPositionals:s,deriveNextSession:c}=e,l=i.get(n),u=t.flags??{},d=z(a,l,u);if(d)return d;let f=await B({session:l,flags:u,ensureReady:!0}),p=Wt(a,f);if(p)return p;l&&Vr(t)===`may-invalidate`&&hn(l);let m=await Kt(f,a,o,t.flags?.out,{...qt(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;lr(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function LS(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=z(T.clipboard,a,o);if(s)return s;let c=(t.positionals?.[0]??``).toLowerCase();if(c!==`read`&&c!==`write`)return N(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let l=await B({session:a,flags:o,ensureReady:!0}),u=Wt(T.clipboard,l);if(u)return u;let d=await Kt(l,T.clipboard,t.positionals??[],t.flags?.out,{...qt(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return lr(i,a,t,t.command,d??{}),{ok:!0,data:{platform:D(l),...d??{}}}}async function RS(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new In,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}=e;if(t.command===T.doctor)return await SS({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(qn(t.command)===`inventory`)return await Ds({req:t,sessionName:n,sessionStore:i});if(t.command===`runtime`)return await Qa({req:t,sessionName:n,sessionStore:i});if(qn(t.command)===`state`)return await Ps({req:t,sessionName:n,logPath:r,sessionStore:i});if(qn(t.command)===`publication`)return sx({req:t,sessionName:n,sessionStore:i});if(t.command===T.clipboard)return await LS({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===T.keyboard){let e=i.get(n),a=t.positionals?.[0]?.trim().toLowerCase();return!e&&(a===`dismiss`||a===`enter`||a===`return`)&&(t.flags??{}).platform===`ios`?N(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await IS({req:t,sessionName:n,logPath:r,sessionStore:i,command:T.keyboard,positionals:t.positionals??[]})}if(qn(t.command)===`observability`)return await El({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(t.command===T.prepare)return await kS({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===T.install||t.command===T.reinstall)return await xs({req:t,command:t.command,sessionName:n,sessionStore:i,deployOps:t.command===T.install?bs:ys});if(t.command===ge.installSource)return await Ui({req:t,sessionName:n,sessionStore:i});if(t.command===ge.releaseMaterializedPaths)return await Qi({req:t});if(t.command===T.push){let e=t.positionals?.[0]?.trim(),a=t.positionals?.[1]?.trim();return!e||!a?N(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`):await IS({req:t,sessionName:n,logPath:r,sessionStore:i,command:T.push,positionals:[e,zS(a,t.meta?.cwd)],recordPositionals:[e,a]})}return t.command===T.triggerAppEvent?await IS({req:t,sessionName:n,logPath:r,sessionStore:i,command:T.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await wo(e.device,n,e.appBundleId,xo)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}}):t.command===T.open?await Ko({req:t,sessionName:n,logPath:r,sessionStore:i}):qn(t.command)===`replay`?await ox({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:c??s}):t.command===T.batch?await Es(t,n,s):t.command===T.close?await ms({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}):null}function zS(e,t){let n=Rt(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>E.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{RS as handleSessionCommands};
|