agent-device 0.21.16 → 0.21.18
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.16.apk → agent-device-android-ime-helper-0.21.18.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.18.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.16.manifest.json → agent-device-android-ime-helper-0.21.18.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.16.apk → agent-device-android-snapshot-helper-0.21.18.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.18.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.16.manifest.json → agent-device-android-snapshot-helper-0.21.18.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +31 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +9 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +40 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +4 -0
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +1 -1
- package/dist/src/adb-transport.js +1 -1
- package/dist/src/agent-browser-process-record.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/back-mode.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/cache.js +1 -0
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +6 -5
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/click-button.js +1 -1
- package/dist/src/client-metro-companion.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +5 -5
- package/dist/src/clipboard-shell-response.js +1 -1
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-tools.js +3 -3
- 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-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-transport.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -0
- package/dist/src/daemon-process.js +1 -1
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -2
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/{stop-sequence.js → device-readiness-runtime.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/device.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/doctor-facade.js +1 -1
- package/dist/src/doctor2.js +1 -1
- package/dist/src/durable-resource.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 -2
- package/dist/src/gesture-admission.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 +2 -2
- package/dist/src/host.js +1 -1
- package/dist/src/human-control-contract.js +1 -1
- package/dist/src/human-control.js +1 -1
- package/dist/src/index.d.ts +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 +5 -5
- 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/legacy-xctest-device-set.js +1 -0
- package/dist/src/limrun-download-file.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +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 +10 -10
- package/dist/src/multitouch-support.js +1 -1
- package/dist/src/observation.js +1 -1
- package/dist/src/overlay.js +3 -3
- package/dist/src/owner-identity.js +3 -3
- 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 +1 -1
- package/dist/src/perf.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-app-log-process.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-unavailable.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/process.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 +2 -2
- 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 +36 -36
- 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/result-serialization.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/runner-cache-metadata.js +3 -3
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-command-traits.js +1 -0
- 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-exchange.js +1 -0
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-owner-facade.js +1 -1
- package/dist/src/runner-session-types.js +1 -0
- package/dist/src/runner-start-budget.js +1 -0
- package/dist/src/runner-startup-transport.js +1 -0
- package/dist/src/runner-xctestrun.js +1 -0
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +1 -1
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +3 -3
- 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/screen-recording-transport.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.d.ts +4 -1
- package/dist/src/scroll-command.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +1 -1
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +10 -0
- package/dist/src/sdk-contracts.js +2 -2
- 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/selection.js +0 -0
- 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 +1 -1
- package/dist/src/session2.js +5 -4
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-boot.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/target-evidence.js +1 -0
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/transport.js +2 -2
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/vars.js +2 -0
- 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.16.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.16.apk.sha256 +0 -1
- package/dist/src/capture-disclosure.js +0 -1
- package/dist/src/fold-runtime.js +0 -1
- package/dist/src/native-build-cache.js +0 -1
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{B as e,H as t,M as n,N as r,P as i,T as a,X as o,_ as s,b as c,c as l,d as u,o 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,c as C,f as w,m as ee,u as T,w as te}from"./sdk-device.js";import{f as ne,n as re,u as ie}from"./lease-scope.js";import{$t as ae,Bn as oe,Dr as se,Er as ce,Gn as le,Hn as ue,Ir as de,Jn as fe,Jr as E,Jt as pe,Qr as me,T as he,Un as ge,Wr as _e,Xr as ve,_n as ye,ar as be,en as xe,gn as Se,hn as Ce,kr as we,on as Te,or as Ee,sr as De,vn as Oe,yn as ke}from"./sdk-batch.js";import{u as Ae}from"./scroll-gesture.js";import{a as je,b as Me,f as Ne,g as Pe,n as Fe,p as Ie,r as Le,w as Re,y as ze}from"./script.js";import{a as Be}from"./session-store.js";import{C as Ve,E as He,J as Ue,S as We,T as Ge,x as Ke}from"./session-snapshot.js";import{a as qe,c as Je,i as Ye,l as Xe,n as Ze,o as Qe,r as $e,s as et,t as tt,u as nt}from"./format.js";import{A as rt,j as it}from"./parameterized-recorded-fill.js";import{E as at,F as ot,I as st,N as ct,O as lt,P as ut,w as dt}from"./runtime.js";import{i as ft}from"./back-mode.js";import{n as pt}from"./success-text.js";import{m as mt,o as ht,p as gt}from"./overlay.js";import{a as _t}from"./device.js";import{o as vt,r as D}from"./diagnostics.js";import{p as yt}from"./exec.js";import{t as bt}from"./timeouts.js";import"./diagnostics2.js";import{n as xt,r as St}from"./output-path.js";import"./command.js";import{a as Ct,n as wt,t as Tt}from"./replay-divergence.js";import{s as Et}from"./device-shell.js";import{n as Dt}from"./retry.js";import{t as Ot}from"./session-paths.js";import{n as O}from"./runtime-transport-hints.js";import{r as k}from"./rect-center.js";import{t as kt}from"./android-snapshot-quality.js";import{_ as At,a as jt,c as Mt,d as A,f as Nt,g as Pt,h as Ft,i as It,l as Lt,m as Rt,n as zt,o as Bt,p as Vt,r as Ht,s as Ut,u as Wt,v as Gt,y 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 an,l as on,n as sn,o as cn,r as ln,t as un}from"./device-claim-inspection.js";import{b as dn,c as fn,g as pn,i as mn,p as hn,x as gn}from"./perf-runtime-plan.js";import{n as _n,r as vn,t as yn}from"./lease-context.js";import{d as bn,g as xn,u as Sn}from"./screenshot-runtime.js";import{n as Cn,r as wn}from"./device-isolation.js";import{n as Tn}from"./device-inventory-context.js";import{n as En}from"./dispatch-resolve.js";import{t as Dn}from"./touch-reference-frame.js";import{n as On}from"./screen-recording-admission-ledger.js";import{a as kn,c as An,d as M,l as jn,n as Mn,o as Nn,r as Pn,u as Fn}from"./src8.js";import{i as In,n as N,r as Ln,t as Rn}from"./compatibility-policy.js";import{s as zn}from"./quality-warnings.js";import{t as Bn}from"./png-worker-client.js";import{a as Vn}from"./ios-snapshot-engine.js";import{o as Hn}from"./screen-recording-resource-recovery.js";import P from"node:path";import F,{promises as Un}from"node:fs";import Wn,{createHash as Gn}from"node:crypto";import Kn from"node:os";import I from"node:fs/promises";import{fileURLToPath as qn}from"node:url";import{setTimeout as Jn}from"node:timers/promises";import Yn from"node:vm";function Xn(e,t){return Zn(e,t)?t:`${e}:${t}`}function Zn(e,t){return t.startsWith(`${e}:`)}function Qn(e,t){return!e.partitioned||Zn(e.tenant,t)}var $n=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)}}},er=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())}},tr=class{holdsByDevice=new Map;mutations=new $n;inFlightWork=new er;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=Lt(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=Rt(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=Mt(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let n=Vt(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 Wt(i);return Ut(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=At(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);Bt(n,e),Ut(n,e);let r=e.ttlMs===void 0?Nt(n):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=At(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return Bt(n,e),Ut(n,e),{...n}}assertLeaseAdmission(e){let t=Ft(e);this.cleanupExpiredLeases(),Ut(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})=>zt(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,r,i){i?.throwIfAborted();let a=It(t),o=jt(r);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 n(`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,r,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 n(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...r===void 0?{}:{expiresAt:s+r}},this.refreshHeldLease(e,s),zt(t.hold)}catch(n){throw a.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=It(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),zt(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 Ht(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 n(`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 n(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new n(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let r=this.requireHumanControlLease(e.leaseId);return{backend:r.backend,leaseProvider:r.leaseProvider,deviceKey:r.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let r=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==r.leaseId||A(r)!==A(t.hold.scope))throw new n(`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,Nt(n),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=Pt(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 n(`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 n(`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(Vt(e),e.leaseId);let t=A(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.runBindings.delete(Vt(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 Wt(r)}};function nr(e){let t=Kt(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,i=Gt(r);if(r&&!i)throw new n(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!i)throw new n(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let a=e.session||`default`;return Zn(i,a)?{...e,meta:{...e.meta,tenantId:i,sessionIsolation:t}}:{...e,session:Xn(i,a),meta:{...e.meta,tenantId:i,sessionIsolation:t}}}function rr(e,t,r,i={}){if(bn(e.command))return;let a=_n(e);or(e,a);let o=r?.lease;if(r===void 0&&!a.leaseId&&ir(e,i.providerAppCatalog))return;if(e.command===`human_control`&&!o&&!a.leaseId)throw new n(`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;sr(a,o);let s=vn(e,r);t.assertLeaseAdmission(ie(s));let c=t.heartbeatLease(ie(s));return Sn(e)&&t.assertHumanControlAdmission(c),c}function ir(e,t){let n=xn(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function ar(e){bn(e.command)||or(e,_n(e))}function or(e,t){if(e.command!==`open`)return;let r=re(t);if(r.length!==0)throw new n(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:r})}function sr(e,t){t&&(L(`leaseId`,e.leaseId,t.leaseId),L(`tenantId`,e.tenantId,t.tenantId),L(`runId`,e.runId,t.runId),L(`leaseProvider`,e.leaseProvider,t.leaseProvider),L(`clientId`,e.clientId,t.clientId),L(`deviceKey`,e.deviceKey,t.deviceKey))}function L(e,t,r){if(!(!t||!r||t===r))throw new n(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function cr(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 lr(e){ar(e)}async function ur(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 dn(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 dr(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.get(t),a=rr(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 fr(e){return yn(e.req,e.req.internal?.admittedLease)??e.existingLease}async function pr(e){let t=e.session.lease;if(!t)return;let n=ne({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 mr=[`platform`,`target`],hr=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function gr(e){return C({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function _r(e){return gr(e)||br(e,mr)}function vr(e){return _r(e)||br(e,hr)}function yr(e){return typeof e==`string`&&e.trim().length>0}function br(e,t){return e?t.some(t=>yr(e[t])):!1}function xr(e){return{appleSimulatorAppTarget:Sr(e)}}function Sr(e){return e&&!f(e)?e:void 0}function Cr(){return On({displayName:`audio probe`})}function wr(){return On({displayName:`perf capture`})}function Tr(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return Gn(`sha256`).update(be(t),`utf8`).digest(`hex`)}function Er(e,t,n){return new Fr(Or(Dr(t.resolve(e))),n).parse()}function Dr(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function Or(e){let t=[],r=0;for(;r<e.length;){let i=e.slice(r),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){r+=a;continue}let o=kr(i);if(!o)throw new n(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);t.push(o.value),r+=o.length}return t}function kr(e){return Ar(e)??jr(e)??Mr(e)??Nr(e)??Pr(e)}function Ar(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function jr(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function Mr(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function Nr(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Pr(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Fr=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let e=this.parseOr();if(this.peek())throw new n(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new n(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new n(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.consumePlatformToken();let e=this.consumeComparisonOperator(),t=this.consumeStringLiteral(),n=this.platform===t.toLowerCase();return e.value===`==`?n:!n}consumePlatformToken(){if(this.peek()?.type!==`platform`)throw new n(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}consumeComparisonOperator(){let e=this.peek();if(e?.type!==`operator`||e.value!==`==`&&e.value!==`!=`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,e}consumeStringLiteral(){let e=this.peek();if(e?.type!==`string`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`);return this.index+=1,e.value}consumeOperator(e){let t=this.peek();return t?.type!==`operator`||t.value!==e?!1:(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type!==`paren`||t.value!==e?!1:(this.index+=1,!0)}peek(){return this.tokens[this.index]}};function Ir(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function Lr(e,t){return{...Kr(e,t),source:e.source}}function R(e,t,r){if(e===void 0)return;let i=r??kn[t]??{},a=Nn(i),o;if(typeof e==`number`)o=e;else{let r=e.trim();if(r===``)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);o=Number(r)}if(!Number.isFinite(o)||Math.abs(o)>2**53-1||i.integer&&!Number.isSafeInteger(o)||i.nonNegative&&o<0||i.positive&&o<=0)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);return o}function Rr(e,t,n,r){return R(e===void 0?t:n.resolve(String(e)),r)}function z(e){if(e?.aborted)throw i()}async function zr(e,t){if(e.include.kind===`commands`)return{kind:`program`,source:e.source,config:{},commands:e.include.commands};if(!t.loadProgram)throw new n(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return z(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 Br(e,t){if(e.include.kind===`file`)return P.resolve(t?P.dirname(t):process.cwd(),e.include.path)}function Vr(e){return e===void 0?void 0:P.resolve(e)}function Hr(e,t){let r=Br(e,e.source.path);if(r&&t.has(r))throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);return r}function Ur(e,t,r,i){let a=e.include.kind===`file`?Vr(t.source.path):void 0,o=new Set([r,a].filter(e=>e!==void 0)),s=[...o].find(e=>i.has(e));if(s)throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function Wr(e,t,n){return e.platform&&e.platform!==n.platform?!1:e.true===void 0?!0:typeof e.true==`boolean`?e.true:Er(e.true,t,n.platform)}function Gr(e){return[...e.visible?[{kind:`visible`,selector:e.visible}]:[],...e.notVisible?[{kind:`notVisible`,selector:e.notVisible}]:[]]}function Kr(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>Kr(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Kr(n,t)])):e}async function qr(e,t){z(t.signal);let n=Vr(e.source.path),r={options:t,context:An(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await Jr(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function Jr(e,t,n,r,i){z(i.options.signal);let a=ai(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 Xr(s,a,o,e.source.path??r,i));return n}finally{s()}}async function Yr(e,t,n,r,i){let a=[];for(let o of e)a.push(...await Xr(o,t,n,r,i));return a}async function Xr(e,t,n,r,i){z(i.options.signal);let a=oi(e,r);switch(a.kind){case`runFlow`:{let e=Qr(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await Zr(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[ri(a,t,n,o)]}case`repeat`:return[ri(a,t,n,await Yr(a.commands,t,n,r,i))];case`retry`:return[ri(a,t,n,await Yr(a.commands,t,n,r,i))];default:return[ni(a,t,n)]}}async function Zr(e,t,n,r,i){let a=ei(e,i.context),o=Hr(a,i.activeIncludePaths),s=await zr(a,i.options);z(i.options.signal);let c=Ur(a,s,o,i.activeIncludePaths),l=ai(t,e.env),u=i.context.enter(e.env);try{return await Jr(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function Qr(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:$r(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function $r(e,t){if(e===!1)return`omit`;if(typeof e==`string`)return ti(t.context.resolveDeferred(e))?`opaque`:Er(e,t.context,t.options.platform)?void 0:`omit`}function ei(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function ti(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function ni(e,t,n){return M({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function ri(e,t,n,r){return M({kind:`opaque`,command:ii(e),source:e.source,scopes:t,body:r,appId:n})}function ii(e){switch(e.kind){case`runFlow`:return M({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 M({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function ai(e,t){return t===void 0?e:[...e,t]}function oi(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function si(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await qr(e,t),a=ci(t.runtimeHints),o=M({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=Tr(o);return li({...o,digest:s})}function ci(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 li(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))li(t);return Object.freeze(e)}function ui(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 di(e,t={}){let r=ui(e,t);if(!r.allowed)throw new n(`INVALID_ARGS`,r.reason);return r.startIndex}function fi(e,t){if(!Number.isInteger(t)||t<0||t>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${t} is out of range for a ${e.total}-step plan.`);return t}const pi=`maestro-test-failure`;function mi(e,t={}){return new n(`COMMAND_FAILED`,e,{...t,reason:pi})}function hi(e){return e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===pi}const gi=new Set([``,`false`,`0`,`null`,`undefined`]);function _i(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0&&!Number.isNaN(e):!gi.has(e)}async function vi(e,t){z(t.options.signal);try{return await Ni(e,t.context,async()=>await yi(e,t))}catch(t){throw Pi(t,e)}}async function yi(e,t){if(e.kind===`command`)return await bi(e.command,e.appId,t);await Ei(e,t)}async function bi(e,t,n){if(e.kind===`evalScript`)return await Ci(e,n);let r=Lr(e,n.context);try{return await wi(r,t,n)}catch(e){if(z(n.options.signal),Si(r)&&hi(e)){n.warnings.push(xi(r,e)),n.skipped+=1;return}throw Fi(e,r)}}function xi(e,t){let r=`${e.source.path?`${e.source.path}:`:``}line ${e.source.line}`,i=t instanceof n?t.message:String(t);return`Optional Maestro ${e.kind} skipped at ${r}: ${i}`}function Si(e){return`optional`in e&&e.optional===!0}async function Ci(e,t){let{evaluateMaestroEvalScript:r}=await import(`./engine-eval-script.js`);if(t.options.trustedScripts===!1)throw new n(`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(e.script,t.context.values);t.context.replaceOutput(i),t.executed+=1}async function wi(e,t,n){switch(e.kind){case`assertVisible`:await Ai({kind:`visible`,selector:e.target},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await Ai({kind:`notVisible`,selector:e.target},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`assertTrue`:if(!_i(e.condition))throw mi(`Maestro assertTrue condition was falsy: ${JSON.stringify(e.condition)}`);n.executed+=1;return;case`extendedWaitUntil`:await Ai(Mi(e),R(e.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await Ti(e,t,n)}}async function Ti(e,t,n){let r=M({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 z(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 Ei(e,t){let n=Lr(e.command,t.context);switch(n.kind){case`runFlow`:if(n.when&&!await ki(n.when,t)){t.skipped+=1;return}t.executed+=1,await Di(e.body,t);return;case`repeat`:{let r=Rr(n.times,0,t.context,`repeat.times`);t.executed+=1;for(let n=0;n<r;n+=1)z(t.options.signal),await Di(e.body,t);return}case`retry`:{let r=Math.min(Rr(n.maxRetries,1,t.context,`retry.maxRetries`),N.control.retryMaxRetries);t.executed+=1,await Oi(e.body,r,t);return}}}async function Di(e,t){for(let n of e)await vi(n,t)}async function Oi(e,t,r){let i;for(let n=0;n<=t;n+=1){z(r.options.signal);try{await Di(e,r);return}catch(t){if(z(r.options.signal),!hi(Li(t)))throw t;i=Pi(t,e[0])}}throw i||new n(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function ki(e,t){if(!Wr(e,t.context,t.options))return!1;for(let n of Gr(e))if(z(t.options.signal),!(await ji(n,t.timing.runFlowConditionTimeoutMs,t)).matched)return!1;return!0}async function Ai(e,t,n){if(!(await ji(e,t,n)).matched)throw mi(`Maestro ${e.kind} condition did not match.`)}async function ji(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 z(n.options.signal),n.context.recordObservation(i),i}function Mi(e){if(e.visible)return{kind:`visible`,selector:e.visible};if(e.notVisible)return{kind:`notVisible`,selector:e.notVisible};throw new n(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function Ni(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 Pi(e,t){if(Ii(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:Ri(e,t?.command),source:n,...t?{command:t.command}:{}}}function Fi(e,t){return{kind:`maestroPlanStepFailure`,error:Ri(e,t),source:t.source,command:t}}function Ii(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function Li(e){return Ii(e)?e.error:e}function Ri(e,t){if(!(e instanceof n)||!t||/\bline \d+\b/.test(e.message))return e;let r=t.source.path?`${t.source.path}:`:``;return new n(e.code,`${e.message} (${r}line ${t.source.line})`,e.details)}async function zi(e,t,r={}){z(r.signal);let i=r.startIndex??0;if(!Number.isInteger(i)||i<0||i>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${e.total}-step plan.`);let a={plan:e,port:t,options:r,context:An(r.defaults,r.env?{...r.env}:{}),timing:Rn,artifacts:new Set,warnings:[],executed:e.compatibility.staticallyExecutedControls,skipped:e.compatibility.staticallySkippedControls};for(let t=i;t<e.steps.length;t+=1)try{await Bi(e.steps[t],t,a)}catch(e){throw Li(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function Bi(e,t,n){z(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};Hi(()=>n.options.observer?.commandStarted?.(s));try{let t=await vi(e,n);z(n.options.signal),Hi(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...Vi(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=Pi(t,e);throw Hi(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...Vi(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],warnings:[...n.warnings]})),o}}function Vi(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 Hi(e){try{e?.()}catch{}}async function Ui(e,t,n={}){let r=Wi(e,n);return await zi(e,t,{...n,startIndex:r})}function Wi(e,t){return t.from!==void 0||t.planDigest!==void 0?di(e,{from:t.from,planDigest:t.planDigest}):fi(e,t.startIndex??0)}function Gi(e){return Ir(e)?{command:e.kind,...e.kind===`runFlow`?B(e.label??e.includePath):{}}:{command:e.kind,...Ki(e)}}function Ki(e){return`label`in e&&e.label?B(e.label):qi(e)?B(ea(e.target)):Ji(e)?Yi(e):e.kind===`inputText`?B(`<text>`):Xi(e)}function qi(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function Ji(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function Yi(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return B(ta(e.target));case`extendedWaitUntil`:return B(ta(e.visible??e.notVisible));case`scrollUntilVisible`:return B(ta(e.element))}}function Xi(e){return Zi(e)?Qi(e):e.kind===`swipe`?$i(e):e.kind===`runFlow`?B(e.label??(e.include.kind===`file`?e.include.path:``)):e.kind===`assertTrue`?B(String(e.condition)):{}}function Zi(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function Qi(e){switch(e.kind){case`openLink`:return B(e.link);case`takeScreenshot`:return B(e.path);case`runScript`:return B(e.file);case`pressKey`:return B(e.key)}}function $i(e){return B(e.gesture.kind===`coordinates`?`${na(e.gesture.start)} to ${na(e.gesture.end)}`:e.gesture.direction)}function ea(e){return e.space===`target`?ta(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function ta(e){return e?.id??e?.text}function na(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function B(e){return e?{value:e}:{}}const ra=new Set(String.raw`^$\.*+?()[]{}|`);function ia(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function aa(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(ra.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!ra.has(i))return;t+=i,n+=1}return t}function oa(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=>we(e,n)?e:null);return r?E(r.rect)?t.isVisibleInEffectiveViewport(r):n!==`android`&&r.hittable===!0:!1}function sa(e,t,n){return!!n.findAncestor(e,e=>e.index===t.index?e:null)}function ca(e,t){let n=[t.id===void 0?void 0:ua(e.identifier,t.id),t.text===void 0?void 0:da(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 la(e){return e.matches.filter(t=>oa(t,e.visibility,e.platform))}function ua(e,t){let n=e??``;return Fn(n)===Fn(t)||ia(n,t)}function da(e,t){return[e.label,jn(e),e.identifier].filter(e=>!!e).some(e=>ua(e,t))}function fa(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 pa(e){return e.text!==void 0||e.id!==void 0||e.enabled!==void 0||e.selected!==void 0}function ma(e,t,n){let r=[],i=0;for(let a of e)for(let e of n){let n=ga(a.rect,e.rect);n===void 0||!ha(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 ha(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 ga(e,t){if(!(!_a(e)||!_a(t)))return Math.fround(Math.hypot(va(e.x,e.width)-va(t.x,t.width),va(e.y,e.height)-va(t.y,t.height)))}function _a(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite))}function va(e,t){return e+Math.trunc(t/2)}function ya(e,t={},r={}){let i=ce(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=ma(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 n(`INVALID_ARGS`,`Maestro selector relations cannot contain cycles.`);o.add(i),t.onSelectorComputed?.(i);try{let t=ba(e,i,l,u,m,p),n={matches:t,indexed:wa(t,i.index,r.orderUnindexed)};return a.set(i,n),n}finally{o.delete(i)}};return{visibility:i,resolve:m,resolvePosition:f}}function ba(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=pa(m)?e.nodes.filter(e=>ca(e,m)):[...e.nodes];if(s){let e=new Set(i(s).indexed.map(e=>e.index));h=h.filter(t=>Sa(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=>xa(i(e).indexed,r));h=h.filter(t=>e.every(e=>e.has(t.index)))}for(let[e,n]of Ca(t)){let t=a(e,n);h=h.filter(e=>t.has(e.index))}return h}function xa(e,t){let n=new Set;for(let r of e)for(let e of t(r))n.add(e);return n}function Sa(e,t){for(let n of e)if(t.has(n))return!0;return!1}function Ca(e){return[[`below`,e.below],[`above`,e.above],[`leftOf`,e.leftOf],[`rightOf`,e.rightOf]].filter(e=>e[1]!==void 0)}function wa(e,t,n){if(t===void 0)return n?n(e):[...e];let r=Ea(e)[Oa(t)];return r?[r]:[]}function Ta(e,t){return t===void 0?e[0]:Ea(e)[Oa(t)]}function Ea(e){return[...e].sort((e,t)=>{let n=Da(e.rect?.y),r=Da(t.rect?.y);return n===r?Da(e.rect?.x)-Da(t.rect?.x):n-r})}function Da(e){return e!==void 0&&Number.isFinite(e)?e:2**53-1}function Oa(e){let t=typeof e==`number`?e:Number(e.trim());if(!Number.isSafeInteger(t)||t<0)throw new n(`INVALID_ARGS`,`Maestro selector.index must be a non-negative integer.`);return t}const ka={android:{kind:`exact`,provider:`android-helper`},ios:{kind:`divergence`,provider:`apple-xctest`,reason:`maestro-clickable-not-exposed-by-provider`}};function Aa(e,t){let n=ka[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 ja(e,t){return t.kind===`exact`?e.map((e,n)=>({node:e,order:n,rank:Ma(t.clickableByNodeIndex.get(e.index))})).sort((e,t)=>t.rank-e.rank||e.order-t.order).map(({node:e})=>e):[...e]}function Ma(e){return e===!0?2:+(e===!1)}function Na(e,t,n,r={}){let i=Aa(e,n),a=Fa(e,i,r),o=Pa(t,a),s=la({visibility:a.visibility,matches:o.matches,platform:n});return{...o,visible:s,clickability:i,ranked:Ia(s,t,n,a.visibility,i)}}function Pa(e,t){return{matches:t.resolve(e).matches,parentMatched:e.childOf===void 0||t.resolve(e.childOf).indexed.length>0}}function Fa(e,t,n={}){return ya(e,n,t?{orderUnindexed:e=>ja(e,t)}:{})}function Ia(e,t,n,r,i){let a=n!==`ios`||!Va(t)?e:e.filter(n=>{if(Ga(n))return!0;let i=e.filter(e=>e!==n&&Ha(n,e,t));return!i.some(e=>Ga(e)&&sa(n,e,r))&&!i.some(e=>sa(e,n,r))});return t.index===void 0&&i?ja(a,i):a}function La(e,t){let n=t===void 0?e.find(Ba):Ra(e,t);return!n||!Ba(n)?null:{node:n,rect:n.rect}}function Ra(e,t){return Ta(e,t)}function za(e){return Ba(e)?e.rect:void 0}function Ba(e){return E(e.rect)}function Va(e){return e.id!==void 0||e.text!==void 0}function Ha(e,t,n){if(n.id!==void 0&&Wa(e.identifier)!==Wa(t.identifier))return!1;if(n.text!==void 0){let n=Ua(e),r=new Set(Ua(t));if(!n.some(e=>r.has(e)))return!1}return!0}function Ua(e){return[e.label,e.value,e.identifier].map(Wa).filter(e=>e!==void 0)}function Wa(e){if(e)return Fn(e)||void 0}function Ga(e){let t=de(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}const Ka=Symbol(`maestroFlowProgram`),qa=Symbol(`maestroFailureCommand`),Ja=Symbol(`maestroFailurePlan`);function Ya(e,t){let n=Pn(e,{sourcePath:t});return{sourcePath:t,name:n.config.name,appTarget:eo(n),[Ka]:n}}async function Xa(e,t,n){let r;try{let i=Mn(P.dirname(e.sourcePath),n.readSource),a=await si(e[Ka],{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,runtimeHints:n.runtimeHints,loadProgram:i,signal:n.signal}),o=di(a,{from:n.from,planDigest:n.planDigest}),s=await Ui(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:Qa(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 Za(e,t){let n=no(e[qa]),r=e[Ja].platform;return!n||r!==`android`&&r!==`ios`?[]:Na(t,n.selector,r).ranked.map(e=>({node:e,basis:ro(n.selector,e)}))}function Qa(e,t,n){return{commandStarted:e=>t?.actionStarted?.($a(e)),commandCompleted:e=>t?.actionCompleted?.({...$a(e),durationMs:e.durationMs,runtimeMetrics:e.runtimeMetrics,data:e.data}),commandFailed:r=>{let i=ui(e,{from:r.stepIndex,planDigest:e.digest}),a={...$a(r),durationMs:r.durationMs,error:r.error,artifactPaths:r.artifactPaths,warnings:[...r.warnings],isControl:Ir(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},[qa]:r.command,[Ja]:e};n(a),t?.actionFailed?.(a)}}}function $a(e){let t=Gi(e.command);return{action:t.command,...t.value?{value:t.value}:{},source:e.source,generation:e.generation,stepIndex:e.stepIndex,stepTotal:e.stepTotal}}function eo(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(to)}function to(e){return!!(e?.trim()&&!e.includes(`$`)&&!f(e))}function no(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 ro(e,t){return e.id!==void 0||e.text!==void 0&&ca({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text===void 0?`other`:`label`}function V(e,t){return M({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function io(e){return M({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function ao(e,t){let n=uo(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},io(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:oo(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function oo(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function so(e,t,n,r){let i=uo(await r.resolveTarget({selector:e,...t},V(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw mi(`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 co(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 lo(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 uo(e,t){return fo(e,t),po(e),mo(e),ho(e),e}function fo(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function po(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function mo(e){if(e.rect!==void 0&&!lo(e.rect)||e.viewport!==void 0&&!lo(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function ho(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function go(e,t,n,r,i,a={}){let o=_o(e,t,n,i,a);if(!o)return;let{start:s,end:c}=So(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function _o(e,t,n,r,i){let a=n===`up`||n===`down`,o=Fa(e,Aa(e,r),i),s=o.visibility,c=la({visibility:s,matches:e.nodes.filter(e=>_e(e)),platform:r}),l=ve(s.viewportRects)??yo(c);if(!l||!E(l))return;let u=c.flatMap(e=>{if(!E(e.rect))return[];let t=bo(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=vo(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(xo)[0]?.viewport}function vo(e,t){return _e(e)?e:se(e,t)}function yo(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 bo(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 xo(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function So(e,t){let n=H(e,.5,.5),r=N.scrollUntilVisibleSwipe.nearEdgeFraction,i=N.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:H(e,.5,i)};case`down`:return{start:n,end:H(e,.5,r)};case`left`:return{start:n,end:H(e,i,.5)};case`right`:return{start:n,end:H(e,r,.5)}}}async function Co(e,t,r){let i=R(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new n(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(V(t,t.command)):void 0;return{authored:e,gesture:To(await wo(e.start,t,r,a),await wo(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(V(t,t.command)),{start:a,end:o}=Eo(n,e.direction,r.platform);return{authored:e,gesture:To(a,o,i),viewport:n}}let a=await so(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?N.command.optionalTargetLookupTimeoutMs:N.command.targetLookupTimeoutMs},t,r),o=a.viewport??await r.resolveGestureViewport(V(t,t.command)),{start:s,end:c}=Do(a,e.direction,o);return{authored:e,gesture:To(s,c,i),target:a,viewport:o}}async function wo(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(V(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 To(e,t,n){return{from:e,to:t,durationMs:n??N.command.swipeDurationMs}}function Eo(e,t,n){if(t===`left`||t===`right`){let n=Ae(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=N.screenSwipe,i=H(e,r.centerFraction,r.nearEdgeFraction),a=H(e,r.centerFraction,r.farEdgeFraction),o=H(e,r.centerFraction,r.downStartFraction),s=H(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function H(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Do(e,t,n){let r=k(e.rect),i=n.x+Math.trunc(n.width*N.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*N.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*N.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*N.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 Oo={launchApp:U,stopApp:U,setPermissions:U,clearState:U,openLink:U,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},ko={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 Ao(e){return ko[e.kind]}async function jo(e,t){let n=e.command;return await Mo(n,e,t,V(e,n))}function Mo(e,t,n,r){let i=Oo[e.kind];return i(e,t,n,r)}async function U(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 M({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=R(e.delay,`doubleTapOn.delay`)??N.command.repeatDelayMs;return await G(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?co(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?co(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?co(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?N.command.optionalTargetLookupTimeoutMs:N.command.targetLookupTimeoutMs}function zo(e,t){let n=R(e.repeat,`tapOn.repeat`),r=R(e.delay,`tapOn.delay`),i=n===void 0?r:r??N.command.repeatDelayMs;return M({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Bo(e,t,n,r){let i=await Co(e.gesture,t,n);return await G(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?co(i.target):void 0)}async function Vo(e,t,n,r){switch(e.kind){case`inputText`:return await G(n.inputText,M({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await G(n.eraseText,M({charactersToErase:R(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:R(e.timeout,`scrollUntilVisible.timeout`)??N.command.scrollUntilVisibleTimeoutMs,durationMs:In(N.command.scrollUntilVisibleSpeed)}}function Uo(e){return M({timeoutMs:R(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,M({file:e.file,env:e.env}),r,`preserve`)}}async function Go(e){throw new n(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function Ko(e){throw new n(`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 n(`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 so(e.selector,t,n,r);return{authored:e,point:k(i.rect),resolution:i}}return{authored:e,point:await wo(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):Na(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?Ra(s,t.selector.index):La(s,t.selector.index)?.node,l=cs(t,o,s,c);if(!c)return as(t,o,s,l);let u=i?La(i.visibleForSource(c),void 0):null,d=za(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=fa;function rs(e){let t=ce(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=>oa(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=Aa(e,`ios`),i=ya(e,{},{orderUnindexed:e=>ja(e,r)}),a=Pa(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:Ia(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 M({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const K={settleTimeoutMs:Ln,retryTapMaxAttempts:N.command.retryTapMaxAttempts,longPressDurationMs:N.command.longPressDurationMs,eraseTextMaxCharacters:N.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:N.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:N.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:N.command.waitForAnimationToEndDifferencePercent,observationPollMs:N.observation.pollIntervalMs};function ls(e,t={}){return{execute:async n=>{let r=V(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ao(n.command)&&!i,visualStabilityBarrier:i});let a=await jo(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await ao(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 q(e,t){let r=e.files[t];if(r===void 0)throw new n(`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 r}function ds(e){let t=fs(e),n=be(t);return Gn(`sha256`).update(n,`utf8`).digest(`hex`)}function fs(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)=>ps(e,n[t]??null,r?.[t]??null))}}function ps(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 ms(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=hs({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function hs(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>gs({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>_s({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>vs(n,r)];for(let e of s){let t=e();if(t)return t}}function gs(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 _s(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 vs(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 ys(e,t){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new n(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=Fe(e),a=Le(e),o=ds({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:t?.platform??je(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=>ms(e,s,o)}}function bs(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function xs(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&ye(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Ss(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 Cs(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Ss(i,a);return{matchCount:n,observed:r,mismatches:[...r?ge(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 ws(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...ge(e,r),...ue(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 Ts(e,t,n,r,i,a){if(n.targetEvidences)return Es(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return J(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return J(e,n,r,i,a);if(s.kind===`post-resolution`){let c=bs({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return J(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return Os(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=xs({recorded:o,token:s.token});if(c.kind===`skip`)return J(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,Ds(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?Os(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 Es(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return J(e,n,r,i,a);let d=xs({recorded:o[c],token:u.token});if(d.kind===`skip`)return J(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,Ds(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 Os(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function Ds(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function J(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function Os(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=ks(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=As(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 ks(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 As(e,t,n){return n.status===`guard-mismatch`?Cs(e,n.evidence,t):ws(e,n.evidence)}async function js(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Ye(e.varSources),o=[],s=[],c=Fs(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Ps(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Is(u,n.length,r,e))}let d=nt(r,a,Ns(e,u)),f=qe(a),p=t.diagnosticsMarker(),m=await Ts(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:Ms(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 Ms(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Ns(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Ps(e){return!!(e&&e.command!==`replay`)}function Fs(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Ps(n))return n.command===`close`?t:void 0}}function Is(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function Ls(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=ye(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function Rs(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),Pe(e.command)){let n=zs(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=ye(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Ls([...e.positionals]);n&&t.push(n)}return De(t).filter(e=>e.trim().length>0)}function zs(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Bs(n)?t.slice(0,-1):t}function Bs(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Vs(e){let t=P.dirname(e),n=P.basename(e,P.extname(e));return P.join(t,`${n}.healed.ad`)}function Hs(e){let t=Us({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 Us(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Ws({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Ws(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 Gs(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Ks(n))return`manual`;let i=qs(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Ks(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Js(e.scrollRegion)}function qs(e,t){let n=ot(t),r=Xs(e.ancestry,n,t),i=e.scrollRegion;return i&&Js(i)?r&&Ys(i,n,t):r}function Js(e){return e.id!==void 0||e.label!==void 0}function Ys(e,t,n){return n.some(n=>He(We(n,t),e))}function Xs(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=ut(n,t,e.length);return!r.broken&&le(r.chain,e)})}function Zs(e){let{sessionStore:t,observationStore:n,divergence:r,responseLevel:i}=e,a,s,c=Tt({divergence:r,level:i,writeOverflowArtifact:e=>{let n=o(e),r=ec(t,n);return`artifactPath`in r&&(a=n,s=r.artifactPath),r}}),l=(a??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 $s(s),Qs(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:($s(s),Qs(c,u.reason))}function Qs(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 $s(e){if(e)try{F.unlinkSync(e)}catch{}}function ec(e,t){try{let n=P.join(e.ensureSessionDir(),`replay-divergence`);F.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=P.join(n,r);return F.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const tc={id:0,"role-label":1,label:2,other:3};function nc(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||rc(n.basis)<rc(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>rc(e.basis)-rc(t.basis)||e.nodeIndex-t.nodeIndex)}function rc(e){return tc[e]}async function ic(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=wt(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await sc({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=dc(v,g),b=v.state===`available`&&o?gc({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=Gs({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:ac(v)}),S=Hs({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return Zs({sessionStore:s,observationStore:c,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Ne(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 ac(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const oc=[300,500,800,1200,2e3,3e3,4e3];async function sc(e){let{session:t,observationStore:n,logPath:r,action:i,retryLaunchRace:a=!1}=e,o=lc(i),s=Date.now()+12e3,c=await cc({session:t,observationStore:n,logPath:r,flags:o});if(!a)return c.observation;for(let e of oc){if(c.observation.state===`available`||!c.retryable)break;let i=s-Date.now();if(i<=0)break;await bt(Math.min(e,i)),c=await cc({session:t,observationStore:n,logPath:r,flags:o})}return c.observation}async function cc(e){let{session:t,observationStore:n,logPath:r,flags:i}=e;try{let e=(await n.capture({flags:i,logPath:r})).snapshot;if(zn(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:kt(e)}}}function lc(e){return{snapshotInteractiveOnly:uc(e)}}function uc(e){return!_c(e.command)||vc(e).requiresRect}function dc(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=hc(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function fc(e){return!!gt(e,mt(e.type??`Element`))||e.hittable===!0}function pc(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function mc(e,t){let n=ct(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&fc(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=>pc(e,t)),...o.filter(e=>!pc(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function hc(e,t,n){let{nodes:r,truncated:i}=mc(e,n);return{refs:r.map(e=>{let n=mt(e.type??`Element`),r=gt(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function gc(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!_c(t.command))return[];let a=Rs(t);return a.length===0?[]:yc({candidates:a,nodes:r,session:n,action:t,matching:vc(t),sanitize:i})}function _c(e){return Pe(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function vc(e){let t=Pe(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function yc(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=bc({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return nc(s).map(e=>e.suggestion)}function bc(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=ke(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:xc({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function xc(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Ce(t,r.device.platform,{action:i.command===`fill`?`fill`:Pe(i.command)?`click`:`get`,nodes:n}),c=mt(t.type??`Element`),l=gt(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function Sc(e){return{...e,hint:e.hint??Tc(e.details,`hint`),diagnosticId:e.diagnosticId??Tc(e.details,`diagnosticId`),logPath:e.logPath??Tc(e.details,`logPath`)}}function Cc(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return wc({error:t,actionLabel:Ne(n),action:n.command,positionals:Be(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function wc(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:Ct(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Ct(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Dc(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>Ct(e,u))}:{},divergence:l}}}}function Tc(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const Ec=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function Dc(e){if(!e)return{};let t={};for(let n of Ec)e[n]!==void 0&&(t[n]=e[n]);return t}async function Oc(e){return await kc({...e,snapshotDiagnostics:g(e.snapshotDiagnosticSamples)})}async function kc(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 _=Ac(t.error.details?.replaySource),v=Sc(t.error),y=await ic({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 Cc({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Ac(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 jc(e,t){if(e)try{F.appendFileSync(e,`${JSON.stringify(o(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 Mc(e){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}=e,h=Date.now();jc(d,{type:`replay_action_start`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:Be(o)??[]});let g;try{g=await Pc({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f,resolvedSessionScope:p,dependencies:m})}catch(e){if(!(e instanceof n))throw e;g={ok:!1,error:t(e)}}let _=Date.now();return jc(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?Ic(g.data):void 0,errorCode:g.ok?void 0:g.error.code}),Nc(g,u??s,c)}function Nc(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 Pc(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a,resolvedSessionScope:o,dependencies:s}=e,c=Lc(t.flags,r.flags),l=i.command===`fill`?it(rt(i)):void 0;return l&&(c.recordAs=l),await a(Fc({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 Fc(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:Me(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:Re(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Ic(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 Lc(e,t){return h(e,{...t??{}})}function Rc(e){return Gc(e.ok?Bc(e.data):zc(e.error.details?.artifactPaths))}function zc(e){return Array.isArray(e)?e.filter(Wc):[]}function Bc(e){return e?[Uc(e.path),Uc(e.outPath),...Vc(e.artifacts)].filter(Wc):[]}function Vc(e){return Array.isArray(e)?e.map(Hc).filter(Wc):[]}function Hc(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Uc(t.localPath)??Uc(t.path)}function Uc(e){return typeof e==`string`?e:void 0}function Wc(e){return typeof e==`string`}function Gc(e){return[...new Set(e.filter(Kc))]}function Kc(e){try{return F.statSync(e).isFile()}catch{return!1}}function qc(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Jc({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=ot(r),u=oe(t),d=st(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Ve(r,e)===t.sibling),p=d.filter(e=>He(We(e,l),t.scrollRegion)),m=Ge(p)[t.viewportOrder]?.ref,h=Ue({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,...Zc({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Jc(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Yc(n,t,i,a):Xc(n,t,r,a,o)}function Yc(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),o=a(t),s=o?c(e,o):null;if(i(s))return{matchedNodes:[s],winnerRef:s.ref};let l=n?at(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Xc(e,t,n,r,i){let a=Oe(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=dt(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Zc(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?Qc(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?Qc(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?Qc(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 Qc(e,t,n){let r=Ke(t),i=ut(t,n,Math.max(e.ancestry.length,1)).chain;return[...ge(e,r),...ue(e.ancestry,i)].slice(0,5)}function $c(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=ze(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=ye(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!Pe(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(tl(r)&&tl(n[1])))return r}function el(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function tl(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function nl(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=wt(f),g={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:fl(oe(n),h),...t.observed?{observed:fl(t.observed,h)}:{},mismatches:t.mismatches.slice(0,5).map(e=>h(e)),candidates:t.candidateNodes.slice(0,5).map(e=>pl(e,h))},_=Gs({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),v=Hs({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(Ne(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=Zs({sessionStore:l,observationStore:e.observationStore,divergence:y,responseLevel:d,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return Cc({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:f})}function rl(e,t,n){let r=wt(e.scrubVars);return nl(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:dc(n,r),publicationEvidence:sl(n),repairCapture:ac(n)})}async function il(e){let{session:t,observationStore:n,logPath:r,action:i,unavailableHint:a}=e;return t?await sc({session:t,observationStore:n,logPath:r,action:i}):{state:`unavailable`,reason:`no-session`,hint:a}}async function al(e,t){return rl(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 il({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function ol(e,t,n){return rl(e,t,await il({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function sl(e){return e.state===`available`?e.evidence:void 0}function cl(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?he(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Te(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:$c(n,i),platform:a.device.platform}:{kind:`inactive`}}function ll(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=vc(r),s=qc({recorded:t,token:n,nodes:i,platform:a,refLabel:el(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Ke(s.winnerNode),structural:fe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Ke(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function ul(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function dl(e){return!e.ok&&e.error.details?.reason===lt}function fl(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function pl(e,t){let n=mt(e.type??`Element`),r=gt(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function ml(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 hl(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 gl(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 _l(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 vl(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:hl(e?.observed),expectedStructural:_l(e?.expectedStructural),observedStructural:_l(e?.observedStructural)}}function yl(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:hl(e?.observed),observedAncestry:gl(e?.observedAncestry)}}function bl(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function xl(e,t,n){let r=bl(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&ul(e)?{status:`guard-mismatch`,evidence:vl(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&dl(e)?{status:`landmark-mismatch`,evidence:yl(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function Sl(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,bl(Cl(e),Rc(e)));return{runtime:{beginTargetVerification(e,n,r,i){return cl({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await sc({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 ll({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 Mc({req:ml(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,Rc(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:xl(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await al(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=rl(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await ol(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=Cl(o),u=await wl(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=>Tl(e),onStep:i,diagnosticsMarker:()=>Dl(t.sessionStore),diagnosticsSince:e=>Ol(t.sessionStore,e)},readLastResponse:()=>o}}function Cl(e){return e&&!e.ok?e:d(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function wl(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return El(i)?c(i):c(await Oc({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 Tl(e){let t=e.positionals??[],n=Se(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function El(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 Dl(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function Ol(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function kl(e){let t=je(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return Ml(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function Al(e,t){return t===`ios`?Nl(e)??{}:{}}function jl(e,t){let n=kl(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function Ml(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!f(e))}function Nl(e){let t=Sr(e);return t?{appleSimulatorAppTarget:t}:void 0}function Pl(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Fl(t,i)};return Ll(o,`AD_PLATFORM`,a.platform??r.platform),Ll(o,`AD_TARGET`,a.target??r.target),Ll(o,`AD_DEVICE`,a.device),Ll(o,`AD_DEVICE_ID`,Il(a)),Rl(o,`AD_SHARD_INDEX`,a.shardIndex),Rl(o,`AD_SHARD_COUNT`,a.shardCount),Ll(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Fl(e,t){let n=e.meta?.cwd??process.cwd();return P.relative(n,t)||t}function Il(e){return typeof e.serial==`string`?e.serial:e.udid}function Ll(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Rl(e,t,n){typeof n==`number`&&(e[t]=String(n))}const zl=3e4,Bl=1e3;function Vl(e){let{scriptPath:r,env:i,publicNetworkOnly:a}=e,o=F.readFileSync(r,`utf8`),s=Object.create(null);try{Yn.runInNewContext(o,Hl(i,s,a),{filename:r,timeout:zl})}catch(e){let i=t(e);throw new n(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}),e instanceof Error?e:void 0)}return Yl(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Xl(t)]))}function Hl(e,t,n){return{...e,output:t,json:Ul,http:{post:(e,t)=>Gl(`POST`,e,n,t)}}}function Ul(e){if(typeof e!=`string`)throw new n(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new n(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Wl)}catch(t){throw new n(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Bl)},t instanceof Error?t:void 0)}}function Wl(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Gl(e,t,r,i){let a=yt(process.execPath,Kl(),{stdin:JSON.stringify(Jl(e,t,i,r)),timeoutMs:zl,allowFailure:!0});if(a.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Zl(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:a.stdout.slice(0,Bl),stderr:a.stderr.slice(0,Bl)},r instanceof Error?r:void 0)}}function Kl(){let e=ql(import.meta.url);if(!e)throw new n(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function ql(e){try{let t=qn(e),n=P.extname(t)||`.js`;return[P.join(P.dirname(t),`run-script-http-child`+n),P.join(P.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>F.existsSync(e))??null}catch{return null}}function Jl(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Yl(e,t){for(let r of Object.keys(e))if(r.includes(`.`))throw new n(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:t,key:r})}function Xl(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Zl(e){let t=e.trim();return t.length>0?t.slice(0,Bl):`request process exited without stderr`}async function Ql(e){return await $l(`tap`,async t=>{let n=P.join(t,`before.png`),r=P.join(t,`after.png`),i=await tu(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await tu(e,r)))return await eu(n,r,e.signal,`tap`)}})})}async function $l(e,t){let n=await Un.mkdtemp(P.join(Kn.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await Un.rm(n,{recursive:!0,force:!0})}catch{}}}async function eu(e,t,n,r){try{let[i,a]=await Promise.all([Un.readFile(e),Un.readFile(t)]);Y(n);let o=await Bn(i,a,`Maestro screenshot`);return Y(n),nu(o,r)}catch(e){iu(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 tu(e,t){try{return await Un.rm(t,{force:!0}),Y(e.signal),await e.capture(t),Y(e.signal),!0}catch(t){return iu(t,e.signal),!1}}function nu(e,t){if(e.status!==`compared`)return ru(t,e.status,e),!1;let n=e.differencePercent<=K.animationDifferencePercent;return ru(t,n?`stable`:`changed`,e),n}function ru(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 iu(t,n){if(n?.aborted||e(t))throw i()}function Y(e){if(e?.aborted)throw i()}async function au(e){su(e.timeoutMs),Y(e.signal);let t=e.now()+e.timeoutMs;return await $l(`animation`,async n=>{let r=P.join(n,`first.png`),i=P.join(n,`second.png`);for(;;){if(Y(e.signal),await ou(e,r,i))return!0;if(e.now()>=t)return!1}})}async function ou(e,t,n){let r=[await tu(e,t),await tu(e,n)];return!r[0]||!r[1]?!1:await eu(t,n,e.signal,`animation`)===!0}function su(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const cu=K.observationPollMs;async function X(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!wu(n)||(Z(e.context.signal),!await Su(e.dependencies,t,cu,e.context.signal)))throw n}}}function lu(e){return uu({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function uu(e){let t=Dn(e.snapshot),n=e.platform===`ios`?Vn(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:s(n.nodes)}:e.snapshot;return hu(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 du(e){Cu(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await X(e,n),i=uu({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,oo(e.condition,i))return i;if(e.dependencies.now()>=n)break;await Su(e.dependencies,n,cu,e.context.signal)}return Z(e.context.signal),Du(t)}async function fu(e){Cu(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await X(e,t);if(r=void 0,n=uu({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 Z(e.context.signal),Du(n)}async function pu(e){Cu(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await X(e,t),r=Tu(n);for(;;){Z(e.context.signal),await Su(e.dependencies,t,cu,e.context.signal);let i=await X(e,t),a=Tu(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 mu(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function hu(e,t,n,r,i,a,o){if(!e.ok){let t=mu(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=_u({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=mu(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:gu(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:Tu(t)}:{}}}function gu(e,t){return!E(e)||!E(t)?0:me(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 _u(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!vu(t,n,r)||i!==1))return yu(t.selector)}function vu(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!ns(e.selector)}function yu(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!bu(n)||typeof r!=`string`)return;let i=aa(r)?.trim();return i?{key:n,value:i}:void 0}function bu(e){return e===`id`||e===`label`||e===`text`}async function xu(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?i():e}Z(n)}async function Su(e,t,n,r){let i=t-e.now();return i<=0?!1:(await xu(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw i()}function Cu(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function wu(e){return e instanceof n&&e.details?.retriable===!0}function Tu(e){return Gn(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,checked:e.checked??!1,bounds:Eu(e.rect)})))).digest(`hex`)}function Eu(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 Du(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function Ou(e){return e.kind===`clearState`?Nu(e):ku(e)?Au(e):Ju(e)?Yu(e):e.kind===`settingsPermission`?Vu(e):Hu(e)}function ku(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function Au(e){switch(e.kind){case`launchApp`:return ju(e);case`stopApp`:return Mu(e);case`openLink`:return Pu(e)}}function ju(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 Mu(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function Nu(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function Pu(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}const Fu={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`},Iu={allow:`grant`,deny:`deny`,unset:`reset`},Lu={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 Ru(e){let t=Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]);if(t.length===0)throw new n(`INVALID_ARGS`,`Maestro setPermissions requires at least one permission.`);return[...t.filter(([e])=>e===`all`),...t.filter(([e])=>e!==`all`)].map(([e,t])=>zu(e,t))}function zu(e,t){let r=e===`all`?`all`:Bu(Fu,e);if(r===void 0)throw new n(`UNSUPPORTED_OPERATION`,`Maestro permission "${e}" is not supported.`,{hint:`Supported: all, ${Object.keys(Fu).join(`, `)}.`});let i=Lu[e],a=i?Bu(i,t):void 0;if(a)return a;let o=Bu(Iu,t);if(o)return{state:o,permission:r};throw new n(`INVALID_ARGS`,`Maestro permission "${e}" does not accept "${t}".`,{hint:`Use ${[`allow`,`deny`,`unset`,...Object.keys(i??{})].join(`|`)}.`})}function Bu(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function Vu(e){return{command:`settings`,positionals:[`permission`,e.state,e.permission,...e.mode?[e.mode]:[]],...e.appId?{dispatch:{settingsAppBundleId:e.appId}}:{}}}function Hu(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Uu(e);case`clickPoint`:return Wu(e);case`swipe`:return Gu(e);case`scroll`:return Ku(e);case`pressKey`:return qu(e)}}function Uu(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Wu(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Gu(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 Ku(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function qu(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Ju(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Yu(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 Xu(e,t){let r=Ou(t),i=await e.invoke(p({...r,flags:Zu(e.flags,r.flags??{})}));if(!i.ok)throw rd(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 n(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function Zu(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 Qu(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 $u(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 ed(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 td(e,t,r){if(P.isAbsolute(e))return e;let i=t.source?.path??r;if(!i)throw new n(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return P.resolve(P.dirname(i),e)}function nd(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function rd(e){let t=e.error,r=p({...t.details??{},hint:t.hint??id(t.details,`hint`),diagnosticId:t.diagnosticId??id(t.details,`diagnosticId`),logPath:t.logPath??id(t.details,`logPath`),retriable:t.retriable??ad(t.details,`retriable`),supportedOn:t.supportedOn??id(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function id(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function ad(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function od(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Xu(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new n(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=y(i,i);return t={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let n=r.snapshot;return r=void 0,t={generation:e.generation,snapshot:n},n}return r=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await pu({timeoutMs:K.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function sd(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 X({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=lu({query:t,context:n,snapshot:o,platform:i.platform});if(pd(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await Su(i.dependencies,a,cu,n.signal)}}}async function cd(e,t,n,r,i,a){let o=async()=>await dd(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Ql({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Xu(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await ld(e,t,n,r,i,a.click,o)});return}await ld(e,t,n,r,i,a.click)}async function ld(e,t,n,r,i,a,o){let s=async()=>await dd(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:Tu(await t.capture(i))),l=async()=>{let r=await pu({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 ud({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 ud(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 dd(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await md(e,o,n.point,i);return}catch(n){if(!hd(n))throw n;let o=await sd({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!fd(o))throw n;t.invalidate(r.generation),await gd(e,k(o.rect),i);return}}t.invalidate(r.generation),await gd(e,n.point,i)}function fd(e){return e.matched&&e.visible&&e.rect!==void 0}function pd(e,t){return fd(e)?!t||e.dispatchSelector!==void 0:!1}async function md(e,t,n,r){D({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Xu(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function hd(e){let t=r(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===ht.selectorNotFound}async function gd(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);D({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Xu(e,{kind:`clickPoint`,point:t,options:r})}function _d(e){return`${e.state} ${e.permission}${e.mode?` ${e.mode}`:``}`}function vd(e){let t=od(e),r={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},i=e=>{e.settled?r.settleLatches+=1:r.settleTimeouts+=1},a=e.platform,o=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),Xu(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,r)=>{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}:{}},r)}catch(e){throw e instanceof n?new n(e.code,e.message,{...e.details,appliedPermissionMutations:i,failedPermissionMutation:_d(a)}):e}i.push(_d(a))}},u=async(n,r)=>{vt(n),await c({kind:`typeText`,text:n},r);let a=await pu({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 sd({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await du({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=[...Qu(e.arguments),...Qu(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;if(e.permissions){let r=Ru(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,Ru(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(n,i)=>await cd(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await s(()=>gd(e,t.target.point,p({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await s(()=>gd(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 fu({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=go(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 pu({timeoutMs:Math.min(K.settleTimeoutMs,i),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(i.visiblePercentage!==K.scrollUntilVisiblePercentage)throw mi(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation($u(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 au({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:ed(await o({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Vl({scriptPath:td(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?nd(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r}),recordSettle:i}}function yd(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=vd(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 bd(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),xd(()=>wd(r,e)),xd(()=>Td(n,t,e))},actionCompleted:e=>{let r=Sd(i,e.stepIndex);xd(()=>Ed(n,t,Cd(r,e),!0))},actionFailed:e=>{let r=Sd(i,e.stepIndex);xd(()=>Ed(n,t,Cd(r,e),!1))}}}function xd(e){try{e()}catch{}}function Sd(e,t){let n=e.get(t);return e.delete(t),n}function Cd(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 wd(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function Td(e,t,n){jc(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 Ed(e,t,r,i){let a=Dd(r);jc(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:t,...r.source.path&&r.source.path!==t?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof n?{errorCode:r.error.code}:{}})}function Dd(e){let t=`data`in e?e.data:void 0,n=Od(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 Od(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function kd(e,t){let n=p({...e.dispatch,...Ad(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 Ad(e){return p({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile,settingsAppBundleId:e?.settingsAppBundleId})}function jd(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:Fd(e.action),positionals:Id(e.action,e.value),flags:t.flags??{}}}}async function Md(e){let{failure:t,replayPath:n,req:r,sessionStore:i,observationStore:a,logPath:o}=e,s=j(r.meta?.requestId),c=jd(t,r),l=Sc(e.error),u=[...t.redactions],d=wt(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(),m=p?await sc({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?Nd({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Pd(t.value)].filter(Boolean).join(` `),_=Zs({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:dc(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Gs({kind:`action-failure`,targetEvidence:void 0,capture:ac(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return wc({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 Nd(e){let t={createdAt:Date.now(),nodes:e.nodes};return nc(Za(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>xc({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Pd(e){return!e||e===`<text>`?e??``:Ie(e)}function Fd(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function Id(e,t){return!t||e===`inputText`?[]:[t]}function Ld(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=zd(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:Bd(c,Date.now()-r)}}}async function Rd(e){let{command:n,replayPath:r,state:i,outcome:a}=e,{request:o,session:{store:s,observationStore:c,logPath:l}}=n,{failure:u}=a,d=t(a.error);return u?await Md({error:d,failure:u,replayPath:r,req:o,sessionStore:s,observationStore:c,logPath:l,snapshotDiagnostics:zd(s,i.snapshotStart)}):{ok:!1,error:d}}function zd(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return g(n)}function Bd(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Vd(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return d(`INVALID_ARGS`,us);if(t.flags?.saveScript!==void 0)return d(`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 Hd({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await Rd({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function Hd(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c}=t,l=await Ud({command:t,bundle:n}),u=t.publicNetworkOnly===!0,d=Xd({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 Xa(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=>q(n,e),observer:bd({filePath:l.filePath,tracePath:s,onStep:c})});return f.ok?Ld({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await Rd({command:t,replayPath:n.entry,state:i,outcome:f})}async function Ud(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=Ya(q(n,o),o),c=a.lookup(),l=c?.session;c&&a.assertSelectorMatches(r.flags);let u=await Wd({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Jd({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Yd(r),signal:j(r.meta?.requestId)}}async function Wd(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 En(t.flags??{},Al(a.appTarget,o))),c=tf(t,s),l=Kd({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Gd({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:nf(t,s),runtimeHints:l,flow:a})}async function Gd(e){if(e.device||!qd(e.runtimeHints))return e;let t=await En(e.req.flags??{},Al(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:nf(e.req,t),runtimeHints:Kd({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Kd(e){return e.sessionStore.resolveOpenRuntimeHints({request:e.req,device:e.device,platform:e.platform})}function qd(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Jd(e){return{...Pl({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Yd(e){return{...Qe(Xe(e.flags?.replayShellEnv)),...et(Je(e.flags?.replayEnv))}}function Xd(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 yd({invoke:e=>c(kd(l,e)),flags:Zd(n,r,s.flags),publicNetworkOnly:o,platform:r,sourcePath:a,dependencies:{now:Date.now,sleep:async(e,t)=>{await Jn(e,void 0,{signal:t})}}})}function Zd(e,t,n){if(!e)return Qd(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 Qd(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?$d(n,t):ef(n,t)}function $d(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function ef(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function tf(e,t){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new n(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function nf(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function rf(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if($e(t,a.flags?.replayBackend)===`maestro`)return n?d(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Vd(i):d(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function af(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s,dispatch:c}=e,l=of(t);if(l)return{ok:!1,response:l};let{manifest:u,replayReq:d}=sf(t,o,c),{metadata:f,actions:p,actionLines:m,actionSourcePaths:h,planDigest:g}=u,_=r.get(),v=cf({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:uf({req:t,replayReq:d,sessionName:n,resolved:a,metadata:f}),actionTracePath:i??_?.trace?.outPath}}:{ok:!1,response:v.response}}function of(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return d(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function sf(e,t,n){let r=ys(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:r,replayReq:lf({...e,flags:jl(e.flags,r.actions),...n?{dispatch:n}:{}},r.metadata)}}function cf(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:d(`INVALID_ARGS`,a.message)}}function lf(e,t){return!t.platform&&!t.target?e:{...e,flags:df(e.flags,t)}}function uf(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Pl({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Qe(Xe(t.flags?.replayShellEnv)),cliEnv:et(Je(t.flags?.replayEnv))}}function df(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 ff={kind:`none`,status:void 0,targetPath:void 0,targetForce:!1};function pf(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=mf({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(_f({req:t,coordinator:a}),gf({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function mf(e){let t=vf(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return u()}function hf(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?d(`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.`):yf({saveScript:t,liveForce:n,persistedForce:r.targetForce||void 0,sourcePath:i,existingSaveScriptPath:r.targetPath})}function gf(e){let{req:t,sourcePath:n,coordinator:r}=e,{saveScript:i,force:a}=t.flags??{},o=hf({saveScript:i,force:a,preRunState:r.view()?.scriptPublication??ff,sourcePath:n});return o?{ok:!1,response:o}:(r.demoteForRerunIfArmed(),{ok:!0,armSaveScript:bf({saveScript:i,force:a,coordinator:r,sourcePath:n})})}function _f(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function vf(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return d(`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 yf(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Ot(t):a??Vs(i);if(!(n||r&&o===a)&&F.existsSync(o))return d(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function bf(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 xf(e){let{request:t,session:{name:n,logPath:i,store:a,observationStore:o,coordinator:s},tracePath:c,onStep:l,invoke:u}=e,f=t.flags?.replayScriptSource;if(!f)return d(`INVALID_ARGS`,us);let p=Date.now(),m=t.flags?.replayKeepSession===!0,h=``,g=new Set;try{if(h=f.entry,tt(h)&&t.flags?.replayBackend!==`maestro`)return d(`INVALID_ARGS`,Ze(`replay`,h));let r=await rf({resolved:h,keepSession:m,coordinator:s,command:e});if(r)return r;let _=af({req:t,sessionName:n,sessionStore:a,tracePath:c,resolved:h,script:q(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,T=pf({req:t,entryIndex:C,sessionStore:a,sourcePath:h,coordinator:s});if(!T.ok)return T.response;let{runtime:te,readLastResponse:ne}=Sl({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:u,signal:j(t.meta?.requestId),coordinator:s,resolvedSessionScope:e.resolvedSessionScope,dependencies:e.dependencies},req:t,artifactPaths:g,onStep:l,armSaveScript:T.armSaveScript}),re=await js({actions:y,entryIndex:C,keepSession:m,actionLines:b,actionSourcePaths:x,resolvedPath:h,varSources:w},te);return re.status===`failed`?ne()??d(`COMMAND_FAILED`,`replay step failed with no recorded response`):Sf({startedAt:p,sessionName:n,sessionStore:a,replayed:re.replayed,artifactPaths:re.artifactPaths,snapshotDiagnosticSamples:re.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:s,keepSession:m})}catch(e){let t=r(e);return d(t.code,t.message,g.size>0?{artifactPaths:[...g]}:void 0)}}function Sf(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=wf({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:Cf(i,Date.now()-t)}}}function Cf(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function wf(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return d(`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 Tf(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=P.resolve(n??`.`,t??`.agent-device/test-artifacts`);return P.join(i,r)}function Ef(e,t){let n=t?P.relative(t,e):P.basename(e),r=n.length===0||n.startsWith(`..`)?P.basename(e):n;return Ee(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function Df(e,t){F.mkdirSync(t,{recursive:!0}),Af(e,t)}function Of(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=P.join(o,`result.txt`),u=P.join(o,`failure.txt`),d=kf([...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=>P.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
-
`)}\n`;F.writeFileSync(l,p),s||F.writeFileSync(u,p)}function kf(e,t,n){let r=[],i=new Set(n.map(e=>P.basename(e).toLowerCase()));for(let n of e){if(!Mf(n))continue;let e=P.basename(n);if(P.resolve(n)===P.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=jf(e,t,i),o=P.join(t,a);F.copyFileSync(n,o),r.push(o)}return r}function Af(e,t){let n=P.join(t,`replay.ad`);if(F.copyFileSync(e,n),P.extname(e).toLowerCase()===`.ad`)return;let r=P.join(t,P.basename(e));P.resolve(r)!==P.resolve(n)&&F.copyFileSync(e,r)}function jf(e,t,n){let r=P.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||F.existsSync(P.join(t,a));)a=`${i}-${o++}${r}`;return a}function Mf(e){try{return F.statSync(e).isFile()}catch{return!1}}function Nf(e){let{platformFilter:t,discoverSources:r}=e,i=r(),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}zf(t,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=t?` for --platform ${t}`:``;throw new n(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function Pf(e,t,n,r,i=0){let a=P.basename(n,P.extname(n)),o=Ee(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function Ff(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return Ee(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function If(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,P.basename(r),`attempt`,a+1].join(`:`)}function Lf(e,t){return typeof e==`number`?e:t}function Rf(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function zf(e,t){return e===`apple`?T(t):t===e}function Bf(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const Vf=2e3;async function Hf(e){let{filePath:n,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=Yf({artifactsDir:l,artifactPaths:v,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>Bf({error:t(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Xf(o,[...v]))},o)})]):await w,Q(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await Wf(w)||(x=qf(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:Vf}}),Gf({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await Kf({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Jf(x,`Replay test finalization failed: ${e.error.message}`));let n=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(e){let i=t(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-n,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=Uf(x,i,v)}}return x??Bf({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Uf(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:Bf({error:t,artifactPaths:[...n],infrastructure:!0})}async function Wf(e){return await Promise.race([e.then(()=>!0),Jn(Vf).then(()=>!1)])}async function Gf(e){let{replayPromise:n,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await n}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:t(e).message}})}}}async function Kf(e){let{finalizeAttempt:n,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!n)return;let c=Date.now();Q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await n({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Q(o,e)});return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let n=t(e);return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:n.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:n.message}}),Bf({error:n})}}function qf(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Jf(e,t){return{...e,warnings:[...e.warnings,t]}}function Yf(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=P.join(t,`replay-timing.ndjson`);return F.mkdirSync(P.dirname(l),{recursive:!0}),F.writeFileSync(l,``),n.add(l),Q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Q(e,t){e&&F.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Xf(e,t=[]){return Bf({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 Zf(e){let t=Qf(e),n=await $f(e,t);return{result:ap(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Qf(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:P.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Ef(t.path,n)),maxAttempts:r+1}}async function $f(e,t){tp(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await ep(e,t,r);if(np(n,i),rp(e,i.outcome,r))break;ip(e,t,i)}return n}async function ep(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=Pf(i,a,r.path,o,n),h=P.join(t.testArtifactsDir,`attempt-${f}`);Df(r.path,h);let g=If({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,...$(d)},v=await Hf({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 Of({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function tp(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:Pf(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...$(c)})}function np(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 rp(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function ip(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,...$(e.shard)})}function ap(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?op(e,t,n,r):sp(e,t,n,r)}function op(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,...$(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}:{},...lp(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function sp(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,...$(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...cp(c),...lp(s)}}function cp(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 lp(e){return $(e)}function $(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function up(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 dp(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 fp(t,u,d);gp(r,o);let p=r.shardPlan?_p({entries:r.entries,total:r.total,emitProgress:o}):[];return r.shardPlan?p.push(...await vp({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 Sp({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:Tp(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 fp(e,t,n){let r=pp(e,t),i=mp(r),a=r.length-i.length,o=Ff(e.requestId),s=await up(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:hp(e,o),total:s?.total??r.length}}function pp(e,t){return Nf({platformFilter:e.platformFilter,discoverSources:t})}function mp(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function hp(e,t){return Tf({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function gp(e,t){t({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function _p(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function vp(e){return(await Promise.allSettled(e.shards.map(async t=>await bp({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[yp(r,e.sessionName,t.reason)]:[]})}function yp(e,n,r){let i=t(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:xp(n,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 bp(e){let{shard:t,sessionName:n}=e;return await Cp({...e,entries:t.entries,sessionName:xp(n,t),shard:t})}function xp(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Sp(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 Zf({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:Rf(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:Lf(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),wp(t,o,p))break}return g}async function Cp(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 Zf({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Rf(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:Lf(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),wp(b,o,m))break}return _}function wp(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Tp(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 Ep(e,t){return()=>e.map(e=>Dp(e,t))}function Dp(e,t){let n=e.entry,r=q(e,n),i=$e(n,t)===`maestro`,a=Le(r);return{path:n,manifest:{...i?{title:Ya(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 Op(e){return async t=>(await jp(e,t)).map(kp)}function kp(e){if(e.platform===`web`||!ee(e))throw new n(`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 Ap(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 jp(e,t){let r=Fp(e),i=Np(await Tn(Mp(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${Pp(t)}, but only ${i.length} matched`);return i.slice(0,t)}function Mp(e){let t=Cn(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:te({simulatorSetPath:wn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Np(e,t,n){return t.length>0?Ip(e,t,n):e.filter(e=>Lp(e,n)).sort(Bp)}function Pp(e){return`${e} device${e===1?``:`s`}`}function Fp(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Ip(e,t,r){return t.map(t=>{let i=zp(t),a=e.find(e=>Rp(e,r)&&(e.id===t||zp(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Lp(e,t){return!Rp(e,t)||!ee(e)?!1:e.booted!==!1}function Rp(e,t){return!(!S(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function zp(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function Bp(e,t){return e.id.localeCompare(t.id)}function Vp(e){let t=Hp(e?.shardAll,`--shard-all`),r=Hp(e?.shardSplit,`--shard-split`);if(t!==void 0&&r!==void 0)throw new n(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(r!==void 0)return{mode:`split`,count:r}}function Hp(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new n(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const Up=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 Wp(e){return Up.has(e.toUpperCase())}const Gp=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Kp(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=qp(e);return t?Jp(t.details)||Yp(t.code,t.message):!1}function qp(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Jp(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||_t(t)?!0:t?Wp(t):!1}function Yp(e,t){let n=`${e}\n${t}`.toLowerCase();return Gp.some(e=>n.includes(e))}function Xp(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:$p(e.error.details?.artifactPaths),warnings:pt(e.error.details),infrastructure:Kp(e),...em(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:pt(t),artifactPaths:$p(t?.artifactPaths),...em(t?.snapshotDiagnostics)}}function Zp(e){if(!e||e.ok)return;let t=Xp(e);return t.status===`failed`?t:void 0}function Qp(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function $p(e){return[...new Set(Qp(e))]}function em(e){let t=_(e);return t?{snapshotDiagnostics:t}:{}}const tm=1e3,nm=3e3;function rm(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await im(e)}}async function im(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=St(o.device.platform),c=i?P.join(i,`recording${s}`):xt(o.device.platform);om(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(sm({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return om(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await bt(tm),om(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:tm}),D({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:tm}}),l}async function am(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;om(a,{type:`video_tail_start`,session:n,requestedDurationMs:nm});let o=Date.now();await bt(nm);let s=Date.now(),c=await e.video.record(sm({req:t,sessionName:n,phase:`stop`}));return Rc(c).forEach(e=>i.add(e)),om(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 om(e,t){e({...t,ts:new Date().toISOString()})}function sm(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 cm=[{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.`}],lm=({attemptId:e,parentAttemptId:t})=>{Zt(e);let n=um(e,t);return{cancel:()=>qt(e),release:()=>{n(),Xt(e)}}};function um(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 dm(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=fm(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:Ap({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function fm(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 pm(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 d(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of cm)if(e.requested(l))return d(`INVALID_ARGS`,e.message);let u,f;try{u=gm(t,n),f=hm(t)}catch(e){let t=r(e);return d(t.code,t.message)}let p=new Map(f.map(e=>[e.entry,e])),m=await dp({request:u,emitProgress:Qt,isCanceled:()=>Yt(t.meta?.requestId),emitDiagnostic:D,bindAttemptCancellation:lm,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&&Rc(e).forEach(e=>f.add(e)),e),y=dm({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?rm(x):void 0;return Xp(await xf({..._m(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 im(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 Zp(await am({req:t,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:n,video:c}))},discoverSources:Ep(f,t.flags?.replayBackend),resolveShardTargets:Op(t.flags),cleanupSession:s});return m.status===`completed`?{ok:!0,data:mm(m.data,t)}:d(m.error.code,m.error.message)}function mm(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=P.join(n,P.basename(r)),a=e=>e===r||e.startsWith(r+P.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 F.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:P.basename(r)}]}:o}function hm(e){let t=e.flags?.replayScriptSources;if(!t)throw new n(`INVALID_ARGS`,us);return t}function gm(e,t){let n=e.flags??{},r=e.meta?.cwd,i=ym(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:Ot(i,r),failFast:n.failFast===!0,retries:vm(n.retries),timeoutMs:vm(n.timeoutMs),shard:Vp(n)}}function _m(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 vm(e){return typeof e==`number`?e:void 0}function ym(e){return typeof e==`string`?e:void 0}function bm(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[r]=ft(`waitMs`);if(!r)throw new n(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return m(t,`waitMs`,{min:r.min,max:r.max})}function xm(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function Sm(e){return{...xm(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function Cm(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 Tm({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function wm(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function Tm(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=Dt.fromTimeoutMs(a),s=()=>wm(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 bt(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};Em(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function Em(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}const Dm={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.`},Om=new Map;async function km(e){let t=await I.mkdtemp(P.join(Kn.tmpdir(),`agent-device-materialized-`));try{let n=await Pm(e.installablePath,P.join(t,`installable`)),r=e.archivePath?await Pm(e.archivePath,P.join(t,`archive`)):void 0,i=Wn.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{Mm(i)},a);return Om.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 I.rm(t,{recursive:!0,force:!0}),e}}async function Am(e,t){await Nm(e,tn(Om,e,t,Dm))}async function jm(e){let t=Array.from(Om.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await Nm(e,t)}))}async function Mm(e){let t=Om.get(e);if(t)try{await Nm(e,t)}catch{}}async function Nm(e,t){clearTimeout(t.timer),Om.delete(e),await I.rm(t.rootPath,{recursive:!0,force:!0})}async function Pm(e,t){let n=await I.stat(e);await I.mkdir(t,{recursive:!0});let r=P.join(t,P.basename(e));return n.isDirectory()?(await I.cp(e,r,{recursive:!0}),r):(await I.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 hn({session:t,sessionName:n,sessionStore:r,resourcePath:pn.resolvePath(r.resolveSessionDir(n))})}async function Rm(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.perfCapture&&await mn({...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),r=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:r}}),new n(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${r.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:r,sessionStore:i}=e;if(!e.platformCleanup)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let a=e.platformCleanup,o=[{step:`recording`,run:()=>Wm({session:t,sessionName:r,sessionStore:i})},...e.appLog===`run`?[{step:`app_log`,run:()=>Lm({session:t,sessionName:r,sessionStore:i})}]:[],{step:`audio_probe`,run:()=>Gm({session:t,sessionName:r,sessionStore:i})},{step:`perf_capture`,run:()=>Rm({session:t,sessionName:r,sessionStore:i})},{step:`platform_snapshot_helper`,run:()=>zm(t,a)},{step:`web_browser`,run:()=>Bm({session:t,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 Hn({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 fn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}function Km(e){return w(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 n(`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 n(`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 n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return $m(e)}}function th(e,t,r){if(e===void 0)return r;if(!l(e))throw new n(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(r&&e!==r)throw new n(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${r}.`);return e}function nh(e){if(l(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:r,platform:i}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new n(`INVALID_ARGS`,`open runtime must be an object.`);let a=t,o=Object.keys(a).find(e=>!Jm.includes(e));if(o)throw new n(`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(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?x(r):void 0,s=nh(o)??i;if(a.platform&&r&&!s)throw new n(`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 n(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function uh(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?nh(x(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 d(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`&&xe(i.owner,n)?pe(i.fence):null;if(!a)return{status:`binding-invalid`};let o=an(gn(t)),s=ln(on(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!_h(c.stateDir,r)||!xe(cn(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=an(gn(e));return rn(on(t))}function _h(e,t){return P.resolve(e)===P.resolve(t)}function vh(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=x(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=T(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${Et(i)}`,`${a} ${Et(e.id)}`,...n===`release`||sn(t.classification)?[`--stale`]:[]].join(` `)}function yh(e,t){if(t.classification===`allocator-held`)return xh(e,t);let r=t.claim,i=vh(e,t,un(t.classification)?`release`:`status`),a=x(r?{platform:r.device.family,appleOs:r.device.appleOs}:e);return new n(`DEVICE_IN_USE`,r?`${a} device ${e.id} is owned by session "${r.session}" in workspace "${r.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:Oh(t.classification),classification:t.classification,deviceKey:t.deviceKey,...r?{owner:{session:r.session,workspace:r.workspace,stateDir:r.stateDir}}:{},recovery:{command:i},hint:un(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 r=t.allocatorClaim,i=x({platform:r.device.family,appleOs:r.device.appleOs}),a=vh(e,t);return new n(`DEVICE_IN_USE`,`${i} device ${e.id} is held by managed-device allocator "${r.allocator.instanceId}" for installation "${r.stateDir}".`,{reason:`DEVICE_CLAIM_ALLOCATOR_HELD`,classification:t.classification,deviceKey:t.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(e,t){return new n(`COMMAND_FAILED`,`${x(e)} device ${e.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:ae(t),deviceKey:an(gn(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,r){return new n(`COMMAND_FAILED`,`${x(e)} device ${e.id} is held for identity incarnation "${r}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:ae(t),deviceKey:an(gn(e)),heldIncarnationId:r,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function wh(e,t){return new n(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:ae(t),deviceKey:an(gn(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 d(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{cr as $,km as A,Vs as B,Rm as C,Im as D,Fm as E,xf as F,xr as G,Ya as H,Nl as I,vr as J,_r as K,Al as L,Sm as M,bm as N,Am as O,pm as P,ur as Q,jl as R,Lm as S,Um as T,wr as U,q as V,Cr as W,dr as X,yr as Y,lr as Z,nh as _,yh as a,Wm as b,rh as c,ph as d,pr as et,ih as f,mh as g,ch as h,Th as i,Qn as it,Cm as j,jm as k,Ym as l,Xm as m,Eh as n,nr as nt,gh as o,dh as p,gr as q,bh as r,tr as rt,hh as s,kh as t,fr as tt,Zm as u,fh as v,zm as w,Hm as x,Gm as y,kl as z};
|
|
1
|
+
import{F as e,N as t,P as n,c as r,o as i}from"./sdk-contracts.js";import"./capture.js";import{i as a,p as o}from"./sdk-batch-runner.js";import{p as s}from"./android-input-ownership.js";import{C as c,d as l,l as u,p as d}from"./sdk-device.js";import{f,n as p,u as m}from"./lease-scope.js";import{$t as h,Er as ee,Ir as te,Jr as g,Jt as ne,ar as re,en as ie,kr as ae}from"./sdk-batch.js";import{a as oe}from"./script.js";import"./session-store.js";import{i as se}from"./back-mode.js";import{r as _}from"./diagnostics.js";import{t as ce}from"./timeouts.js";import"./diagnostics2.js";import{s as le}from"./device-shell.js";import{n as ue}from"./retry.js";import{n as v}from"./runtime-transport-hints.js";import{_ as de,a as fe,c as pe,d as y,f as me,g as he,h as ge,i as _e,l as ve,m as ye,n as b,o as be,p as x,r as xe,s as S,u as Se,v as Ce,y as we}from"./human-control-contract.js";import{c as Te}from"./request-cancel.js";import{t as Ee}from"./request.js";import{n as De,t as Oe,u as ke}from"./provider-session-ownership.js";import{r as Ae}from"./application-lifecycle-runtime.js";import{a as je,c as C,l as Me,n as Ne,o as Pe,r as Fe,t as Ie}from"./device-claim-inspection.js";import{b as Le,c as Re,g as ze,i as Be,p as Ve,x as w}from"./perf-runtime-plan.js";import{n as He,r as Ue,t as We}from"./lease-context.js";import{d as Ge,g as Ke,u as qe}from"./screenshot-runtime.js";import{n as Je}from"./screen-recording-admission-ledger.js";import{a as Ye,c as Xe,d as T,l as Ze,n as Qe,o as $e,r as et,u as E}from"./src8.js";import{n as tt,t as nt}from"./compatibility-policy.js";import{o as rt}from"./screen-recording-resource-recovery.js";import D from"node:path";import"node:fs";import it,{createHash as at}from"node:crypto";import ot from"node:os";import O from"node:fs/promises";function st(e,t){return k(e,t)?t:`${e}:${t}`}function k(e,t){return t.startsWith(`${e}:`)}function ct(e,t){return!e.partitioned||k(e.tenant,t)}var lt=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)}}},ut=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())}},dt=class{holdsByDevice=new Map;mutations=new lt;inFlightWork=new ut;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=ve(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new Oe({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=ye(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=pe(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let n=x(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 Se(i);return S(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=de(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);be(n,e),S(n,e);let r=e.ttlMs===void 0?me(n):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=de(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return be(n,e),S(n,e),{...n}}assertLeaseAdmission(e){let t=ge(e);this.cleanupExpiredLeases(),S(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`?y(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>b(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,n,r,i){i?.throwIfAborted();let a=_e(n),o=fe(r);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=y(s),l=this.findHumanControlHold(a);if(l&&(this.assertHoldAuthority(e,l),y(l.hold.scope)!==c))throw new t(`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,n,r,i){let a=this.holdsByDevice.get(e),{id:o}=n.hold;try{if(await this.mutations.wait(e,i),i?.throwIfAborted(),a.get(o)!==n)throw new t(`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(e,s),b(n.hold)}catch(t){throw a.get(o)===n&&this.deleteHumanControlHold(e,o),t}}removeHumanControlHold(e,t){let n=_e(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=y(r.hold.scope);return this.deleteHumanControlHold(i,n),b(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=y(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw xe(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=y(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let n=this.getActiveLease(e);if(!n.deviceKey)throw new t(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...n,deviceKey:n.deviceKey}}resolveHumanControlScope(e,n){if(e.kind===`host`){if(!n.scope)throw new t(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return n.scope}if(n.scope)throw new t(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let r=this.requireHumanControlLease(e.leaseId);return{backend:r.backend,leaseProvider:r.leaseProvider,deviceKey:r.deviceKey}}assertHoldAuthority(e,n){if(e.kind===`host`)return;let r=this.requireHumanControlLease(e.leaseId);if(n.ownerLeaseId!==r.leaseId||y(r)!==y(n.hold.scope))throw new t(`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=y(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,me(n),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=he(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 n=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(n<this.maxActiveSimulatorLeases))throw new t(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:n,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let n=this.leases.get(e);if(n)return n;throw new t(`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(x(e),e.leaseId);let t=y(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.runBindings.delete(x(e));let n=y(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=y({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 Se(r)}};function ft(e){let n=we(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,i=Ce(r);if(r&&!i)throw new t(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(n!==`tenant`)return e;if(!i)throw new t(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let a=e.session||`default`;return k(i,a)?{...e,meta:{...e.meta,tenantId:i,sessionIsolation:n}}:{...e,session:st(i,a),meta:{...e.meta,tenantId:i,sessionIsolation:n}}}function pt(e,n,r,i={}){if(Ge(e.command))return;let a=He(e);gt(e,a);let o=r?.lease;if(r===void 0&&!a.leaseId&&mt(e,i.providerAppCatalog))return;if(e.command===`human_control`&&!o&&!a.leaseId)throw new t(`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;_t(a,o);let s=Ue(e,r);n.assertLeaseAdmission(m(s));let c=n.heartbeatLease(m(s));return qe(e)&&n.assertHumanControlAdmission(c),c}function mt(e,t){let n=Ke(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function ht(e){Ge(e.command)||gt(e,He(e))}function gt(e,n){if(e.command!==`open`)return;let r=p(n);if(r.length!==0)throw new t(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:r})}function _t(e,t){t&&(A(`leaseId`,e.leaseId,t.leaseId),A(`tenantId`,e.tenantId,t.tenantId),A(`runId`,e.runId,t.runId),A(`leaseProvider`,e.leaseProvider,t.leaseProvider),A(`clientId`,e.clientId,t.clientId),A(`deviceKey`,e.deviceKey,t.deviceKey))}function A(e,n,r){if(!(!n||!r||n===r))throw new t(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function vt(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),_({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return _({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 yt(e){ht(e)}async function bt(e){let t=e.sessionStore.get(e.sessionName),n=t?.lease;return!t||!n||!e.leaseRegistry.consumeExpiredLease(n.leaseId)?!1:(_({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=>{_({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 Le(t.deviceClaim).catch(e=>{_({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 xt(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.get(t),a=pt(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 St(e){return We(e.req,e.req.internal?.admittedLease)??e.existingLease}async function Ct(e){let t=e.session.lease;if(!t)return;let n=f({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=De(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return _({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const wt=[`platform`,`target`],Tt=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function Et(e){return u({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function Dt(e){return Et(e)||At(e,wt)}function Ot(e){return Dt(e)||At(e,Tt)}function kt(e){return typeof e==`string`&&e.trim().length>0}function At(e,t){return e?t.some(t=>kt(e[t])):!1}function jt(e){return{appleSimulatorAppTarget:Mt(e)}}function Mt(e){return e&&!a(e)?e:void 0}function Nt(){return Je({displayName:`audio probe`})}function Pt(){return Je({displayName:`perf capture`})}function Ft(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return at(`sha256`).update(re(t),`utf8`).digest(`hex`)}function It(e,t,n){return new Gt(Rt(Lt(t.resolve(e))),n).parse()}function Lt(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function Rt(e){let n=[],r=0;for(;r<e.length;){let i=e.slice(r),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){r+=a;continue}let o=zt(i);if(!o)throw new t(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);n.push(o.value),r+=o.length}return n}function zt(e){return Bt(e)??Vt(e)??Ht(e)??Ut(e)??Wt(e)}function Bt(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function Vt(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function Ht(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function Ut(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Wt(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Gt=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let e=this.parseOr();if(this.peek())throw new t(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new t(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new t(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.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 t(`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 t(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,e}consumeStringLiteral(){let e=this.peek();if(e?.type!==`string`)throw new t(`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 Kt(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function qt(e,t){return{...N(e,t),source:e.source}}function j(e,n,r){if(e===void 0)return;let i=r??Ye[n]??{},a=$e(i),o;if(typeof e==`number`)o=e;else{let r=e.trim();if(r===``)throw new t(`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 t(`INVALID_ARGS`,`Maestro ${n} must be ${a}.`);return o}function Jt(e,t,n,r){return j(e===void 0?t:n.resolve(String(e)),r)}function M(t){if(t?.aborted)throw e()}async function Yt(e,n){if(e.include.kind===`commands`)return{kind:`program`,source:e.source,config:{},commands:e.include.commands};if(!n.loadProgram)throw new t(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return M(n.signal),n.signal?await n.loadProgram(e.include.path,e.source.path,n.signal):await n.loadProgram(e.include.path,e.source.path)}function Xt(e,t){if(e.include.kind===`file`)return D.resolve(t?D.dirname(t):process.cwd(),e.include.path)}function Zt(e){return e===void 0?void 0:D.resolve(e)}function Qt(e,n){let r=Xt(e,e.source.path);if(r&&n.has(r))throw new t(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);return r}function $t(e,n,r,i){let a=e.include.kind===`file`?Zt(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 t(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function en(e,t,n){return e.platform&&e.platform!==n.platform?!1:e.true===void 0?!0:typeof e.true==`boolean`?e.true:It(e.true,t,n.platform)}function tn(e){return[...e.visible?[{kind:`visible`,selector:e.visible}]:[],...e.notVisible?[{kind:`notVisible`,selector:e.notVisible}]:[]]}function N(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>N(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,N(n,t)])):e}async function nn(e,t){M(t.signal);let n=Zt(e.source.path),r={options:t,context:Xe(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await rn(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function rn(e,t,n,r,i){M(i.options.signal);let a=mn(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 on(s,a,o,e.source.path??r,i));return n}finally{s()}}async function an(e,t,n,r,i){let a=[];for(let o of e)a.push(...await on(o,t,n,r,i));return a}async function on(e,t,n,r,i){M(i.options.signal);let a=hn(e,r);switch(a.kind){case`runFlow`:{let e=cn(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await sn(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[P(a,t,n,o)]}case`repeat`:return[P(a,t,n,await an(a.commands,t,n,r,i))];case`retry`:return[P(a,t,n,await an(a.commands,t,n,r,i))];default:return[fn(a,t,n)]}}async function sn(e,t,n,r,i){let a=un(e,i.context),o=Qt(a,i.activeIncludePaths),s=await Yt(a,i.options);M(i.options.signal);let c=$t(a,s,o,i.activeIncludePaths),l=mn(t,e.env),u=i.context.enter(e.env);try{return await rn(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function cn(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:ln(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function ln(e,t){if(e===!1)return`omit`;if(typeof e==`string`)return dn(t.context.resolveDeferred(e))?`opaque`:It(e,t.context,t.options.platform)?void 0:`omit`}function un(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function dn(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function fn(e,t,n){return T({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function P(e,t,n,r){return T({kind:`opaque`,command:pn(e),source:e.source,scopes:t,body:r,appId:n})}function pn(e){switch(e.kind){case`runFlow`:return T({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 T({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function mn(e,t){return t===void 0?e:[...e,t]}function hn(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function gn(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await nn(e,t),a=_n(t.runtimeHints),o=T({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=Ft(o);return vn({...o,digest:s})}function _n(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 vn(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))vn(t);return Object.freeze(e)}function yn(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 bn(e,n={}){let r=yn(e,n);if(!r.allowed)throw new t(`INVALID_ARGS`,r.reason);return r.startIndex}function xn(e,n){if(!Number.isInteger(n)||n<0||n>e.total)throw new t(`INVALID_ARGS`,`Maestro replay startIndex ${n} is out of range for a ${e.total}-step plan.`);return n}const Sn=`maestro-test-failure`;function F(e,n={}){return new t(`COMMAND_FAILED`,e,{...n,reason:Sn})}function Cn(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason===Sn}const wn=new Set([``,`false`,`0`,`null`,`undefined`]);function Tn(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0&&!Number.isNaN(e):!wn.has(e)}async function En(e,t){M(t.options.signal);try{return await zn(e,t.context,async()=>await Dn(e,t))}catch(t){throw R(t,e)}}async function Dn(e,t){if(e.kind===`command`)return await On(e.command,e.appId,t);await Pn(e,t)}async function On(e,t,n){if(e.kind===`evalScript`)return await jn(e,n);let r=qt(e,n.context);try{return await Mn(r,t,n)}catch(e){if(M(n.options.signal),An(r)&&Cn(e)){n.warnings.push(kn(r,e)),n.skipped+=1;return}throw Bn(e,r)}}function kn(e,n){let r=`${e.source.path?`${e.source.path}:`:``}line ${e.source.line}`,i=n instanceof t?n.message:String(n);return`Optional Maestro ${e.kind} skipped at ${r}: ${i}`}function An(e){return`optional`in e&&e.optional===!0}async function jn(e,n){let{evaluateMaestroEvalScript:r}=await import(`./engine-eval-script.js`);if(n.options.trustedScripts===!1)throw new t(`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(e.script,n.context.values);n.context.replaceOutput(i),n.executed+=1}async function Mn(e,t,n){switch(e.kind){case`assertVisible`:await L({kind:`visible`,selector:e.target},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await L({kind:`notVisible`,selector:e.target},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`assertTrue`:if(!Tn(e.condition))throw F(`Maestro assertTrue condition was falsy: ${JSON.stringify(e.condition)}`);n.executed+=1;return;case`extendedWaitUntil`:await L(Rn(e),j(e.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await Nn(e,t,n)}}async function Nn(e,t,n){let r=T({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 M(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 Pn(e,t){let n=qt(e.command,t.context);switch(n.kind){case`runFlow`:if(n.when&&!await In(n.when,t)){t.skipped+=1;return}t.executed+=1,await I(e.body,t);return;case`repeat`:{let r=Jt(n.times,0,t.context,`repeat.times`);t.executed+=1;for(let n=0;n<r;n+=1)M(t.options.signal),await I(e.body,t);return}case`retry`:{let r=Math.min(Jt(n.maxRetries,1,t.context,`retry.maxRetries`),tt.control.retryMaxRetries);t.executed+=1,await Fn(e.body,r,t);return}}}async function I(e,t){for(let n of e)await En(n,t)}async function Fn(e,n,r){let i;for(let t=0;t<=n;t+=1){M(r.options.signal);try{await I(e,r);return}catch(t){if(M(r.options.signal),!Cn(Hn(t)))throw t;i=R(t,e[0])}}throw i||new t(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function In(e,t){if(!en(e,t.context,t.options))return!1;for(let n of tn(e))if(M(t.options.signal),!(await Ln(n,t.timing.runFlowConditionTimeoutMs,t)).matched)return!1;return!0}async function L(e,t,n){if(!(await Ln(e,t,n)).matched)throw F(`Maestro ${e.kind} condition did not match.`)}async function Ln(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 M(n.options.signal),n.context.recordObservation(i),i}function Rn(e){if(e.visible)return{kind:`visible`,selector:e.visible};if(e.notVisible)return{kind:`notVisible`,selector:e.notVisible};throw new t(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function zn(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 R(e,t){if(Vn(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:Un(e,t?.command),source:n,...t?{command:t.command}:{}}}function Bn(e,t){return{kind:`maestroPlanStepFailure`,error:Un(e,t),source:t.source,command:t}}function Vn(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function Hn(e){return Vn(e)?e.error:e}function Un(e,n){if(!(e instanceof t)||!n||/\bline \d+\b/.test(e.message))return e;let r=n.source.path?`${n.source.path}:`:``;return new t(e.code,`${e.message} (${r}line ${n.source.line})`,e.details)}async function Wn(e,n,r={}){M(r.signal);let i=r.startIndex??0;if(!Number.isInteger(i)||i<0||i>e.total)throw new t(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${e.total}-step plan.`);let a={plan:e,port:n,options:r,context:Xe(r.defaults,r.env?{...r.env}:{}),timing:nt,artifacts:new Set,warnings:[],executed:e.compatibility.staticallyExecutedControls,skipped:e.compatibility.staticallySkippedControls};for(let t=i;t<e.steps.length;t+=1)try{await Gn(e.steps[t],t,a)}catch(e){throw Hn(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function Gn(e,t,n){M(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};z(()=>n.options.observer?.commandStarted?.(s));try{let t=await En(e,n);M(n.options.signal),z(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...Kn(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=R(t,e);throw z(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...Kn(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],warnings:[...n.warnings]})),o}}function Kn(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 z(e){try{e?.()}catch{}}async function qn(e,t,n={}){let r=Jn(e,n);return await Wn(e,t,{...n,startIndex:r})}function Jn(e,t){return t.from!==void 0||t.planDigest!==void 0?bn(e,{from:t.from,planDigest:t.planDigest}):xn(e,t.startIndex??0)}function Yn(e){return Kt(e)?{command:e.kind,...e.kind===`runFlow`?V(e.label??e.includePath):{}}:{command:e.kind,...Xn(e)}}function Xn(e){return`label`in e&&e.label?V(e.label):Zn(e)?V(ir(e.target)):Qn(e)?$n(e):e.kind===`inputText`?V(`<text>`):er(e)}function Zn(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function Qn(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function $n(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return V(B(e.target));case`extendedWaitUntil`:return V(B(e.visible??e.notVisible));case`scrollUntilVisible`:return V(B(e.element))}}function er(e){return tr(e)?nr(e):e.kind===`swipe`?rr(e):e.kind===`runFlow`?V(e.label??(e.include.kind===`file`?e.include.path:``)):e.kind===`assertTrue`?V(String(e.condition)):{}}function tr(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function nr(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 rr(e){return V(e.gesture.kind===`coordinates`?`${ar(e.gesture.start)} to ${ar(e.gesture.end)}`:e.gesture.direction)}function ir(e){return e.space===`target`?B(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function B(e){return e?.id??e?.text}function ar(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function V(e){return e?{value:e}:{}}const or=new Set(String.raw`^$\.*+?()[]{}|`);function sr(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function cr(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(or.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!or.has(i))return;t+=i,n+=1}return t}function lr(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(g(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=>ae(e,n)?e:null);return r?g(r.rect)?t.isVisibleInEffectiveViewport(r):n!==`android`&&r.hittable===!0:!1}function ur(e,t,n){return!!n.findAncestor(e,e=>e.index===t.index?e:null)}function dr(e,t){let n=[t.id===void 0?void 0:pr(e.identifier,t.id),t.text===void 0?void 0:mr(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 fr(e){return e.matches.filter(t=>lr(t,e.visibility,e.platform))}function pr(e,t){let n=e??``;return E(n)===E(t)||sr(n,t)}function mr(e,t){return[e.label,Ze(e),e.identifier].filter(e=>!!e).some(e=>pr(e,t))}function hr(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 gr(e){return e.text!==void 0||e.id!==void 0||e.enabled!==void 0||e.selected!==void 0}function _r(e,t,n){let r=[],i=0;for(let a of e)for(let e of n){let n=yr(a.rect,e.rect);n===void 0||!vr(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 vr(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 yr(e,t){if(!(!br(e)||!br(t)))return Math.fround(Math.hypot(H(e.x,e.width)-H(t.x,t.width),H(e.y,e.height)-H(t.y,t.height)))}function br(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite))}function H(e,t){return e+Math.trunc(t/2)}function xr(e,n={},r={}){let i=ee(e.nodes,n);n.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=(t,r)=>{let i=c.get(t);i||(i=new WeakMap,c.set(t,i));let a=i.get(r);if(a)return a;n.onPositionComputed?.(t,r);let o=_r(e.nodes,t,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 t(`INVALID_ARGS`,`Maestro selector relations cannot contain cycles.`);o.add(i),n.onSelectorComputed?.(i);try{let t=Sr(e,i,l,u,m,p),n={matches:t,indexed:Er(t,i.index,r.orderUnindexed)};return a.set(i,n),n}finally{o.delete(i)}};return{visibility:i,resolve:m,resolvePosition:f}}function Sr(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=gr(m)?e.nodes.filter(e=>dr(e,m)):[...e.nodes];if(s){let e=new Set(i(s).indexed.map(e=>e.index));h=h.filter(t=>wr(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=>Cr(i(e).indexed,r));h=h.filter(t=>e.every(e=>e.has(t.index)))}for(let[e,n]of Tr(t)){let t=a(e,n);h=h.filter(e=>t.has(e.index))}return h}function Cr(e,t){let n=new Set;for(let r of e)for(let e of t(r))n.add(e);return n}function wr(e,t){for(let n of e)if(t.has(n))return!0;return!1}function Tr(e){return[[`below`,e.below],[`above`,e.above],[`leftOf`,e.leftOf],[`rightOf`,e.rightOf]].filter(e=>e[1]!==void 0)}function Er(e,t,n){if(t===void 0)return n?n(e):[...e];let r=Or(e)[kr(t)];return r?[r]:[]}function Dr(e,t){return t===void 0?e[0]:Or(e)[kr(t)]}function Or(e){return[...e].sort((e,t)=>{let n=U(e.rect?.y),r=U(t.rect?.y);return n===r?U(e.rect?.x)-U(t.rect?.x):n-r})}function U(e){return e!==void 0&&Number.isFinite(e)?e:2**53-1}function kr(e){let n=typeof e==`number`?e:Number(e.trim());if(!Number.isSafeInteger(n)||n<0)throw new t(`INVALID_ARGS`,`Maestro selector.index must be a non-negative integer.`);return n}const Ar={android:{kind:`exact`,provider:`android-helper`},ios:{kind:`divergence`,provider:`apple-xctest`,reason:`maestro-clickable-not-exposed-by-provider`}};function jr(e,t){let n=Ar[t];if(n.kind===`divergence`)return n;let r=s(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 W(e,t){return t.kind===`exact`?e.map((e,n)=>({node:e,order:n,rank:Mr(t.clickableByNodeIndex.get(e.index))})).sort((e,t)=>t.rank-e.rank||e.order-t.order).map(({node:e})=>e):[...e]}function Mr(e){return e===!0?2:+(e===!1)}function Nr(e,t,n,r={}){let i=jr(e,n),a=Fr(e,i,r),o=Pr(t,a),s=fr({visibility:a.visibility,matches:o.matches,platform:n});return{...o,visible:s,clickability:i,ranked:Ir(s,t,n,a.visibility,i)}}function Pr(e,t){return{matches:t.resolve(e).matches,parentMatched:e.childOf===void 0||t.resolve(e.childOf).indexed.length>0}}function Fr(e,t,n={}){return xr(e,n,t?{orderUnindexed:e=>W(e,t)}:{})}function Ir(e,t,n,r,i){let a=n!==`ios`||!Br(t)?e:e.filter(n=>{if(Ur(n))return!0;let i=e.filter(e=>e!==n&&Vr(n,e,t));return!i.some(e=>Ur(e)&&ur(n,e,r))&&!i.some(e=>ur(e,n,r))});return t.index===void 0&&i?W(a,i):a}function Lr(e,t){let n=t===void 0?e.find(G):Rr(e,t);return!n||!G(n)?null:{node:n,rect:n.rect}}function Rr(e,t){return Dr(e,t)}function zr(e){return G(e)?e.rect:void 0}function G(e){return g(e.rect)}function Br(e){return e.id!==void 0||e.text!==void 0}function Vr(e,t,n){if(n.id!==void 0&&K(e.identifier)!==K(t.identifier))return!1;if(n.text!==void 0){let n=Hr(e),r=new Set(Hr(t));if(!n.some(e=>r.has(e)))return!1}return!0}function Hr(e){return[e.label,e.value,e.identifier].map(K).filter(e=>e!==void 0)}function K(e){if(e)return E(e)||void 0}function Ur(e){let t=te(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}const Wr=Symbol(`maestroFlowProgram`),Gr=Symbol(`maestroFailureCommand`),Kr=Symbol(`maestroFailurePlan`);function qr(e,t){let n=et(e,{sourcePath:t});return{sourcePath:t,name:n.config.name,appTarget:Zr(n),[Wr]:n}}async function Jr(e,t,n){let r;try{let i=Qe(D.dirname(e.sourcePath),n.readSource),a=await gn(e[Wr],{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,runtimeHints:n.runtimeHints,loadProgram:i,signal:n.signal}),o=bn(a,{from:n.from,planDigest:n.planDigest}),s=await qn(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:Xr(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 Yr(e,t){let n=$r(e[Gr]),r=e[Kr].platform;return!n||r!==`android`&&r!==`ios`?[]:Nr(t,n.selector,r).ranked.map(e=>({node:e,basis:ei(n.selector,e)}))}function Xr(e,t,n){return{commandStarted:e=>t?.actionStarted?.(q(e)),commandCompleted:e=>t?.actionCompleted?.({...q(e),durationMs:e.durationMs,runtimeMetrics:e.runtimeMetrics,data:e.data}),commandFailed:r=>{let i=yn(e,{from:r.stepIndex,planDigest:e.digest}),a={...q(r),durationMs:r.durationMs,error:r.error,artifactPaths:r.artifactPaths,warnings:[...r.warnings],isControl:Kt(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},[Gr]:r.command,[Kr]:e};n(a),t?.actionFailed?.(a)}}}function q(e){let t=Yn(e.command);return{action:t.command,...t.value?{value:t.value}:{},source:e.source,generation:e.generation,stepIndex:e.stepIndex,stepTotal:e.stepTotal}}function Zr(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(Qr)}function Qr(e){return!!(e?.trim()&&!e.includes(`$`)&&!a(e))}function $r(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 ei(e,t){return e.id!==void 0||e.text!==void 0&&dr({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text===void 0?`other`:`label`}const ti=`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 ni(e,n){let r=e.files[n];if(r===void 0)throw new t(`INVALID_ARGS`,`replay script source is missing ${n}; it was not part of the script sources sent with this request.`,{path:n,entry:e.entry});return r}function ri(e){let t=oe(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return oi(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function ii(e,t){return t===`ios`?si(e)??{}:{}}function ai(e,t){let n=ri(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function oi(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!a(e))}function si(e){let t=Mt(e);return t?{appleSimulatorAppTarget:t}:void 0}function ci(e){let n=e.flags??{};if(n.waitMs===void 0)return;let[r]=se(`waitMs`);if(!r)throw new t(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return o(n,`waitMs`,{min:r.min,max:r.max})}function li(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function ui(e){return{...li(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function di(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 pi({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function fi(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function pi(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=ue.fromTimeoutMs(a),s=()=>fi(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;Ee({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 ce(Math.min(250,o.remainingMs())),Te(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};mi(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function mi(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}const hi={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.`},J=new Map;async function gi(e){let t=await O.mkdtemp(D.join(ot.tmpdir(),`agent-device-materialized-`));try{let n=await bi(e.installablePath,D.join(t,`installable`)),r=e.archivePath?await bi(e.archivePath,D.join(t,`archive`)):void 0,i=it.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{yi(i)},a);return J.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 O.rm(t,{recursive:!0,force:!0}),e}}async function _i(e,t){await Y(e,ke(J,e,t,hi))}async function vi(e){let t=Array.from(J.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await Y(e,t)}))}async function yi(e){let t=J.get(e);if(t)try{await Y(e,t)}catch{}}async function Y(e,t){clearTimeout(t.timer),J.delete(e),await O.rm(t.rootPath,{recursive:!0,force:!0})}async function bi(e,t){let n=await O.stat(e);await O.mkdir(t,{recursive:!0});let r=D.join(t,D.basename(e));return n.isDirectory()?(await O.cp(e,r,{recursive:!0}),r):(await O.copyFile(e,r),r)}function xi(e){return e.device.platform===`web`}function Si(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function Ci(e){let{session:t,sessionName:n,sessionStore:r}=e;t.appLog&&await Ve({session:t,sessionName:n,sessionStore:r,resourcePath:ze.resolvePath(r.resolveSessionDir(n))})}async function wi(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.perfCapture&&await Be({...e,session:t,intent:`disposal`})}async function Ti(e,t){await t.stopSnapshotHelper(e.device)}async function Ei(e){let{session:t,sessionName:n,sessionStore:r,platformCleanup:i}=e;await i.closeManagedBrowser({device:t.device,sessionName:n,stateDir:r.resolveDaemonStateDir(),openSessionNames:()=>Si(r)})}async function Di(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 Oi(e){if(e.failures.length===0)return;let n=e.failures.map(({step:e})=>e),r=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return _({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:n,errors:r}}),new t(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${r.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.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 ki(e){let{session:n,sessionName:r,sessionStore:i}=e;if(!e.platformCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let a=e.platformCleanup,o=[{step:`recording`,run:()=>Ai({session:n,sessionName:r,sessionStore:i})},...e.appLog===`run`?[{step:`app_log`,run:()=>Ci({session:n,sessionName:r,sessionStore:i})}]:[],{step:`audio_probe`,run:()=>ji({session:n,sessionName:r,sessionStore:i})},{step:`perf_capture`,run:()=>wi({session:n,sessionName:r,sessionStore:i})},{step:`platform_snapshot_helper`,run:()=>Ti(n,a)},{step:`web_browser`,run:()=>Ei({session:n,sessionName:r,sessionStore:i,platformCleanup:a})}];o.push({step:`materialized_paths`,run:()=>vi(r)});let s=Oi({sessionName:r,phase:`session_teardown_cleanup_failed`,failures:await Di(o)});if(s)throw s}async function Ai(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.screenRecording&&await rt({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}async function ji(e){let t=e.sessionStore.get(e.sessionName)??e.session;t.audioProbe&&await Re({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}function Mi(e){return d(e)&&e.kind===`simulator`}function Ni(e){return e.platform===`android`&&e.kind===`emulator`}const Pi=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function X(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Z(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 Q(e){return Ae(Z(e))}function $(e,n){if(e!==void 0){if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`Invalid open runtime ${n}: expected string.`);return v(e)}}function Fi(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Ii(e){if(e!==void 0){if(typeof e!=`number`)throw new t(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Fi(e)}}function Li(e,n,i){if(e===void 0)return i;if(!r(e))throw new t(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(i&&e!==i)throw new t(`INVALID_ARGS`,`open runtime targets ${e}, but session "${n}" is bound to ${i}.`);return e}function Ri(e){if(r(e))return e}function zi(e,t){return{platform:t,metroHost:v(e?.metroHost),metroPort:Fi(e?.metroPort),bundleUrl:v(e?.bundleUrl),launchUrl:v(e?.launchUrl)}}function Bi(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 Vi(e){if(Ni(e))return`10.0.2.2`;if(Mi(e))return`127.0.0.1`}function Hi(e,t){if(!e||v(e.metroHost)||v(e.bundleUrl)||e.metroPort===void 0)return e;let n=Vi(t);return n?{...e,metroHost:n}:e}function Ui(e){let{runtime:n,sessionName:r,platform:i}=e;if(n===void 0)return;if(!n||typeof n!=`object`||Array.isArray(n))throw new t(`INVALID_ARGS`,`open runtime must be an object.`);let a=n,o=Object.keys(a).find(e=>!Pi.includes(e));if(o)throw new t(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Pi.join(`, `)}.`);return{platform:Li(a.platform,r,i),metroHost:$(a.metroHost,`metroHost`),metroPort:Ii(a.metroPort),bundleUrl:$(a.bundleUrl,`bundleUrl`),launchUrl:$(a.launchUrl,`launchUrl`)}}function Wi(e,t,n){if(n){if(X(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function Gi(e,n,r,i){let a=e.getRuntimeHints(n);if(!a)return;let o=r?c(r):void 0,s=Ri(o)??i;if(a.platform&&r&&!s)throw new t(`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 t(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${n}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Ki(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Ri(c(i)):e.platform,o=n.getRuntimeHints(r),s=Ui({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Gi(n,r,i,a);return{runtime:i?Hi(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let l=s&&X(s)>0?s:void 0;return{runtime:i?Hi(l,i):l,previousRuntime:o,replacedStoredRuntime:!0}}function qi(e){return Ki(e).runtime}function Ji(e){try{return{ok:!0,data:Ki(e)}}catch(e){let t=n(e);return i(t.code,t.message,t.details)}}async function Yi(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Xi(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Z(t)})}function Xi(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&Q(e.previousRuntime)&&!Q(e.runtime)}function Zi(e){let{device:t,owner:n,stateDir:r,intent:i}=e,a=i.kind===`exact-owner`&&ie(i.owner,n)?ne(i.fence):null;if(!a)return{status:`binding-invalid`};let o=C(w(t)),s=Fe(Me(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!$i(c.stateDir,r)||!ie(Pe(c),n)?{status:`conflict`,conflict:s}:c.allocator.identityIncarnationId===a.identityIncarnationId?{status:`covered`}:{status:`incarnation-stale`,heldIncarnationId:c.allocator.identityIncarnationId}}function Qi(e){let t=C(w(e));return je(Me(t))}function $i(e,t){return D.resolve(e)===D.resolve(t)}function ea(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=c(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=l(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${le(i)}`,`${a} ${le(e.id)}`,...n===`release`||Ne(t.classification)?[`--stale`]:[]].join(` `)}function ta(e,n){if(n.classification===`allocator-held`)return ra(e,n);let r=n.claim,i=ea(e,n,Ie(n.classification)?`release`:`status`),a=c(r?{platform:r.device.family,appleOs:r.device.appleOs}:e);return new t(`DEVICE_IN_USE`,r?`${a} device ${e.id} is owned by session "${r.session}" in workspace "${r.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:ua(n.classification),classification:n.classification,deviceKey:n.deviceKey,...r?{owner:{session:r.session,workspace:r.workspace,stateDir:r.stateDir}}:{},recovery:{command:i},hint:Ie(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 na(e,t){return la(ta(e,t))}function ra(e,n){let r=n.allocatorClaim,i=c({platform:r.device.family,appleOs:r.device.appleOs}),a=ea(e,n);return new t(`DEVICE_IN_USE`,`${i} device ${e.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 ia(e,n){return new t(`COMMAND_FAILED`,`${c(e)} device ${e.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:h(n),deviceKey:C(w(e)),retriable:!1,hint:`A managed identity becomes executable only after its allocator activates it and this installation holds its allocator-held claim.`})}function aa(e,n,r){return new t(`COMMAND_FAILED`,`${c(e)} device ${e.id} is held for identity incarnation "${r}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:h(n),deviceKey:C(w(e)),heldIncarnationId:r,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function oa(e,n){return new t(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:h(n),deviceKey:C(w(e)),retriable:!1})}function sa(e,t,n){switch(n.status){case`binding-invalid`:return{admitted:!1,error:oa(e,t)};case`missing`:return{admitted:!1,error:ia(e,t)};case`covered`:return{admitted:!0};case`incarnation-stale`:return{admitted:!1,error:aa(e,t,n.heldIncarnationId)};case`conflict`:return{admitted:!1,error:ta(e,n.conflict)}}}function ca(e,t,n){let r=sa(e,t,n);return r.admitted?void 0:la(r.error)}function la(e){let{hint:t,retriable:n,...r}=e.details??{};return i(e.code,e.message,r,{hint:t,retriable:n})}function ua(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 da(e){switch(e.kind){case`local-family`:return`ordinary`;case`managed-local`:return`allocator-held`;case`provider-runtime`:return`none`}}export{hr as $,gi as A,Yr as B,wi as C,Si as D,xi as E,ii as F,Nr as G,qr as H,ai as I,Rr as J,Ir as K,ri as L,ui as M,ci as N,_i as O,si as P,xr as Q,ti as R,Ci as S,ki as T,Fr as U,Jr as V,Pr as W,W as X,zr as Y,jr as Z,Ri as _,St as _t,ta as a,Pt as at,Ai as b,ct as bt,zi as c,Dt as ct,Yi as d,kt as dt,fr as et,Bi as f,xt as ft,Xi as g,Ct as gt,Wi as h,vt as ht,sa as i,j as it,di as j,vi as k,X as l,Et as lt,Z as m,bt as mt,ca as n,cr as nt,Qi as o,Nt as ot,qi as p,yt as pt,Lr as q,na as r,F as rt,Zi as s,jt as st,da as t,lr as tt,Q as u,Ot as ut,Ji as v,ft as vt,Ti as w,Oi as x,ji as y,dt as yt,ni as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{N as t,V as n}from"./sdk-contracts.js";import{AsyncLocalStorage as r}from"node:async_hooks";var i=e({listDeviceInventory:()=>l,listLocalDeviceInventory:()=>d,readDeviceInventory:()=>u,readInstalledAppProbe:()=>c,shouldPropagateDeviceInventoryProbeError:()=>m,withDeviceInventoryContext:()=>s});const a=`device_inventory_context_unavailable`,o=new r;async function s(e,t){return await o.run(e,t)}function c(){return o.getStore()?.findInstalledApp}async function l(e){return await f(`providerFirst`,e)}async function u(e){let t=p(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function d(e){return await f(`localOnly`,e)}async function f(e,t){let n=p();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function p(){let e=o.getStore();if(!e)throw new t(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:a});return e}function m(e){return n(e)||e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason===a?!0:e instanceof Error&&e.name===`AbortError`}export{m as a,u as i,l as n,s as o,d as r,i as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-batch-runner.js";import{
|
|
1
|
+
import{_ as e}from"./sdk-batch-runner.js";import{m as t,p as n}from"./sdk-device.js";import{r}from"./recording-export-quality.js";import{n as i}from"./recording-scope.js";import{i as a,n as o}from"./recording-stop-observation.js";import{t as s}from"./screen-recording-completion.js";import{t as c}from"./artifact-paths.js";async function l(e,t){try{return await e()}catch{if(t?.aborted)throw t.reason;return!1}}function u(e){return e.exitCode===0}function d(e){return process.platform===`darwin`&&(t(e)||n(e)&&e.kind===`simulator`||e.platform===`android`&&e.kind===`emulator`)}const f=[`scope`,`showTouches`,`recordOnlySession`,`activeSessionApp`,`exportQuality`];function p(e){return i(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`&&(e.exportQuality===void 0||r(e.exportQuality))&&m(e.activeSessionApp)}function m(t){return t===void 0?!0:!e(t)||!h(t.bundleId)?!1:t.name===void 0||h(t.name)}function h(e){return typeof e==`string`&&e.length>0}function g(e){return e.exportPath===void 0?e.observation===void 0||e.observation.recorder===`unconfirmed`:!1}const _=`stopObservation`,v=`stoppedAtMs`,y=`stopRecorderWarning`,b=`collectedPath`,x=`exportPath`,S=`stopFinalization`,C=Symbol(`unreadable`),w={telemetryPath:j(),warning:j(),overlayWarning:j(),nativePathDisposition:{encode:e=>e,read:e=>e===void 0?void 0:a(e)?e:C},chunks:{encode:e=>e.map(M),read:e=>e===void 0?void 0:N(e)??C},capturedDurationMs:{encode:e=>e,read:e=>e===void 0?void 0:F(e)?e:C}};function T(e){return{...e.observation===void 0?{}:{[_]:D(e.observation)},...e.stoppedAtMs===void 0?{}:{[v]:e.stoppedAtMs},...e.recorderWarning===void 0?{}:{[y]:e.recorderWarning},...e.collectedPath===void 0?{}:{[b]:e.collectedPath},...e.exportPath===void 0?{}:{[x]:e.exportPath},...e.finalization===void 0?{}:{[S]:O(e.finalization)}}}function E(e){let t=e?.[_],n=e?.[v],r=I(e?.[y]),i=I(e?.[b]),a=I(e?.[x]),s=k(e?.[S]);return{...o(t)?{observation:t}:{},...F(n)?{stoppedAtMs:n}:{},...r===void 0?{}:{recorderWarning:r},...i===void 0?{}:{collectedPath:i},...a===void 0?{}:{exportPath:a},...s===void 0?{}:{finalization:s}}}function D(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function O(e){let t={};for(let n of A()){let r=e[n];r!==void 0&&(t[n]=w[n].encode(r))}return t}function k(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n={};for(let e of A()){let r=w[e].read(t[e]);if(r===C)return;r!==void 0&&(n[e]=r)}return Object.keys(n).length===0?void 0:n}function A(){return Object.keys(w)}function j(){return{encode:e=>e,read:I}}function M(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function N(e){if(!Array.isArray(e))return;let t=e.map(P);return t.every(e=>e!==void 0)?t:void 0}function P(e){if(typeof e!=`object`||!e)return;let{index:t,path:n,clientOutPath:r}=e,i=I(n),a=I(r);if(!(!Number.isInteger(t)||t<1||i===void 0)&&(r===void 0||a!==void 0))return{index:t,path:i,...a===void 0?{}:{clientOutPath:a}}}function F(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function I(e){return typeof e==`string`&&e.length>0?e:void 0}async function L(e){let{steps:t,snapshot:n,progress:r,now:i=Date.now}=e,a=E(r?.learned),o=a.observation,l=a.recorderWarning,u=a.stoppedAtMs;if(g(a)){u=i();let e=await t.stop();o=e.observation,l=e.warning,r?.record(T({observation:o,stoppedAtMs:u,recorderWarning:e.warning}))}if(o===void 0)throw Error(`record stop reached collection without an observation of its recorder and a committed export`);let d=a.collectedPath??c(n.outPath);a.collectedPath===void 0&&(await t.collect(d),r?.record(T({collectedPath:d})));let f=a.finalization??await t.finalize({collectedPath:d,exportPath:n.outPath,stoppedAtMs:u??i()});r?.record(T({exportPath:n.outPath,finalization:f})),await t.discard(d);let{nativePathDisposition:p,warning:m,...h}=f,_=[m,l].filter(e=>e!==void 0&&e.length>0);return s(n,{...h,..._.length===0?{}:{warning:_.join(` `)}},{stopObservation:o,...p===void 0?{}:{nativePathDisposition:p}})}const R=`boot_timeout`;export{p as a,l as c,f as i,L as n,d as o,E as r,u as s,R as t};
|