agent-device 0.21.13 → 0.21.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.apk → agent-device-android-ime-helper-0.21.14.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.14.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.manifest.json → agent-device-android-ime-helper-0.21.14.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.13.manifest.json → agent-device-android-snapshot-helper-0.21.14.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +23 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +12 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +19 -15
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +2 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +16 -20
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+GestureExecution.swift +8 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +16 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollDragExecution.swift +8 -24
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +20 -42
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +7 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotAcquisition.swift +17 -17
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +2 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +48 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +0 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +7 -14
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +16 -19
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +21 -9
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +59 -10
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +12 -10
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +13 -8
- package/dist/src/absence-observation-errors.js +1 -1
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +1 -1
- package/dist/src/adb-failure.js +1 -1
- package/dist/src/adb-transport.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/app-catalog.js +1 -1
- package/dist/src/app-deployment-resolution.js +1 -1
- package/dist/src/app-inventory.js +1 -1
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +1 -1
- package/dist/src/app-lifecycle2.js +1 -1
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-runtime2.js +1 -1
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/archive.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/capture-disclosure.js +1 -1
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +2 -2
- package/dist/src/cli.js +4 -4
- package/dist/src/click-button.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/clipboard-shell-response.js +1 -1
- package/dist/src/command-schema.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-rule.js +2 -2
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-rotation.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/device-shell.js +1 -1
- package/dist/src/device2.js +1 -1
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/dispatch-resolve.js +1 -1
- package/dist/src/doctor2.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/exec.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/format.js +1 -1
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/helper.js +1 -1
- package/dist/src/human-control-contract.js +1 -1
- package/dist/src/human-control.js +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-artifact-facade.js +1 -1
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-binding.js +1 -1
- package/dist/src/interactor.js +1 -1
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.js +1 -1
- package/dist/src/inventory.js +1 -1
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-download-file.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/mechanics.js +5 -5
- package/dist/src/multitouch-support.js +1 -1
- package/dist/src/native-build-cache.js +1 -0
- package/dist/src/observation.js +1 -1
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/perf-target.js +2 -2
- package/dist/src/perf.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +2 -2
- package/dist/src/platform-runtime-runtime-hints.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-size.js +1 -1
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/png.js +1 -1
- package/dist/src/prepare-kind.js +1 -1
- package/dist/src/provider-session-ownership.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/recording.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +13 -13
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +1 -1
- package/dist/src/reporting.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/runner-cache-metadata.js +1 -1
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-device-readiness.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-error-classification.js +2 -2
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +1 -1
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -5
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-admission-ledger.js +1 -1
- package/dist/src/screen-recording-completion.js +1 -1
- package/dist/src/screen-recording-options.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-image.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot3.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-command.js +1 -1
- package/dist/src/scroll-gesture.js +1 -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 +21 -2
- package/dist/src/sdk-contracts.js +1 -1
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-routing.js +1 -1
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +2 -2
- package/dist/src/session2.js +3 -3
- package/dist/src/settings.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-state.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/src8.js +2 -2
- package/dist/src/string-enum.js +1 -1
- package/dist/src/takeover.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider-facade.js +1 -1
- package/dist/src/tool-provider.js +2 -2
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/transport.js +1 -1
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/video.js +1 -1
- package/dist/src/viewport.js +1 -1
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/dist/src/webdriver-source.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.13.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk.sha256 +0 -1
- package/dist/src/snapshot-process.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{D as e,F as t,L as n,O as r,W as i,_ as a,b as o,c as s,k as c,m as l,o as u,u as d}from"./sdk-contracts.js";import"./capture.js";import{i as f,k as p,p as m,t as h}from"./sdk-batch-runner.js";import{a as g,n as _,t as v}from"./snapshot-diagnostics.js";import{f as y,p as b}from"./android-input-ownership.js";import{S as x,b as S,d as C,l as w,p as ee,s as te,y as ne}from"./sdk-device.js";import{d as re,l as T,n as ie,r as ae}from"./lease-scope.js";import{$t as oe,Bn as se,Br as ce,Dr as le,Er as ue,Gn as de,Hn as fe,Ir as pe,Jn as me,Jr as he,Jt as ge,Kr as _e,T as ve,Un as ye,Wr as E,_n as be,ar as xe,en as Se,gn as Ce,hn as we,kr as Te,on as Ee,or as De,sr as Oe,vn as ke,yn as Ae}from"./sdk-batch.js";import{u as je}from"./scroll-gesture.js";import{a as Me,b as Ne,f as Pe,g as Fe,n as Ie,p as Le,r as Re,w as ze,y as Be}from"./script.js";import{a as Ve}from"./session-store.js";import{S as He,T as Ue,b as We,q as Ge,w as Ke,x as qe}from"./session-snapshot.js";import{a as Je,c as Ye,i as Xe,l as Ze,n as Qe,o as $e,r as et,s as tt,t as nt,u as rt}from"./format.js";import{A as it,j as at}from"./parameterized-recorded-fill.js";import{E as ot,I as st,L as ct,O as lt,R as ut,j as dt,w as ft}from"./runtime.js";import{i as pt}from"./back-mode.js";import{n as mt}from"./success-text.js";import{d as ht,f as gt,i as _t}from"./absence-observation-errors.js";import{a as vt}from"./device.js";import{o as yt,r as D}from"./diagnostics.js";import{p as bt}from"./exec.js";import{t as xt}from"./timeouts.js";import"./diagnostics2.js";import{n as St,r as Ct}from"./output-path.js";import"./command.js";import{a as wt,n as Tt,t as Et}from"./replay-divergence.js";import{s as Dt}from"./device-shell.js";import{n as Ot}from"./retry.js";import{t as kt}from"./session-paths.js";import{n as O}from"./runtime-transport-hints.js";import{r as k}from"./rect-center.js";import{o as At}from"./android-system-chrome.js";import{_ as jt,a as Mt,c as Nt,d as A,f as Pt,g as Ft,h as It,i as Lt,l as Rt,m as zt,n as Bt,o as Vt,p as Ht,r as Ut,s as Wt,u as Gt,v as Kt}from"./human-control-contract.js";import{a as qt,c as Jt,i as Yt,n as Xt,o as Zt,r as j}from"./request-cancel.js";import{t as Qt}from"./request.js";import{n as $t,t as en,u as tn}from"./provider-session-ownership.js";import{r as nn}from"./application-lifecycle-runtime.js";import{a as rn,c as M,l as an,n as on,o as sn,r as cn,t as ln}from"./device-claim-inspection.js";import{b as un,c as dn,g as fn,i as pn,p as mn,x as hn}from"./perf-runtime-plan.js";import{n as gn,r as _n,t as vn}from"./lease-context.js";import{d as yn,g as bn,u as xn}from"./screenshot-runtime.js";import{n as Sn,r as Cn}from"./device-isolation.js";import{n as wn}from"./device-inventory-context.js";import{n as Tn}from"./dispatch-resolve.js";import{t as En}from"./touch-reference-frame.js";import{n as Dn}from"./screen-recording-admission-ledger.js";import{a as On,c as kn,d as N,l as An,n as jn,o as Mn,r as Nn,u as Pn}from"./src8.js";import{i as Fn,n as P,r as In,t as Ln}from"./compatibility-policy.js";import{s as Rn}from"./quality-warnings.js";import{t as zn}from"./png-worker-client.js";import{t as Bn}from"./semantic-index.js";import{o as Vn}from"./screen-recording-resource-recovery.js";import F from"node:path";import I,{promises as Hn}from"node:fs";import Un,{createHash as Wn}from"node:crypto";import Gn from"node:os";import L from"node:fs/promises";import{fileURLToPath as Kn}from"node:url";import{setTimeout as qn}from"node:timers/promises";import Jn from"node:vm";function Yn(e,t){return Xn(e,t)?t:`${e}:${t}`}function Xn(e,t){return t.startsWith(`${e}:`)}function Zn(e,t){return!e.partitioned||Xn(e.tenant,t)}var Qn=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},$n=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},er=class{holdsByDevice=new Map;mutations=new Qn;inFlightWork=new $n;leases=new Map;runBindings=new Map;deviceBindings=new Map;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=Rt(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new en({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=Ht(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Nt(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let n=Pt(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(i,t);if(i.deviceKey)throw Gt(i);return Wt(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=Ft(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);Vt(n,e),Wt(n,e);let r=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(n,r)}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=Ft(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return Vt(n,e),Wt(n,e),{...n}}assertLeaseAdmission(e){let t=zt(e);this.cleanupExpiredLeases(),Wt(this.getActiveLease(t.leaseId),t)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?A(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>Bt(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(t,n,r,i){i?.throwIfAborted();let a=Lt(n),o=Mt(r);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(t,o),c=A(s),l=this.findHumanControlHold(a);if(l&&(this.assertHoldAuthority(t,l),A(l.hold.scope)!==c))throw new e(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...t.kind===`lease`?{ownerLeaseId:t.leaseId}:{},hold:{id:a,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(a,d),await this.activateHumanControlHold(c,d,o.ttlMs,i)}async activateHumanControlHold(t,n,r,i){let a=this.holdsByDevice.get(t),{id:o}=n.hold;try{if(await this.mutations.wait(t,i),i?.throwIfAborted(),a.get(o)!==n)throw new e(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return n.hold={...n.hold,state:`active`,updatedAt:s,...r===void 0?{}:{expiresAt:s+r}},this.refreshHeldLease(t,s),Bt(n.hold)}catch(e){throw a.get(o)===n&&this.deleteHumanControlHold(t,o),e}}removeHumanControlHold(e,t){let n=Lt(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=A(r.hold.scope);return this.deleteHumanControlHold(i,n),Bt(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=A(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Ut(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=A(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(t){let n=this.getActiveLease(t);if(!n.deviceKey)throw new e(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...n,deviceKey:n.deviceKey}}resolveHumanControlScope(t,n){if(t.kind===`host`){if(!n.scope)throw new e(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return n.scope}if(n.scope)throw new e(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let r=this.requireHumanControlLease(t.leaseId);return{backend:r.backend,leaseProvider:r.leaseProvider,deviceKey:r.deviceKey}}assertHoldAuthority(t,n){if(t.kind===`host`)return;let r=this.requireHumanControlLease(t.leaseId);if(n.ownerLeaseId!==r.leaseId||A(r)!==A(n.hold.scope))throw new e(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=A(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,n.expiresAt-n.heartbeatAt,Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=It(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(t){if(t!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let n=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(n<this.maxActiveSimulatorLeases))throw new e(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:n,maxActiveLeases:this.maxActiveSimulatorLeases,backend:t,hint:`Retry after releasing another simulator lease.`})}getActiveLease(t){let n=this.leases.get(t);if(n)return n;throw new e(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(Pt(e),e.leaseId);let t=A(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.runBindings.delete(Pt(e));let n=A(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=A({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw Gt(r)}};function tr(t){let n=Kt(t.meta?.sessionIsolation??t.flags?.sessionIsolation),r=t.meta?.tenantId??t.flags?.tenant,i=jt(r);if(r&&!i)throw new e(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(n!==`tenant`)return t;if(!i)throw new e(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let a=t.session||`default`;return Xn(i,a)?{...t,meta:{...t.meta,tenantId:i,sessionIsolation:n}}:{...t,session:Yn(i,a),meta:{...t.meta,tenantId:i,sessionIsolation:n}}}function nr(t,n,r,i={}){if(yn(t.command))return;let a=gn(t);ar(t,a);let o=r?.lease;if(r===void 0&&!a.leaseId&&rr(t,i.providerAppCatalog))return;if(t.command===`human_control`&&!o&&!a.leaseId)throw new e(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(t.command!==`human_control`&&!o&&t.meta?.sessionIsolation!==`tenant`&&(!a.leaseId||!a.tenantId&&!a.runId))return;or(a,o);let s=_n(t,r),c={...s,leaseTtlMs:s.leaseTtlMs??(ae(s)?3e5:void 0)};n.assertLeaseAdmission(T(s));let l=n.heartbeatLease(T(c));return xn(t)&&n.assertHumanControlAdmission(l),l}function rr(e,t){let n=bn(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function ir(e){yn(e.command)||ar(e,gn(e))}function ar(t,n){if(t.command!==`open`)return;let r=ie(n);if(r.length!==0)throw new e(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:r})}function or(e,t){t&&(R(`leaseId`,e.leaseId,t.leaseId),R(`tenantId`,e.tenantId,t.tenantId),R(`runId`,e.runId,t.runId),R(`leaseProvider`,e.leaseProvider,t.leaseProvider),R(`clientId`,e.clientId,t.clientId),R(`deviceKey`,e.deviceKey,t.deviceKey))}function R(t,n,r){if(!(!n||!r||n===r))throw new e(`UNAUTHORIZED`,`Lease does not match session owner (${t})`,{reason:`LEASE_SESSION_MISMATCH`,field:t})}async function sr(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),D({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return D({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}function cr(e){ir(e)}async function lr(e){let t=e.sessionStore.get(e.sessionName),n=t?.lease;return!t||!n||!e.leaseRegistry.consumeExpiredLease(n.leaseId)?!1:(D({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:n.leaseId,session:t.name,deviceKey:n.deviceKey}}),await e.teardownSession(t,t.name).catch(e=>{D({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:n.leaseId,session:t.name,error:e instanceof Error?e.message:String(e)}})}),await un(t.deviceClaim).catch(e=>{D({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:t.name,deviceKey:t.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.delete(t.name),!0)}function ur(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.get(t),a=nr(e.req,r,i,{providerAppCatalog:e.providerAppCatalog});if(!a)return e.req;let o={...e.req,internal:{...e.req.internal,admittedLease:a}};return i?.lease&&n.set(t,{...i,lease:{...i.lease,leaseBackend:a.backend,expiresAt:a.expiresAt}}),o}function dr(e){return vn(e.req,e.req.internal?.admittedLease)??e.existingLease}async function fr(e){let t=e.session.lease;if(!t)return;let n=re({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n),i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=$t(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return D({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const pr=[`platform`,`target`],mr=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function hr(e){return te({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function gr(e){return hr(e)||yr(e,pr)}function _r(e){return gr(e)||yr(e,mr)}function vr(e){return typeof e==`string`&&e.trim().length>0}function yr(e,t){return e?t.some(t=>vr(e[t])):!1}function br(e){return{appleSimulatorAppTarget:xr(e)}}function xr(e){return e&&!f(e)?e:void 0}function Sr(){return Dn({displayName:`audio probe`})}function Cr(){return Dn({displayName:`perf capture`})}function wr(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return Wn(`sha256`).update(xe(t),`utf8`).digest(`hex`)}function Tr(e,t,n){return new Pr(Dr(Er(t.resolve(e))),n).parse()}function Er(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function Dr(t){let n=[],r=0;for(;r<t.length;){let i=t.slice(r),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){r+=a;continue}let o=Or(i);if(!o)throw new e(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);n.push(o.value),r+=o.length}return n}function Or(e){return kr(e)??Ar(e)??jr(e)??Mr(e)??Nr(e)}function kr(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function Ar(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function jr(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function Mr(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Nr(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Pr=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let t=this.parseOr();if(this.peek())throw new e(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return t}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 t=this.peek();if(!t)throw new e(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(t.type===`boolean`)return this.index+=1,t.value;if(t.type===`paren`&&t.value===`(`){this.index+=1;let t=this.parseOr();if(!this.consumeParen(`)`))throw new e(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return t}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 e(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}consumeComparisonOperator(){let t=this.peek();if(t?.type!==`operator`||t.value!==`==`&&t.value!==`!=`)throw new e(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,t}consumeStringLiteral(){let t=this.peek();if(t?.type!==`string`)throw new e(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`);return this.index+=1,t.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 Fr(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function Ir(e,t){return{...Gr(e,t),source:e.source}}function z(t,n,r){if(t===void 0)return;let i=r??On[n]??{},a=Mn(i),o;if(typeof t==`number`)o=t;else{let r=t.trim();if(r===``)throw new e(`INVALID_ARGS`,`Maestro ${n} 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 e(`INVALID_ARGS`,`Maestro ${n} must be ${a}.`);return o}function Lr(e,t,n,r){return z(e===void 0?t:n.resolve(String(e)),r)}function B(e){if(e?.aborted)throw c()}async function Rr(t,n){if(t.include.kind===`commands`)return{kind:`program`,source:t.source,config:{},commands:t.include.commands};if(!n.loadProgram)throw new e(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return B(n.signal),n.signal?await n.loadProgram(t.include.path,t.source.path,n.signal):await n.loadProgram(t.include.path,t.source.path)}function zr(e,t){if(e.include.kind===`file`)return F.resolve(t?F.dirname(t):process.cwd(),e.include.path)}function Br(e){return e===void 0?void 0:F.resolve(e)}function Vr(t,n){let r=zr(t,t.source.path);if(r&&n.has(r))throw new e(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);return r}function Hr(t,n,r,i){let a=t.include.kind===`file`?Br(n.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 e(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function Ur(e,t,n){return e.platform&&e.platform!==n.platform?!1:e.true===void 0?!0:typeof e.true==`boolean`?e.true:Tr(e.true,t,n.platform)}function Wr(e){return[...e.visible?[{kind:`visible`,selector:e.visible}]:[],...e.notVisible?[{kind:`notVisible`,selector:e.notVisible}]:[]]}function Gr(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>Gr(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Gr(n,t)])):e}async function Kr(e,t){B(t.signal);let n=Br(e.source.path),r={options:t,context:kn(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await qr(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function qr(e,t,n,r,i){B(i.options.signal);let a=ii(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 Yr(s,a,o,e.source.path??r,i));return n}finally{s()}}async function Jr(e,t,n,r,i){let a=[];for(let o of e)a.push(...await Yr(o,t,n,r,i));return a}async function Yr(e,t,n,r,i){B(i.options.signal);let a=ai(e,r);switch(a.kind){case`runFlow`:{let e=Zr(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await Xr(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[ni(a,t,n,o)]}case`repeat`:return[ni(a,t,n,await Jr(a.commands,t,n,r,i))];case`retry`:return[ni(a,t,n,await Jr(a.commands,t,n,r,i))];default:return[ti(a,t,n)]}}async function Xr(e,t,n,r,i){let a=$r(e,i.context),o=Vr(a,i.activeIncludePaths),s=await Rr(a,i.options);B(i.options.signal);let c=Hr(a,s,o,i.activeIncludePaths),l=ii(t,e.env),u=i.context.enter(e.env);try{return await qr(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function Zr(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:Qr(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function Qr(e,t){if(e===!1)return`omit`;if(typeof e==`string`)return ei(t.context.resolveDeferred(e))?`opaque`:Tr(e,t.context,t.options.platform)?void 0:`omit`}function $r(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function ei(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function ti(e,t,n){return N({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function ni(e,t,n,r){return N({kind:`opaque`,command:ri(e),source:e.source,scopes:t,body:r,appId:n})}function ri(e){switch(e.kind){case`runFlow`:return N({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 N({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function ii(e,t){return t===void 0?e:[...e,t]}function ai(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function oi(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await Kr(e,t),a=si(t.runtimeHints),o=N({kind:`maestroReplayPlan`,platform:t.platform,target:t.target,runtimeHints:a,initialStaticEnv:structuredClone({...t.defaults??{},...e.config.env??{},...t.env??{}}),steps:structuredClone(n),total:n.length,compatibility:{staticallyExecutedControls:r,staticallySkippedControls:i}}),s=wr(o);return ci({...o,digest:s})}function si(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 ci(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))ci(t);return Object.freeze(e)}function li(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`||n.command.kind===`evalScript`)return{allowed:!1,reason:`step ${t+1} (${n.command.kind}) 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 ui(t,n={}){let r=li(t,n);if(!r.allowed)throw new e(`INVALID_ARGS`,r.reason);return r.startIndex}function di(t,n){if(!Number.isInteger(n)||n<0||n>t.total)throw new e(`INVALID_ARGS`,`Maestro replay startIndex ${n} is out of range for a ${t.total}-step plan.`);return n}const fi=`maestro-test-failure`;function pi(t,n={}){return new e(`COMMAND_FAILED`,t,{...n,reason:fi})}function mi(t){return t instanceof e&&t.code===`COMMAND_FAILED`&&t.details?.reason===fi}const hi=new Set([``,`false`,`0`,`null`,`undefined`]);function gi(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0&&!Number.isNaN(e):!hi.has(e)}async function _i(e,t){B(t.options.signal);try{return await Mi(e,t.context,async()=>await vi(e,t))}catch(t){throw Ni(t,e)}}async function vi(e,t){if(e.kind===`command`)return await yi(e.command,e.appId,t);await Ti(e,t)}async function yi(e,t,n){if(e.kind===`evalScript`)return await Si(e,n);let r=Ir(e,n.context);try{return await Ci(r,t,n)}catch(e){if(B(n.options.signal),xi(r)&&mi(e)){n.warnings.push(bi(r,e)),n.skipped+=1;return}throw Pi(e,r)}}function bi(t,n){let r=`${t.source.path?`${t.source.path}:`:``}line ${t.source.line}`,i=n instanceof e?n.message:String(n);return`Optional Maestro ${t.kind} skipped at ${r}: ${i}`}function xi(e){return`optional`in e&&e.optional===!0}async function Si(t,n){let{evaluateMaestroEvalScript:r}=await import(`./engine-eval-script.js`);if(n.options.trustedScripts===!1)throw new e(`UNAUTHORIZED`,`Maestro evalScript is not permitted for flows received over the remote daemon surface: node:vm is not a security sandbox, so an untrusted expression can escape to the host.`);let i=await r(t.script,n.context.values);n.context.replaceOutput(i),n.executed+=1}async function Ci(e,t,n){switch(e.kind){case`assertVisible`:await ki({kind:`visible`,selector:e.target},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await ki({kind:`notVisible`,selector:e.target},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`assertTrue`:if(!gi(e.condition))throw pi(`Maestro assertTrue condition was falsy: ${JSON.stringify(e.condition)}`);n.executed+=1;return;case`extendedWaitUntil`:await ki(ji(e),z(e.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await wi(e,t,n)}}async function wi(e,t,n){let r=N({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 B(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 Ti(e,t){let n=Ir(e.command,t.context);switch(n.kind){case`runFlow`:if(n.when&&!await Oi(n.when,t)){t.skipped+=1;return}t.executed+=1,await Ei(e.body,t);return;case`repeat`:{let r=Lr(n.times,0,t.context,`repeat.times`);t.executed+=1;for(let n=0;n<r;n+=1)B(t.options.signal),await Ei(e.body,t);return}case`retry`:{let r=Math.min(Lr(n.maxRetries,1,t.context,`retry.maxRetries`),P.control.retryMaxRetries);t.executed+=1,await Di(e.body,r,t);return}}}async function Ei(e,t){for(let n of e)await _i(n,t)}async function Di(t,n,r){let i;for(let e=0;e<=n;e+=1){B(r.options.signal);try{await Ei(t,r);return}catch(e){if(B(r.options.signal),!mi(Ii(e)))throw e;i=Ni(e,t[0])}}throw i||new e(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function Oi(e,t){if(!Ur(e,t.context,t.options))return!1;for(let n of Wr(e))if(B(t.options.signal),!(await Ai(n,t.timing.runFlowConditionTimeoutMs,t)).matched)return!1;return!0}async function ki(e,t,n){if(!(await Ai(e,t,n)).matched)throw pi(`Maestro ${e.kind} condition did not match.`)}async function Ai(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 B(n.options.signal),n.context.recordObservation(i),i}function ji(t){if(t.visible)return{kind:`visible`,selector:t.visible};if(t.notVisible)return{kind:`notVisible`,selector:t.notVisible};throw new e(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function Mi(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 Ni(e,t){if(Fi(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:Li(e,t?.command),source:n,...t?{command:t.command}:{}}}function Pi(e,t){return{kind:`maestroPlanStepFailure`,error:Li(e,t),source:t.source,command:t}}function Fi(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function Ii(e){return Fi(e)?e.error:e}function Li(t,n){if(!(t instanceof e)||!n||/\bline \d+\b/.test(t.message))return t;let r=n.source.path?`${n.source.path}:`:``;return new e(t.code,`${t.message} (${r}line ${n.source.line})`,t.details)}async function Ri(t,n,r={}){B(r.signal);let i=r.startIndex??0;if(!Number.isInteger(i)||i<0||i>t.total)throw new e(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${t.total}-step plan.`);let a={plan:t,port:n,options:r,context:kn(r.defaults,r.env?{...r.env}:{}),timing:Ln,artifacts:new Set,warnings:[],executed:t.compatibility.staticallyExecutedControls,skipped:t.compatibility.staticallySkippedControls};for(let e=i;e<t.steps.length;e+=1)try{await zi(t.steps[e],e,a)}catch(e){throw Ii(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function zi(e,t,n){B(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};Vi(()=>n.options.observer?.commandStarted?.(s));try{let t=await _i(e,n);B(n.options.signal),Vi(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...Bi(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=Ni(t,e);throw Vi(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...Bi(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],warnings:[...n.warnings]})),o}}function Bi(e,t){return!e||!t?{}:{runtimeMetrics:{hierarchyCaptures:t.hierarchyCaptures-e.hierarchyCaptures,screenshotCaptures:t.screenshotCaptures-e.screenshotCaptures,tapRetries:t.tapRetries-e.tapRetries,settleLatches:t.settleLatches-e.settleLatches,settleTimeouts:t.settleTimeouts-e.settleTimeouts}}}function Vi(e){try{e?.()}catch{}}async function Hi(e,t,n={}){let r=Ui(e,n);return await Ri(e,t,{...n,startIndex:r})}function Ui(e,t){return t.from!==void 0||t.planDigest!==void 0?ui(e,{from:t.from,planDigest:t.planDigest}):di(e,t.startIndex??0)}function Wi(e){return Fr(e)?{command:e.kind,...e.kind===`runFlow`?V(e.label??e.includePath):{}}:{command:e.kind,...Gi(e)}}function Gi(e){return`label`in e&&e.label?V(e.label):Ki(e)?V($i(e.target)):qi(e)?Ji(e):e.kind===`inputText`?V(`<text>`):Yi(e)}function Ki(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function qi(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function Ji(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return V(ea(e.target));case`extendedWaitUntil`:return V(ea(e.visible??e.notVisible));case`scrollUntilVisible`:return V(ea(e.element))}}function Yi(e){return Xi(e)?Zi(e):e.kind===`swipe`?Qi(e):e.kind===`runFlow`?V(e.label??(e.include.kind===`file`?e.include.path:``)):e.kind===`assertTrue`?V(String(e.condition)):{}}function Xi(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function Zi(e){switch(e.kind){case`openLink`:return V(e.link);case`takeScreenshot`:return V(e.path);case`runScript`:return V(e.file);case`pressKey`:return V(e.key)}}function Qi(e){return V(e.gesture.kind===`coordinates`?`${ta(e.gesture.start)} to ${ta(e.gesture.end)}`:e.gesture.direction)}function $i(e){return e.space===`target`?ea(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function ea(e){return e?.id??e?.text}function ta(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function V(e){return e?{value:e}:{}}const na=new Set(String.raw`^$\.*+?()[]{}|`);function ra(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function ia(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(na.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!na.has(i))return;t+=i,n+=1}return t}function aa(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(E(e.rect))return t.isVisibleInEffectiveViewport(e);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=t.findAncestor(e,e=>Te(e,n)?e:null);return r?E(r.rect)?t.isVisibleInEffectiveViewport(r):n!==`android`&&r.hittable===!0:!1}function oa(e,t,n){return!!n.findAncestor(e,e=>e.index===t.index?e:null)}function sa(e,t){let n=[t.id===void 0?void 0:la(e.identifier,t.id),t.text===void 0?void 0:ua(e,t.text)].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 ca(e){return e.matches.filter(t=>aa(t,e.visibility,e.platform))}function la(e,t){let n=e??``;return Pn(n)===Pn(t)||ra(n,t)}function ua(e,t){return[e.label,An(e),e.identifier].filter(e=>!!e).some(e=>la(e,t))}function da(e){return e.index!==void 0||e.childOf!==void 0||e.below!==void 0||e.above!==void 0||e.leftOf!==void 0||e.rightOf!==void 0||e.containsChild!==void 0||e.containsDescendants!==void 0}function fa(e){return e.text!==void 0||e.id!==void 0||e.enabled!==void 0||e.selected!==void 0}function pa(e,t,n){let r=[],i=0;for(let a of e)for(let e of n){let n=ha(a.rect,e.rect);n===void 0||!ma(t,a.rect,e.rect)||r.push({node:a,distance:n,order:i++})}return r.sort((e,t)=>e.distance-t.distance||e.order-t.order),r.map(({node:e})=>e)}function ma(e,t,n){switch(e){case`below`:return t.y>n.y;case`above`:return t.y<n.y;case`leftOf`:return t.x<n.x;case`rightOf`:return t.x>n.x}}function ha(e,t){if(!(!ga(e)||!ga(t)))return Math.fround(Math.hypot(_a(e.x,e.width)-_a(t.x,t.width),_a(e.y,e.height)-_a(t.y,t.height)))}function ga(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite))}function _a(e,t){return e+Math.trunc(t/2)}function va(t,n={},r={}){let i=ue(t.nodes,n);n.onVisibilityContextCreated?.();let a=new WeakMap,o=new WeakSet,s=new WeakMap,c=new Map,l=e=>e.parentIndex===void 0?void 0:i.nodeByIndex.get(e.parentIndex)??t.nodes[e.parentIndex],u=e=>{let t=s.get(e);if(t)return t;let n=new Set,r=new Set,i=l(e);for(;i&&!r.has(i.index);)r.add(i.index),n.add(i.index),i=l(i);return s.set(e,n),n},d=(e,r)=>{let i=c.get(e);i||(i=new WeakMap,c.set(e,i));let a=i.get(r);if(a)return a;n.onPositionComputed?.(e,r);let o=pa(t.nodes,e,m(r).indexed),s={ordered:o,candidateIndexes:new Set(o.map(e=>e.index))};return i.set(r,s),s},f=(e,t)=>d(e,t).ordered,p=(e,t)=>d(e,t).candidateIndexes,m=i=>{let s=a.get(i);if(s)return s;if(o.has(i))throw new e(`INVALID_ARGS`,`Maestro selector relations cannot contain cycles.`);o.add(i),n.onSelectorComputed?.(i);try{let e=ya(t,i,l,u,m,p),n={matches:e,indexed:Ca(e,i.index,r.orderUnindexed)};return a.set(i,n),n}finally{o.delete(i)}};return{visibility:i,resolve:m,resolvePosition:f}}function ya(e,t,n,r,i,a){let{index:o,childOf:s,below:c,above:l,leftOf:u,rightOf:d,containsChild:f,containsDescendants:p,...m}=t,h=fa(m)?e.nodes.filter(e=>sa(e,m)):[...e.nodes];if(s){let e=new Set(i(s).indexed.map(e=>e.index));h=h.filter(t=>xa(r(t),e))}if(f){let e=new Set(i(f).indexed.map(n).filter(e=>e!==void 0).map(e=>e.index));h=h.filter(t=>e.has(t.index))}if(p){let e=p.map(e=>ba(i(e).indexed,r));h=h.filter(t=>e.every(e=>e.has(t.index)))}for(let[e,n]of Sa(t)){let t=a(e,n);h=h.filter(e=>t.has(e.index))}return h}function ba(e,t){let n=new Set;for(let r of e)for(let e of t(r))n.add(e);return n}function xa(e,t){for(let n of e)if(t.has(n))return!0;return!1}function Sa(e){return[[`below`,e.below],[`above`,e.above],[`leftOf`,e.leftOf],[`rightOf`,e.rightOf]].filter(e=>e[1]!==void 0)}function Ca(e,t,n){if(t===void 0)return n?n(e):[...e];let r=Ta(e)[Da(t)];return r?[r]:[]}function wa(e,t){return t===void 0?e[0]:Ta(e)[Da(t)]}function Ta(e){return[...e].sort((e,t)=>{let n=Ea(e.rect?.y),r=Ea(t.rect?.y);return n===r?Ea(e.rect?.x)-Ea(t.rect?.x):n-r})}function Ea(e){return e!==void 0&&Number.isFinite(e)?e:2**53-1}function Da(t){let n=typeof t==`number`?t:Number(t.trim());if(!Number.isSafeInteger(n)||n<0)throw new e(`INVALID_ARGS`,`Maestro selector.index must be a non-negative integer.`);return n}const Oa={android:{kind:`exact`,provider:`android-helper`},ios:{kind:`divergence`,provider:`apple-xctest`,reason:`maestro-clickable-not-exposed-by-provider`}};function ka(e,t){let n=Oa[t];if(n.kind===`divergence`)return n;let r=b(e);return r?r.kind!==`exact`||r.provider!==n.provider?{kind:`divergence`,provider:n.provider,reason:`unregistered-provider-evidence`}:r:{kind:`divergence`,provider:n.provider,reason:`exact-evidence-not-retained`}}function Aa(e,t){return t.kind===`exact`?e.map((e,n)=>({node:e,order:n,rank:ja(t.clickableByNodeIndex.get(e.index))})).sort((e,t)=>t.rank-e.rank||e.order-t.order).map(({node:e})=>e):[...e]}function ja(e){return e===!0?2:+(e===!1)}function Ma(e,t,n,r={}){let i=ka(e,n),a=Pa(e,i,r),o=Na(t,a),s=ca({visibility:a.visibility,matches:o.matches,platform:n});return{...o,visible:s,clickability:i,ranked:Fa(s,t,n,a.visibility,i)}}function Na(e,t){return{matches:t.resolve(e).matches,parentMatched:e.childOf===void 0||t.resolve(e.childOf).indexed.length>0}}function Pa(e,t,n={}){return va(e,n,t?{orderUnindexed:e=>Aa(e,t)}:{})}function Fa(e,t,n,r,i){let a=n!==`ios`||!Ba(t)?e:e.filter(n=>{if(Wa(n))return!0;let i=e.filter(e=>e!==n&&Va(n,e,t));return!i.some(e=>Wa(e)&&oa(n,e,r))&&!i.some(e=>oa(e,n,r))});return t.index===void 0&&i?Aa(a,i):a}function Ia(e,t){let n=t===void 0?e.find(za):La(e,t);return!n||!za(n)?null:{node:n,rect:n.rect}}function La(e,t){return wa(e,t)}function Ra(e){return za(e)?e.rect:void 0}function za(e){return E(e.rect)}function Ba(e){return e.id!==void 0||e.text!==void 0}function Va(e,t,n){if(n.id!==void 0&&Ua(e.identifier)!==Ua(t.identifier))return!1;if(n.text!==void 0){let n=Ha(e),r=new Set(Ha(t));if(!n.some(e=>r.has(e)))return!1}return!0}function Ha(e){return[e.label,e.value,e.identifier].map(Ua).filter(e=>e!==void 0)}function Ua(e){if(e)return Pn(e)||void 0}function Wa(e){let t=pe(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}const Ga=Symbol(`maestroFlowProgram`),Ka=Symbol(`maestroFailureCommand`),qa=Symbol(`maestroFailurePlan`);function Ja(e,t){let n=Nn(e,{sourcePath:t});return{sourcePath:t,name:n.config.name,appTarget:$a(n),[Ga]:n}}async function Ya(e,t,n){let r;try{let i=jn(F.dirname(e.sourcePath),n.readSource),a=await oi(e[Ga],{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,runtimeHints:n.runtimeHints,loadProgram:i,signal:n.signal}),o=ui(a,{from:n.from,planDigest:n.planDigest}),s=await Hi(a,t,{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,loadProgram:i,signal:n.signal,startIndex:o,trustedScripts:n.trustedScripts,observer:Za(a,n.observer,e=>{r=e})});return{ok:!0,replayed:a.total-o,planDigest:a.digest,startIndex:o,artifactPaths:s.artifactPaths,...s.warnings?{warnings:s.warnings}:{}}}catch(e){return{ok:!1,error:r?.error??e,...r?{failure:r}:{}}}}function Xa(e,t){let n=to(e[Ka]),r=e[qa].platform;return!n||r!==`android`&&r!==`ios`?[]:Ma(t,n.selector,r).ranked.map(e=>({node:e,basis:no(n.selector,e)}))}function Za(e,t,n){return{commandStarted:e=>t?.actionStarted?.(Qa(e)),commandCompleted:e=>t?.actionCompleted?.({...Qa(e),durationMs:e.durationMs,runtimeMetrics:e.runtimeMetrics,data:e.data}),commandFailed:r=>{let i=li(e,{from:r.stepIndex,planDigest:e.digest}),a={...Qa(r),durationMs:r.durationMs,error:r.error,artifactPaths:r.artifactPaths,warnings:[...r.warnings],isControl:Fr(r.command),redactions:r.command.kind===`inputText`&&r.command.text.length>0?[{name:`inputText.text`,value:r.command.text}]:[],resume:i.allowed?{allowed:!0,from:r.stepIndex,planDigest:e.digest}:{allowed:!1,from:r.stepIndex,planDigest:e.digest,reason:i.reason},[Ka]:r.command,[qa]:e};n(a),t?.actionFailed?.(a)}}}function Qa(e){let t=Wi(e.command);return{action:t.command,...t.value?{value:t.value}:{},source:e.source,generation:e.generation,stepIndex:e.stepIndex,stepTotal:e.stepTotal}}function $a(e){return[e.config.appId,...[...e.config.onFlowStart??[],...e.commands].filter(e=>e.kind===`launchApp`).map(e=>e.kind===`launchApp`?e.appId:void 0)].find(eo)}function eo(e){return!!(e?.trim()&&!e.includes(`$`)&&!f(e))}function to(e){switch(e.kind){case`tapOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`doubleTapOn`:case`longPressOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;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};case`swipe`:return e.gesture.kind===`target`?{selector:e.gesture.from}:void 0;default:return}}function no(e,t){return e.id!==void 0||e.text!==void 0&&sa({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text===void 0?`other`:`label`}function H(e,t){return N({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function ro(e){return N({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function io(e,t){let n=lo(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},ro(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:ao(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ao(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function oo(e,t,n,r){let i=lo(await r.resolveTarget({selector:e,...t},H(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw pi(`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 so(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function co(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 lo(e,t){return uo(e,t),fo(e),po(e),mo(e),e}function uo(t,n){if(t.generation!==n)throw new e(`COMMAND_FAILED`,`Maestro target evidence generation ${t.generation} does not match ${n}.`)}function fo(t){if(!Number.isInteger(t.candidateCount)||t.candidateCount<0)throw new e(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function po(t){if(t.rect!==void 0&&!co(t.rect)||t.viewport!==void 0&&!co(t.viewport))throw new e(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function mo(t){if(t.surfaceSignature!==void 0&&typeof t.surfaceSignature!=`string`)throw new e(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function ho(e,t,n,r,i,a={}){let o=go(e,t,n,i,a);if(!o)return;let{start:s,end:c}=xo(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function go(e,t,n,r,i){let a=n===`up`||n===`down`,o=Pa(e,ka(e,r),i),s=o.visibility,c=ca({visibility:s,matches:e.nodes.filter(e=>ce(e)),platform:r}),l=_e(s.viewportRects)??vo(c);if(!l||!E(l))return;let u=c.flatMap(e=>{if(!E(e.rect))return[];let t=yo(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=_o(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(bo)[0]?.viewport}function _o(e,t){return ce(e)?e:le(e,t)}function vo(e){let t;for(let n of e)E(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function yo(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 bo(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function xo(e,t){let n=U(e,.5,.5),r=P.scrollUntilVisibleSwipe.nearEdgeFraction,i=P.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:U(e,.5,i)};case`down`:return{start:n,end:U(e,.5,r)};case`left`:return{start:n,end:U(e,i,.5)};case`right`:return{start:n,end:U(e,r,.5)}}}async function So(t,n,r){let i=z(t.duration,`swipe.duration`);if(t.kind===`coordinates`){if(t.start.space!==t.end.space)throw new e(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=t.start.space===`percent`?await r.resolveGestureViewport(H(n,n.command)):void 0;return{authored:t,gesture:wo(await Co(t.start,n,r,a),await Co(t.end,n,r,a),i),...a?{viewport:a}:{}}}if(t.kind===`screen`){let e=await r.resolveGestureViewport(H(n,n.command)),{start:a,end:o}=To(e,t.direction,r.platform);return{authored:t,gesture:wo(a,o,i),viewport:e}}let a=await oo(t.from,{purpose:`swipe`,timeoutMs:`optional`in n.command&&n.command.optional===!0?P.command.optionalTargetLookupTimeoutMs:P.command.targetLookupTimeoutMs},n,r),o=a.viewport??await r.resolveGestureViewport(H(n,n.command)),{start:s,end:c}=Eo(a,t.direction,o);return{authored:t,gesture:wo(s,c,i),target:a,viewport:o}}async function Co(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(H(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 wo(e,t,n){return{from:e,to:t,durationMs:n??P.command.swipeDurationMs}}function To(e,t,n){if(t===`left`||t===`right`){let n=je(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=U(e,r.centerFraction,r.nearEdgeFraction),a=U(e,r.centerFraction,r.farEdgeFraction),o=U(e,r.centerFraction,r.downStartFraction),s=U(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function U(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Eo(e,t,n){let r=k(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 Do={launchApp:Mo,stopApp:Mo,setPermissions:Mo,clearState:Mo,openLink:Mo,tapOn:Fo,doubleTapOn:Fo,longPressOn:Fo,swipe:Bo,inputText:Vo,eraseText:Vo,scroll:W,scrollUntilVisible:W,hideKeyboard:W,pressKey:W,back:W,waitForAnimationToEnd:W,takeScreenshot:Wo,runScript:Wo,evalScript:Ko,assertVisible:Go,assertNotVisible:Go,assertTrue:Go,extendedWaitUntil:Go},Oo={launchApp:!0,stopApp:!0,setPermissions:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function ko(e){return Oo[e.kind]}async function Ao(e,t){let n=e.command;return await jo(n,e,t,H(e,n))}function jo(e,t,n,r){let i=Do[e.kind];return i(e,t,n,r)}async function Mo(e,t,n,r){switch(e.kind){case`launchApp`:return await G(n.launchApp,No(e,t),r,`invalidate`);case`stopApp`:return await G(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`setPermissions`:return await G(n.setPermissions,{appId:e.appId??t.appId,permissions:Po(e.permissions)},r,`invalidate`);case`clearState`:return await G(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await G(n.openLink,{link:e.link},r,`invalidate`)}}function No(e,t){return N({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?Po(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function Po(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function Fo(e,t,n,r){switch(e.kind){case`tapOn`:return await Io(e,t,n,r);case`doubleTapOn`:{let i=await es(e.target,{purpose:`doubleTap`,timeoutMs:Ro(e)},t,n),a=z(e.delay,`doubleTapOn.delay`)??P.command.repeatDelayMs;return await G(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?so(i.resolution):void 0)}case`longPressOn`:{let i=await es(e.target,{purpose:`longPress`,timeoutMs:Ro(e)},t,n);return await G(n.longPressOn,{target:i},r,`invalidate`,i.resolution?so(i.resolution):void 0)}}}async function Io(e,t,n,r){let i=await Lo(e,t,n);return await G(n.tapOn,zo(e,i),r,`invalidate`,i.resolution?so(i.resolution):void 0)}async function Lo(e,t,n){let r={purpose:`tap`,timeoutMs:Ro(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await es(e.target,r,t,n)}function Ro(e){return e.optional===!0?P.command.optionalTargetLookupTimeoutMs:P.command.targetLookupTimeoutMs}function zo(e,t){let n=z(e.repeat,`tapOn.repeat`),r=z(e.delay,`tapOn.delay`),i=n===void 0?r:r??P.command.repeatDelayMs;return N({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Bo(e,t,n,r){let i=await So(e.gesture,t,n);return await G(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?so(i.target):void 0)}async function Vo(e,t,n,r){switch(e.kind){case`inputText`:return await G(n.inputText,N({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await G(n.eraseText,N({charactersToErase:z(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function W(e,t,n,r){switch(e.kind){case`scroll`:return await G(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await G(n.scrollUntilVisible,Ho(e),r,`invalidate`);case`hideKeyboard`:return await G(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await G(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await G(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await G(n.waitForAnimationToEnd,Uo(e),r,`preserve`)}}function Ho(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:z(e.timeout,`scrollUntilVisible.timeout`)??P.command.scrollUntilVisibleTimeoutMs,durationMs:Fn(P.command.scrollUntilVisibleSpeed)}}function Uo(e){return N({timeoutMs:z(e.timeout,`waitForAnimationToEnd.timeout`)})}async function Wo(e,t,n,r){switch(e.kind){case`takeScreenshot`:return Jo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await G(n.runScript,N({file:e.file,env:e.env}),r,`preserve`)}}async function Go(t){throw new e(`COMMAND_FAILED`,`Maestro ${t.kind} must be executed by the observation engine.`)}function Ko(t){throw new e(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${t.source.path??``}line ${t.source.line}.`)}async function G(e,t,n,r,i){let a=qo(n,r);return Jo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function qo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function Jo(e,t,n,r){let i=e?.observation;return Yo(i,r),{...Xo(n??i),...Zo(e?.outputEnv),...Qo(t,e?.artifactPaths),...$o(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function Yo(t,n){if(!(!t||n===void 0||t.generation===n))throw new e(`COMMAND_FAILED`,`Maestro operation evidence generation ${t.generation} does not match ${n}.`)}function Xo(e){return e?{observation:e}:{}}function Zo(e){return e?{outputEnv:{...e}}:{}}function Qo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function $o(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function es(e,t,n,r){if(e.space===`target`){let i=await oo(e.selector,t,n,r);return{authored:e,point:k(i.rect),resolution:i}}return{authored:e,point:await Co(e,n,r)}}function ts(e,t,n,r={}){let i=n===`ios`&&r.presentation?rs(r.presentation):void 0,a=i?is(e,t,i):Ma(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:cs(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?La(s,t.selector.index):Ia(s,t.selector.index)?.node,l=cs(t,o,s,c);if(!c)return as(t,o,s,l);let u=i?Ia(i.visibleForSource(c),void 0):null,d=Ra(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!ns(t.selector)&&i?os(d,s,u):0,evidence:l}:as(t,o,s,l)}const ns=da;function rs(e){let t=ue(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>aa(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function is(e,t,n){let r=ka(e,`ios`),i=va(e,{},{orderUnindexed:e=>Aa(e,r)}),a=Na(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:Fa(o,t.selector,`ios`,i.visibility,r)}}function as(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function os(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&ss(n.rect,e)?1:0:t.length}function ss(e,t){let n=k(e),r=k(t);return n.x===r.x&&n.y===r.y}function cs(e,t,n,r){return N({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const K={settleTimeoutMs:In,retryTapMaxAttempts:P.command.retryTapMaxAttempts,longPressDurationMs:P.command.longPressDurationMs,eraseTextMaxCharacters:P.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:P.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:P.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:P.command.waitForAnimationToEndDifferencePercent,observationPollMs:P.observation.pollIntervalMs};function ls(e,t={}){return{execute:async n=>{let r=H(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:ko(n.command)&&!i,visualStabilityBarrier:i});let a=await Ao(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await io(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}const us=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;function ds(t,n){let r=t.files[n];if(r===void 0)throw new e(`INVALID_ARGS`,`replay script source is missing ${n}; it was not part of the script sources sent with this request.`,{path:n,entry:t.entry});return r}function fs(e){let t=ps(e),n=xe(t);return Wn(`sha256`).update(n,`utf8`).digest(`hex`)}function ps(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)=>ms(e,n[t]??null,r?.[t]??null))}}function ms(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function hs(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=gs({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function gs(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>_s({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>vs({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>ys(n,r)];for(let e of s){let t=e();if(t)return t}}function _s(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 vs(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 ys(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 bs(t,n){let r=t.trimStart()[0];if(r===`{`||r===`[`)throw new e(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=Ie(t),a=Re(t),o=fs({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??Me(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>hs(e,s,o)}}function xs(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function Ss(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&be(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Cs(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function ws(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Cs(i,a);return{matchCount:n,observed:r,mismatches:[...r?ye(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function Ts(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...ye(e,r),...fe(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function Es(e,t,n,r,i,a){if(n.targetEvidences)return Ds(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return q(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return q(e,n,r,i,a);if(s.kind===`post-resolution`){let c=xs({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return q(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return ks(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=Ss({recorded:o,token:s.token});if(c.kind===`skip`)return q(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,Os(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?ks(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function Ds(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return q(e,n,r,i,a);let d=Ss({recorded:o[c],token:u.token});if(d.kind===`skip`)return q(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,Os(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return ks(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function Os(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function q(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function ks(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=As(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=js(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function As(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function js(e,t,n){return n.status===`guard-mismatch`?ws(e,n.evidence,t):Ts(e,n.evidence)}async function Ms(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Xe(e.varSources),o=[],s=[],c=Is(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Fs(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Ls(u,n.length,r,e))}let d=rt(r,a,Ps(e,u)),f=Je(a),p=t.diagnosticsMarker(),m=await Es(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:Ns(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function Ns(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Ps(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Fs(e){return!!(e&&e.command!==`replay`)}function Is(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Fs(n))return n.command===`close`?t:void 0}}function Ls(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function Rs(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=be(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function zs(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),Fe(e.command)){let n=Bs(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=be(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Rs([...e.positionals]);n&&t.push(n)}return Oe(t).filter(e=>e.trim().length>0)}function Bs(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Vs(n)?t.slice(0,-1):t}function Vs(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Hs(e){let t=F.dirname(e),n=F.basename(e,F.extname(e));return F.join(t,`${n}.healed.ad`)}function Us(e){let t=Ws({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Ws(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Gs({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Gs(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 Ks(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!qs(n))return`manual`;let i=Js(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function qs(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Ys(e.scrollRegion)}function Js(e,t){let n=ct(t),r=Zs(e.ancestry,n,t),i=e.scrollRegion;return i&&Ys(i)?r&&Xs(i,n,t):r}function Ys(e){return e.id!==void 0||e.label!==void 0}function Xs(e,t,n){return n.some(n=>Ue(qe(n,t),e))}function Zs(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=st(n,t,e.length);return!r.broken&&de(r.chain,e)})}function Qs(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:a}=e,o,s,c=Et({divergence:r,level:a,writeOverflowArtifact:e=>{let n=i(e),r=tc(t,n);return`artifactPath`in r&&(o=n,s=r.artifactPath),r}}),l=(o??c).screen;if(l.state!==`available`||l.refs.length===0)return e.evidence&&n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:l.state===`available`?l.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return ec(s),$s(c,`missing-evidence`);let u=n.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:l.refsGeneration,refs:l.refs.map(e=>e.ref)});return u.published===!0?c:(ec(s),$s(c,u.reason))}function $s(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function ec(e){if(e)try{I.unlinkSync(e)}catch{}}function tc(e,t){try{let n=F.join(e.ensureSessionDir(),`replay-divergence`);I.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=F.join(n,r);return I.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const nc={id:0,"role-label":1,label:2,other:3};function rc(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||ic(n.basis)<ic(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>ic(e.basis)-ic(t.basis)||e.nodeIndex-t.nodeIndex)}function ic(e){return nc[e]}async function ac(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionStore:s,observationStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=Tt(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await cc({session:o,observationStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=fc(v,g),b=v.state===`available`&&o?_c({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=Ks({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:oc(v)}),S=Us({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Qs({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Pe(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function oc(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const sc=[300,500,800,1200,2e3,3e3,4e3];async function cc(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=uc(i),s=Date.now()+12e3,c=await lc({session:t,observationStore:n,logPath:r,flags:o});if(!a)return c.observation;for(let e of sc){if(c.observation.state===`available`||!c.retryable)break;let i=s-Date.now();if(i<=0)break;await xt(Math.min(e,i)),c=await lc({session:t,observationStore:n,logPath:r,flags:o})}return c.observation}async function lc(e){let{session:t,observationStore:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).snapshot;if(Rn(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let a=n.bindAuthority().store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:a.refsGeneration,evidence:a.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:At(e)}}}function uc(e){return{snapshotInteractiveOnly:dc(e)}}function dc(e){return!vc(e.command)||yc(e).requiresRect}function fc(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=gc(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function pc(e){return!!ht(e,gt(e.type??`Element`))||e.hittable===!0}function mc(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function hc(e,t){let n=dt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&pc(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=>mc(e,t)),...o.filter(e=>!mc(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function gc(e,t,n){let{nodes:r,truncated:i}=hc(e,n);return{refs:r.map(e=>{let n=gt(e.type??`Element`),r=ht(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function _c(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!vc(t.command))return[];let a=zs(t);return a.length===0?[]:bc({candidates:a,nodes:r,session:n,action:t,matching:yc(t),sanitize:i})}function vc(e){return Fe(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function yc(e){let t=Fe(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function bc(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=xc({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return rc(s).map(e=>e.suggestion)}function xc(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Ae(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:Sc({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function Sc(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=we(t,r.device.platform,{action:i.command===`fill`?`fill`:Fe(i.command)?`click`:`get`,nodes:n}),c=gt(t.type??`Element`),l=ht(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function Cc(e){return{...e,hint:e.hint??Ec(e.details,`hint`),diagnosticId:e.diagnosticId??Ec(e.details,`diagnosticId`),logPath:e.logPath??Ec(e.details,`logPath`)}}function wc(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return Tc({error:t,actionLabel:Pe(n),action:n.command,positionals:Ve(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function Tc(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:wt(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:wt(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Oc(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>wt(e,u))}:{},divergence:l}}}}function Ec(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const Dc=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function Oc(e){if(!e)return{};let t={};for(let n of Dc)e[n]!==void 0&&(t[n]=e[n]);return t}async function kc(e){return await Ac({...e,snapshotDiagnostics:g(e.snapshotDiagnosticSamples)})}async function Ac(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=jc(t.error.details?.replaySource),v=Cc(t.error),y=await ac({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:j(u.meta?.requestId)});return wc({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function jc(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 Mc(e,t){if(e)try{I.appendFileSync(e,`${JSON.stringify(i(t))}\n`)}catch(t){D({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Nc(t){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=t,h=Date.now();Mc(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:Ve(o)??[]});let g;try{g=await Fc({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f,resolvedSessionScope:p,dependencies:m})}catch(t){if(!(t instanceof e))throw t;g={ok:!1,error:n(t)}}let _=Date.now();return Mc(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?Lc(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Pc(g,u??s,c)}function Pc(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 Fc(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Rc(t.flags,r.flags),l=i.command===`fill`?at(it(i)):void 0;return l&&(c.recordAs=l),await a(Ic({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Ic(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:Ne(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ze(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Lc(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 Rc(e,t){return h(e,{...t??{}})}function zc(e){return Kc(e.ok?Vc(e.data):Bc(e.error.details?.artifactPaths))}function Bc(e){return Array.isArray(e)?e.filter(Gc):[]}function Vc(e){return e?[Wc(e.path),Wc(e.outPath),...Hc(e.artifacts)].filter(Gc):[]}function Hc(e){return Array.isArray(e)?e.map(Uc).filter(Gc):[]}function Uc(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Wc(t.localPath)??Wc(t.path)}function Wc(e){return typeof e==`string`?e:void 0}function Gc(e){return typeof e==`string`}function Kc(e){return[...new Set(e.filter(qc))]}function qc(e){try{return I.statSync(e).isFile()}catch{return!1}}function Jc(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Yc({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=ct(r),u=se(t),d=ut(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>He(r,e)===t.sibling),p=d.filter(e=>Ue(qe(e,l),t.scrollRegion)),m=Ke(p)[t.viewportOrder]?.ref,h=Ge({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,...Qc({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Yc(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Xc(n,t,i,a):Zc(n,t,r,a,o)}function Xc(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),s=o(t),c=s?a(e,s):null;if(i(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?ot(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Zc(e,t,n,r,i){let a=ke(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=ft(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Qc(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?$c(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?$c(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?$c(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 $c(e,t,n){let r=We(t),i=st(t,n,Math.max(e.ancestry.length,1)).chain;return[...ye(e,r),...fe(e.ancestry,i)].slice(0,5)}function el(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=Be(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=be(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!Fe(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(nl(r)&&nl(n[1])))return r}function tl(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function nl(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function rl(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=Tt(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:pl(se(n),h),...t.observed?{observed:pl(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>ml(e,h))},_=Ks({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Us({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(Pe(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=Qs({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return wc({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function il(e,t,n){let r=Tt(e.scrubVars);return rl(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:fc(n,r),publicationEvidence:cl(n),repairCapture:oc(n)})}async function al(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await cc({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function ol(e,t){return il(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await al({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function sl(e,t,n){return il(e,t,await al({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function cl(e){return e.state===`available`?e.evidence:void 0}function ll(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?ve(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Ee(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:el(n,i),platform:a.device.platform}:{kind:`inactive`}}function ul(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=yc(r),s=Jc({recorded:t,token:n,nodes:i,platform:a,refLabel:tl(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:We(s.winnerNode),structural:me(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?We(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function dl(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function fl(e){return!e.ok&&e.error.details?.reason===lt}function pl(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function ml(e,t){let n=gt(e.type??`Element`),r=ht(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function hl(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function gl(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 _l(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function vl(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 yl(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:gl(e?.observed),expectedStructural:vl(e?.expectedStructural),observedStructural:vl(e?.observedStructural)}}function bl(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:gl(e?.observed),observedAncestry:_l(e?.observedAncestry)}}function xl(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function Sl(e,t,n){let r=xl(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&dl(e)?{status:`guard-mismatch`,evidence:yl(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&fl(e)?{status:`landmark-mismatch`,evidence:bl(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function Cl(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,xl(wl(e),zc(e)));return{runtime:{beginTargetVerification(e,n,r,i){return ll({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await cc({session:i,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return ul({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Nc({req:hl(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=l,zc(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:Sl(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await ol(c(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=il(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await sl(c(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=wl(o),u=await Tl(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>El(e),onStep:i,diagnosticsMarker:()=>Ol(t.sessionStore),diagnosticsSince:e=>kl(t.sessionStore,e)},readLastResponse:()=>o}}function wl(e){return e&&!e.ok?e:u(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Tl(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Dl(i)?c(i):c(await kc({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function El(e){let t=e.positionals??[],n=Ce(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Dl(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 Ol(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function kl(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Al(e){let t=Me(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return Nl(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function jl(e,t){return t===`ios`?Pl(e)??{}:{}}function Ml(e,t){let n=Al(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function Nl(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!f(e))}function Pl(e){let t=xr(e);return t?{appleSimulatorAppTarget:t}:void 0}function Fl(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Il(t,i)};return Rl(o,`AD_PLATFORM`,a.platform??r.platform),Rl(o,`AD_TARGET`,a.target??r.target),Rl(o,`AD_DEVICE`,a.device),Rl(o,`AD_DEVICE_ID`,Ll(a)),zl(o,`AD_SHARD_INDEX`,a.shardIndex),zl(o,`AD_SHARD_COUNT`,a.shardCount),Rl(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Il(e,t){let n=e.meta?.cwd??process.cwd();return F.relative(n,t)||t}function Ll(e){return typeof e.serial==`string`?e.serial:e.udid}function Rl(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function zl(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Bl=3e4,Vl=1e3;function Hl(t){let{scriptPath:r,env:i,publicNetworkOnly:a}=t,o=I.readFileSync(r,`utf8`),s=Object.create(null);try{Jn.runInNewContext(o,Ul(i,s,a),{filename:r,timeout:Bl})}catch(t){let i=n(t);throw new e(i.code,`Maestro runScript failed: ${i.message}`,p({...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 Xl(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Zl(t)]))}function Ul(e,t,n){return{...e,output:t,json:Wl,http:{post:(e,t)=>Kl(`POST`,e,n,t)}}}function Wl(t){if(typeof t!=`string`)throw new e(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof t}.`);if(t.trim().length===0)throw new e(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(t,Gl)}catch(n){throw new e(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:t.slice(0,Vl)},n instanceof Error?n:void 0)}}function Gl(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Kl(t,n,r,i){let a=bt(process.execPath,ql(),{stdin:JSON.stringify(Yl(t,n,i,r)),timeoutMs:Bl,allowFailure:!0});if(a.exitCode!==0)throw new e(`COMMAND_FAILED`,`Maestro runScript http.${t.toLowerCase()} failed for ${n}: ${Ql(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new e(`COMMAND_FAILED`,`Maestro runScript http.${t.toLowerCase()} returned invalid JSON for ${n}`,{stdout:a.stdout.slice(0,Vl),stderr:a.stderr.slice(0,Vl)},r instanceof Error?r:void 0)}}function ql(){let t=Jl(import.meta.url);if(!t)throw new e(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return t.endsWith(`.ts`)?[`--experimental-strip-types`,t]:[t]}function Jl(e){try{let t=Kn(e),n=F.extname(t)||`.js`;return[F.join(F.dirname(t),`run-script-http-child`+n),F.join(F.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>I.existsSync(e))??null}catch{return null}}function Yl(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Xl(t,n){for(let r of Object.keys(t))if(r.includes(`.`))throw new e(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function Zl(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Ql(e){let t=e.trim();return t.length>0?t.slice(0,Vl):`request process exited without stderr`}async function $l(e){return await eu(`tap`,async t=>{let n=F.join(t,`before.png`),r=F.join(t,`after.png`),i=await nu(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await nu(e,r)))return await tu(n,r,e.signal,`tap`)}})})}async function eu(e,t){let n=await Hn.mkdtemp(F.join(Gn.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await Hn.rm(n,{recursive:!0,force:!0})}catch{}}}async function tu(e,t,n,r){try{let[i,a]=await Promise.all([Hn.readFile(e),Hn.readFile(t)]);J(n);let o=await zn(i,a,`Maestro screenshot`);return J(n),ru(o,r)}catch(e){au(e,n),D({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function nu(e,t){try{return await Hn.rm(t,{force:!0}),J(e.signal),await e.capture(t),J(e.signal),!0}catch(t){return au(t,e.signal),!1}}function ru(e,t){if(e.status!==`compared`)return iu(t,e.status,e),!1;let n=e.differencePercent<=K.animationDifferencePercent;return iu(t,n?`stable`:`changed`,e),n}function iu(e,t,n){D({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function au(e,n){if(n?.aborted||t(e))throw c()}function J(e){if(e?.aborted)throw c()}async function ou(e){cu(e.timeoutMs),J(e.signal);let t=e.now()+e.timeoutMs;return await eu(`animation`,async n=>{let r=F.join(n,`first.png`),i=F.join(n,`second.png`);for(;;){if(J(e.signal),await su(e,r,i))return!0;if(e.now()>=t)return!1}})}async function su(e,t,n){let r=[await nu(e,t),await nu(e,n)];return!r[0]||!r[1]?!1:await tu(t,n,e.signal,`animation`)===!0}function cu(t){if(!Number.isFinite(t)||t<0)throw new e(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const lu=K.observationPollMs;async function uu(e,t){for(;;){Y(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!Eu(n)||(Y(e.context.signal),!await wu(e.dependencies,t,lu,e.context.signal)))throw n}}}function du(e){return fu({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function fu(e){let t=En(e.snapshot),n=e.platform===`ios`?Bn(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:l(n.nodes)}:e.snapshot;return _u(ts(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function pu(e){Tu(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Y(e.context.signal);let r=await uu(e,n),i=fu({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ao(e.condition,i))return i;if(e.dependencies.now()>=n)break;await wu(e.dependencies,n,lu,e.context.signal)}return Y(e.context.signal),ku(t)}async function mu(e){Tu(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Y(e.context.signal);let i=r??await uu(e,t);if(r=void 0,n=fu({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===K.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Y(e.context.signal),ku(n)}async function hu(e){Tu(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await uu(e,t),r=Du(n);for(;;){Y(e.context.signal),await wu(e.dependencies,t,lu,e.context.signal);let i=await uu(e,t),a=Du(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function gu(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function _u(e,t,n,r,i,a,o){if(!e.ok){let t=gu(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=yu({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=gu(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:vu(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:Du(t)}:{}}}function vu(e,t){return!E(e)||!E(t)?0:he(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 yu(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!bu(t,n,r)||i!==1))return xu(t.selector)}function bu(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!ns(e.selector)}function xu(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!Su(n)||typeof r!=`string`)return;let i=ia(r)?.trim();return i?{key:n,value:i}:void 0}function Su(e){return e===`id`||e===`label`||e===`text`}async function Cu(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?c():e}Y(n)}async function wu(e,t,n,r){let i=t-e.now();return i<=0?!1:(await Cu(e,Math.min(n,i),r),!0)}function Y(e){if(e?.aborted)throw c()}function Tu(t,n){if(!Number.isFinite(t)||t<0)throw new e(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function Eu(t){return t instanceof e&&t.details?.retriable===!0}function Du(e){return Wn(`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:Ou(e.rect)})))).digest(`hex`)}function Ou(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 ku(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function Au(e){return e.kind===`clearState`?Fu(e):ju(e)?Mu(e):Xu(e)?Zu(e):e.kind===`settingsPermission`?Uu(e):Wu(e)}function ju(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Mu(e){switch(e.kind){case`launchApp`:return Nu(e);case`stopApp`:return Pu(e);case`openLink`:return Iu(e)}}function Nu(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 Pu(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function Fu(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Iu(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const Lu={camera:`camera`,microphone:`microphone`,photos:`photos`,contacts:`contacts`,notifications:`notifications`,calendar:`calendar`,location:`location`,medialibrary:`media-library`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`},Ru={allow:`grant`,deny:`deny`,unset:`reset`},zu={location:{always:{state:`grant`,permission:`location-always`},inuse:{state:`grant`,permission:`location`},never:{state:`deny`,permission:`location`}},photos:{limited:{state:`grant`,permission:`photos`,mode:`limited`}}};function Bu(t){let n=Object.entries(t).map(([e,t])=>[e.toLowerCase(),t]);if(n.length===0)throw new e(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...n.filter(([e])=>e===`all`),...n.filter(([e])=>e!==`all`)].map(([e,t])=>Vu(e,t))}function Vu(t,n){let r=t===`all`?`all`:Hu(Lu,t);if(r===void 0)throw new e(`UNSUPPORTED_OPERATION`,`Maestro permission "${t}" is not supported.`,{hint:`Supported: all, ${Object.keys(Lu).join(`, `)}.`});let i=zu[t],a=i?Hu(i,n):void 0;if(a)return a;let o=Hu(Ru,n);if(o)return{state:o,permission:r};throw new e(`INVALID_ARGS`,`Maestro permission "${t}" does not accept "${n}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(i??{})].join(`|`)}.`})}function Hu(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function Uu(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Wu(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Gu(e);case`clickPoint`:return Ku(e);case`swipe`:return qu(e);case`scroll`:return Ju(e);case`pressKey`:return Yu(e)}}function Gu(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Ku(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function qu(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function Ju(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Yu(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Xu(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Zu(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Qu(t,n){let r=Au(n),i=await t.invoke(p({...r,flags:$u(t.flags,r.flags??{})}));if(!i.ok)throw ad(i);if(n.kind===`gestureViewport`){let t=i.data?.viewport;if(typeof t!=`object`||!t||![`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`))throw new e(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return t}return i.data}function $u(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=p({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function ed(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 td(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 nd(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 rd(t,n,r){if(F.isAbsolute(t))return t;let i=n.source?.path??r;if(!i)throw new e(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return F.resolve(F.dirname(i),t)}function id(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function ad(t){let n=t.error,r=p({...n.details??{},hint:n.hint??od(n.details,`hint`),diagnosticId:n.diagnosticId??od(n.details,`diagnosticId`),logPath:n.logPath??od(n.details,`logPath`),retriable:n.retriable??sd(n.details,`retriable`),supportedOn:n.supportedOn??od(n.details,`supportedOn`)});return new e(n.code,n.message,Object.keys(r).length?r:void 0)}function od(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function sd(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function cd(t){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Qu(t,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new e(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=y(i,i);return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:t=>{if(o!==void 0){if(o!==t.generation)throw new e(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${t.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 e(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await hu({timeoutMs:K.settleTimeoutMs,context:i,snapshot:l,dependencies:t.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function ld(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 uu({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=du({query:t,context:n,snapshot:o,platform:i.platform});if(hd(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await wu(i.dependencies,a,lu,n.signal)}}}async function ud(e,t,n,r,i,a){let o=async()=>await pd(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await $l({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Qu(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await dd(e,t,n,r,i,a.click,o)});return}await dd(e,t,n,r,i,a.click)}async function dd(e,t,n,r,i,a,o){let s=async()=>await pd(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:Du(await t.capture(i))),l=async()=>{let r=await hu({timeoutMs:K.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await fd({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 fd(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<K.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function pd(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await gd(e,o,n.point,i);return}catch(n){if(!_d(n))throw n;let o=await ld({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!md(o))throw n;t.invalidate(r.generation),await vd(e,k(o.rect),i);return}}t.invalidate(r.generation),await vd(e,n.point,i)}function md(e){return e.matched&&e.visible&&e.rect!==void 0}function hd(e,t){return md(e)?!t||e.dispatchSelector!==void 0:!1}async function gd(e,t,n,r){D({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Qu(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function _d(e){let t=r(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===_t.selectorNotFound}async function vd(t,n,r){if(!n)throw new e(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);D({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await Qu(t,{kind:`clickPoint`,point:n,options:r})}function yd(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function bd(t){let n=cd(t),r={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},i=e=>{e.settled?r.settleLatches+=1:r.settleTimeouts+=1},a=t.platform,o=e=>(e.kind===`screenshot`&&(r.screenshotCaptures+=1),Qu(t,e)),s=async(e,t,r=`none`)=>{n.invalidate(t.generation);try{return await e()}finally{r===`deferred`&&n.requireStability(t.generation)}},c=async(e,t,n=`none`)=>await s(()=>o(e),t,n),l=async(t,n,r)=>{let i=[];for(let a of n){try{await c({kind:`settingsPermission`,...t?{appId:t}:{},state:a.state,permission:a.permission,...a.mode?{mode:a.mode}:{}},r)}catch(t){throw t instanceof e?new e(t.code,t.message,{...t.details,appliedPermissionMutations:i,failedPermissionMutation:yd(a)}):t}i.push(yd(a))}},u=async(e,r)=>{yt(e),await c({kind:`typeText`,text:e},r);let a=await hu({timeoutMs:K.settleTimeoutMs,context:r,snapshot:n.capture,dependencies:t.dependencies});i(a),n.prime(r.generation,a.snapshot)};return{operations:{platform:a,resolveTarget:async(e,r)=>await ld({input:e,context:r,snapshots:n,options:t}),observe:async(e,r)=>await pu({condition:e.condition,timeoutMs:e.timeoutMs,context:r,snapshot:n.capture,dependencies:t.dependencies,platform:a}),resolveGestureViewport:async()=>await o({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...ed(e.arguments),...ed(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Bu(e.permissions);i&&await c({kind:`clearState`,...n?{appId:n}:{}},t),await l(n,r,t)}await c({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i&&!e.permissions,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`stopApp`,...n?{appId:n}:{}},t)},setPermissions:async(e,t)=>{await l(e.appId??t.appId,Bu(e.permissions),t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await c({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:a===`ios`},t,`deferred`)},tapOn:async(e,i)=>await ud(t,n,r,e.target,i,{click:{count:e.repeat,intervalMs:e.delay},retryIfNoChange:e.retryTapIfNoChange===!0}),doubleTapOn:async(e,n)=>{await s(()=>vd(t,e.target.point,p({doubleTap:!0,intervalMs:e.delay})),n,`deferred`)},longPressOn:async(e,n)=>{await s(()=>vd(t,e.target.point,{holdMs:K.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await c({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await u(e.text,t),eraseText:async(e,t)=>await u(`\b`.repeat(e.charactersToErase??K.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await c({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(e,r)=>{let i=await mu({selector:e.selector,direction:e.direction,timeoutMs:e.timeoutMs,context:r,snapshot:n.capture,dependencies:t.dependencies,platform:a,scroll:async(i,o)=>{let s=ho(o,e.selector,e.direction,e.durationMs,a);return await c(s?{kind:`swipe`,...s}:{kind:`scroll`,direction:e.direction,durationMs:e.durationMs},r),(await hu({timeoutMs:Math.min(K.settleTimeoutMs,i),context:r,snapshot:n.capture,dependencies:t.dependencies})).snapshot}});if(i.visiblePercentage!==K.scrollUntilVisiblePercentage)throw pi(`Maestro scrollUntilVisible target did not become visible.`,{selector:e.selector,timeoutMs:e.timeoutMs});return{observation:n.bindObservation(td(e.selector,i))}},pressKey:async(e,t)=>{await c({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await c({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await c({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(e,n)=>({visualStabilityReached:await ou({timeoutMs:e.timeoutMs??K.animationWaitTimeoutMs,now:t.dependencies.now,signal:n.signal,capture:async e=>{await o({kind:`screenshot`,path:e,stabilize:!1,...t.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:nd(await o({kind:`screenshot`,path:e.path}))}),runScript:async(e,n)=>({outputEnv:Hl({scriptPath:rd(e.file,n,t.sourcePath),publicNetworkOnly:t.publicNetworkOnly,env:{...n.env,...e.env?id(e.env):{}}})})},snapshots:n,readMetrics:()=>({...n.readMetrics(),...r}),recordSettle:i}}function xd(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=bd(e);return ls(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function Sd(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),Cd(()=>Ed(r,e)),Cd(()=>Dd(n,t,e))},actionCompleted:e=>{let r=wd(i,e.stepIndex);Cd(()=>Od(n,t,Td(r,e),!0))},actionFailed:e=>{let r=wd(i,e.stepIndex);Cd(()=>Od(n,t,Td(r,e),!1))}}}function Cd(e){try{e()}catch{}}function wd(e,t){let n=e.get(t);return e.delete(t),n}function Td(e,t){return p({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function Ed(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function Dd(e,t,n){Mc(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function Od(t,n,r,i){let a=kd(r);Mc(t,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof e?{errorCode:r.error.code}:{}})}function kd(e){let t=`data`in e?e.data:void 0,n=Ad(t?.timing)?t.timing:void 0;return p({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function Ad(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function jd(e,t){let n=p({...e.dispatch,...Md(t.dispatch)});return p({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,dispatch:Object.keys(n).length>0?n:void 0})}function Md(e){return p({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function Nd(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:Ld(e.action),positionals:Rd(e.action,e.value),flags:t.flags??{}}}}async function Pd(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=j(r.meta?.requestId),c=Nd(t,r),l=Cc(e.error),u=[...t.redactions],d=Tt(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await cc({session:p,observationStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?Fd({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Id(t.value)].filter(Boolean).join(` `),_=Qs({sessionStore:i,observationStore:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:fc(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Ks({kind:`action-failure`,targetEvidence:void 0,capture:oc(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return Tc({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u,warnings:t.warnings})}function Fd(e){let t={createdAt:Date.now(),nodes:e.nodes};return rc(Xa(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>Sc({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Id(e){return!e||e===`<text>`?e??``:Le(e)}function Ld(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Rd(e,t){return!t||e===`inputText`?[]:[t]}function zd(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=Vd(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:Hd(c,Date.now()-r)}}}async function Bd(e){let{command:t,replayPath:r,state:i,outcome:a}=e,{request:o,session:{store:s,observationStore:c,logPath:l}}=t,{failure:u}=a,d=n(a.error);return u?await Pd({error:d,failure:u,replayPath:r,req:o,sessionStore:s,observationStore:c,logPath:l,snapshotDiagnostics:Vd(s,i.snapshotStart)}):{ok:!1,error:d}}function Vd(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return g(n)}function Hd(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Ud(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return u(`INVALID_ARGS`,us);if(t.flags?.saveScript!==void 0)return u(`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 Wd({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Bd({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Wd(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await Gd({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Qd({command:t,device:l.device,platform:l.platform,runtimeHints:l.runtimeHints,sourcePath:l.filePath,publicNetworkOnly:u});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await Ya(l.flow,d,{defaults:l.defaults,env:l.env,platform:l.platform,target:l.target,runtimeHints:l.runtimeHints,signal:l.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:!u,readSource:e=>ds(n,e),observer:Sd({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?zd({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Bd({command:t,replayPath:n.entry,state:i,outcome:f})}async function Gd(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=Ja(ds(n,o),o),c=a.lookup(),l=c?.session;c&&a.assertSelectorMatches(r.flags);let u=await Kd({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Xd({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Zd(r),signal:j(r.meta?.requestId)}}async function Kd(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await Tn(t.flags??{},jl(a.appTarget,o))),c=rf(t,s),l=Jd({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await qd({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:af(t,s),runtimeHints:l,flow:a})}async function qd(e){if(e.device||!Yd(e.runtimeHints))return e;let t=await Tn(e.req.flags??{},jl(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:af(e.req,t),runtimeHints:Jd({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Jd(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function Yd(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Xd(e){return{...Fl({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Zd(e){return{...$e(Ze(e.flags?.replayShellEnv)),...tt(Ye(e.flags?.replayEnv))}}function Qd(e){let{command:t,device:n,platform:r,runtimeHints:i,sourcePath:a,publicNetworkOnly:o}=e,{request:s,invoke:c}=t,l={...s,runtime:i,...t.dispatch?{dispatch:t.dispatch}:{}};return xd({invoke:e=>c(jd(l,e)),flags:$d(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await qn(e,void 0,{signal:t})}}})}function $d(e,t,n){if(!e)return ef(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 ef(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?tf(n,t):nf(n,t)}function tf(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function nf(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function rf(t,n){let r=t.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new e(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function af(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function of(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(et(t,a.flags?.replayBackend)===`maestro`)return n?u(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Ud(i):u(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function sf(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=cf(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=lf(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=uf({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:ff({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function cf(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return u(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function lf(e,t,n){let r=bs(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:df({...e,flags:Ml(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function uf(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:u(`INVALID_ARGS`,a.message)}}function df(e,t){return!t.platform&&!t.target?e:{...e,flags:pf(e.flags,t)}}function ff(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Fl({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:$e(Ze(t.flags?.replayShellEnv)),cliEnv:tt(Ye(t.flags?.replayEnv))}}function pf(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const mf={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function hf(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=gf({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(yf({req:t,coordinator:a}),vf({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function gf(e){let t=bf(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return d()}function _f(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?u(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):xf({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function vf(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=_f({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??mf,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:Sf({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function yf(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function bf(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return u(`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 xf(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?kt(t):a??Hs(i);if(!(n||r&&o===a)&&I.existsSync(o))return u(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function Sf(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function Cf(e){let{request:t,session:{name:n,logPath:i,store:a,observationStore:o,coordinator:s},tracePath:c,onStep:l,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return u(`INVALID_ARGS`,us);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,nt(h)&&t.flags?.replayBackend!==`maestro`)return u(`INVALID_ARGS`,Qe(`replay`,h));let r=await of({resolved:h,keepSession:m,coordinator:s,command:e});if(r)return r;let _=sf({req:t,sessionName:n,sessionStore:a,tracePath:c,resolved:h,script:ds(f,h),coordinator:s,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:ee}=_.value,te=hf({req:t,entryIndex:C,sessionStore:a,sourcePath:h,coordinator:s});if(!te.ok)return te.response;let{runtime:ne,readLastResponse:re}=Cl({ctx:{replayReq:v,sessionName:n,sessionStore:a,observationStore:o,logPath:i,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:ee,responseLevel:t.meta?.responseLevel,invoke:d,signal:j(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:l,armSaveScript:te.armSaveScript}),T=await Ms({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},ne);return T.status===`failed`?re()??u(`COMMAND_FAILED`,`replay step failed with no recorded response`):wf({startedAt:p,sessionName:n,sessionStore:a,replayed:T.replayed,artifactPaths:T.artifactPaths,snapshotDiagnosticSamples:T.snapshotDiagnosticSamples,armSaveScript:te.armSaveScript,coordinator:s,keepSession:m})}catch(e){let t=r(e);return u(t.code,t.message,g.size>0?{artifactPaths:[...g]}:void 0)}}function wf(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=Ef({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=g([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:Tf(i,Date.now()-t)}}}function Tf(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function Ef(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return u(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function Df(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=F.resolve(n??`.`,t??`.agent-device/test-artifacts`);return F.join(i,r)}function Of(e,t){let n=t?F.relative(t,e):F.basename(e),r=n.length===0||n.startsWith(`..`)?F.basename(e):n;return De(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function kf(e,t){I.mkdirSync(t,{recursive:!0}),Mf(e,t)}function Af(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=F.join(o,`result.txt`),u=F.join(o,`failure.txt`),d=jf([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>F.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
-
`)}\n`;I.writeFileSync(l,p),s||I.writeFileSync(u,p)}function jf(e,t,n){let r=[],i=new Set(n.map(e=>F.basename(e).toLowerCase()));for(let n of e){if(!Pf(n))continue;let e=F.basename(n);if(F.resolve(n)===F.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=Nf(e,t,i),o=F.join(t,a);I.copyFileSync(n,o),r.push(o)}return r}function Mf(e,t){let n=F.join(t,`replay.ad`);if(I.copyFileSync(e,n),F.extname(e).toLowerCase()===`.ad`)return;let r=F.join(t,F.basename(e));F.resolve(r)!==F.resolve(n)&&I.copyFileSync(e,r)}function Nf(e,t,n){let r=F.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||I.existsSync(F.join(t,a));)a=`${i}-${o++}${r}`;return a}function Pf(e){try{return I.statSync(e).isFile()}catch{return!1}}function Ff(t){let{platformFilter:n,discoverSources:r}=t,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}Vf(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let t=n?` for --platform ${n}`:``;throw new e(`INVALID_ARGS`,`No replay tests matched${t}.`)}return a}function If(e,t,n,r,i=0){let a=F.basename(n,F.extname(n)),o=De(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Lf(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return De(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function Rf(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,F.basename(r),`attempt`,a+1].join(`:`)}function zf(e,t){return typeof e==`number`?e:t}function Bf(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Vf(e,t){return e===`apple`?w(t):t===e}function X(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Hf=2e3;async function Uf(e){let{filePath:t,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=Xf({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Z(C,e),shard:u,onStep:d}).catch(e=>X({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Zf(o,[...v]))},o)})]):await w,Z(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Gf(w)||(x=Jf(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:Hf}}),Kf({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await qf({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Yf(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Z(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=Wf(x,i,v)}}return x??X({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Wf(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:X({error:t,artifactPaths:[...n],infrastructure:!0})}async function Gf(e){return await Promise.race([e.then(()=>!0),qn(Hf).then(()=>!1)])}async function Kf(e){let{replayPromise:t,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:n(e).message}})}}}async function qf(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Z(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Z(o,e)});return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=n(e);return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:t.message}}),X({error:t})}}function Jf(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Yf(e,t){return{...e,warnings:[...e.warnings,t]}}function Xf(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=F.join(t,`replay-timing.ndjson`);return I.mkdirSync(F.dirname(l),{recursive:!0}),I.writeFileSync(l,``),n.add(l),Z(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Z(e,t){e&&I.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Zf(e,t=[]){return X({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function Qf(e){let t=$f(e),n=await ep(e,t);return{result:op(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function $f(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:F.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Of(t.path,n)),maxAttempts:r+1}}async function ep(e,t){np(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await tp(e,t,r);if(rp(n,i),ip(e,i.outcome,r))break;ap(e,t,i)}return n}async function tp(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=If(i,a,r.path,o,n),h=F.join(t.testArtifactsDir,`attempt-${f}`);kf(r.path,h);let g=Rf({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Q(d)},v=await Uf({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return Af({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function np(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:If(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Q(c)})}function rp(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function ip(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function ap(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Q(e.shard)})}function op(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?sp(e,t,n,r):cp(e,t,n,r)}function sp(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Q(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,replayed:c.replayed,healed:c.healed,...c.warnings.length>0?{warnings:[...c.warnings]}:{},...c.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...up(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function cp(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...Q(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...lp(c),...up(s)}}function lp(e){let t=e?.status===`failed`?e:void 0;return{...t&&t.warnings.length>0?{warnings:[...t.warnings]}:{},...t?.infrastructure?{infrastructure:!0}:{},...e?.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function up(e){return Q(e)}function Q(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function dp(e,t,n,r){if(!e||t.length===0)return;let i=await r(e.count);return{mode:e.kind,shardCount:e.count,total:n+(e.kind===`all`?t.length*e.count:t.length),shards:i.map((n,r)=>({shardIndex:r,shardCount:e.count,device:n,entries:e.kind===`all`?t:t.filter((t,n)=>n%e.count===r)}))}}async function fp(e){let{request:t,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),r=await pp(t,u,d);_p(r,o);let p=r.shardPlan?vp({entries:r.entries,total:r.total,emitProgress:o}):[];return r.shardPlan?p.push(...await yp({shards:r.shardPlan.shards,sessionName:f,suiteInvocationId:r.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:r.suiteArtifactsDir,suiteTotal:r.total,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await Cp({discoveryEntries:r.entries,sessionName:f,suiteInvocationId:r.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:r.suiteArtifactsDir,suiteTotal:r.total,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:Ep(r.total,p,Date.now()-e,r.suiteArtifactsDir)}}catch(e){let t=r(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function pp(e,t,n){let r=mp(e,t),i=hp(r),a=r.length-i.length,o=Lf(e.requestId),s=await dp(e.shard?{kind:e.shard.mode,count:e.shard.count}:void 0,i,a,n);return{entries:r,runnable:i,shardPlan:s,suiteInvocationId:o,suiteArtifactsDir:gp(e,o),total:s?.total??r.length}}function mp(e,t){return Ff({platformFilter:e.platformFilter,discoverSources:t})}function hp(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function gp(e,t){return Df({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function _p(e,t){t({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function vp(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function yp(e){return(await Promise.allSettled(e.shards.map(async t=>await xp({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[bp(r,e.sessionName,t.reason)]:[]})}function bp(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:Sp(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function xp(e){let{shard:t,sessionName:n}=e;return await wp({...e,entries:t.entries,sessionName:Sp(n,t),shard:t})}function Sp(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Cp(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await Qf({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Bf(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:zf(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),Tp(t,o,p))break}return g}async function wp(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await Qf({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Bf(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:zf(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),Tp(b,o,m))break}return _}function Tp(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Ep(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=v(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function Dp(e,t){return()=>e.map(e=>Op(e,t))}function Op(e,t){let n=e.entry,r=ds(e,n),i=et(n,t)===`maestro`,a=Re(r);return{path:n,manifest:{...i?{title:Ja(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function kp(e){return async t=>(await Mp(e,t)).map(Ap)}function Ap(t){if(t.platform===`web`||!ee(t))throw new e(`INVALID_ARGS`,`test sharding requires a mobile device; ${t.id} is ${t.platform}`);return{id:t.id,name:t.name,platform:t.platform,...t.target===void 0?{}:{target:t.target}}}function jp(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}async function Mp(t,n){let r=Ip(t),i=Pp(await wn(Np(t)),r,t);if(i.length<n)throw new e(`DEVICE_NOT_FOUND`,`test sharding requires ${Fp(n)}, but only ${i.length} matched`);return i.slice(0,n)}function Np(e){let t=Sn(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:x({simulatorSetPath:Cn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Pp(e,t,n){return t.length>0?Lp(e,t,n):e.filter(e=>Rp(e,n)).sort(Vp)}function Fp(e){return`${e} device${e===1?``:`s`}`}function Ip(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Lp(t,n,r){return n.map(n=>{let i=Bp(n),a=t.find(e=>zp(e,r)&&(e.id===n||Bp(e.name)===i));if(!a)throw new e(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function Rp(e,t){return!zp(e,t)||!ee(e)?!1:e.booted!==!1}function zp(e,t){return!(!ne(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Bp(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function Vp(e,t){return e.id.localeCompare(t.id)}function Hp(t){let n=Up(t?.shardAll,`--shard-all`),r=Up(t?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new e(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function Up(t,n){if(t!==void 0){if(typeof t!=`number`||!Number.isInteger(t)||t<1)throw new e(`INVALID_ARGS`,`${n} requires a positive integer`);return t}}const Wp=new Set([`IOS_BOOT_TIMEOUT`,`IOS_RUNNER_CONNECT_TIMEOUT`,`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,`IOS_TOOL_MISSING`,`ANDROID_BOOT_TIMEOUT`,`ADB_TRANSPORT_UNAVAILABLE`,`CI_RESOURCE_STARVATION_SUSPECTED`]);function Gp(e){return Wp.has(e.toUpperCase())}const Kp=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function qp(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=Jp(e);return t?Yp(t.details)||Xp(t.code,t.message):!1}function Jp(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Yp(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||vt(t)?!0:t?Gp(t):!1}function Xp(e,t){let n=`${e}\n${t}`.toLowerCase();return Kp.some(e=>n.includes(e))}function Zp(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:em(e.error.details?.artifactPaths),warnings:mt(e.error.details),infrastructure:qp(e),...tm(e.error.details?.snapshotDiagnostics)};let t=e.data;return{status:`passed`,replayed:typeof t?.replayed==`number`?t.replayed:0,healed:typeof t?.healed==`number`?t.healed:0,warnings:mt(t),artifactPaths:em(t?.artifactPaths),...tm(t?.snapshotDiagnostics)}}function Qp(e){if(!e||e.ok)return;let t=Zp(e);return t.status===`failed`?t:void 0}function $p(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function em(e){return[...new Set($p(e))]}function tm(e){let t=_(e);return t?{snapshotDiagnostics:t}:{}}const nm=1e3,rm=3e3;function im(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await am(e)}}async function am(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=Ct(o.device.platform),c=i?F.join(i,`recording${s}`):St(o.device.platform);sm(a,{type:`video_recording_start`,session:n,videoPath:c}),D({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(cm({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return sm(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await xt(nm),sm(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:nm}),D({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:nm}}),l}async function om(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;sm(a,{type:`video_tail_start`,session:n,requestedDurationMs:rm});let o=Date.now();await xt(rm);let s=Date.now(),c=await e.video.record(cm({req:t,sessionName:n,phase:`stop`}));return zc(c).forEach(e=>i.add(e)),sm(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),D({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function sm(e,t){e({...t,ts:new Date().toISOString()})}function cm(e){let t={token:e.req.token,meta:e.req.meta};return e.phase===`start`?{request:t,sessionName:e.sessionName,phase:`start`,outputPath:e.outputPath}:{request:t,sessionName:e.sessionName,phase:`stop`}}const lm=[{keys:[`replayKeepSession`],requested:e=>e.replayKeepSession===!0,message:`test does not support --keep-session; suite attempts own their cleanup. Run one native .ad script directly with replay --keep-session.`},{keys:[`replayFrom`,`replayPlanDigest`],requested:e=>e.replayFrom!==void 0||e.replayPlanDigest!==void 0,message:`test does not support --from/--plan-digest; resume is replay-only. Run the failing script directly with replay --from.`},{keys:[`saveScript`,`force`],requested:e=>!!e.saveScript||e.force===!0,message:`test does not support --save-script/--force; the agent-supervised repair loop is replay-only. Repair the failing script directly with replay --save-script.`}],um=({attemptId:e,parentAttemptId:t})=>{Zt(e);let n=dm(e,t);return{cancel:()=>qt(e),release:()=>{n(),Xt(e)}}};function dm(e,t){if(!t||t===e)return()=>{};let n=j(t);if(!n)return()=>{};let r=()=>{qt(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function fm(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=pm(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:jp({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function pm(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function mm(e){let{request:t,session:{name:n,logPath:i},createSession:a,invoke:o,cleanupSession:s,video:c}=e;if(t.flags?.recordVideo===!0&&c===void 0)return u(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of lm)if(e.requested(l))return u(`INVALID_ARGS`,e.message);let d,f;try{d=_m(t,n),f=gm(t)}catch(e){let t=r(e);return u(t.code,t.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await fp({request:d,emitProgress:Qt,isCanceled:()=>Yt(t.meta?.requestId),emitDiagnostic:D,bindAttemptCancellation:um,runReplay:async({filePath:n,sessionName:r,platform:s,target:l,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&zc(e).forEach(e=>f.add(e)),e),y=fm({parentFlags:t.flags,platform:s,target:l,artifactsDir:d,shard:g,sourceBundle:p.get(n)}),b=a(r,i),x=c?{req:t,sessionName:r,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:c}:void 0,S=x?im(x):void 0;return Zp(await Cf({...vm(e,{request:{...t,command:`replay`,session:r,positionals:[n],flags:y,meta:{...t.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await am(x):void 0;return t&&!t.ok?t:v(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:r,appendTimingEvent:o})=>{if(c)return Qp(await om({req:t,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:n,video:c}))},discoverSources:Dp(f,t.flags?.replayBackend),resolveShardTargets:kp(t.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:hm(m.data,t)}:u(m.error.code,m.error.message)}function hm(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=F.join(n,F.basename(r)),a=e=>e===r||e.startsWith(r+F.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return I.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:F.basename(r)}]}:o}function gm(t){let n=t.flags?.replayScriptSources;if(!n)throw new e(`INVALID_ARGS`,us);return n}function _m(e,t){let n=e.flags??{},r=e.meta?.cwd,i=bm(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:kt(i,r),failFast:n.failFast===!0,retries:ym(n.retries),timeoutMs:ym(n.timeoutMs),shard:Hp(n)}}function vm(e,t){let{publicNetworkOnly:n,resolvedSessionScope:r,dispatch:i,dependencies:a}=e,o=i||t.openLifecycle?{...i,...t.openLifecycle?{openLifecycle:t.openLifecycle}:{}}:void 0;return{request:t.request,...n?{publicNetworkOnly:n}:{},...r?{resolvedSessionScope:r}:{},...o?{dispatch:o}:{},dependencies:a}}function ym(e){return typeof e==`number`?e:void 0}function bm(e){return typeof e==`string`?e:void 0}function xm(t){let n=t.flags??{};if(n.waitMs===void 0)return;let[r]=pt(`waitMs`);if(!r)throw new e(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return m(n,`waitMs`,{min:r.min,max:r.max})}function Sm(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function Cm(e){return{...Sm(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function wm(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return Em({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function Tm(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function Em(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=Ot.fromTimeoutMs(a),s=()=>Tm(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;Qt({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await xt(Math.min(250,o.remainingMs())),Jt(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};Dm(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function Dm(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}const Om={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},$=new Map;async function km(e){let t=await L.mkdtemp(F.join(Gn.tmpdir(),`agent-device-materialized-`));try{let n=await Pm(e.installablePath,F.join(t,`installable`)),r=e.archivePath?await Pm(e.archivePath,F.join(t,`archive`)):void 0,i=Un.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{Mm(i)},a);return $.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await L.rm(t,{recursive:!0,force:!0}),e}}async function Am(e,t){await Nm(e,tn($,e,t,Om))}async function jm(e){let t=Array.from($.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await Nm(e,t)}))}async function Mm(e){let t=$.get(e);if(t)try{await Nm(e,t)}catch{}}async function Nm(e,t){clearTimeout(t.timer),$.delete(e),await L.rm(t.rootPath,{recursive:!0,force:!0})}async function Pm(e,t){let n=await L.stat(e);await L.mkdir(t,{recursive:!0});let r=F.join(t,F.basename(e));return n.isDirectory()?(await L.cp(e,r,{recursive:!0}),r):(await L.copyFile(e,r),r)}function Fm(e){return e.device.platform===`web`}function Im(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function Lm(e){let{session:t,sessionName:n,sessionStore:r}=e;t.appLog&&await mn({session:t,sessionName:n,sessionStore:r,resourcePath:fn.resolvePath(r.resolveSessionDir(n))})}async function Rm(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.perfCapture&&await pn({...e,session:t,intent:`disposal`})}async function zm(e,t){await t.stopSnapshotHelper(e.device)}async function Bm(e){let{session:t,sessionName:n,sessionStore:r,platformCleanup:i}=e;await i.closeManagedBrowser({device:t.device,sessionName:n,stateDir:r.resolveDaemonStateDir(),openSessionNames:()=>Im(r)})}async function Vm(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function Hm(t){if(t.failures.length===0)return;let n=t.failures.map(({step:e})=>e),r=t.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return D({level:`error`,phase:t.phase,data:{session:t.sessionName,failedSteps:n,errors:r}}),new e(`COMMAND_FAILED`,`Session cleanup left ${t.failures.length} resource(s) unreleased: ${r.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:t.sessionName,failedSteps:n,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function Um(t){let{session:n,sessionName:r,sessionStore:i}=t;if(!t.platformCleanup)throw new e(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let a=t.platformCleanup,o=[{step:`recording`,run:()=>Wm({session:n,sessionName:r,sessionStore:i})},...t.appLog===`run`?[{step:`app_log`,run:()=>Lm({session:n,sessionName:r,sessionStore:i})}]:[],{step:`audio_probe`,run:()=>Gm({session:n,sessionName:r,sessionStore:i})},{step:`perf_capture`,run:()=>Rm({session:n,sessionName:r,sessionStore:i})},{step:`platform_snapshot_helper`,run:()=>zm(n,a)},{step:`web_browser`,run:()=>Bm({session:n,sessionName:r,sessionStore:i,platformCleanup:a})}];o.push({step:`materialized_paths`,run:()=>jm(r)});let s=Hm({sessionName:r,phase:`session_teardown_cleanup_failed`,failures:await Vm(o)});if(s)throw s}async function Wm(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.screenRecording&&await Vn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}async function Gm(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.audioProbe&&await dn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}function Km(e){return C(e)&&e.kind===`simulator`}function qm(e){return e.platform===`android`&&e.kind===`emulator`}const Jm=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Ym(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Xm(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function Zm(e){return nn(Xm(e))}function Qm(t,n){if(t!==void 0){if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`Invalid open runtime ${n}: expected string.`);return O(t)}}function $m(t){if(t!==void 0){if(!Number.isInteger(t)||t<1||t>65535)throw new e(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(t)}. Use an integer between 1 and 65535.`);return t}}function eh(t){if(t!==void 0){if(typeof t!=`number`)throw new e(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return $m(t)}}function th(t,n,r){if(t===void 0)return r;if(!s(t))throw new e(`INVALID_ARGS`,`Invalid open runtime platform: ${String(t)}. Use "ios", "android", or "harmonyos".`);if(r&&t!==r)throw new e(`INVALID_ARGS`,`open runtime targets ${t}, but session "${n}" is bound to ${r}.`);return t}function nh(e){if(s(e))return e}function rh(e,t){return{platform:t,metroHost:O(e?.metroHost),metroPort:$m(e?.metroPort),bundleUrl:O(e?.bundleUrl),launchUrl:O(e?.launchUrl)}}function ih(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 ah(e){if(qm(e))return`10.0.2.2`;if(Km(e))return`127.0.0.1`}function oh(e,t){if(!e||O(e.metroHost)||O(e.bundleUrl)||e.metroPort===void 0)return e;let n=ah(t);return n?{...e,metroHost:n}:e}function sh(t){let{runtime:n,sessionName:r,platform:i}=t;if(n===void 0)return;if(!n||typeof n!=`object`||Array.isArray(n))throw new e(`INVALID_ARGS`,`open runtime must be an object.`);let a=n,o=Object.keys(a).find(e=>!Jm.includes(e));if(o)throw new e(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Jm.join(`, `)}.`);return{platform:th(a.platform,r,i),metroHost:Qm(a.metroHost,`metroHost`),metroPort:eh(a.metroPort),bundleUrl:Qm(a.bundleUrl,`bundleUrl`),launchUrl:Qm(a.launchUrl,`launchUrl`)}}function ch(e,t,n){if(n){if(Ym(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function lh(t,n,r,i){let a=t.getRuntimeHints(n);if(!a)return;let o=r?S(r):void 0,s=nh(o)??i;if(a.platform&&r&&!s)throw new e(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${n}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new e(`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 uh(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?nh(S(i)):e.platform,o=n.getRuntimeHints(r),s=sh({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=lh(n,r,i,a);return{runtime:i?oh(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Ym(s)>0?s:void 0;return{runtime:i?oh(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function dh(e){return uh(e).runtime}function fh(e){try{return{ok:!0,data:uh(e)}}catch(e){let t=r(e);return u(t.code,t.message,t.details)}}async function ph(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!mh(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Xm(t)})}function mh(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&Zm(e.previousRuntime)&&!Zm(e.runtime)}function hh(e){let{device:t,owner:n,stateDir:r,intent:i}=e,a=i.kind===`exact-owner`&&Se(i.owner,n)?ge(i.fence):null;if(!a)return{status:`binding-invalid`};let o=M(hn(t)),s=cn(an(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!_h(c.stateDir,r)||!Se(sn(c),n)?{status:`conflict`,conflict:s}:c.allocator.identityIncarnationId===a.identityIncarnationId?{status:`covered`}:{status:`incarnation-stale`,heldIncarnationId:c.allocator.identityIncarnationId}}function gh(e){let t=M(hn(e));return rn(an(t))}function _h(e,t){return F.resolve(e)===F.resolve(t)}function vh(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=S(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=w(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${Dt(i)}`,`${a} ${Dt(e.id)}`,...n===`release`||on(t.classification)?[`--stale`]:[]].join(` `)}function yh(t,n){if(n.classification===`allocator-held`)return xh(t,n);let r=n.claim,i=vh(t,n,ln(n.classification)?`release`:`status`),a=S(r?{platform:r.device.family,appleOs:r.device.appleOs}:t);return new e(`DEVICE_IN_USE`,r?`${a} device ${t.id} is owned by session "${r.session}" in workspace "${r.workspace}".`:`${t.name} has an ownership claim that could not be verified.`,{reason:Oh(n.classification),classification:n.classification,deviceKey:n.deviceKey,...r?{owner:{session:r.session,workspace:r.workspace,stateDir:r.stateDir}}:{},recovery:{command:i},hint:ln(n.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${i}`:`Inspect the owner with: ${i}`,retriable:!1})}function bh(e,t){return Dh(yh(e,t))}function xh(t,n){let r=n.allocatorClaim,i=S({platform:r.device.family,appleOs:r.device.appleOs}),a=vh(t,n);return new e(`DEVICE_IN_USE`,`${i} device ${t.id} is held by managed-device allocator "${r.allocator.instanceId}" for installation "${r.stateDir}".`,{reason:`DEVICE_CLAIM_ALLOCATOR_HELD`,classification:n.classification,deviceKey:n.deviceKey,owner:{kind:`allocator`,stateDir:r.stateDir,allocator:r.allocator},recovery:{command:a},hint:`This device belongs to a managed pool and is released only after its allocator proves the identity removed; inspect with: ${a}`,retriable:!1})}function Sh(t,n){return new e(`COMMAND_FAILED`,`${S(t)} device ${t.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:oe(n),deviceKey:M(hn(t)),retriable:!1,hint:`A managed identity becomes executable only after its allocator activates it and this installation holds its allocator-held claim.`})}function Ch(t,n,r){return new e(`COMMAND_FAILED`,`${S(t)} device ${t.id} is held for identity incarnation "${r}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:oe(n),deviceKey:M(hn(t)),heldIncarnationId:r,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function wh(t,n){return new e(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:oe(n),deviceKey:M(hn(t)),retriable:!1})}function Th(e,t,n){switch(n.status){case`binding-invalid`:return{admitted:!1,error:wh(e,t)};case`missing`:return{admitted:!1,error:Sh(e,t)};case`covered`:return{admitted:!0};case`incarnation-stale`:return{admitted:!1,error:Ch(e,t,n.heldIncarnationId)};case`conflict`:return{admitted:!1,error:yh(e,n.conflict)}}}function Eh(e,t,n){let r=Th(e,t,n);return r.admitted?void 0:Dh(r.error)}function Dh(e){let{hint:t,retriable:n,...r}=e.details??{};return u(e.code,e.message,r,{hint:t,retriable:n})}function Oh(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:case`allocator-inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function kh(e){switch(e.kind){case`local-family`:return`ordinary`;case`managed-local`:return`allocator-held`;case`provider-runtime`:return`none`}}export{sr as $,km as A,Hs as B,Rm as C,Im as D,Fm as E,Cf as F,br as G,Ja as H,Pl as I,_r as J,gr as K,jl as L,Cm as M,xm as N,Am as O,mm as P,lr as Q,Ml as R,Lm as S,Um as T,Cr as U,ds as V,Sr as W,ur as X,vr as Y,cr as Z,nh as _,yh as a,Wm as b,rh as c,ph as d,fr as et,ih as f,mh as g,ch as h,Th as i,Zn as it,wm as j,jm as k,Ym as l,Xm as m,Eh as n,tr as nt,gh as o,dh as p,hr as q,bh as r,er as rt,hh as s,kh as t,dr as tt,Zm as u,fh as v,zm as w,Hm as x,Gm as y,Al as z};
|
|
1
|
+
import{A as e,G as t,I as n,O as r,R as i,_ as a,c as o,k as s,m as c,o as l,u,x as d}from"./sdk-contracts.js";import"./capture.js";import{i as f,k as p,p as m,t as h}from"./sdk-batch-runner.js";import{a as g,n as _,t as v}from"./snapshot-diagnostics.js";import{f as y,p as b}from"./android-input-ownership.js";import{S as x,b as S,d as C,l as w,p as ee,s as te,y as ne}from"./sdk-device.js";import{d as re,l as T,n as ie,r as ae}from"./lease-scope.js";import{$t as oe,Bn as se,Br as ce,Dr as le,Er as ue,Gn as de,Hn as fe,Ir as pe,Jn as me,Jr as he,Jt as ge,Kr as _e,T as ve,Un as ye,Wr as E,_n as be,ar as xe,en as Se,gn as Ce,hn as we,kr as Te,on as Ee,or as De,sr as Oe,vn as ke,yn as Ae}from"./sdk-batch.js";import{u as je}from"./scroll-gesture.js";import{a as Me,b as Ne,f as Pe,g as Fe,n as Ie,p as Le,r as Re,w as ze,y as Be}from"./script.js";import{a as Ve}from"./session-store.js";import{C as He,E as Ue,J as We,S as Ge,T as Ke,x as qe}from"./session-snapshot.js";import{a as Je,c as Ye,i as Xe,l as Ze,n as Qe,o as $e,r as et,s as tt,t as nt,u as rt}from"./format.js";import{A as it,j as at}from"./parameterized-recorded-fill.js";import{E as ot,F as st,I as ct,L as lt,N as ut,O as dt,w as ft}from"./runtime.js";import{i as pt}from"./back-mode.js";import{n as mt}from"./success-text.js";import{d as ht,f as gt,i as _t}from"./absence-observation-errors.js";import{a as vt}from"./device.js";import{o as yt,r as D}from"./diagnostics.js";import{p as bt}from"./exec.js";import{t as xt}from"./timeouts.js";import"./diagnostics2.js";import{n as St,r as Ct}from"./output-path.js";import"./command.js";import{a as wt,n as Tt,t as Et}from"./replay-divergence.js";import{s as Dt}from"./device-shell.js";import{n as Ot}from"./retry.js";import{t as kt}from"./session-paths.js";import{n as O}from"./runtime-transport-hints.js";import{r as k}from"./rect-center.js";import{o as At}from"./android-system-chrome.js";import{_ as jt,a as Mt,c as Nt,d as A,f as Pt,g as Ft,h as It,i as Lt,l as Rt,m as zt,n as Bt,o as Vt,p as Ht,r as Ut,s as Wt,u as Gt,v as Kt}from"./human-control-contract.js";import{a as qt,c as Jt,i as Yt,n as Xt,o as Zt,r as j}from"./request-cancel.js";import{t as Qt}from"./request.js";import{n as $t,t as en,u as tn}from"./provider-session-ownership.js";import{r as nn}from"./application-lifecycle-runtime.js";import{a as rn,c as M,l as an,n as on,o as sn,r as cn,t as ln}from"./device-claim-inspection.js";import{b as un,c as dn,g as fn,i as pn,p as mn,x as hn}from"./perf-runtime-plan.js";import{n as gn,r as _n,t as vn}from"./lease-context.js";import{d as yn,g as bn,u as xn}from"./screenshot-runtime.js";import{n as Sn,r as Cn}from"./device-isolation.js";import{n as wn}from"./device-inventory-context.js";import{n as Tn}from"./dispatch-resolve.js";import{t as En}from"./touch-reference-frame.js";import{n as Dn}from"./screen-recording-admission-ledger.js";import{a as On,c as kn,d as N,l as An,n as jn,o as Mn,r as Nn,u as Pn}from"./src8.js";import{i as Fn,n as P,r as In,t as Ln}from"./compatibility-policy.js";import{s as Rn}from"./quality-warnings.js";import{t as zn}from"./png-worker-client.js";import{t as Bn}from"./semantic-index.js";import{o as Vn}from"./screen-recording-resource-recovery.js";import F from"node:path";import I,{promises as Hn}from"node:fs";import Un,{createHash as Wn}from"node:crypto";import Gn from"node:os";import L from"node:fs/promises";import{fileURLToPath as Kn}from"node:url";import{setTimeout as qn}from"node:timers/promises";import Jn from"node:vm";function Yn(e,t){return Xn(e,t)?t:`${e}:${t}`}function Xn(e,t){return t.startsWith(`${e}:`)}function Zn(e,t){return!e.partitioned||Xn(e.tenant,t)}var Qn=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},$n=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},er=class{holdsByDevice=new Map;mutations=new Qn;inFlightWork=new $n;leases=new Map;runBindings=new Map;deviceBindings=new Map;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=Rt(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new en({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=Ht(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Nt(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let n=Pt(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(i,t);if(i.deviceKey)throw Gt(i);return Wt(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=Ft(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);Vt(n,e),Wt(n,e);let r=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(n,r)}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=Ft(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return Vt(n,e),Wt(n,e),{...n}}assertLeaseAdmission(e){let t=zt(e);this.cleanupExpiredLeases(),Wt(this.getActiveLease(t.leaseId),t)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?A(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>Bt(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,n,i){i?.throwIfAborted();let a=Lt(t),o=Mt(n);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=A(s),l=this.findHumanControlHold(a);if(l&&(this.assertHoldAuthority(e,l),A(l.hold.scope)!==c))throw new r(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:a,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(a,d),await this.activateHumanControlHold(c,d,o.ttlMs,i)}async activateHumanControlHold(e,t,n,i){let a=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,i),i?.throwIfAborted(),a.get(o)!==t)throw new r(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...n===void 0?{}:{expiresAt:s+n}},this.refreshHeldLease(e,s),Bt(t.hold)}catch(n){throw a.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=Lt(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=A(r.hold.scope);return this.deleteHumanControlHold(i,n),Bt(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=A(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Ut(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=A(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new r(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new r(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new r(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let n=this.requireHumanControlLease(e.leaseId);return{backend:n.backend,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let n=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==n.leaseId||A(n)!==A(t.hold.scope))throw new r(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=A(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,n.expiresAt-n.heartbeatAt,Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=It(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new r(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new r(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(Pt(e),e.leaseId);let t=A(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.runBindings.delete(Pt(e));let n=A(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=A({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw Gt(r)}};function tr(e){let t=Kt(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,i=jt(n);if(n&&!i)throw new r(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!i)throw new r(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let a=e.session||`default`;return Xn(i,a)?{...e,meta:{...e.meta,tenantId:i,sessionIsolation:t}}:{...e,session:Yn(i,a),meta:{...e.meta,tenantId:i,sessionIsolation:t}}}function nr(e,t,n,i={}){if(yn(e.command))return;let a=gn(e);ar(e,a);let o=n?.lease;if(n===void 0&&!a.leaseId&&rr(e,i.providerAppCatalog))return;if(e.command===`human_control`&&!o&&!a.leaseId)throw new r(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!a.leaseId||!a.tenantId&&!a.runId))return;or(a,o);let s=_n(e,n),c={...s,leaseTtlMs:s.leaseTtlMs??(ae(s)?3e5:void 0)};t.assertLeaseAdmission(T(s));let l=t.heartbeatLease(T(c));return xn(e)&&t.assertHumanControlAdmission(l),l}function rr(e,t){let n=bn(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function ir(e){yn(e.command)||ar(e,gn(e))}function ar(e,t){if(e.command!==`open`)return;let n=ie(t);if(n.length!==0)throw new r(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:n})}function or(e,t){t&&(R(`leaseId`,e.leaseId,t.leaseId),R(`tenantId`,e.tenantId,t.tenantId),R(`runId`,e.runId,t.runId),R(`leaseProvider`,e.leaseProvider,t.leaseProvider),R(`clientId`,e.clientId,t.clientId),R(`deviceKey`,e.deviceKey,t.deviceKey))}function R(e,t,n){if(!(!t||!n||t===n))throw new r(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function sr(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),D({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return D({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}function cr(e){ir(e)}async function lr(e){let t=e.sessionStore.get(e.sessionName),n=t?.lease;return!t||!n||!e.leaseRegistry.consumeExpiredLease(n.leaseId)?!1:(D({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:n.leaseId,session:t.name,deviceKey:n.deviceKey}}),await e.teardownSession(t,t.name).catch(e=>{D({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:n.leaseId,session:t.name,error:e instanceof Error?e.message:String(e)}})}),await un(t.deviceClaim).catch(e=>{D({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:t.name,deviceKey:t.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.delete(t.name),!0)}function ur(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.get(t),a=nr(e.req,r,i,{providerAppCatalog:e.providerAppCatalog});if(!a)return e.req;let o={...e.req,internal:{...e.req.internal,admittedLease:a}};return i?.lease&&n.set(t,{...i,lease:{...i.lease,leaseBackend:a.backend,expiresAt:a.expiresAt}}),o}function dr(e){return vn(e.req,e.req.internal?.admittedLease)??e.existingLease}async function fr(e){let t=e.session.lease;if(!t)return;let n=re({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n),i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=$t(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return D({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const pr=[`platform`,`target`],mr=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function hr(e){return te({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function gr(e){return hr(e)||yr(e,pr)}function _r(e){return gr(e)||yr(e,mr)}function vr(e){return typeof e==`string`&&e.trim().length>0}function yr(e,t){return e?t.some(t=>vr(e[t])):!1}function br(e){return{appleSimulatorAppTarget:xr(e)}}function xr(e){return e&&!f(e)?e:void 0}function Sr(){return Dn({displayName:`audio probe`})}function Cr(){return Dn({displayName:`perf capture`})}function wr(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return Wn(`sha256`).update(xe(t),`utf8`).digest(`hex`)}function Tr(e,t,n){return new Pr(Dr(Er(t.resolve(e))),n).parse()}function Er(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function Dr(e){let t=[],n=0;for(;n<e.length;){let i=e.slice(n),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){n+=a;continue}let o=Or(i);if(!o)throw new r(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);t.push(o.value),n+=o.length}return t}function Or(e){return kr(e)??Ar(e)??jr(e)??Mr(e)??Nr(e)}function kr(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function Ar(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function jr(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function Mr(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Nr(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Pr=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let e=this.parseOr();if(this.peek())throw new r(`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 r(`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 r(`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 r(`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 r(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,e}consumeStringLiteral(){let e=this.peek();if(e?.type!==`string`)throw new r(`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 Fr(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function Ir(e,t){return{...Gr(e,t),source:e.source}}function z(e,t,n){if(e===void 0)return;let i=n??On[t]??{},a=Mn(i),o;if(typeof e==`number`)o=e;else{let n=e.trim();if(n===``)throw new r(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);o=Number(n)}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 r(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);return o}function Lr(e,t,n,r){return z(e===void 0?t:n.resolve(String(e)),r)}function B(t){if(t?.aborted)throw e()}async function Rr(e,t){if(e.include.kind===`commands`)return{kind:`program`,source:e.source,config:{},commands:e.include.commands};if(!t.loadProgram)throw new r(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return B(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 zr(e,t){if(e.include.kind===`file`)return F.resolve(t?F.dirname(t):process.cwd(),e.include.path)}function Br(e){return e===void 0?void 0:F.resolve(e)}function Vr(e,t){let n=zr(e,e.source.path);if(n&&t.has(n))throw new r(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${n}.`);return n}function Hr(e,t,n,i){let a=e.include.kind===`file`?Br(t.source.path):void 0,o=new Set([n,a].filter(e=>e!==void 0)),s=[...o].find(e=>i.has(e));if(s)throw new r(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function Ur(e,t,n){return e.platform&&e.platform!==n.platform?!1:e.true===void 0?!0:typeof e.true==`boolean`?e.true:Tr(e.true,t,n.platform)}function Wr(e){return[...e.visible?[{kind:`visible`,selector:e.visible}]:[],...e.notVisible?[{kind:`notVisible`,selector:e.notVisible}]:[]]}function Gr(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>Gr(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Gr(n,t)])):e}async function Kr(e,t){B(t.signal);let n=Br(e.source.path),r={options:t,context:kn(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await qr(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function qr(e,t,n,r,i){B(i.options.signal);let a=ii(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 Yr(s,a,o,e.source.path??r,i));return n}finally{s()}}async function Jr(e,t,n,r,i){let a=[];for(let o of e)a.push(...await Yr(o,t,n,r,i));return a}async function Yr(e,t,n,r,i){B(i.options.signal);let a=ai(e,r);switch(a.kind){case`runFlow`:{let e=Zr(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await Xr(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[ni(a,t,n,o)]}case`repeat`:return[ni(a,t,n,await Jr(a.commands,t,n,r,i))];case`retry`:return[ni(a,t,n,await Jr(a.commands,t,n,r,i))];default:return[ti(a,t,n)]}}async function Xr(e,t,n,r,i){let a=$r(e,i.context),o=Vr(a,i.activeIncludePaths),s=await Rr(a,i.options);B(i.options.signal);let c=Hr(a,s,o,i.activeIncludePaths),l=ii(t,e.env),u=i.context.enter(e.env);try{return await qr(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function Zr(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:Qr(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function Qr(e,t){if(e===!1)return`omit`;if(typeof e==`string`)return ei(t.context.resolveDeferred(e))?`opaque`:Tr(e,t.context,t.options.platform)?void 0:`omit`}function $r(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function ei(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function ti(e,t,n){return N({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function ni(e,t,n,r){return N({kind:`opaque`,command:ri(e),source:e.source,scopes:t,body:r,appId:n})}function ri(e){switch(e.kind){case`runFlow`:return N({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 N({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function ii(e,t){return t===void 0?e:[...e,t]}function ai(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function oi(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await Kr(e,t),a=si(t.runtimeHints),o=N({kind:`maestroReplayPlan`,platform:t.platform,target:t.target,runtimeHints:a,initialStaticEnv:structuredClone({...t.defaults??{},...e.config.env??{},...t.env??{}}),steps:structuredClone(n),total:n.length,compatibility:{staticallyExecutedControls:r,staticallySkippedControls:i}}),s=wr(o);return ci({...o,digest:s})}function si(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 ci(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))ci(t);return Object.freeze(e)}function li(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`||n.command.kind===`evalScript`)return{allowed:!1,reason:`step ${t+1} (${n.command.kind}) 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 ui(e,t={}){let n=li(e,t);if(!n.allowed)throw new r(`INVALID_ARGS`,n.reason);return n.startIndex}function di(e,t){if(!Number.isInteger(t)||t<0||t>e.total)throw new r(`INVALID_ARGS`,`Maestro replay startIndex ${t} is out of range for a ${e.total}-step plan.`);return t}const fi=`maestro-test-failure`;function pi(e,t={}){return new r(`COMMAND_FAILED`,e,{...t,reason:fi})}function mi(e){return e instanceof r&&e.code===`COMMAND_FAILED`&&e.details?.reason===fi}const hi=new Set([``,`false`,`0`,`null`,`undefined`]);function gi(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0&&!Number.isNaN(e):!hi.has(e)}async function _i(e,t){B(t.options.signal);try{return await Mi(e,t.context,async()=>await vi(e,t))}catch(t){throw Ni(t,e)}}async function vi(e,t){if(e.kind===`command`)return await yi(e.command,e.appId,t);await Ti(e,t)}async function yi(e,t,n){if(e.kind===`evalScript`)return await Si(e,n);let r=Ir(e,n.context);try{return await Ci(r,t,n)}catch(e){if(B(n.options.signal),xi(r)&&mi(e)){n.warnings.push(bi(r,e)),n.skipped+=1;return}throw Pi(e,r)}}function bi(e,t){let n=`${e.source.path?`${e.source.path}:`:``}line ${e.source.line}`,i=t instanceof r?t.message:String(t);return`Optional Maestro ${e.kind} skipped at ${n}: ${i}`}function xi(e){return`optional`in e&&e.optional===!0}async function Si(e,t){let{evaluateMaestroEvalScript:n}=await import(`./engine-eval-script.js`);if(t.options.trustedScripts===!1)throw new r(`UNAUTHORIZED`,`Maestro evalScript is not permitted for flows received over the remote daemon surface: node:vm is not a security sandbox, so an untrusted expression can escape to the host.`);let i=await n(e.script,t.context.values);t.context.replaceOutput(i),t.executed+=1}async function Ci(e,t,n){switch(e.kind){case`assertVisible`:await ki({kind:`visible`,selector:e.target},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await ki({kind:`notVisible`,selector:e.target},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`assertTrue`:if(!gi(e.condition))throw pi(`Maestro assertTrue condition was falsy: ${JSON.stringify(e.condition)}`);n.executed+=1;return;case`extendedWaitUntil`:await ki(ji(e),z(e.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await wi(e,t,n)}}async function wi(e,t,n){let r=N({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 B(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 Ti(e,t){let n=Ir(e.command,t.context);switch(n.kind){case`runFlow`:if(n.when&&!await Oi(n.when,t)){t.skipped+=1;return}t.executed+=1,await Ei(e.body,t);return;case`repeat`:{let r=Lr(n.times,0,t.context,`repeat.times`);t.executed+=1;for(let n=0;n<r;n+=1)B(t.options.signal),await Ei(e.body,t);return}case`retry`:{let r=Math.min(Lr(n.maxRetries,1,t.context,`retry.maxRetries`),P.control.retryMaxRetries);t.executed+=1,await Di(e.body,r,t);return}}}async function Ei(e,t){for(let n of e)await _i(n,t)}async function Di(e,t,n){let i;for(let r=0;r<=t;r+=1){B(n.options.signal);try{await Ei(e,n);return}catch(t){if(B(n.options.signal),!mi(Ii(t)))throw t;i=Ni(t,e[0])}}throw i||new r(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function Oi(e,t){if(!Ur(e,t.context,t.options))return!1;for(let n of Wr(e))if(B(t.options.signal),!(await Ai(n,t.timing.runFlowConditionTimeoutMs,t)).matched)return!1;return!0}async function ki(e,t,n){if(!(await Ai(e,t,n)).matched)throw pi(`Maestro ${e.kind} condition did not match.`)}async function Ai(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 B(n.options.signal),n.context.recordObservation(i),i}function ji(e){if(e.visible)return{kind:`visible`,selector:e.visible};if(e.notVisible)return{kind:`notVisible`,selector:e.notVisible};throw new r(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function Mi(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 Ni(e,t){if(Fi(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:Li(e,t?.command),source:n,...t?{command:t.command}:{}}}function Pi(e,t){return{kind:`maestroPlanStepFailure`,error:Li(e,t),source:t.source,command:t}}function Fi(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function Ii(e){return Fi(e)?e.error:e}function Li(e,t){if(!(e instanceof r)||!t||/\bline \d+\b/.test(e.message))return e;let n=t.source.path?`${t.source.path}:`:``;return new r(e.code,`${e.message} (${n}line ${t.source.line})`,e.details)}async function Ri(e,t,n={}){B(n.signal);let i=n.startIndex??0;if(!Number.isInteger(i)||i<0||i>e.total)throw new r(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${e.total}-step plan.`);let a={plan:e,port:t,options:n,context:kn(n.defaults,n.env?{...n.env}:{}),timing:Ln,artifacts:new Set,warnings:[],executed:e.compatibility.staticallyExecutedControls,skipped:e.compatibility.staticallySkippedControls};for(let t=i;t<e.steps.length;t+=1)try{await zi(e.steps[t],t,a)}catch(e){throw Ii(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function zi(e,t,n){B(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};Vi(()=>n.options.observer?.commandStarted?.(s));try{let t=await _i(e,n);B(n.options.signal),Vi(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...Bi(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=Ni(t,e);throw Vi(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...Bi(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],warnings:[...n.warnings]})),o}}function Bi(e,t){return!e||!t?{}:{runtimeMetrics:{hierarchyCaptures:t.hierarchyCaptures-e.hierarchyCaptures,screenshotCaptures:t.screenshotCaptures-e.screenshotCaptures,tapRetries:t.tapRetries-e.tapRetries,settleLatches:t.settleLatches-e.settleLatches,settleTimeouts:t.settleTimeouts-e.settleTimeouts}}}function Vi(e){try{e?.()}catch{}}async function Hi(e,t,n={}){let r=Ui(e,n);return await Ri(e,t,{...n,startIndex:r})}function Ui(e,t){return t.from!==void 0||t.planDigest!==void 0?ui(e,{from:t.from,planDigest:t.planDigest}):di(e,t.startIndex??0)}function Wi(e){return Fr(e)?{command:e.kind,...e.kind===`runFlow`?V(e.label??e.includePath):{}}:{command:e.kind,...Gi(e)}}function Gi(e){return`label`in e&&e.label?V(e.label):Ki(e)?V($i(e.target)):qi(e)?Ji(e):e.kind===`inputText`?V(`<text>`):Yi(e)}function Ki(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function qi(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function Ji(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return V(ea(e.target));case`extendedWaitUntil`:return V(ea(e.visible??e.notVisible));case`scrollUntilVisible`:return V(ea(e.element))}}function Yi(e){return Xi(e)?Zi(e):e.kind===`swipe`?Qi(e):e.kind===`runFlow`?V(e.label??(e.include.kind===`file`?e.include.path:``)):e.kind===`assertTrue`?V(String(e.condition)):{}}function Xi(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function Zi(e){switch(e.kind){case`openLink`:return V(e.link);case`takeScreenshot`:return V(e.path);case`runScript`:return V(e.file);case`pressKey`:return V(e.key)}}function Qi(e){return V(e.gesture.kind===`coordinates`?`${ta(e.gesture.start)} to ${ta(e.gesture.end)}`:e.gesture.direction)}function $i(e){return e.space===`target`?ea(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function ea(e){return e?.id??e?.text}function ta(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function V(e){return e?{value:e}:{}}const na=new Set(String.raw`^$\.*+?()[]{}|`);function ra(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function ia(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(na.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!na.has(i))return;t+=i,n+=1}return t}function aa(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(E(e.rect))return t.isVisibleInEffectiveViewport(e);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=t.findAncestor(e,e=>Te(e,n)?e:null);return r?E(r.rect)?t.isVisibleInEffectiveViewport(r):n!==`android`&&r.hittable===!0:!1}function oa(e,t,n){return!!n.findAncestor(e,e=>e.index===t.index?e:null)}function sa(e,t){let n=[t.id===void 0?void 0:la(e.identifier,t.id),t.text===void 0?void 0:ua(e,t.text)].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 ca(e){return e.matches.filter(t=>aa(t,e.visibility,e.platform))}function la(e,t){let n=e??``;return Pn(n)===Pn(t)||ra(n,t)}function ua(e,t){return[e.label,An(e),e.identifier].filter(e=>!!e).some(e=>la(e,t))}function da(e){return e.index!==void 0||e.childOf!==void 0||e.below!==void 0||e.above!==void 0||e.leftOf!==void 0||e.rightOf!==void 0||e.containsChild!==void 0||e.containsDescendants!==void 0}function fa(e){return e.text!==void 0||e.id!==void 0||e.enabled!==void 0||e.selected!==void 0}function pa(e,t,n){let r=[],i=0;for(let a of e)for(let e of n){let n=ha(a.rect,e.rect);n===void 0||!ma(t,a.rect,e.rect)||r.push({node:a,distance:n,order:i++})}return r.sort((e,t)=>e.distance-t.distance||e.order-t.order),r.map(({node:e})=>e)}function ma(e,t,n){switch(e){case`below`:return t.y>n.y;case`above`:return t.y<n.y;case`leftOf`:return t.x<n.x;case`rightOf`:return t.x>n.x}}function ha(e,t){if(!(!ga(e)||!ga(t)))return Math.fround(Math.hypot(_a(e.x,e.width)-_a(t.x,t.width),_a(e.y,e.height)-_a(t.y,t.height)))}function ga(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite))}function _a(e,t){return e+Math.trunc(t/2)}function va(e,t={},n={}){let i=ue(e.nodes,t);t.onVisibilityContextCreated?.();let a=new WeakMap,o=new WeakSet,s=new WeakMap,c=new Map,l=t=>t.parentIndex===void 0?void 0:i.nodeByIndex.get(t.parentIndex)??e.nodes[t.parentIndex],u=e=>{let t=s.get(e);if(t)return t;let n=new Set,r=new Set,i=l(e);for(;i&&!r.has(i.index);)r.add(i.index),n.add(i.index),i=l(i);return s.set(e,n),n},d=(n,r)=>{let i=c.get(n);i||(i=new WeakMap,c.set(n,i));let a=i.get(r);if(a)return a;t.onPositionComputed?.(n,r);let o=pa(e.nodes,n,m(r).indexed),s={ordered:o,candidateIndexes:new Set(o.map(e=>e.index))};return i.set(r,s),s},f=(e,t)=>d(e,t).ordered,p=(e,t)=>d(e,t).candidateIndexes,m=i=>{let s=a.get(i);if(s)return s;if(o.has(i))throw new r(`INVALID_ARGS`,`Maestro selector relations cannot contain cycles.`);o.add(i),t.onSelectorComputed?.(i);try{let t=ya(e,i,l,u,m,p),r={matches:t,indexed:Ca(t,i.index,n.orderUnindexed)};return a.set(i,r),r}finally{o.delete(i)}};return{visibility:i,resolve:m,resolvePosition:f}}function ya(e,t,n,r,i,a){let{index:o,childOf:s,below:c,above:l,leftOf:u,rightOf:d,containsChild:f,containsDescendants:p,...m}=t,h=fa(m)?e.nodes.filter(e=>sa(e,m)):[...e.nodes];if(s){let e=new Set(i(s).indexed.map(e=>e.index));h=h.filter(t=>xa(r(t),e))}if(f){let e=new Set(i(f).indexed.map(n).filter(e=>e!==void 0).map(e=>e.index));h=h.filter(t=>e.has(t.index))}if(p){let e=p.map(e=>ba(i(e).indexed,r));h=h.filter(t=>e.every(e=>e.has(t.index)))}for(let[e,n]of Sa(t)){let t=a(e,n);h=h.filter(e=>t.has(e.index))}return h}function ba(e,t){let n=new Set;for(let r of e)for(let e of t(r))n.add(e);return n}function xa(e,t){for(let n of e)if(t.has(n))return!0;return!1}function Sa(e){return[[`below`,e.below],[`above`,e.above],[`leftOf`,e.leftOf],[`rightOf`,e.rightOf]].filter(e=>e[1]!==void 0)}function Ca(e,t,n){if(t===void 0)return n?n(e):[...e];let r=Ta(e)[Da(t)];return r?[r]:[]}function wa(e,t){return t===void 0?e[0]:Ta(e)[Da(t)]}function Ta(e){return[...e].sort((e,t)=>{let n=Ea(e.rect?.y),r=Ea(t.rect?.y);return n===r?Ea(e.rect?.x)-Ea(t.rect?.x):n-r})}function Ea(e){return e!==void 0&&Number.isFinite(e)?e:2**53-1}function Da(e){let t=typeof e==`number`?e:Number(e.trim());if(!Number.isSafeInteger(t)||t<0)throw new r(`INVALID_ARGS`,`Maestro selector.index must be a non-negative integer.`);return t}const Oa={android:{kind:`exact`,provider:`android-helper`},ios:{kind:`divergence`,provider:`apple-xctest`,reason:`maestro-clickable-not-exposed-by-provider`}};function ka(e,t){let n=Oa[t];if(n.kind===`divergence`)return n;let r=b(e);return r?r.kind!==`exact`||r.provider!==n.provider?{kind:`divergence`,provider:n.provider,reason:`unregistered-provider-evidence`}:r:{kind:`divergence`,provider:n.provider,reason:`exact-evidence-not-retained`}}function Aa(e,t){return t.kind===`exact`?e.map((e,n)=>({node:e,order:n,rank:ja(t.clickableByNodeIndex.get(e.index))})).sort((e,t)=>t.rank-e.rank||e.order-t.order).map(({node:e})=>e):[...e]}function ja(e){return e===!0?2:+(e===!1)}function Ma(e,t,n,r={}){let i=ka(e,n),a=Pa(e,i,r),o=Na(t,a),s=ca({visibility:a.visibility,matches:o.matches,platform:n});return{...o,visible:s,clickability:i,ranked:Fa(s,t,n,a.visibility,i)}}function Na(e,t){return{matches:t.resolve(e).matches,parentMatched:e.childOf===void 0||t.resolve(e.childOf).indexed.length>0}}function Pa(e,t,n={}){return va(e,n,t?{orderUnindexed:e=>Aa(e,t)}:{})}function Fa(e,t,n,r,i){let a=n!==`ios`||!Ba(t)?e:e.filter(n=>{if(Wa(n))return!0;let i=e.filter(e=>e!==n&&Va(n,e,t));return!i.some(e=>Wa(e)&&oa(n,e,r))&&!i.some(e=>oa(e,n,r))});return t.index===void 0&&i?Aa(a,i):a}function Ia(e,t){let n=t===void 0?e.find(za):La(e,t);return!n||!za(n)?null:{node:n,rect:n.rect}}function La(e,t){return wa(e,t)}function Ra(e){return za(e)?e.rect:void 0}function za(e){return E(e.rect)}function Ba(e){return e.id!==void 0||e.text!==void 0}function Va(e,t,n){if(n.id!==void 0&&Ua(e.identifier)!==Ua(t.identifier))return!1;if(n.text!==void 0){let n=Ha(e),r=new Set(Ha(t));if(!n.some(e=>r.has(e)))return!1}return!0}function Ha(e){return[e.label,e.value,e.identifier].map(Ua).filter(e=>e!==void 0)}function Ua(e){if(e)return Pn(e)||void 0}function Wa(e){let t=pe(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}const Ga=Symbol(`maestroFlowProgram`),Ka=Symbol(`maestroFailureCommand`),qa=Symbol(`maestroFailurePlan`);function Ja(e,t){let n=Nn(e,{sourcePath:t});return{sourcePath:t,name:n.config.name,appTarget:$a(n),[Ga]:n}}async function Ya(e,t,n){let r;try{let i=jn(F.dirname(e.sourcePath),n.readSource),a=await oi(e[Ga],{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,runtimeHints:n.runtimeHints,loadProgram:i,signal:n.signal}),o=ui(a,{from:n.from,planDigest:n.planDigest}),s=await Hi(a,t,{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,loadProgram:i,signal:n.signal,startIndex:o,trustedScripts:n.trustedScripts,observer:Za(a,n.observer,e=>{r=e})});return{ok:!0,replayed:a.total-o,planDigest:a.digest,startIndex:o,artifactPaths:s.artifactPaths,...s.warnings?{warnings:s.warnings}:{}}}catch(e){return{ok:!1,error:r?.error??e,...r?{failure:r}:{}}}}function Xa(e,t){let n=to(e[Ka]),r=e[qa].platform;return!n||r!==`android`&&r!==`ios`?[]:Ma(t,n.selector,r).ranked.map(e=>({node:e,basis:no(n.selector,e)}))}function Za(e,t,n){return{commandStarted:e=>t?.actionStarted?.(Qa(e)),commandCompleted:e=>t?.actionCompleted?.({...Qa(e),durationMs:e.durationMs,runtimeMetrics:e.runtimeMetrics,data:e.data}),commandFailed:r=>{let i=li(e,{from:r.stepIndex,planDigest:e.digest}),a={...Qa(r),durationMs:r.durationMs,error:r.error,artifactPaths:r.artifactPaths,warnings:[...r.warnings],isControl:Fr(r.command),redactions:r.command.kind===`inputText`&&r.command.text.length>0?[{name:`inputText.text`,value:r.command.text}]:[],resume:i.allowed?{allowed:!0,from:r.stepIndex,planDigest:e.digest}:{allowed:!1,from:r.stepIndex,planDigest:e.digest,reason:i.reason},[Ka]:r.command,[qa]:e};n(a),t?.actionFailed?.(a)}}}function Qa(e){let t=Wi(e.command);return{action:t.command,...t.value?{value:t.value}:{},source:e.source,generation:e.generation,stepIndex:e.stepIndex,stepTotal:e.stepTotal}}function $a(e){return[e.config.appId,...[...e.config.onFlowStart??[],...e.commands].filter(e=>e.kind===`launchApp`).map(e=>e.kind===`launchApp`?e.appId:void 0)].find(eo)}function eo(e){return!!(e?.trim()&&!e.includes(`$`)&&!f(e))}function to(e){switch(e.kind){case`tapOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`doubleTapOn`:case`longPressOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;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};case`swipe`:return e.gesture.kind===`target`?{selector:e.gesture.from}:void 0;default:return}}function no(e,t){return e.id!==void 0||e.text!==void 0&&sa({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text===void 0?`other`:`label`}function H(e,t){return N({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function ro(e){return N({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function io(e,t){let n=lo(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},ro(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:ao(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ao(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function oo(e,t,n,r){let i=lo(await r.resolveTarget({selector:e,...t},H(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw pi(`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 so(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function co(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 lo(e,t){return uo(e,t),fo(e),po(e),mo(e),e}function uo(e,t){if(e.generation!==t)throw new r(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function fo(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function po(e){if(e.rect!==void 0&&!co(e.rect)||e.viewport!==void 0&&!co(e.viewport))throw new r(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function mo(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new r(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function ho(e,t,n,r,i,a={}){let o=go(e,t,n,i,a);if(!o)return;let{start:s,end:c}=xo(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function go(e,t,n,r,i){let a=n===`up`||n===`down`,o=Pa(e,ka(e,r),i),s=o.visibility,c=ca({visibility:s,matches:e.nodes.filter(e=>ce(e)),platform:r}),l=_e(s.viewportRects)??vo(c);if(!l||!E(l))return;let u=c.flatMap(e=>{if(!E(e.rect))return[];let t=yo(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=_o(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(bo)[0]?.viewport}function _o(e,t){return ce(e)?e:le(e,t)}function vo(e){let t;for(let n of e)E(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function yo(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 bo(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function xo(e,t){let n=U(e,.5,.5),r=P.scrollUntilVisibleSwipe.nearEdgeFraction,i=P.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:U(e,.5,i)};case`down`:return{start:n,end:U(e,.5,r)};case`left`:return{start:n,end:U(e,i,.5)};case`right`:return{start:n,end:U(e,r,.5)}}}async function So(e,t,n){let i=z(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new r(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await n.resolveGestureViewport(H(t,t.command)):void 0;return{authored:e,gesture:wo(await Co(e.start,t,n,a),await Co(e.end,t,n,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let r=await n.resolveGestureViewport(H(t,t.command)),{start:a,end:o}=To(r,e.direction,n.platform);return{authored:e,gesture:wo(a,o,i),viewport:r}}let a=await oo(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?P.command.optionalTargetLookupTimeoutMs:P.command.targetLookupTimeoutMs},t,n),o=a.viewport??await n.resolveGestureViewport(H(t,t.command)),{start:s,end:c}=Eo(a,e.direction,o);return{authored:e,gesture:wo(s,c,i),target:a,viewport:o}}async function Co(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(H(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 wo(e,t,n){return{from:e,to:t,durationMs:n??P.command.swipeDurationMs}}function To(e,t,n){if(t===`left`||t===`right`){let n=je(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=U(e,r.centerFraction,r.nearEdgeFraction),a=U(e,r.centerFraction,r.farEdgeFraction),o=U(e,r.centerFraction,r.downStartFraction),s=U(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function U(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Eo(e,t,n){let r=k(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 Do={launchApp:Mo,stopApp:Mo,setPermissions:Mo,clearState:Mo,openLink:Mo,tapOn:Fo,doubleTapOn:Fo,longPressOn:Fo,swipe:Bo,inputText:Vo,eraseText:Vo,scroll:W,scrollUntilVisible:W,hideKeyboard:W,pressKey:W,back:W,waitForAnimationToEnd:W,takeScreenshot:Wo,runScript:Wo,evalScript:Ko,assertVisible:Go,assertNotVisible:Go,assertTrue:Go,extendedWaitUntil:Go},Oo={launchApp:!0,stopApp:!0,setPermissions:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function ko(e){return Oo[e.kind]}async function Ao(e,t){let n=e.command;return await jo(n,e,t,H(e,n))}function jo(e,t,n,r){let i=Do[e.kind];return i(e,t,n,r)}async function Mo(e,t,n,r){switch(e.kind){case`launchApp`:return await G(n.launchApp,No(e,t),r,`invalidate`);case`stopApp`:return await G(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`setPermissions`:return await G(n.setPermissions,{appId:e.appId??t.appId,permissions:Po(e.permissions)},r,`invalidate`);case`clearState`:return await G(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await G(n.openLink,{link:e.link},r,`invalidate`)}}function No(e,t){return N({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,permissions:e.permissions?Po(e.permissions):void 0,arguments:e.arguments,launchArguments:e.launchArguments})}function Po(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.toLowerCase()]))}async function Fo(e,t,n,r){switch(e.kind){case`tapOn`:return await Io(e,t,n,r);case`doubleTapOn`:{let i=await es(e.target,{purpose:`doubleTap`,timeoutMs:Ro(e)},t,n),a=z(e.delay,`doubleTapOn.delay`)??P.command.repeatDelayMs;return await G(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?so(i.resolution):void 0)}case`longPressOn`:{let i=await es(e.target,{purpose:`longPress`,timeoutMs:Ro(e)},t,n);return await G(n.longPressOn,{target:i},r,`invalidate`,i.resolution?so(i.resolution):void 0)}}}async function Io(e,t,n,r){let i=await Lo(e,t,n);return await G(n.tapOn,zo(e,i),r,`invalidate`,i.resolution?so(i.resolution):void 0)}async function Lo(e,t,n){let r={purpose:`tap`,timeoutMs:Ro(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await es(e.target,r,t,n)}function Ro(e){return e.optional===!0?P.command.optionalTargetLookupTimeoutMs:P.command.targetLookupTimeoutMs}function zo(e,t){let n=z(e.repeat,`tapOn.repeat`),r=z(e.delay,`tapOn.delay`),i=n===void 0?r:r??P.command.repeatDelayMs;return N({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Bo(e,t,n,r){let i=await So(e.gesture,t,n);return await G(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?so(i.target):void 0)}async function Vo(e,t,n,r){switch(e.kind){case`inputText`:return await G(n.inputText,N({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await G(n.eraseText,N({charactersToErase:z(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function W(e,t,n,r){switch(e.kind){case`scroll`:return await G(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await G(n.scrollUntilVisible,Ho(e),r,`invalidate`);case`hideKeyboard`:return await G(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await G(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await G(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await G(n.waitForAnimationToEnd,Uo(e),r,`preserve`)}}function Ho(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:z(e.timeout,`scrollUntilVisible.timeout`)??P.command.scrollUntilVisibleTimeoutMs,durationMs:Fn(P.command.scrollUntilVisibleSpeed)}}function Uo(e){return N({timeoutMs:z(e.timeout,`waitForAnimationToEnd.timeout`)})}async function Wo(e,t,n,r){switch(e.kind){case`takeScreenshot`:return Jo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await G(n.runScript,N({file:e.file,env:e.env}),r,`preserve`)}}async function Go(e){throw new r(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function Ko(e){throw new r(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function G(e,t,n,r,i){let a=qo(n,r);return Jo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function qo(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function Jo(e,t,n,r){let i=e?.observation;return Yo(i,r),{...Xo(n??i),...Zo(e?.outputEnv),...Qo(t,e?.artifactPaths),...$o(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function Yo(e,t){if(!(!e||t===void 0||e.generation===t))throw new r(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function Xo(e){return e?{observation:e}:{}}function Zo(e){return e?{outputEnv:{...e}}:{}}function Qo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function $o(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function es(e,t,n,r){if(e.space===`target`){let i=await oo(e.selector,t,n,r);return{authored:e,point:k(i.rect),resolution:i}}return{authored:e,point:await Co(e,n,r)}}function ts(e,t,n,r={}){let i=n===`ios`&&r.presentation?rs(r.presentation):void 0,a=i?is(e,t,i):Ma(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:cs(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?La(s,t.selector.index):Ia(s,t.selector.index)?.node,l=cs(t,o,s,c);if(!c)return as(t,o,s,l);let u=i?Ia(i.visibleForSource(c),void 0):null,d=Ra(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!ns(t.selector)&&i?os(d,s,u):0,evidence:l}:as(t,o,s,l)}const ns=da;function rs(e){let t=ue(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>aa(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function is(e,t,n){let r=ka(e,`ios`),i=va(e,{},{orderUnindexed:e=>Aa(e,r)}),a=Na(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:Fa(o,t.selector,`ios`,i.visibility,r)}}function as(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function os(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&ss(n.rect,e)?1:0:t.length}function ss(e,t){let n=k(e),r=k(t);return n.x===r.x&&n.y===r.y}function cs(e,t,n,r){return N({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const K={settleTimeoutMs:In,retryTapMaxAttempts:P.command.retryTapMaxAttempts,longPressDurationMs:P.command.longPressDurationMs,eraseTextMaxCharacters:P.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:P.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:P.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:P.command.waitForAnimationToEndDifferencePercent,observationPollMs:P.observation.pollIntervalMs};function ls(e,t={}){return{execute:async n=>{let r=H(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:ko(n.command)&&!i,visualStabilityBarrier:i});let a=await Ao(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await io(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}const us=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;function ds(e,t){let n=e.files[t];if(n===void 0)throw new r(`INVALID_ARGS`,`replay script source is missing ${t}; it was not part of the script sources sent with this request.`,{path:t,entry:e.entry});return n}function fs(e){let t=ps(e),n=xe(t);return Wn(`sha256`).update(n,`utf8`).digest(`hex`)}function ps(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)=>ms(e,n[t]??null,r?.[t]??null))}}function ms(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function hs(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=gs({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function gs(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>_s({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>vs({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>ys(n,r)];for(let e of s){let t=e();if(t)return t}}function _s(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 vs(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 ys(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 bs(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new r(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=Ie(e),a=Re(e),o=fs({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??Me(i.actions)??a.platform,target:t?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>hs(e,s,o)}}function xs(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function Ss(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&be(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Cs(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function ws(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Cs(i,a);return{matchCount:n,observed:r,mismatches:[...r?ye(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function Ts(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...ye(e,r),...fe(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function Es(e,t,n,r,i,a){if(n.targetEvidences)return Ds(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return q(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return q(e,n,r,i,a);if(s.kind===`post-resolution`){let c=xs({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return q(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return ks(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=Ss({recorded:o,token:s.token});if(c.kind===`skip`)return q(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,Os(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?ks(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function Ds(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return q(e,n,r,i,a);let d=Ss({recorded:o[c],token:u.token});if(d.kind===`skip`)return q(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,Os(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return ks(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function Os(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function q(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function ks(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=As(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=js(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function As(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function js(e,t,n){return n.status===`guard-mismatch`?ws(e,n.evidence,t):Ts(e,n.evidence)}async function Ms(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Xe(e.varSources),o=[],s=[],c=Is(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Fs(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Ls(u,n.length,r,e))}let d=rt(r,a,Ps(e,u)),f=Je(a),p=t.diagnosticsMarker(),m=await Es(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:Ns(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function Ns(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Ps(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Fs(e){return!!(e&&e.command!==`replay`)}function Is(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Fs(n))return n.command===`close`?t:void 0}}function Ls(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function Rs(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=be(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function zs(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),Fe(e.command)){let n=Bs(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=be(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Rs([...e.positionals]);n&&t.push(n)}return Oe(t).filter(e=>e.trim().length>0)}function Bs(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Vs(n)?t.slice(0,-1):t}function Vs(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Hs(e){let t=F.dirname(e),n=F.basename(e,F.extname(e));return F.join(t,`${n}.healed.ad`)}function Us(e){let t=Ws({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Ws(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Gs({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Gs(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 Ks(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!qs(n))return`manual`;let i=Js(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function qs(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Ys(e.scrollRegion)}function Js(e,t){let n=ct(t),r=Zs(e.ancestry,n,t),i=e.scrollRegion;return i&&Ys(i)?r&&Xs(i,n,t):r}function Ys(e){return e.id!==void 0||e.label!==void 0}function Xs(e,t,n){return n.some(n=>Ue(Ge(n,t),e))}function Zs(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=st(n,t,e.length);return!r.broken&&de(r.chain,e)})}function Qs(e){let{sessionStore:n,observationStore:r,divergence:i,responseLevel:a}=e,o,s,c=Et({divergence:i,level:a,writeOverflowArtifact:e=>{let r=t(e),i=tc(n,r);return`artifactPath`in i&&(o=r,s=i.artifactPath),i}}),l=(o??c).screen;if(l.state!==`available`||l.refs.length===0)return e.evidence&&r.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:l.state===`available`?l.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return ec(s),$s(c,`missing-evidence`);let u=r.bindAuthority(e.signal).finalize(e.evidence,{refsGeneration:l.refsGeneration,refs:l.refs.map(e=>e.ref)});return u.published===!0?c:(ec(s),$s(c,u.reason))}function $s(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function ec(e){if(e)try{I.unlinkSync(e)}catch{}}function tc(e,t){try{let n=F.join(e.ensureSessionDir(),`replay-divergence`);I.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=F.join(n,r);return I.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const nc={id:0,"role-label":1,label:2,other:3};function rc(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||ic(n.basis)<ic(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>ic(e.basis)-ic(t.basis)||e.nodeIndex-t.nodeIndex)}function ic(e){return nc[e]}async function ac(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionStore:s,observationStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=Tt(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await cc({session:o,observationStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=fc(v,g),b=v.state===`available`&&o?_c({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=Ks({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:oc(v)}),S=Us({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Qs({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Pe(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:S,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function oc(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const sc=[300,500,800,1200,2e3,3e3,4e3];async function cc(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=uc(i),s=Date.now()+12e3,c=await lc({session:t,observationStore:n,logPath:r,flags:o});if(!a)return c.observation;for(let e of sc){if(c.observation.state===`available`||!c.retryable)break;let i=s-Date.now();if(i<=0)break;await xt(Math.min(e,i)),c=await lc({session:t,observationStore:n,logPath:r,flags:o})}return c.observation}async function lc(e){let{session:t,observationStore:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).snapshot;if(Rn(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let a=n.bindAuthority().store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:a.refsGeneration,evidence:a.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:At(e)}}}function uc(e){return{snapshotInteractiveOnly:dc(e)}}function dc(e){return!vc(e.command)||yc(e).requiresRect}function fc(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=gc(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function pc(e){return!!ht(e,gt(e.type??`Element`))||e.hittable===!0}function mc(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function hc(e,t){let n=ut(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&pc(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=>mc(e,t)),...o.filter(e=>!mc(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function gc(e,t,n){let{nodes:r,truncated:i}=hc(e,n);return{refs:r.map(e=>{let n=gt(e.type??`Element`),r=ht(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function _c(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!vc(t.command))return[];let a=zs(t);return a.length===0?[]:bc({candidates:a,nodes:r,session:n,action:t,matching:yc(t),sanitize:i})}function vc(e){return Fe(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function yc(e){let t=Fe(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function bc(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=xc({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return rc(s).map(e=>e.suggestion)}function xc(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Ae(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:Sc({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function Sc(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=we(t,r.device.platform,{action:i.command===`fill`?`fill`:Fe(i.command)?`click`:`get`,nodes:n}),c=gt(t.type??`Element`),l=ht(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function Cc(e){return{...e,hint:e.hint??Ec(e.details,`hint`),diagnosticId:e.diagnosticId??Ec(e.details,`diagnosticId`),logPath:e.logPath??Ec(e.details,`logPath`)}}function wc(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return Tc({error:t,actionLabel:Pe(n),action:n.command,positionals:Ve(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function Tc(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:wt(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:wt(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Oc(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>wt(e,u))}:{},divergence:l}}}}function Ec(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const Dc=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function Oc(e){if(!e)return{};let t={};for(let n of Dc)e[n]!==void 0&&(t[n]=e[n]);return t}async function kc(e){return await Ac({...e,snapshotDiagnostics:g(e.snapshotDiagnosticSamples)})}async function Ac(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=jc(t.error.details?.replaySource),v=Cc(t.error),y=await ac({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(),sessionStore:d,observationStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:j(u.meta?.requestId)});return wc({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function jc(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 Mc(e,n){if(e)try{I.appendFileSync(e,`${JSON.stringify(t(n))}\n`)}catch(t){D({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function Nc(e){let{req:t,sessionName:n,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f,resolvedSessionScope:p,dependencies:m}=e,h=Date.now();Mc(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:Ve(o)??[]});let g;try{g=await Fc({req:t,sessionName:n,resolved:o,sourceAction:a,invoke:f,resolvedSessionScope:p,dependencies:m})}catch(e){if(!(e instanceof r))throw e;g={ok:!1,error:i(e)}}let _=Date.now();return Mc(d,{type:`replay_action_stop`,ts:new Date(_).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:g.ok,durationMs:_-h,resultTiming:g.ok?Lc(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Pc(g,u??s,c)}function Pc(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 Fc(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Rc(t.flags,r.flags),l=i.command===`fill`?at(it(i)):void 0;return l&&(c.recordAs=l),await a(Ic({token:t.token,session:n,flags:c,runtime:r.runtime,meta:t.meta,dispatch:{...t.dispatch,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:o??s.resolveSessionScope(t)}:{}}},r))}function Ic(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:Ne(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ze(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Lc(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 Rc(e,t){return h(e,{...t??{}})}function zc(e){return Kc(e.ok?Vc(e.data):Bc(e.error.details?.artifactPaths))}function Bc(e){return Array.isArray(e)?e.filter(Gc):[]}function Vc(e){return e?[Wc(e.path),Wc(e.outPath),...Hc(e.artifacts)].filter(Gc):[]}function Hc(e){return Array.isArray(e)?e.map(Uc).filter(Gc):[]}function Uc(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Wc(t.localPath)??Wc(t.path)}function Wc(e){return typeof e==`string`?e:void 0}function Gc(e){return typeof e==`string`}function Kc(e){return[...new Set(e.filter(qc))]}function qc(e){try{return I.statSync(e).isFile()}catch{return!1}}function Jc(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Yc({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=ct(r),u=se(t),d=lt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>He(r,e)===t.sibling),p=d.filter(e=>Ue(Ge(e,l),t.scrollRegion)),m=Ke(p)[t.viewportOrder]?.ref,h=We({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,...Qc({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Yc(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Xc(n,t,i,a):Zc(n,t,r,a,o)}function Xc(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),o=d(t),s=o?a(e,o):null;if(i(s))return{matchedNodes:[s],winnerRef:s.ref};let c=n?ot(e,n):null;return i(c)?{matchedNodes:[c],winnerRef:c.ref}:{matchedNodes:[],winnerRef:``}}function Zc(e,t,n,r,i){let a=ke(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=ft(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Qc(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?$c(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?$c(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?$c(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 $c(e,t,n){let r=qe(t),i=st(t,n,Math.max(e.ancestry.length,1)).chain;return[...ye(e,r),...fe(e.ancestry,i)].slice(0,5)}function el(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=Be(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=be(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!Fe(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(nl(r)&&nl(n[1])))return r}function tl(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function nl(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function rl(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionStore:l,resumeStamper:u,responseLevel:d,scrubVars:f,planActions:p,planDigest:m}=e,h=Tt(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:pl(se(n),h),...t.observed?{observed:pl(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>ml(e,h))},_=Ks({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Us({failedIndex:i,actions:p,planDigest:m,repairHint:_,resumeStamper:u}),y={version:1,kind:t.kind,step:{index:i,source:{path:h(a),line:o}},action:h(Pe(r)),cause:{code:t.causeCode,message:h(t.causeMessage),...t.causeHint?{hint:h(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:v,repairHint:_,targetBinding:g},b=Qs({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return wc({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function il(e,t,n){let r=Tt(e.scrubVars);return rl(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:fc(n,r),publicationEvidence:cl(n),repairCapture:oc(n)})}async function al(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await cc({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function ol(e,t){return il(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await al({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function sl(e,t,n){return il(e,t,await al({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function cl(e){return e.state===`available`?e.evidence:void 0}function ll(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?ve(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Ee(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:el(n,i),platform:a.device.platform}:{kind:`inactive`}}function ul(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=yc(r),s=Jc({recorded:t,token:n,nodes:i,platform:a,refLabel:tl(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:qe(s.winnerNode),structural:me(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?qe(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function dl(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function fl(e){return!e.ok&&e.error.details?.reason===dt}function pl(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function ml(e,t){let n=gt(e.type??`Element`),r=ht(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function hl(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,dispatch:{...e.dispatch,...n}}:e}function gl(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 _l(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function vl(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 yl(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:gl(e?.observed),expectedStructural:vl(e?.expectedStructural),observedStructural:vl(e?.observedStructural)}}function bl(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:gl(e?.observed),observedAncestry:_l(e?.observedAncestry)}}function xl(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function Sl(e,t,n){let r=xl(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&dl(e)?{status:`guard-mismatch`,evidence:yl(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&fl(e)?{status:`landmark-mismatch`,evidence:bl(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function Cl(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,xl(wl(e),zc(e)));return{runtime:{beginTargetVerification(e,n,r,i){return ll({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await cc({session:i,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return ul({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Nc({req:hl(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke,resolvedSessionScope:t.resolvedSessionScope,dependencies:t.dependencies});o=l,zc(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:Sl(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await ol(c(e,n,r,i),{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=il(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await sl(c(e,n,i,a),r,{session:t.observationStore.get(),observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=wl(o),u=await Tl(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>El(e),onStep:i,diagnosticsMarker:()=>Ol(t.sessionStore),diagnosticsSince:e=>kl(t.sessionStore,e)},readLastResponse:()=>o}}function wl(e){return e&&!e.ok?e:l(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function Tl(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Dl(i)?c(i):c(await kc({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function El(e){let t=e.positionals??[],n=Ce(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Dl(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 Ol(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function kl(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Al(e){let t=Me(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return Nl(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function jl(e,t){return t===`ios`?Pl(e)??{}:{}}function Ml(e,t){let n=Al(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function Nl(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!f(e))}function Pl(e){let t=xr(e);return t?{appleSimulatorAppTarget:t}:void 0}function Fl(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Il(t,i)};return Rl(o,`AD_PLATFORM`,a.platform??r.platform),Rl(o,`AD_TARGET`,a.target??r.target),Rl(o,`AD_DEVICE`,a.device),Rl(o,`AD_DEVICE_ID`,Ll(a)),zl(o,`AD_SHARD_INDEX`,a.shardIndex),zl(o,`AD_SHARD_COUNT`,a.shardCount),Rl(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Il(e,t){let n=e.meta?.cwd??process.cwd();return F.relative(n,t)||t}function Ll(e){return typeof e.serial==`string`?e.serial:e.udid}function Rl(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function zl(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Bl=3e4,Vl=1e3;function Hl(e){let{scriptPath:t,env:n,publicNetworkOnly:a}=e,o=I.readFileSync(t,`utf8`),s=Object.create(null);try{Jn.runInNewContext(o,Ul(n,s,a),{filename:t,timeout:Bl})}catch(e){let n=i(e);throw new r(n.code,`Maestro runScript failed: ${n.message}`,p({...n.details??{},hint:n.hint,diagnosticId:n.diagnosticId,logPath:n.logPath,retriable:n.retriable,supportedOn:n.supportedOn,scriptPath:t}),e instanceof Error?e:void 0)}return Xl(s,t),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Zl(t)]))}function Ul(e,t,n){return{...e,output:t,json:Wl,http:{post:(e,t)=>Kl(`POST`,e,n,t)}}}function Wl(e){if(typeof e!=`string`)throw new r(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new r(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Gl)}catch(t){throw new r(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Vl)},t instanceof Error?t:void 0)}}function Gl(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Kl(e,t,n,i){let a=bt(process.execPath,ql(),{stdin:JSON.stringify(Yl(e,t,i,n)),timeoutMs:Bl,allowFailure:!0});if(a.exitCode!==0)throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Ql(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(n){throw new r(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:a.stdout.slice(0,Vl),stderr:a.stderr.slice(0,Vl)},n instanceof Error?n:void 0)}}function ql(){let e=Jl(import.meta.url);if(!e)throw new r(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Jl(e){try{let t=Kn(e),n=F.extname(t)||`.js`;return[F.join(F.dirname(t),`run-script-http-child`+n),F.join(F.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>I.existsSync(e))??null}catch{return null}}function Yl(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Xl(e,t){for(let n of Object.keys(e))if(n.includes(`.`))throw new r(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${n}`,{scriptPath:t,key:n})}function Zl(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Ql(e){let t=e.trim();return t.length>0?t.slice(0,Vl):`request process exited without stderr`}async function $l(e){return await eu(`tap`,async t=>{let n=F.join(t,`before.png`),r=F.join(t,`after.png`),i=await nu(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await nu(e,r)))return await tu(n,r,e.signal,`tap`)}})})}async function eu(e,t){let n=await Hn.mkdtemp(F.join(Gn.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await Hn.rm(n,{recursive:!0,force:!0})}catch{}}}async function tu(e,t,n,r){try{let[i,a]=await Promise.all([Hn.readFile(e),Hn.readFile(t)]);J(n);let o=await zn(i,a,`Maestro screenshot`);return J(n),ru(o,r)}catch(e){au(e,n),D({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function nu(e,t){try{return await Hn.rm(t,{force:!0}),J(e.signal),await e.capture(t),J(e.signal),!0}catch(t){return au(t,e.signal),!1}}function ru(e,t){if(e.status!==`compared`)return iu(t,e.status,e),!1;let n=e.differencePercent<=K.animationDifferencePercent;return iu(t,n?`stable`:`changed`,e),n}function iu(e,t,n){D({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function au(t,r){if(r?.aborted||n(t))throw e()}function J(t){if(t?.aborted)throw e()}async function ou(e){cu(e.timeoutMs),J(e.signal);let t=e.now()+e.timeoutMs;return await eu(`animation`,async n=>{let r=F.join(n,`first.png`),i=F.join(n,`second.png`);for(;;){if(J(e.signal),await su(e,r,i))return!0;if(e.now()>=t)return!1}})}async function su(e,t,n){let r=[await nu(e,t),await nu(e,n)];return!r[0]||!r[1]?!1:await tu(t,n,e.signal,`animation`)===!0}function cu(e){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const lu=K.observationPollMs;async function uu(e,t){for(;;){Y(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!Eu(n)||(Y(e.context.signal),!await wu(e.dependencies,t,lu,e.context.signal)))throw n}}}function du(e){return fu({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function fu(e){let t=En(e.snapshot),n=e.platform===`ios`?Bn(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:c(n.nodes)}:e.snapshot;return _u(ts(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function pu(e){Tu(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Y(e.context.signal);let r=await uu(e,n),i=fu({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ao(e.condition,i))return i;if(e.dependencies.now()>=n)break;await wu(e.dependencies,n,lu,e.context.signal)}return Y(e.context.signal),ku(t)}async function mu(e){Tu(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Y(e.context.signal);let i=r??await uu(e,t);if(r=void 0,n=fu({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===K.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Y(e.context.signal),ku(n)}async function hu(e){Tu(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await uu(e,t),r=Du(n);for(;;){Y(e.context.signal),await wu(e.dependencies,t,lu,e.context.signal);let i=await uu(e,t),a=Du(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function gu(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function _u(e,t,n,r,i,a,o){if(!e.ok){let t=gu(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=yu({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=gu(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:vu(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:Du(t)}:{}}}function vu(e,t){return!E(e)||!E(t)?0:he(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 yu(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!bu(t,n,r)||i!==1))return xu(t.selector)}function bu(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!ns(e.selector)}function xu(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!Su(n)||typeof r!=`string`)return;let i=ia(r)?.trim();return i?{key:n,value:i}:void 0}function Su(e){return e===`id`||e===`label`||e===`text`}async function Cu(t,n,r){try{await t.sleep(n,r)}catch(t){throw r?.aborted?e():t}Y(r)}async function wu(e,t,n,r){let i=t-e.now();return i<=0?!1:(await Cu(e,Math.min(n,i),r),!0)}function Y(t){if(t?.aborted)throw e()}function Tu(e,t){if(!Number.isFinite(e)||e<0)throw new r(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function Eu(e){return e instanceof r&&e.details?.retriable===!0}function Du(e){return Wn(`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:Ou(e.rect)})))).digest(`hex`)}function Ou(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 ku(e){if(e)return e;throw new r(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function Au(e){return e.kind===`clearState`?Fu(e):ju(e)?Mu(e):Xu(e)?Zu(e):e.kind===`settingsPermission`?Uu(e):Wu(e)}function ju(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Mu(e){switch(e.kind){case`launchApp`:return Nu(e);case`stopApp`:return Pu(e);case`openLink`:return Iu(e)}}function Nu(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 Pu(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function Fu(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Iu(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const Lu={camera:`camera`,microphone:`microphone`,photos:`photos`,contacts:`contacts`,notifications:`notifications`,calendar:`calendar`,location:`location`,medialibrary:`media-library`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`},Ru={allow:`grant`,deny:`deny`,unset:`reset`},zu={location:{always:{state:`grant`,permission:`location-always`},inuse:{state:`grant`,permission:`location`},never:{state:`deny`,permission:`location`}},photos:{limited:{state:`grant`,permission:`photos`,mode:`limited`}}};function Bu(e){let t=Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]);if(t.length===0)throw new r(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...t.filter(([e])=>e===`all`),...t.filter(([e])=>e!==`all`)].map(([e,t])=>Vu(e,t))}function Vu(e,t){let n=e===`all`?`all`:Hu(Lu,e);if(n===void 0)throw new r(`UNSUPPORTED_OPERATION`,`Maestro permission "${e}" is not supported.`,{hint:`Supported: all, ${Object.keys(Lu).join(`, `)}.`});let i=zu[e],a=i?Hu(i,t):void 0;if(a)return a;let o=Hu(Ru,t);if(o)return{state:o,permission:n};throw new r(`INVALID_ARGS`,`Maestro permission "${e}" does not accept "${t}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(i??{})].join(`|`)}.`})}function Hu(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function Uu(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Wu(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Gu(e);case`clickPoint`:return Ku(e);case`swipe`:return qu(e);case`scroll`:return Ju(e);case`pressKey`:return Yu(e)}}function Gu(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Ku(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function qu(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function Ju(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Yu(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Xu(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Zu(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Qu(e,t){let n=Au(t),i=await e.invoke(p({...n,flags:$u(e.flags,n.flags??{})}));if(!i.ok)throw ad(i);if(t.kind===`gestureViewport`){let e=i.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new r(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function $u(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=p({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function ed(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 td(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 nd(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 rd(e,t,n){if(F.isAbsolute(e))return e;let i=t.source?.path??n;if(!i)throw new r(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return F.resolve(F.dirname(i),e)}function id(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function ad(e){let t=e.error,n=p({...t.details??{},hint:t.hint??od(t.details,`hint`),diagnosticId:t.diagnosticId??od(t.details,`diagnosticId`),logPath:t.logPath??od(t.details,`logPath`),retriable:t.retriable??sd(t.details,`retriable`),supportedOn:t.supportedOn??od(t.details,`supportedOn`)});return new r(t.code,t.message,Object.keys(n).length?n:void 0)}function od(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function sd(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function cd(e){let t,n,i,a,o,s=0,c=0,l=async n=>{c+=1;let i=await Qu(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new r(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=y(i,i);return t={generation:n.generation,snapshot:a},a};return{capture:async e=>{if(n?.generation===e.generation){let r=n.snapshot;return n=void 0,t={generation:e.generation,snapshot:r},r}return n=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,n=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,n=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,n=void 0}},prime:(e,t)=>{n={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new r(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await hu({timeoutMs:K.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,n={generation:i.generation,snapshot:c.snapshot},c}}}async function ld(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 uu({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=du({query:t,context:n,snapshot:o,platform:i.platform});if(hd(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await wu(i.dependencies,a,lu,n.signal)}}}async function ud(e,t,n,r,i,a){let o=async()=>await pd(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await $l({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Qu(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await dd(e,t,n,r,i,a.click,o)});return}await dd(e,t,n,r,i,a.click)}async function dd(e,t,n,r,i,a,o){let s=async()=>await pd(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:Du(await t.capture(i))),l=async()=>{let r=await hu({timeoutMs:K.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await fd({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 fd(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<K.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function pd(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await gd(e,o,n.point,i);return}catch(n){if(!_d(n))throw n;let o=await ld({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!md(o))throw n;t.invalidate(r.generation),await vd(e,k(o.rect),i);return}}t.invalidate(r.generation),await vd(e,n.point,i)}function md(e){return e.matched&&e.visible&&e.rect!==void 0}function hd(e,t){return md(e)?!t||e.dispatchSelector!==void 0:!1}async function gd(e,t,n,r){D({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Qu(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function _d(e){let t=s(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===_t.selectorNotFound}async function vd(e,t,n){if(!t)throw new r(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);D({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Qu(e,{kind:`clickPoint`,point:t,options:n})}function yd(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function bd(e){let t=cd(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},i=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},a=e.platform,o=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Qu(e,t)),s=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},c=async(e,t,n=`none`)=>await s(()=>o(e),t,n),l=async(e,t,n)=>{let i=[];for(let a of t){try{await c({kind:`settingsPermission`,...e?{appId:e}:{},state:a.state,permission:a.permission,...a.mode?{mode:a.mode}:{}},n)}catch(e){throw e instanceof r?new r(e.code,e.message,{...e.details,appliedPermissionMutations:i,failedPermissionMutation:yd(a)}):e}i.push(yd(a))}},u=async(n,r)=>{yt(n),await c({kind:`typeText`,text:n},r);let a=await hu({timeoutMs:K.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});i(a),t.prime(r.generation,a.snapshot)};return{operations:{platform:a,resolveTarget:async(n,r)=>await ld({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await pu({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a}),resolveGestureViewport:async()=>await o({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...ed(e.arguments),...ed(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Bu(e.permissions);i&&await c({kind:`clearState`,...n?{appId:n}:{}},t),await l(n,r,t)}await c({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i&&!e.permissions,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`stopApp`,...n?{appId:n}:{}},t)},setPermissions:async(e,t)=>{await l(e.appId??t.appId,Bu(e.permissions),t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await c({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await c({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:a===`ios`},t,`deferred`)},tapOn:async(r,i)=>await ud(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await s(()=>vd(e,t.target.point,p({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await s(()=>vd(e,t.target.point,{holdMs:K.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await c({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await u(e.text,t),eraseText:async(e,t)=>await u(`\b`.repeat(e.charactersToErase??K.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await c({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let i=await mu({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:a,scroll:async(i,o)=>{let s=ho(o,n.selector,n.direction,n.durationMs,a);return await c(s?{kind:`swipe`,...s}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await hu({timeoutMs:Math.min(K.settleTimeoutMs,i),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(i.visiblePercentage!==K.scrollUntilVisiblePercentage)throw pi(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(td(n.selector,i))}},pressKey:async(e,t)=>{await c({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await c({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await c({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await ou({timeoutMs:t.timeoutMs??K.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await o({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:nd(await o({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Hl({scriptPath:rd(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?id(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:i}}function xd(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=bd(e);return ls(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function Sd(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),Cd(()=>Ed(r,e)),Cd(()=>Dd(n,t,e))},actionCompleted:e=>{let r=wd(i,e.stepIndex);Cd(()=>Od(n,t,Td(r,e),!0))},actionFailed:e=>{let r=wd(i,e.stepIndex);Cd(()=>Od(n,t,Td(r,e),!1))}}}function Cd(e){try{e()}catch{}}function wd(e,t){let n=e.get(t);return e.delete(t),n}function Td(e,t){return p({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function Ed(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function Dd(e,t,n){Mc(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function Od(e,t,n,i){let a=kd(n);Mc(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,ok:i,durationMs:n.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in n&&n.error instanceof r?{errorCode:n.error.code}:{}})}function kd(e){let t=`data`in e?e.data:void 0,n=Ad(t?.timing)?t.timing:void 0;return p({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function Ad(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function jd(e,t){let n=p({...e.dispatch,...Md(t.dispatch)});return p({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,dispatch:Object.keys(n).length>0?n:void 0})}function Md(e){return p({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function Nd(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:Ld(e.action),positionals:Rd(e.action,e.value),flags:t.flags??{}}}}async function Pd(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=j(r.meta?.requestId),c=Nd(t,r),l=Cc(e.error),u=[...t.redactions],d=Tt(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await cc({session:p,observationStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?Fd({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Id(t.value)].filter(Boolean).join(` `),_=Qs({sessionStore:i,observationStore:a,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:fc(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Ks({kind:`action-failure`,targetEvidence:void 0,capture:oc(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return Tc({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u,warnings:t.warnings})}function Fd(e){let t={createdAt:Date.now(),nodes:e.nodes};return rc(Xa(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>Sc({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Id(e){return!e||e===`<text>`?e??``:Le(e)}function Ld(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Rd(e,t){return!t||e===`inputText`?[]:[t]}function zd(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=Vd(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:Hd(c,Date.now()-r)}}}async function Bd(e){let{command:t,replayPath:n,state:r,outcome:a}=e,{request:o,session:{store:s,observationStore:c,logPath:l}}=t,{failure:u}=a,d=i(a.error);return u?await Pd({error:d,failure:u,replayPath:n,req:o,sessionStore:s,observationStore:c,logPath:l,snapshotDiagnostics:Vd(s,r.snapshotStart)}):{ok:!1,error:d}}function Vd(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return g(n)}function Hd(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Ud(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return l(`INVALID_ARGS`,us);if(t.flags?.saveScript!==void 0)return l(`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 Wd({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Bd({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Wd(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await Gd({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Qd({command:t,device:l.device,platform:l.platform,runtimeHints:l.runtimeHints,sourcePath:l.filePath,publicNetworkOnly:u});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await Ya(l.flow,d,{defaults:l.defaults,env:l.env,platform:l.platform,target:l.target,runtimeHints:l.runtimeHints,signal:l.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:!u,readSource:e=>ds(n,e),observer:Sd({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?zd({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Bd({command:t,replayPath:n.entry,state:i,outcome:f})}async function Gd(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=Ja(ds(n,o),o),c=a.lookup(),l=c?.session;c&&a.assertSelectorMatches(r.flags);let u=await Kd({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Xd({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Zd(r),signal:j(r.meta?.requestId)}}async function Kd(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await Tn(t.flags??{},jl(a.appTarget,o))),c=rf(t,s),l=Jd({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await qd({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:af(t,s),runtimeHints:l,flow:a})}async function qd(e){if(e.device||!Yd(e.runtimeHints))return e;let t=await Tn(e.req.flags??{},jl(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:af(e.req,t),runtimeHints:Jd({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Jd(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function Yd(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Xd(e){return{...Fl({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Zd(e){return{...$e(Ze(e.flags?.replayShellEnv)),...tt(Ye(e.flags?.replayEnv))}}function Qd(e){let{command:t,device:n,platform:r,runtimeHints:i,sourcePath:a,publicNetworkOnly:o}=e,{request:s,invoke:c}=t,l={...s,runtime:i,...t.dispatch?{dispatch:t.dispatch}:{}};return xd({invoke:e=>c(jd(l,e)),flags:$d(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await qn(e,void 0,{signal:t})}}})}function $d(e,t,n){if(!e)return ef(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 ef(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?tf(n,t):nf(n,t)}function tf(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function nf(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function rf(e,t){let n=e.flags?.platform;if(n===`android`||n===`ios`)return n;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new r(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function af(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function of(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(et(t,a.flags?.replayBackend)===`maestro`)return n?l(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Ud(i):l(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function sf(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=cf(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=lf(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=uf({req:t,coordinator:s,manifest:u,preEntrySession:_});return v.ok?{ok:!0,value:{replayReq:d,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g,preEntrySession:_,entryIndex:v.value,varSources:ff({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function cf(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return l(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function lf(e,t,n){let r=bs(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:df({...e,flags:Ml(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function uf(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:l(`INVALID_ARGS`,a.message)}}function df(e,t){return!t.platform&&!t.target?e:{...e,flags:pf(e.flags,t)}}function ff(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Fl({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:$e(Ze(t.flags?.replayShellEnv)),cliEnv:tt(Ye(t.flags?.replayEnv))}}function pf(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}const mf={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function hf(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=gf({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(yf({req:t,coordinator:a}),vf({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function gf(e){let t=bf(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return u()}function _f(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?l(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):xf({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function vf(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=_f({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??mf,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:Sf({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function yf(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function bf(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return l(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function xf(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?kt(t):a??Hs(i);if(!(n||r&&o===a)&&I.existsSync(o))return l(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function Sf(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function Cf(e){let{request:t,session:{name:n,logPath:r,store:i,observationStore:a,coordinator:o},tracePath:c,onStep:u,invoke:d}=e,f=t.flags?.replayScriptSource;if(!f)return l(`INVALID_ARGS`,us);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,nt(h)&&t.flags?.replayBackend!==`maestro`)return l(`INVALID_ARGS`,Qe(`replay`,h));let s=await of({resolved:h,keepSession:m,coordinator:o,command:e});if(s)return s;let _=sf({req:t,sessionName:n,sessionStore:i,tracePath:c,resolved:h,script:ds(f,h),coordinator:o,dispatch:e.dispatch});if(!_.ok)return _.response;let{replayReq:v,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,entryIndex:C,varSources:w,actionTracePath:ee}=_.value,te=hf({req:t,entryIndex:C,sessionStore:i,sourcePath:h,coordinator:o});if(!te.ok)return te.response;let{runtime:ne,readLastResponse:re}=Cl({ctx:{replayReq:v,sessionName:n,sessionStore:i,observationStore:a,logPath:r,resolved:h,actions:y,actionLines:b,actionSourcePaths:x,planDigest:S,actionTracePath:ee,responseLevel:t.meta?.responseLevel,invoke:d,signal:j(t.meta?.requestId),coordinator:o,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:u,armSaveScript:te.armSaveScript}),T=await Ms({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},ne);return T.status===`failed`?re()??l(`COMMAND_FAILED`,`replay step failed with no recorded response`):wf({startedAt:p,sessionName:n,sessionStore:i,replayed:T.replayed,artifactPaths:T.artifactPaths,snapshotDiagnosticSamples:T.snapshotDiagnosticSamples,armSaveScript:te.armSaveScript,coordinator:o,keepSession:m})}catch(e){let t=s(e);return l(t.code,t.message,g.size>0?{artifactPaths:[...g]}:void 0)}}function wf(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=Ef({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=g([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:Tf(i,Date.now()-t)}}}function Tf(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function Ef(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return l(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function Df(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=F.resolve(n??`.`,t??`.agent-device/test-artifacts`);return F.join(i,r)}function Of(e,t){let n=t?F.relative(t,e):F.basename(e),r=n.length===0||n.startsWith(`..`)?F.basename(e):n;return De(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function kf(e,t){I.mkdirSync(t,{recursive:!0}),Mf(e,t)}function Af(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=F.join(o,`result.txt`),u=F.join(o,`failure.txt`),d=jf([...c],o,[l,u]),f=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?f.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(f.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&f.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&f.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&f.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&f.push(`timeoutMode: cooperative`)),d.length>0&&f.push(`copiedArtifacts: ${d.map(e=>F.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
+
`)}\n`;I.writeFileSync(l,p),s||I.writeFileSync(u,p)}function jf(e,t,n){let r=[],i=new Set(n.map(e=>F.basename(e).toLowerCase()));for(let n of e){if(!Pf(n))continue;let e=F.basename(n);if(F.resolve(n)===F.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=Nf(e,t,i),o=F.join(t,a);I.copyFileSync(n,o),r.push(o)}return r}function Mf(e,t){let n=F.join(t,`replay.ad`);if(I.copyFileSync(e,n),F.extname(e).toLowerCase()===`.ad`)return;let r=F.join(t,F.basename(e));F.resolve(r)!==F.resolve(n)&&I.copyFileSync(e,r)}function Nf(e,t,n){let r=F.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||I.existsSync(F.join(t,a));)a=`${i}-${o++}${r}`;return a}function Pf(e){try{return I.statSync(e).isFile()}catch{return!1}}function Ff(e){let{platformFilter:t,discoverSources:n}=e,i=n(),a=[];for(let e of i){let{path:n,manifest:r}=e,i={kind:`run`,path:n,title:r.title,manifest:r};if(!t){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}Vf(t,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=t?` for --platform ${t}`:``;throw new r(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function If(e,t,n,r,i=0){let a=F.basename(n,F.extname(n)),o=De(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Lf(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return De(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function Rf(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,F.basename(r),`attempt`,a+1].join(`:`)}function zf(e,t){return typeof e==`number`?e:t}function Bf(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Vf(e,t){return e===`apple`?w(t):t===e}function X(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Hf=2e3;async function Uf(e){let{filePath:t,sessionName:n,requestId:r,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:r,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=Xf({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:n,requestId:r,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:n,platform:s,target:c,requestId:r,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Z(C,e),shard:u,onStep:d}).catch(e=>X({error:i(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Zf(o,[...v]))},o)})]):await w,Z(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:n,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Gf(w)||(x=Jf(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:n,requestId:r,graceMs:Hf}}),Kf({replayPromise:w,cleanupSession:p,sessionName:n,requestId:r,emitDiagnostic:h})));let e=await qf({finalizeAttempt:m,sessionName:n,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Yf(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Z(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:n}),await p(n),Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!0,durationMs:Date.now()-t})}catch(e){let r=i(e);Z(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-t,errorCode:r.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:n,error:r.message}}),x=Wf(x,r,v)}}return x??X({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Wf(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:X({error:t,artifactPaths:[...n],infrastructure:!0})}async function Gf(e){return await Promise.race([e.then(()=>!0),qn(Hf).then(()=>!1)])}async function Kf(e){let{replayPromise:t,cleanupSession:n,sessionName:r,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await n(r)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:r,requestId:a,error:i(e).message}})}}}async function qf(e){let{finalizeAttempt:t,sessionName:n,artifactPaths:r,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Z(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:n});try{let e=await t({sessionName:n,artifactPaths:r,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Z(o,e)});return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=i(e);return Z(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:n,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:n,error:t.message}}),X({error:t})}}function Jf(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Yf(e,t){return{...e,warnings:[...e.warnings,t]}}function Xf(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=F.join(t,`replay-timing.ndjson`);return I.mkdirSync(F.dirname(l),{recursive:!0}),I.writeFileSync(l,``),n.add(l),Z(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Z(e,t){e&&I.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Zf(e,t=[]){return X({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function Qf(e){let t=$f(e),n=await ep(e,t);return{result:op(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function $f(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:F.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Of(t.path,n)),maxAttempts:r+1}}async function ep(e,t){np(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await tp(e,t,r);if(rp(n,i),ip(e,i.outcome,r))break;ap(e,t,i)}return n}async function tp(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=If(i,a,r.path,o,n),h=F.join(t.testArtifactsDir,`attempt-${f}`);kf(r.path,h);let g=Rf({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Q(d)},v=await Uf({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return Af({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function np(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:If(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Q(c)})}function rp(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function ip(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function ap(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Q(e.shard)})}function op(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?sp(e,t,n,r):cp(e,t,n,r)}function sp(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Q(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,replayed:c.replayed,healed:c.healed,...c.warnings.length>0?{warnings:[...c.warnings]}:{},...c.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...up(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function cp(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...Q(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...lp(c),...up(s)}}function lp(e){let t=e?.status===`failed`?e:void 0;return{...t&&t.warnings.length>0?{warnings:[...t.warnings]}:{},...t?.infrastructure?{infrastructure:!0}:{},...e?.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function up(e){return Q(e)}function Q(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function dp(e,t,n,r){if(!e||t.length===0)return;let i=await r(e.count);return{mode:e.kind,shardCount:e.count,total:n+(e.kind===`all`?t.length*e.count:t.length),shards:i.map((n,r)=>({shardIndex:r,shardCount:e.count,device:n,entries:e.kind===`all`?t:t.filter((t,n)=>n%e.count===r)}))}}async function fp(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),s=await pp(t,u,d);_p(s,a);let p=s.shardPlan?vp({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await yp({shards:s.shardPlan.shards,sessionName:f,suiteInvocationId:s.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:s.suiteArtifactsDir,suiteTotal:s.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await Cp({discoveryEntries:s.entries,sessionName:f,suiteInvocationId:s.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:s.suiteArtifactsDir,suiteTotal:s.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:Ep(s.total,p,Date.now()-e,s.suiteArtifactsDir)}}catch(e){let t=s(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function pp(e,t,n){let r=mp(e,t),i=hp(r),a=r.length-i.length,o=Lf(e.requestId),s=await dp(e.shard?{kind:e.shard.mode,count:e.shard.count}:void 0,i,a,n);return{entries:r,runnable:i,shardPlan:s,suiteInvocationId:o,suiteArtifactsDir:gp(e,o),total:s?.total??r.length}}function mp(e,t){return Ff({platformFilter:e.platformFilter,discoverSources:t})}function hp(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function gp(e,t){return Df({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function _p(e,t){t({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function vp(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function yp(e){return(await Promise.allSettled(e.shards.map(async t=>await xp({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[bp(r,e.sessionName,t.reason)]:[]})}function bp(e,t,n){let r=i(n);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:Sp(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:r.code,message:r.message,hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,details:r.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function xp(e){let{shard:t,sessionName:n}=e;return await wp({...e,entries:t.entries,sessionName:Sp(n,t),shard:t})}function Sp(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Cp(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await Qf({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Bf(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:zf(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),Tp(t,o,p))break}return g}async function wp(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await Qf({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Bf(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:zf(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),Tp(b,o,m))break}return _}function Tp(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Ep(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=v(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function Dp(e,t){return()=>e.map(e=>Op(e,t))}function Op(e,t){let n=e.entry,r=ds(e,n),i=et(n,t)===`maestro`,a=Re(r);return{path:n,manifest:{...i?{title:Ja(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function kp(e){return async t=>(await Mp(e,t)).map(Ap)}function Ap(e){if(e.platform===`web`||!ee(e))throw new r(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function jp(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}async function Mp(e,t){let n=Ip(e),i=Pp(await wn(Np(e)),n,e);if(i.length<t)throw new r(`DEVICE_NOT_FOUND`,`test sharding requires ${Fp(t)}, but only ${i.length} matched`);return i.slice(0,t)}function Np(e){let t=Sn(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:x({simulatorSetPath:Cn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Pp(e,t,n){return t.length>0?Lp(e,t,n):e.filter(e=>Rp(e,n)).sort(Vp)}function Fp(e){return`${e} device${e===1?``:`s`}`}function Ip(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Lp(e,t,n){return t.map(t=>{let i=Bp(t),a=e.find(e=>zp(e,n)&&(e.id===t||Bp(e.name)===i));if(!a)throw new r(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Rp(e,t){return!zp(e,t)||!ee(e)?!1:e.booted!==!1}function zp(e,t){return!(!ne(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Bp(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function Vp(e,t){return e.id.localeCompare(t.id)}function Hp(e){let t=Up(e?.shardAll,`--shard-all`),n=Up(e?.shardSplit,`--shard-split`);if(t!==void 0&&n!==void 0)throw new r(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(n!==void 0)return{mode:`split`,count:n}}function Up(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new r(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const Wp=new Set([`IOS_BOOT_TIMEOUT`,`IOS_RUNNER_CONNECT_TIMEOUT`,`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,`IOS_TOOL_MISSING`,`ANDROID_BOOT_TIMEOUT`,`ADB_TRANSPORT_UNAVAILABLE`,`CI_RESOURCE_STARVATION_SUSPECTED`]);function Gp(e){return Wp.has(e.toUpperCase())}const Kp=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function qp(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=Jp(e);return t?Yp(t.details)||Xp(t.code,t.message):!1}function Jp(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Yp(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||vt(t)?!0:t?Gp(t):!1}function Xp(e,t){let n=`${e}\n${t}`.toLowerCase();return Kp.some(e=>n.includes(e))}function Zp(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:em(e.error.details?.artifactPaths),warnings:mt(e.error.details),infrastructure:qp(e),...tm(e.error.details?.snapshotDiagnostics)};let t=e.data;return{status:`passed`,replayed:typeof t?.replayed==`number`?t.replayed:0,healed:typeof t?.healed==`number`?t.healed:0,warnings:mt(t),artifactPaths:em(t?.artifactPaths),...tm(t?.snapshotDiagnostics)}}function Qp(e){if(!e||e.ok)return;let t=Zp(e);return t.status===`failed`?t:void 0}function $p(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function em(e){return[...new Set($p(e))]}function tm(e){let t=_(e);return t?{snapshotDiagnostics:t}:{}}const nm=1e3,rm=3e3;function im(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await am(e)}}async function am(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=Ct(o.device.platform),c=i?F.join(i,`recording${s}`):St(o.device.platform);sm(a,{type:`video_recording_start`,session:n,videoPath:c}),D({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(cm({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return sm(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await xt(nm),sm(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:nm}),D({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:nm}}),l}async function om(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;sm(a,{type:`video_tail_start`,session:n,requestedDurationMs:rm});let o=Date.now();await xt(rm);let s=Date.now(),c=await e.video.record(cm({req:t,sessionName:n,phase:`stop`}));return zc(c).forEach(e=>i.add(e)),sm(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),D({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function sm(e,t){e({...t,ts:new Date().toISOString()})}function cm(e){let t={token:e.req.token,meta:e.req.meta};return e.phase===`start`?{request:t,sessionName:e.sessionName,phase:`start`,outputPath:e.outputPath}:{request:t,sessionName:e.sessionName,phase:`stop`}}const lm=[{keys:[`replayKeepSession`],requested:e=>e.replayKeepSession===!0,message:`test does not support --keep-session; suite attempts own their cleanup. Run one native .ad script directly with replay --keep-session.`},{keys:[`replayFrom`,`replayPlanDigest`],requested:e=>e.replayFrom!==void 0||e.replayPlanDigest!==void 0,message:`test does not support --from/--plan-digest; resume is replay-only. Run the failing script directly with replay --from.`},{keys:[`saveScript`,`force`],requested:e=>!!e.saveScript||e.force===!0,message:`test does not support --save-script/--force; the agent-supervised repair loop is replay-only. Repair the failing script directly with replay --save-script.`}],um=({attemptId:e,parentAttemptId:t})=>{Zt(e);let n=dm(e,t);return{cancel:()=>qt(e),release:()=>{n(),Xt(e)}}};function dm(e,t){if(!t||t===e)return()=>{};let n=j(t);if(!n)return()=>{};let r=()=>{qt(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function fm(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=pm(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:jp({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function pm(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function mm(e){let{request:t,session:{name:n,logPath:r},createSession:i,invoke:a,cleanupSession:o,video:c}=e;if(t.flags?.recordVideo===!0&&c===void 0)return l(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let u=t.flags??{};for(let e of lm)if(e.requested(u))return l(`INVALID_ARGS`,e.message);let d,f;try{d=_m(t,n),f=gm(t)}catch(e){let t=s(e);return l(t.code,t.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await fp({request:d,emitProgress:Qt,isCanceled:()=>Yt(t.meta?.requestId),emitDiagnostic:D,bindAttemptCancellation:um,runReplay:async({filePath:n,sessionName:o,platform:s,target:l,requestId:u,artifactsDir:d,artifactPaths:f,tracePath:m,appendTimingEvent:h,shard:g,onStep:_})=>{let v=e=>(f&&zc(e).forEach(e=>f.add(e)),e),y=fm({parentFlags:t.flags,platform:s,target:l,artifactsDir:d,shard:g,sourceBundle:p.get(n)}),b=i(o,r),x=c?{req:t,sessionName:o,sessionStore:b.store,artifactsDir:d,appendTimingEvent:h,video:c}:void 0,S=x?im(x):void 0;return Zp(await Cf({...vm(e,{request:{...t,command:`replay`,session:o,positionals:[n],flags:y,meta:{...t.meta??{},...u?{requestId:u}:{}}},openLifecycle:S}),session:b,tracePath:m,onStep:_,publicNetworkOnly:e.publicNetworkOnly,invoke:async e=>{let t=x?await am(x):void 0;return t&&!t.ok?t:v(await a(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,appendTimingEvent:o})=>{if(c)return Qp(await om({req:t,sessionName:e,sessionStore:i(e,r).store,artifactsDir:a,appendTimingEvent:o,artifactPaths:n,video:c}))},discoverSources:Dp(f,t.flags?.replayBackend),resolveShardTargets:kp(t.flags),cleanupSession:o});return m.status===`completed`?{ok:!0,data:hm(m.data,t)}:l(m.error.code,m.error.message)}function hm(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=F.join(n,F.basename(r)),a=e=>e===r||e.startsWith(r+F.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return I.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:F.basename(r)}]}:o}function gm(e){let t=e.flags?.replayScriptSources;if(!t)throw new r(`INVALID_ARGS`,us);return t}function _m(e,t){let n=e.flags??{},r=e.meta?.cwd,i=bm(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:kt(i,r),failFast:n.failFast===!0,retries:ym(n.retries),timeoutMs:ym(n.timeoutMs),shard:Hp(n)}}function vm(e,t){let{publicNetworkOnly:n,resolvedSessionScope:r,dispatch:i,dependencies:a}=e,o=i||t.openLifecycle?{...i,...t.openLifecycle?{openLifecycle:t.openLifecycle}:{}}:void 0;return{request:t.request,...n?{publicNetworkOnly:n}:{},...r?{resolvedSessionScope:r}:{},...o?{dispatch:o}:{},dependencies:a}}function ym(e){return typeof e==`number`?e:void 0}function bm(e){return typeof e==`string`?e:void 0}function xm(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[n]=pt(`waitMs`);if(!n)throw new r(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return m(t,`waitMs`,{min:n.min,max:n.max})}function Sm(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function Cm(e){return{...Sm(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function wm(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return Em({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function Tm(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function Em(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=Ot.fromTimeoutMs(a),s=()=>Tm(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;Qt({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await xt(Math.min(250,o.remainingMs())),Jt(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};Dm(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function Dm(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}const Om={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},$=new Map;async function km(e){let t=await L.mkdtemp(F.join(Gn.tmpdir(),`agent-device-materialized-`));try{let n=await Pm(e.installablePath,F.join(t,`installable`)),r=e.archivePath?await Pm(e.archivePath,F.join(t,`archive`)):void 0,i=Un.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{Mm(i)},a);return $.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await L.rm(t,{recursive:!0,force:!0}),e}}async function Am(e,t){await Nm(e,tn($,e,t,Om))}async function jm(e){let t=Array.from($.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await Nm(e,t)}))}async function Mm(e){let t=$.get(e);if(t)try{await Nm(e,t)}catch{}}async function Nm(e,t){clearTimeout(t.timer),$.delete(e),await L.rm(t.rootPath,{recursive:!0,force:!0})}async function Pm(e,t){let n=await L.stat(e);await L.mkdir(t,{recursive:!0});let r=F.join(t,F.basename(e));return n.isDirectory()?(await L.cp(e,r,{recursive:!0}),r):(await L.copyFile(e,r),r)}function Fm(e){return e.device.platform===`web`}function Im(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function Lm(e){let{session:t,sessionName:n,sessionStore:r}=e;t.appLog&&await mn({session:t,sessionName:n,sessionStore:r,resourcePath:fn.resolvePath(r.resolveSessionDir(n))})}async function Rm(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.perfCapture&&await pn({...e,session:t,intent:`disposal`})}async function zm(e,t){await t.stopSnapshotHelper(e.device)}async function Bm(e){let{session:t,sessionName:n,sessionStore:r,platformCleanup:i}=e;await i.closeManagedBrowser({device:t.device,sessionName:n,stateDir:r.resolveDaemonStateDir(),openSessionNames:()=>Im(r)})}async function Vm(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function Hm(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),n=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return D({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:n}}),new r(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${n.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function Um(e){let{session:t,sessionName:n,sessionStore:i}=e;if(!e.platformCleanup)throw new r(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let a=e.platformCleanup,o=[{step:`recording`,run:()=>Wm({session:t,sessionName:n,sessionStore:i})},...e.appLog===`run`?[{step:`app_log`,run:()=>Lm({session:t,sessionName:n,sessionStore:i})}]:[],{step:`audio_probe`,run:()=>Gm({session:t,sessionName:n,sessionStore:i})},{step:`perf_capture`,run:()=>Rm({session:t,sessionName:n,sessionStore:i})},{step:`platform_snapshot_helper`,run:()=>zm(t,a)},{step:`web_browser`,run:()=>Bm({session:t,sessionName:n,sessionStore:i,platformCleanup:a})}];o.push({step:`materialized_paths`,run:()=>jm(n)});let s=Hm({sessionName:n,phase:`session_teardown_cleanup_failed`,failures:await Vm(o)});if(s)throw s}async function Wm(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.screenRecording&&await Vn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}async function Gm(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.audioProbe&&await dn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}function Km(e){return C(e)&&e.kind===`simulator`}function qm(e){return e.platform===`android`&&e.kind===`emulator`}const Jm=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Ym(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Xm(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function Zm(e){return nn(Xm(e))}function Qm(e,t){if(e!==void 0){if(typeof e!=`string`)throw new r(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return O(e)}}function $m(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new r(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function eh(e){if(e!==void 0){if(typeof e!=`number`)throw new r(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return $m(e)}}function th(e,t,n){if(e===void 0)return n;if(!o(e))throw new r(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(n&&e!==n)throw new r(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${n}.`);return e}function nh(e){if(o(e))return e}function rh(e,t){return{platform:t,metroHost:O(e?.metroHost),metroPort:$m(e?.metroPort),bundleUrl:O(e?.bundleUrl),launchUrl:O(e?.launchUrl)}}function ih(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 ah(e){if(qm(e))return`10.0.2.2`;if(Km(e))return`127.0.0.1`}function oh(e,t){if(!e||O(e.metroHost)||O(e.bundleUrl)||e.metroPort===void 0)return e;let n=ah(t);return n?{...e,metroHost:n}:e}function sh(e){let{runtime:t,sessionName:n,platform:i}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new r(`INVALID_ARGS`,`open runtime must be an object.`);let a=t,o=Object.keys(a).find(e=>!Jm.includes(e));if(o)throw new r(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Jm.join(`, `)}.`);return{platform:th(a.platform,n,i),metroHost:Qm(a.metroHost,`metroHost`),metroPort:eh(a.metroPort),bundleUrl:Qm(a.bundleUrl,`bundleUrl`),launchUrl:Qm(a.launchUrl,`launchUrl`)}}function ch(e,t,n){if(n){if(Ym(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function lh(e,t,n,i){let a=e.getRuntimeHints(t);if(!a)return;let o=n?S(n):void 0,s=nh(o)??i;if(a.platform&&n&&!s)throw new r(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new r(`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 uh(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?nh(S(i)):e.platform,o=n.getRuntimeHints(r),s=sh({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=lh(n,r,i,a);return{runtime:i?oh(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Ym(s)>0?s:void 0;return{runtime:i?oh(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function dh(e){return uh(e).runtime}function fh(e){try{return{ok:!0,data:uh(e)}}catch(e){let t=s(e);return l(t.code,t.message,t.details)}}async function ph(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!mh(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Xm(t)})}function mh(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&Zm(e.previousRuntime)&&!Zm(e.runtime)}function hh(e){let{device:t,owner:n,stateDir:r,intent:i}=e,a=i.kind===`exact-owner`&&Se(i.owner,n)?ge(i.fence):null;if(!a)return{status:`binding-invalid`};let o=M(hn(t)),s=cn(an(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!_h(c.stateDir,r)||!Se(sn(c),n)?{status:`conflict`,conflict:s}:c.allocator.identityIncarnationId===a.identityIncarnationId?{status:`covered`}:{status:`incarnation-stale`,heldIncarnationId:c.allocator.identityIncarnationId}}function gh(e){let t=M(hn(e));return rn(an(t))}function _h(e,t){return F.resolve(e)===F.resolve(t)}function vh(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=S(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=w(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${Dt(i)}`,`${a} ${Dt(e.id)}`,...n===`release`||on(t.classification)?[`--stale`]:[]].join(` `)}function yh(e,t){if(t.classification===`allocator-held`)return xh(e,t);let n=t.claim,i=vh(e,t,ln(t.classification)?`release`:`status`),a=S(n?{platform:n.device.family,appleOs:n.device.appleOs}:e);return new r(`DEVICE_IN_USE`,n?`${a} device ${e.id} is owned by session "${n.session}" in workspace "${n.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:Oh(t.classification),classification:t.classification,deviceKey:t.deviceKey,...n?{owner:{session:n.session,workspace:n.workspace,stateDir:n.stateDir}}:{},recovery:{command:i},hint:ln(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${i}`:`Inspect the owner with: ${i}`,retriable:!1})}function bh(e,t){return Dh(yh(e,t))}function xh(e,t){let n=t.allocatorClaim,i=S({platform:n.device.family,appleOs:n.device.appleOs}),a=vh(e,t);return new r(`DEVICE_IN_USE`,`${i} device ${e.id} is held by managed-device allocator "${n.allocator.instanceId}" for installation "${n.stateDir}".`,{reason:`DEVICE_CLAIM_ALLOCATOR_HELD`,classification:t.classification,deviceKey:t.deviceKey,owner:{kind:`allocator`,stateDir:n.stateDir,allocator:n.allocator},recovery:{command:a},hint:`This device belongs to a managed pool and is released only after its allocator proves the identity removed; inspect with: ${a}`,retriable:!1})}function Sh(e,t){return new r(`COMMAND_FAILED`,`${S(e)} device ${e.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:oe(t),deviceKey:M(hn(e)),retriable:!1,hint:`A managed identity becomes executable only after its allocator activates it and this installation holds its allocator-held claim.`})}function Ch(e,t,n){return new r(`COMMAND_FAILED`,`${S(e)} device ${e.id} is held for identity incarnation "${n}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:oe(t),deviceKey:M(hn(e)),heldIncarnationId:n,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function wh(e,t){return new r(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:oe(t),deviceKey:M(hn(e)),retriable:!1})}function Th(e,t,n){switch(n.status){case`binding-invalid`:return{admitted:!1,error:wh(e,t)};case`missing`:return{admitted:!1,error:Sh(e,t)};case`covered`:return{admitted:!0};case`incarnation-stale`:return{admitted:!1,error:Ch(e,t,n.heldIncarnationId)};case`conflict`:return{admitted:!1,error:yh(e,n.conflict)}}}function Eh(e,t,n){let r=Th(e,t,n);return r.admitted?void 0:Dh(r.error)}function Dh(e){let{hint:t,retriable:n,...r}=e.details??{};return l(e.code,e.message,r,{hint:t,retriable:n})}function Oh(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:case`allocator-inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function kh(e){switch(e.kind){case`local-family`:return`ordinary`;case`managed-local`:return`allocator-held`;case`provider-runtime`:return`none`}}export{sr as $,km as A,Hs as B,Rm as C,Im as D,Fm as E,Cf as F,br as G,Ja as H,Pl as I,_r as J,gr as K,jl as L,Cm as M,xm as N,Am as O,mm as P,lr as Q,Ml as R,Lm as S,Um as T,Cr as U,ds as V,Sr as W,ur as X,vr as Y,cr as Z,nh as _,yh as a,Wm as b,rh as c,ph as d,fr as et,ih as f,mh as g,ch as h,Th as i,Zn as it,wm as j,jm as k,Ym as l,Xm as m,Eh as n,tr as nt,gh as o,dh as p,hr as q,bh as r,er as rt,hh as s,kh as t,dr as tt,Zm as u,fh as v,zm as w,Hm as x,Gm as y,Al as z};
|