agent-device 0.21.6 → 0.21.8
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.6.apk → agent-device-android-ime-helper-0.21.8.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.8.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.6.manifest.json → agent-device-android-ime-helper-0.21.8.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.6.apk → agent-device-android-snapshot-helper-0.21.8.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.8.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.6.manifest.json → agent-device-android-snapshot-helper-0.21.8.manifest.json} +6 -6
- package/apple/macos-helper/Package.swift +16 -1
- package/apple/macos-helper/Sources/AgentDeviceMacOSDeviceHub/DeviceHubPose.swift +47 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/DeviceHubPose.swift +320 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +66 -13
- package/apple/macos-helper/Sources/AgentDeviceMacOSInput/MouseClickDelivery.swift +116 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSInput/MouseClickSchedule.swift +61 -0
- package/apple/macos-helper/Tests/AgentDeviceMacOSDeviceHubTests/DeviceHubPoseTests.swift +30 -0
- package/apple/macos-helper/Tests/AgentDeviceMacOSInputTests/MouseClickScheduleTests.swift +58 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerScrollViewportPolicy.swift +1 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +25 -12
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +56 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +36 -108
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +241 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +29 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +46 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +85 -26
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +134 -117
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +1 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +25 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +3 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +197 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +30 -4
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +0 -81
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +1 -9
- package/dist/src/absence-observation-errors.js +1 -1
- 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/adb.js +1 -1
- package/dist/src/agent-browser-lifecycle.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/android-adb.d.ts +29 -2
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-catalog.js +1 -1
- package/dist/src/app-deployment-resolution.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory.js +1 -1
- package/dist/src/app-launch.js +2 -2
- package/dist/src/app-lifecycle.js +2 -2
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +1 -1
- 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/capture-disclosure.js +1 -0
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +18 -2
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/click-button.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +65 -3
- package/dist/src/clipboard-shell-response.js +1 -0
- package/dist/src/command-schema.js +1 -1
- package/dist/src/command-tools.js +4 -2
- package/dist/src/command.js +1 -1
- package/dist/src/config.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +1 -1
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-boot.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +2 -1
- package/dist/src/device-input-state.d.ts +5 -5
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-rotation.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/device-shell.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +1 -1
- package/dist/src/devicectl.js +1 -0
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/dispatch-resolve.js +1 -1
- package/dist/src/display-inventory.js +1 -0
- 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/finders.js +1 -1
- package/dist/src/format.js +2 -1
- package/dist/src/generic.js +1 -1
- 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/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/host.js +1 -0
- 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/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-binding.js +1 -0
- package/dist/src/interactor-operation-catalog.js +1 -1
- package/dist/src/interactor.js +4 -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.d.ts +9 -1
- 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 +4 -4
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +2 -2
- package/dist/src/inventory5.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/ios-target-activation.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-scope.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-download-file.js +1 -0
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +10 -4
- package/dist/src/linux.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/macos-facade.js +1 -1
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/mechanics.js +17 -16
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/multitouch-support.js +1 -1
- package/dist/src/observation.js +2 -2
- package/dist/src/output-common.js +5 -2
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +2 -2
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.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-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-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-worker-client.js +1 -0
- package/dist/src/png.js +1 -1
- package/dist/src/prepare-kind.js +1 -1
- package/dist/src/provider-session-ownership.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/rect-center.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +35 -35
- 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 +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-contract.js +3 -0
- package/dist/src/runner-dev-tools-security.js +1 -0
- package/dist/src/runner-device-readiness.js +1 -0
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-presentation.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime10.js +1 -1
- package/dist/src/runtime2.js +4 -4
- 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 -0
- 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 -0
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-image.js +1 -0
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot3.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-command.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +76 -1
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +29 -3
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-observation.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 +3 -3
- package/dist/src/session2.js +4 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/simctl-facade.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-boot.js +1 -1
- package/dist/src/simulator-facade.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -1
- package/dist/src/snapshot-diagnostics.js +1 -1
- package/dist/src/snapshot-quality-backend-capabilities.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/snapshot.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/src4.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/src8.js +2 -2
- package/dist/src/stop-sequence.js +1 -1
- package/dist/src/string-enum.js +1 -1
- package/dist/src/takeover.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/transport.js +1 -1
- package/dist/src/tree.js +1 -1
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/video.js +1 -1
- package/dist/src/viewport.js +1 -1
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/dist/src/webdriver-source.js +1 -1
- package/dist/src/window-state.js +1 -1
- package/package.json +4 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.6.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.6.apk.sha256 +0 -1
- package/dist/src/session-target-evidence.js +0 -1
- package/dist/src/vars.js +0 -2
package/dist/src/session2.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import{B as e,C as t,N as n,T as r,d as i,g as a,j as o,m as s,t as c,w as l}from"./sdk-contracts.js";import"./capture.js";import{D as u,n as d,r as f,t as p}from"./sdk-batch-runner.js";import{a as m,n as h,t as g}from"./snapshot-diagnostics.js";import{f as _}from"./android-input-ownership.js";import{_ as v,b as y,c as b,d as x,g as S,l as C,m as w,u as T,v as E}from"./sdk-device.js";import{A as ee,B as D,Cr as O,F as te,G as ne,I as re,In as ie,Ir as ae,J as oe,K as se,L as ce,N as le,P as ue,R as de,Rn as fe,Sr as pe,St as me,T as he,U as ge,Ur as _e,Vn as ve,Vr as ye,W as be,Wn as xe,X as Se,Y as Ce,Z as we,at as Te,bt as Ee,d as De,dn as Oe,dt as ke,en as Ae,f as je,fn as Me,ft as Ne,hn as Pe,j as Fe,jt as Ie,mn as Le,nn as Re,nr as ze,nt as Be,pn as Ve,q as He,rr as Ue,rt as We,tr as Ge,v as Ke,xt as qe,z as Je,zn as Ye,zr as Xe,zt as Ze}from"./sdk-batch.js";import{u as Qe}from"./scroll-gesture.js";import{a as $e,b as et,f as tt,g as nt,n as rt,p as it,r as at,w as ot,y as st}from"./script.js";import{_ as ct,a as lt,c as k,d as ut,f as dt,g as ft,h as pt,l as mt,m as ht,p as gt,t as _t,u as vt}from"./session-store.js";import{a as yt,c as bt,n as xt,o as St,r as Ct,t as wt}from"./session-target-evidence.js";import{a as Tt,i as Et,n as Dt,o as Ot,r as kt,s as At,t as jt}from"./vars.js";import{n as Mt,r as Nt,t as Pt}from"./format.js";import{A as Ft,_ as It,d as Lt,g as Rt,h as zt,j as Bt,k as Vt,l as Ht,m as Ut,o as Wt,p as Gt,s as Kt,u as qt}from"./parameterized-recorded-fill.js";import{F as Jt,N as Yt,P as Xt,c as Zt,f as Qt,j as $t,v as en}from"./runtime.js";import{$ as tn,A as nn,B as rn,C as an,D as on,F as sn,G as cn,H as ln,I as un,J as dn,K as fn,L as pn,M as mn,N as hn,Q as gn,R as _n,S as vn,T as yn,U as bn,V as xn,W as Sn,X as Cn,Y as wn,Z as Tn,_ as En,b as Dn,c as On,d as kn,dt as An,et as jn,f as Mn,ft as Nn,g as Pn,h as Fn,it as In,j as Ln,k as Rn,l as zn,m as Bn,mt as Vn,n as Hn,nt as Un,o as Wn,p as Gn,q as Kn,r as qn,rt as Jn,t as Yn,tt as A,u as Xn,v as Zn,w as Qn,x as $n,y as er,z as tr}from"./device-claim-rule.js";import{n as nr,t as rr}from"./catalog.js";import{g as ir,i as ar}from"./observability.js";import{i as or,n as sr,r as j}from"./success-text.js";import{d as cr,i as lr,u as ur}from"./absence-observation-errors.js";import{t as dr}from"./app-inventory.js";import{r as fr,t as pr}from"./device.js";import{a as mr,o as hr,r as M}from"./diagnostics.js";import{a as gr,i as _r,r as vr}from"./verified-file.js";import{c as yr,p as br}from"./exec.js";import{t as xr}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as Sr,r as Cr}from"./output-path.js";import"./command.js";import{a as wr,i as Tr,n as Er,t as Dr}from"./replay-divergence.js";import"./retry.js";import{r as Or}from"./version.js";import{t as kr}from"./session-paths.js";import{i as Ar,r as jr}from"./session-artifact-paths.js";import{t as Mr}from"./project-runtime.js";import{r as Nr}from"./rect-center.js";import{o as Pr}from"./android-system-chrome.js";import{t as Fr}from"./keyed-lock.js";import{n as Ir,t as Lr}from"./deploy-result-target.js";import{t as Rr}from"./keyboard-actions.js";import{a as zr,i as Br,n as Vr,o as Hr,r as N}from"./request-cancel.js";import{t as Ur}from"./request.js";import{i as Wr,s as Gr}from"./provider-session-ownership.js";import{a as Kr,i as P,s as qr}from"./request-runtime-binding.js";import{C as Jr,E as F,O as Yr,g as I,h as Xr,i as Zr,k as Qr,m as $r,n as ei,s as ti,v as ni,x as ri}from"./session-snapshot.js";import{c as ii,i as ai,t as oi}from"./device-claim-inspection.js";import{t as si}from"./audio-probe-result.js";import{T as ci,_ as li,a as ui,b as di,c as fi,d as pi,f as mi,g as hi,h as gi,i as _i,l as vi,m as yi,n as bi,o as xi,r as Si,s as Ci,t as wi,u as Ti,v as Ei,x as Di}from"./perf-runtime-plan.js";import{i as Oi,n as ki}from"./lease-context.js";import{h as Ai}from"./screenshot-runtime.js";import{n as L,r as ji}from"./device-isolation.js";import{a as Mi,n as Ni,r as Pi}from"./device-inventory-context.js";import{n as Fi,r as Ii,t as Li}from"./dispatch-resolve.js";import{t as Ri}from"./touch-reference-frame.js";import{a as zi,i as Bi,l as Vi,n as Hi,o as Ui,s as Wi,u as Gi}from"./session-routing.js";import{d as R}from"./src8.js";import{i as Ki,n as z,r as qi}from"./compatibility-policy.js";import{o as Ji,p as Yi}from"./quality-warnings.js";import{a as Xi,i as B,n as Zi,r as Qi,t as $i}from"./session-runtime-admission.js";import{t as ea}from"./semantic-index.js";import{n as ta,r as na}from"./device-selection-resolver.js";import{n as ra,r as ia}from"./doctor-output.js";import{t as aa}from"./record-runtime.js";import{n as oa}from"./gesture-runtime.js";import{i as sa,n as ca,r as la}from"./platform-runtime-open-target.js";import{t as ua}from"./snapshot-runtime.js";import{t as da}from"./app-log-files.js";import V from"node:path";import H,{promises as U}from"node:fs";import{createHash as fa}from"node:crypto";import pa from"node:os";import{fileURLToPath as ma}from"node:url";import{setTimeout as ha}from"node:timers/promises";import ga from"node:vm";function W(e,t){return R({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function _a(e){return R({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function va(e,t){let n=Ca(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},_a(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:ya(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ya(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function ba(e,t,n,r){let i=Ca(await r.resolveTarget({selector:e,...t},W(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw jn(`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 xa(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 Sa(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 Ca(e,t){return wa(e,t),Ta(e),Ea(e),Da(e),e}function wa(e,n){if(e.generation!==n)throw new t(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${n}.`)}function Ta(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Ea(e){if(e.rect!==void 0&&!Sa(e.rect)||e.viewport!==void 0&&!Sa(e.viewport))throw new t(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Da(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Oa(e,t,n,r,i,a={}){let o=ka(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Pa(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function ka(e,t,n,r,i){let a=n===`up`||n===`down`,o=rn(e,dn(e,r),i),s=o.visibility,c=Tn({visibility:s,matches:e.nodes.filter(e=>ae(e)),platform:r}),l=ye(s.viewportRects)??ja(c);if(!l||!Xe(l))return;let u=c.flatMap(e=>{if(!Xe(e.rect))return[];let t=Ma(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=Aa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(Na)[0]?.viewport}function Aa(e,t){return ae(e)?e:O(e,t)}function ja(e){let t;for(let n of e)Xe(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ma(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 Na(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Pa(e,t){let n=G(e,.5,.5),r=z.scrollUntilVisibleSwipe.nearEdgeFraction,i=z.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:G(e,.5,i)};case`down`:return{start:n,end:G(e,.5,r)};case`left`:return{start:n,end:G(e,i,.5)};case`right`:return{start:n,end:G(e,r,.5)}}}async function Fa(e,n,r){let i=A(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new t(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(W(n,n.command)):void 0;return{authored:e,gesture:La(await Ia(e.start,n,r,a),await Ia(e.end,n,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let t=await r.resolveGestureViewport(W(n,n.command)),{start:a,end:o}=Ra(t,e.direction,r.platform);return{authored:e,gesture:La(a,o,i),viewport:t}}let a=await ba(e.from,{purpose:`swipe`,timeoutMs:`optional`in n.command&&n.command.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs},n,r),o=a.viewport??await r.resolveGestureViewport(W(n,n.command)),{start:s,end:c}=za(a,e.direction,o);return{authored:e,gesture:La(s,c,i),target:a,viewport:o}}async function Ia(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(W(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 La(e,t,n){return{from:e,to:t,durationMs:n??z.command.swipeDurationMs}}function Ra(e,t,n){if(t===`left`||t===`right`){let n=Qe(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=z.screenSwipe,i=G(e,r.centerFraction,r.nearEdgeFraction),a=G(e,r.centerFraction,r.farEdgeFraction),o=G(e,r.centerFraction,r.downStartFraction),s=G(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function G(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function za(e,t,n){let r=Nr(e.rect),i=n.x+Math.trunc(n.width*z.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*z.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*z.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*z.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 Ba={launchApp:Ga,stopApp:Ga,clearState:Ga,openLink:Ga,tapOn:qa,doubleTapOn:qa,longPressOn:qa,swipe:Qa,inputText:$a,eraseText:$a,scroll:K,scrollUntilVisible:K,hideKeyboard:K,pressKey:K,back:K,waitForAnimationToEnd:K,takeScreenshot:no,runScript:no,evalScript:io,assertVisible:ro,assertNotVisible:ro,assertTrue:ro,extendedWaitUntil:ro},Va={launchApp:!0,stopApp:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,evalScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ha(e){return Va[e.kind]}async function Ua(e,t){let n=e.command;return await Wa(n,e,t,W(e,n))}function Wa(e,t,n,r){let i=Ba[e.kind];return i(e,t,n,r)}async function Ga(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,Ka(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`clearState`:return await q(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function Ka(e,t){return R({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function qa(e,t,n,r){switch(e.kind){case`tapOn`:return await Ja(e,t,n,r);case`doubleTapOn`:{let i=await po(e.target,{purpose:`doubleTap`,timeoutMs:Xa(e)},t,n),a=A(e.delay,`doubleTapOn.delay`)??z.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}case`longPressOn`:{let i=await po(e.target,{purpose:`longPress`,timeoutMs:Xa(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}}}async function Ja(e,t,n,r){let i=await Ya(e,t,n);return await q(n.tapOn,Za(e,i),r,`invalidate`,i.resolution?xa(i.resolution):void 0)}async function Ya(e,t,n){let r={purpose:`tap`,timeoutMs:Xa(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await po(e.target,r,t,n)}function Xa(e){return e.optional===!0?z.command.optionalTargetLookupTimeoutMs:z.command.targetLookupTimeoutMs}function Za(e,t){let n=A(e.repeat,`tapOn.repeat`),r=A(e.delay,`tapOn.delay`),i=n===void 0?r:r??z.command.repeatDelayMs;return R({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Qa(e,t,n,r){let i=await Fa(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?xa(i.target):void 0)}async function $a(e,t,n,r){switch(e.kind){case`inputText`:return await q(n.inputText,R({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await q(n.eraseText,R({charactersToErase:A(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function K(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,eo(e),r,`invalidate`);case`hideKeyboard`:return await q(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await q(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await q(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await q(n.waitForAnimationToEnd,to(e),r,`preserve`)}}function eo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:A(e.timeout,`scrollUntilVisible.timeout`)??z.command.scrollUntilVisibleTimeoutMs,durationMs:Ki(z.command.scrollUntilVisibleSpeed)}}function to(e){return R({timeoutMs:A(e.timeout,`waitForAnimationToEnd.timeout`)})}async function no(e,t,n,r){switch(e.kind){case`takeScreenshot`:return oo(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await q(n.runScript,R({file:e.file,env:e.env}),r,`preserve`)}}async function ro(e){throw new t(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}function io(e){throw new t(`COMMAND_FAILED`,`Maestro evalScript must be executed by the compute engine at ${e.source.path??``}line ${e.source.line}.`)}async function q(e,t,n,r,i){let a=ao(n,r);return oo(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function ao(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function oo(e,t,n,r){let i=e?.observation;return so(i,r),{...co(n??i),...lo(e?.outputEnv),...uo(t,e?.artifactPaths),...fo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function so(e,n){if(!(!e||n===void 0||e.generation===n))throw new t(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${n}.`)}function co(e){return e?{observation:e}:{}}function lo(e){return e?{outputEnv:{...e}}:{}}function uo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function fo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function po(e,t,n,r){if(e.space===`target`){let i=await ba(e.selector,t,n,r);return{authored:e,point:Nr(i.rect),resolution:i}}return{authored:e,point:await Ia(e,n,r)}}function mo(e,t,n,r={}){let i=n===`ios`&&r.presentation?go(r.presentation):void 0,a=i?_o(e,t,i):ln(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:xo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?cn(s,t.selector.index):Sn(s,t.selector.index)?.node,l=xo(t,o,s,c);if(!c)return vo(t,o,s,l);let u=i?Sn(i.visibleForSource(c),void 0):null,d=fn(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&&!ho(t.selector)&&i?yo(d,s,u):0,evidence:l}:vo(t,o,s,l)}const ho=Cn;function go(e){let t=pe(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>gn(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function _o(e,t,n){let r=dn(e,`ios`),i=wn(e,{},{orderUnindexed:e=>Kn(e,r)}),a=xn(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:bn(o,t.selector,`ios`,i.visibility,r)}}function vo(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 yo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&bo(n.rect,e)?1:0:t.length}function bo(e,t){let n=Nr(e),r=Nr(t);return n.x===r.x&&n.y===r.y}function xo(e,t,n,r){return R({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:qi,retryTapMaxAttempts:z.command.retryTapMaxAttempts,longPressDurationMs:z.command.longPressDurationMs,eraseTextMaxCharacters:z.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:z.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:z.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:z.command.waitForAnimationToEndDifferencePercent,observationPollMs:z.observation.pollIntervalMs};function So(e,t={}){return{execute:async n=>{let r=W(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ha(n.command)&&!i,visualStabilityBarrier:i});let a=await Ua(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await va(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Co(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function wo(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Co(n)}}function To(e){let t=wo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Gr(n,e.meta?.tenantId)},cleanup:()=>{Wr(n)}}}function Y(e,t,n){return t||Jn(n)?null:P(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function Eo(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function X(e){return In(e.flags)||!e.session?await Fi(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Do(e.session.device)}async function Do(e){if(qr(e)||!C(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ni.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Fi(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Fi({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Oo(e,t){return t?Vi(t,e).length===0:!1}async function ko(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=To(t);let n=No(t),l=await jo(a,t.flags),u=await Qi(e.inspectFacts)(l),d=B(`install_from_source`,u.operations.ensureReady)??B(`install_from_source`,u.operations.materializeAppSource)??B(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Zi(e.bindDevice)(l,Se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Po({artifact:s,retention:n,req:t,session:a,sessionName:r}),a&&F(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Fo(l,s,p,c),h=or(m,`Installed: ${Ir(m)}`);return k(i,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Rn(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:n(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function Ao(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Rn(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:n(e)}}}async function jo(e,n){let r=Mo(n?.platform);if(e&&r&&e.device.platform!==r)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await X({session:e,flags:n})}function Mo(e){return e===`ios`||e===`android`?e:void 0}function No(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Po(e){if(e.retention.enabled)return await Ln({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Fo(e,t,n,r){return C(e)?Io(t,n,r):Lo(t,n,r)}function Io(e,n,r){let i=n.bundleId??e.bundleId;if(!i)throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...zo(r),bundleId:i,...Ro(n,e),launchTarget:n.launchTarget??i}}function Lo(e,n,r){let i=n.packageName??n.launchTarget??e.packageName;if(!i)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...zo(r),packageName:i,...Ro(n,e),launchTarget:n.launchTarget??i}}function Ro(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function zo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Bo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Vo(t);if(!a.ok)return a.response;let o=Y(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await X({session:n,flags:t.flags}),c=await I({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:D});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return P(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:P(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Vo(e){let t=Ho(e);if(!t.ok)return t;let n=Uo(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Ho(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Uo(e){let t=Wo(e.flags?.devicePort),n=Wo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Wo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Go(e){return await I({...e,command:`runtime clear`,use:ce})}async function Ko(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Bo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await qo({...e,session:r.get(n)});if(!Jo(i))return P(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Yo({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Xo(n,o):Qo({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function qo(e){if(!e.session)return P(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await oa({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Jr(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function Jo(e){return e===`set`||e===`show`||e===`clear`}async function Yo(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(kn(i)&&r?.appBundleId){let e=await Go({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;F(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Fn(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Xo(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Zo(e){return e?E(e.device):void 0}function Qo(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Zo(i),s=Zn(t.flags?.platform??a?.platform??o);if(!s)return P(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(o!==void 0&&o!==s)return P(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Gn(a,zn(t.flags,s));return Xn(c)===0?P(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const $o=/^[A-Za-z0-9_.:-]{1,64}$/,es=8192,ts=4096;function ns(e){let n=e[0]?.trim(),r=e[1]?.trim();if(!n)throw new t(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!$o.test(n))throw new t(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new t(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:is(r,n)}}function rs(e,n,r){let i=E(e),a=as(e);if(!a)throw new t(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>ts)throw new t(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:ts});return s}function is(e,n){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>es)throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${es} bytes`);return r}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function as(e){return((C(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function os(e,t,n,r){let{eventName:i,payload:a}=ns([...r]),o=rs(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:$r(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...j(`Triggered app event: ${i}`)}}async function ss(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await I({command:`trigger-app-event`,device:t,use:Be,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>os(s,t,e,n)}}function cs(e){let n=(e[0]??`status`).toLowerCase();if(!Rr(n))throw new t(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new t(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return ls(n)}function ls(e){return e===`get`?`status`:e===`return`?`enter`:e}const us={"ime-probe":`android`},ds={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},fs={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ps(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$r(e)}}async function ms(e,t){let n=await I(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function hs(e,t){return e.operations.keyboardStatus(ps(t)).then(e=>({platform:us[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function gs(e,t){let n=await e.operations.keyboardDismiss(ps(t)),r=ds[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...j(ys(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...j(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function _s(e,t){let n=await e.operations.keyboardEnter(ps(t)),r=fs[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...j(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...j(`Keyboard enter pressed`)}}async function vs(e){let t=cs(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ms({command:`keyboard status`,device:n,use:me,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>hs(e,t)):t===`dismiss`?await ms({command:`keyboard dismiss`,device:n,use:Ee,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>gs(e,t)):await ms({command:`keyboard enter`,device:n,use:qe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>_s(e,t))}function ys(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function bs(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=Y(i,l,u);if(d)return d;let f=await X({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Ai(t)===`may-invalidate`&&F(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function xs(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return P(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function Ss(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await bs({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Jr(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Cs(e){return xs(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await Ss({...e,command:nr.keyboard,resolveRuntime:e=>vs(e)})}async function ws(e){return await Ss({...e,command:nr.triggerAppEvent,resolveRuntime:e=>ss(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await la(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function Ts(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Es(e,n){let r=n?.subject??`Payload`,i=e.trim();if(!i)throw new t(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!H.statSync(a).isFile())throw new t(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof t)throw e;let n=e.code;if(n===`EACCES`||n===`EPERM`)throw new t(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new t(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(Ts(i))return{kind:`inline`,text:i};throw new t(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Ds(e){let n=Es(e,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await Os(n.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Os(e){try{return await U.readFile(e,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new t(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new t(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new t(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new t(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function ks(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=Y(n,a,o);if(s)return s;let c=Fs(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Gr(l,t.meta?.tenantId):_t.expandHome(c.appPathInput);if(!H.existsSync(s))return P(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await X({session:a,flags:o}),d=await Qi(e.inspectFacts)(u),f=B(n,d.operations.deployApp);if(f)return f;let p=await Zi(e.bindDevice)(u,Ce);a&&F(a);let m=await p.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),h=js(u,c.app,s,m),g=or(h,`Installed: ${h.appName??Lr(h)}`),_=Ps(a,h);return _&&_!==a&&i.set(r,_),k(i,_,t,n,g),{ok:!0,data:g}}finally{l&&Wr(l)}}async function As(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=Y(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return P(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Ds(Is(c,t.meta?.cwd)),u=await X({session:i,flags:a}),d=await Qi(e.inspectFacts)(u),f=B(`push`,d.operations.ensureReady)??B(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Zi(e.bindDevice)(u,we);await p.operations.ensureReady({}),i&&F(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=C(u)?or({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):or({platform:E(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return k(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function js(e,t,n,r){return C(e)?Ms(t,n,r):Ns(e,t,n,r)}function Ms(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Ns(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function Ps(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Fs(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:P(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:P(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Is(e,t){let n=Es(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>_t.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Ls(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await ks({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await ko({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await As({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Rs(e,t,n){return await d(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const zs=new Set(`acceptAlert.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Bs(e){return zs.has(e)}const Vs=new Map(De.map(e=>[e.name,e]));function Hs(e){let t=new Set;for(let n of e){let e=Us(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Us(e){let t=Vs.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(Bs)?n:void 0}function Ws(e){if(e!==void 0&&e.remainingSteps.length!==0)return Hs(e.remainingSteps)}function Gs(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(e),plannedOperations:Ws(e.internal?.executionPlan)}}function Ks(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...j(`Closed: ${t.name}`)}})}function qs(e,t,n){if(!dt(t))return{kind:`not-armed`};let r=t.actions.length;Ks(e,t,n);let i=Gt(t),a=e.writeSessionLog(t,{force:qt(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(mt(t),{kind:`aborted`})}function Js(e,t){let r=n(t),i=Ft(e.scriptPublication??It);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ys(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Ks(r,n,t);try{let e=r.writeSessionLog(n,{force:qt(n,t.flags?.force)});e.written&&zt(n,e.path);return}catch(e){return Xs(e)}}function Xs(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof t?new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n(e).message}`,r)}async function Zs(e){let t=e.clearRuntimeHints?Je:de,n=await Xr({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,de)};let r=await n.bind(e.device,Je);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Qs(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await $s({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&kn(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Fn(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>nn(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function $s(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>$n({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>an({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>Dn({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Qn({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>yn(a,r))}function ec(e,t){return vn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function tc(e){if(e instanceof t)return e;let n=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const nc=(e,t)=>(e.positionals?.length??0)>0||on(t);async function rc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=dt(n),s=JSON.stringify(t.positionals??[]);if(o&&!ut(n,s)){let e=await ac({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Js(n,tc(e))};pt(n,s)}let c=qs(i,n,t);return c.kind===`failed`?{response:Js(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function ic(e){try{return{providerData:await An(e)}}catch(t){let r=n(t);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function ac(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(nc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Gs(t,r,n.trace?.outPath)});return}catch(e){return e}}function oc(e,n){if(!e.flags?.saveScript||Lt(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new t(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new t(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function sc(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.get(r);if(!c)return await dc({req:n,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});oc(n,c);let l=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!l)return P(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let u=e.platformResourceCleanup,d=await Zs({device:c.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!c.appBundleId&&kn(a.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;if(F(c),n.internal?.closeAppOnly===!0&&l)return await uc({req:n,session:c,logPath:i,lifecycle:d.runtime,app:l});let f=await rc({req:n,session:c,logPath:i,sessionStore:a,lifecycle:d.runtime});if(`response`in f)return f.response;let p=await cc({req:n,session:c,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:d.runtime,clearRuntimeHints:d.clearRuntimeHints,repairArmed:f.repairArmed,platformResourceCleanup:u});return p.kind===`response`?p.response:lc({session:c,repair:f,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:p.shutdownResult,providerData:p.providerData})}async function cc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Qs({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:ac,finalizeOrdinaryCloseScript:Ys,platformResourceCleanup:e.platformResourceCleanup}),m=await ic({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ec(r,u),g=d??h;if(g?n.deviceClaim&&M({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await di(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function lc(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:or({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...j(c),...o,...s}}}async function uc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await ac({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...j(`Closed: ${a}`)}}}async function dc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return P(`SESSION_NOT_FOUND`,`No active session`);let a=await Zs({device:await X({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Gs(t,n)}),{ok:!0,data:{app:t.positionals[0],...j(`Closed: ${t.positionals[0]}`)}})}function fc(e,t){return e.operations.ensureReady(t)}function pc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function mc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return hc(t,r);case`devices`:return await _c(t);case`capabilities`:return await Tc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await jc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function hc(e,t){let n=zi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ui(e.session,n)).map(e=>gc(e,t))}}}function gc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Ar(r),platform:E(t.device),...b(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...b(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function _c(e){try{let t=vc();return{ok:!0,data:{devices:(await bc(e)).map(e=>({...Rc(e),...yc(e,t)}))}}}catch(e){let t=l(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function vc(){let e=new Map;for(let t of ai({})){let n=t.claim;!n||oi(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function yc(e,t){let n=t.get(ii(Di(e)));return n?{claimedBy:n}:{}}async function bc(e){let t=e.flags?.platform;return wc(await Ni(xc(e,t)),e.flags?.platform,e.flags?.target)}function xc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Sc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Cc(n?.androidDeviceAllowlist)}}function Sc(e,t,n){return y({simulatorSetPath:ji(e),platform:t,target:n})}function Cc(e){let t=L(e);return t?Array.from(t).sort():void 0}function wc(e,t,n){let r=t?e.filter(e=>zc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Tc(e){let t=await Lc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Ec(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Pc(n,e.inspectFacts);return{ok:!0,data:{device:Rc(n),availableCommands:Ke().filter(e=>e===`appstate`&&r?!0:kc(e,i))}}}function Ec(e,t,n){return!t||!C(e)&&!T(e)||!Oo(n,t)?!1:Dc(t)||Oc(e,t)}function Dc(e){return!!(e.appName||e.appBundleId)}function Oc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function kc(e,t){let n=je(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Ac(t,e)))}function Ac(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function jc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Mc(t,e.providerAppCatalog);if(o)return o;let s=await Lc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=dr(t.flags?.appsFilter),u=L(t.flags?.androidDeviceAllowlist),d=await Fc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ic(await pc(f,await fc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Mc(e,t){let n=Nc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,N(e.meta?.requestId))]}}}function Nc(e){let t=ki(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Pc(e,t){if(t)try{return await t(e)}catch{return}}async function Fc(e){if(!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await e.inspectFacts(e.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Te)}}function Ic(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Lc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=Y(t.command,a,o);return s?{response:s}:{device:await X({session:a,flags:o,androidAvdSelection:i})}}function Rc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...b(r.platform)&&n?{appleOs:n}:{}}}function zc(e,t){return v(e,t)}function Bc(e){return P(`INVALID_ARGS`,e)}function Vc(e,n,r,i){try{return ca({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return P(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}async function Hc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await sa({target:n,platform:i.platform,surface:r});return a?Bc(a):null}async function Uc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await sa({target:n,platform:r});return i?Bc(i):null}function Wc(e){let t=er(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:kn(n),clearRemovedRuntimeHints:En({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Gc(e){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!f(a??``),execution:{startupDeadlineAtMs:qc(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(n)}});let{appBundleId:d,appName:p}=await Kc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new t(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Mn({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:p,runtime:c.runtime}}}async function Kc(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function qc(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Jc(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function Yc(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let n=await ua({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.ok?{ok:!0,data:{...o.data,snapshot:n.data}}:Xc(o.data,n.error)}catch(e){return Xc(o.data,n(e))}}function Xc(e,t){return{ok:!0,data:{...e,warnings:[...sr(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Zc(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...Qc(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=E(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,w(d.platform)&&(g.serial=d.id)),d&&C(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...j(`Opened: ${o??s??t}`)}}function Qc(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function $c(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const el=Object.freeze({async observeBootTimeMs(e){if(C(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function tl(e,t){e.warnings=[...sr(e),t]}function nl(e){return e.internal?.resolvedSessionScope??zi(e)}function rl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Ht(t,{});return}Lt(n)&&(Kt(t),tl(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function il(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function al(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function ol(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function sl(e,t){if(!t)return;let n=await ci(t);if(n.status!==`renewed`)return n.conflict?qn(e,n.conflict):P(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function cl(e){let{req:t,sessionName:n,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:u,appBundleId:d,runtimeHints:f,lifecycle:p,applyRuntimeHints:m,existingSession:h,deviceClaim:g,tookOverDeviceClaim:_,selection:v}=e,y=t.flags?.relaunch===!0,b=d,x=Date.now(),S=await ll({req:t,sessionName:n,sessionStore:i,device:o,surface:u,sessionAppBundleId:b,appName:l,existingSession:h});if(S.type===`response`)return S.response;let C=S.session??h,w=Date.now(),T=await p.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:b,surface:u,hasExistingSession:h!==void 0,relaunch:y,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:al(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Fn(f),applyRuntimeHints:m,execution:Gs(t,a,h?.trace?.outPath)});b=T.appBundleId??b;let E={...T.timing},ee=ta(v),D=s?ol(w,s,b):void 0;if(Br(t.meta?.requestId)){let e=r();return P(e.code,e.message,e.details)}h&&ri({session:h,command:`open`,positionals:[],flags:void 0});let O=$c({existingSession:C,sessionName:h?.name??Bi(t),sessionScope:h?.sessionScope??nl(t),device:o,surface:u,appBundleId:b,appName:l});O.lease=Nn({req:t,existingLease:h?.lease}),g&&(O.deviceClaim=g),t.runtime!==void 0&&Pn(i,n,f);let te=i.ensureSessionDir(n),ne=jr(te,t.meta?.requestId??mr().requestId);E.totalDurationMs=Math.max(0,Date.now()-x),M({level:`info`,phase:`open_timing`,durationMs:E.totalDurationMs,data:E});let re=Zc({sessionName:O.name,sessionStateDir:te,runnerLogPath:Ar(te),requestLogPath:ne,eventLogPath:i.resolveEventLogPath(n),appName:l,appBundleId:b,surface:u,startup:D,timing:E,device:o,runtime:f,runtimeHintCount:Xn,sessionReused:h!==void 0,selection:ee});return _&&tl(re,il(_)),rl({session:O,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:re}),i.set(n,O),i.recordAction(O,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:re}),{ok:!0,data:re}}async function ll(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=ul(e);r.set(n,o);let s=await a(o);return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function ul(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=$c({existingSession:o,sessionName:o?.name??Bi(t),sessionScope:o?.sessionScope??nl(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=Nn({req:t,existingLease:o?.lease}),s}function dl(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(i)return Hi(t,i.session)?P(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):Gi(i,n)}async function fl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Yn(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Hn(n,r,On({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await Ei({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:el})}}async function pl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=dl({req:t,device:a,sessionStore:i});if(m)return m;let h=await fl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return qn(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await ml({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Gc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await sl(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await cl({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function ml(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await di(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await li(t);M({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const hl=new Map;async function gl(e){let t=oe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Xr({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ge)};case`open-apply-runtime-hints`:{let t=await r(e.device,ne);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,be);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function _l(e){let t=Wc(e);if(t.type===`response`)return t;let n=await gl({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function vl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Jc({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return P(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Vc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return Bc(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let u=await Hc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await sl(i.device,i.deviceClaim);if(d)return d;let f=await Do(i.device),p=na(f);await o.internal?.retainDeviceExecutionLock?.(f.id);let m=await _l({req:o,sessionStore:r,sessionName:t,device:f,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;F(i);let _=await Gc({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:h.runtime,runtimeHintPlan:g,clearRuntimeHints:h.clearRuntimeHints,foreground:!1});return _.type===`response`?_.response:await sl(f,i.deviceClaim)||await cl({req:o,sessionName:t,sessionStore:r,logPath:n,device:f,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:_.details.appBundleId,appName:_.details.appName,runtimeHints:_.details.runtime,lifecycle:h.runtime,applyRuntimeHints:h.applyRuntimeHints,surface:l,existingSession:i,selection:p})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return Bc(`open --relaunch requires an app argument.`);let l=await Uc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await Ii(o.flags??{},Un(c)),d=u.device;await o.internal?.retainDeviceExecutionLock?.(d.id);let f=Vc(d,o.flags?.surface,c);if(typeof f!=`string`)return f;let p=await Hc({shouldRelaunch:s,openTarget:c,surface:f,device:d});if(p)return p;let m=await _l({req:o,sessionStore:r,sessionName:t,device:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;return await Fr(hl,d.id,async()=>await pl({req:o,sessionName:t,logPath:n,sessionStore:r,device:d,surface:f,openTarget:c,lifecycle:h.runtime,runtimeHintPlan:g,applyRuntimeHints:h.applyRuntimeHints,clearRuntimeHints:h.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:u}))}async function yl(e){let t=await vl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Yc({...e,inspectFacts:Qi(e.inspectFacts),bindDevice:Zi(e.bindDevice),openResponse:t})}const bl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,xl=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Sl(e){return t=>P(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function Cl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function wl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Tl(e){return e.available?null:P(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function El(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Dl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&Eo(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return P(`SESSION_NOT_FOUND`,e)}let s=Y(`appstate`,i,a);if(s)return s;let c=b(i?.device.platform)&&Oo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return P(`SESSION_NOT_FOUND`,bl);if(u&&!c)return P(`SESSION_NOT_FOUND`,xl);if(c&&i){let e=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return P(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:E(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...C(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a});if(C(d))return P(`SESSION_NOT_FOUND`,bl);if(T(d))return P(`SESSION_NOT_FOUND`,xl);let f=await I({command:`appstate`,device:d,use:We,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>P(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:kl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:E(d),package:m.package,activity:m.activity}}}async function Ol(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=L(a.androidDeviceAllowlist),c=s?[...s].sort():void 0,u=Ie({headless:a.headless===!0}),d;try{d=await X({session:i,flags:a,androidAvdSelection:`include-stopped`})}catch(e){let t=l(e);if(u.kind===`boot-target-headless`&&!El(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return P(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(a.target&&(d.target??`mobile`)!==a.target)return P(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await Xr({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Sl(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:a.serial,androidSerialAllowlist:c};return d=u.kind===`boot-target-headless`?await(await f.bind(d,u.use)).operations.bootTargetHeadless(p):await(await f.bind(d,u.use)).operations.bootTarget(p),{ok:!0,data:{platform:E(d),target:d.target??`mobile`,device:d.name,id:d.id,kind:d.kind,booted:!0,...b(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=await X({flags:a,session:i,androidAvdSelection:`include-stopped`}),c=Tl((await Cl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return P(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await wl(e.bindDevice)(s,Ze)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...b(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:P(l.error?.code??`COMMAND_FAILED`,Al(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Dl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function kl(e){let t=L(e);return t?[...t].sort():void 0}function Al(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function jl(e){let t=_r(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=H.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{H.closeSync(t)}}function Ml(e,t){da(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=vr(e);try{H.writeFileSync(r,n,`utf8`)}finally{H.closeSync(r)}}function Nl(e){let t=V.dirname(e),n=V.basename(e);H.existsSync(t)||H.mkdirSync(t,{recursive:!0});let r=gr(e);try{H.fsyncSync(r)}finally{H.closeSync(r)}let i=0;for(let e of H.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{H.unlinkSync(V.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Pl(e){return Ti.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Fl(e){try{return await Il(e)}catch(e){return{ok:!1,error:n(e)}}}async function Il(e){let t=Ll(e);if(!t.ok)return t;let n=t.session,r=le(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Rl(a,o);let c=ue({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await zl(e,n,r,c.use);case`capture-status`:return await Bl(e,n);case`capture-stop`:return await Vl(e,n)}}function Ll(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:P(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Rl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return P(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function zl(e,t,n,r){if(t.audioProbe){await fi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return P(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=Ci.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=Ci.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=V.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),c=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await xi({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...c,throwIfCanceled:e.throwIfCanceled});let l=e.sessionStore.get(e.sessionName)?.audioProbe;if(!l)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await l.handle.status()}}async function Bl(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Hl()};let r=await n.handle.status();return r.state===`stopped`&&await fi({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Vl(e,t){return t.audioProbe?{ok:!0,data:await fi({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Hl()}}function Hl(){return si({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Ul(e){let r=e.sessionStore.get(e.sessionName);if(!r)return P(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(ir(e.req.positionals?.[0]))throw new t(`INVALID_ARGS`,ar);uu(e.req);let n=wi({positionals:e.req.positionals,kind:fu(e.req.flags?.kind),outPath:fu(e.req.flags?.out)}),i=bi(n);if(i.kind===`capture-stop`)return Wl(e,await Jl(e,r,i.request));let a=await $i({device:r.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Wl(e,await Gl(e,r,a)):B(`perf`,a.fact)??P(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:n(e)}}}function Wl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,au(t.data)?{...t.data}:{}),t}async function Gl(e,n,r){let{device:i,plan:a}=Xi(r),o=Zi(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:eu(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:ou(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:su(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?_t.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:V.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Kl(e,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=lu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:_t.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Kl(e,t,n,r){if(t.perfCapture)return P(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return P(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=lu(e,r.outPath,i),o=ui.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=ui.createNextFence({admissionLedger:ql(e),resourcePath:o,device:t.device}),c=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await Si({admissionLedger:ql(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:c.pendingHandle,envelope:c.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:c.response}}function ql(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new t(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Jl(e,t,n){let r=t.perfCapture;if(!r)return P(`INVALID_ARGS`,`no active native perf capture`);let i=$l(r.handle.inspect(),n);if(i)return P(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(_t.expandHome(n.outPath,e.req.meta?.cwd));let a=await _i({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Yl(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function Yl(e){if(Xl(e)||Zl(e))return e;throw new t(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Xl(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Zl(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ql(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ql(e,t){return t.every(t=>typeof e[t]==`string`)}function $l(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function eu(e,t){return{...cu(e),metrics:{fps:tu(t.metric,e)},sampling:{fps:t.sampling}}}function tu(e,t){if(!au(e)||e.available!==!0)return e;let n=nu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function nu(e,t){let n=ru(t.windowStartedAt),r=ru(t.windowEndedAt)??ru(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:iu(e)})).slice(-12)}function ru(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function iu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function au(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ou(e,t){return{...cu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function su(e,t){return{...cu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function cu(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id}}function lu(e,t,n){return t?_t.expandHome(t,e.req.meta?.cwd):V.join(e.sessionStore.ensureSessionDir(e.sessionName),`${du()}-${n}`)}function uu(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new t(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function du(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function fu(e){return typeof e==`string`&&e.length>0?e:void 0}const pu=[`dump`,`log`],mu=`network requires ${pu.join(` or `)}`,hu=`network include mode must be one of: ${c.join(`, `)}`,gu=2048;async function _u(e){let t=e.sessionStore.get(e.sessionName);if(!t)return P(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=vu(e.bindDevice),r=(await n(t.device,ee)).facts.networkDump;if(!r.available)return Cu(r.hint);let i=yu(e.req);if(!i.ok)return i;let a=Fe({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return wu(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:gu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:n(e)}}}function vu(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function yu(e){let t=bu(e);if(!t.ok)return t;let n=xu(e);if(!n.ok)return n;let r=Su(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function bu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return pu.includes(t)?{ok:!0,action:t}:P(`INVALID_ARGS`,mu)}function xu(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?P(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function Su(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return P(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return c.includes(r)?{ok:!0,include:r}:P(`INVALID_ARGS`,hu)}function Cu(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function wu(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:gu,maxScanLines:e.entries.length},notes:e.notes}}}function Tu(e,t){let n=yi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Eu(e.appLogFailure)]:Du(n.state)}}function Eu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Du(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function Ou(e,t){return Ue([...e,...t.notes??[]])}async function ku(e){let{req:t}=e;return t.command===`perf`?await Ul({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?ju(e):t.command===`events`?await Au(e):t.command===`network`?await _u(e):t.command===`audio`?await Fl(Uu(e)):null}async function Au(e){let{req:t,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:n(e)}}}async function ju(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return P(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Wu({...e,session:a}),r=(await n.bindDevice(a.device,te)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=Pu(re({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Mu(n,i)}catch(e){return{ok:!1,error:n(e)}}}async function Mu(e,t){switch(t.kind){case`path`:return Fu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Iu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Nu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Vu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Lu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ru(e)}}async function Nu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Bu(e,t.appBundleId,n.owner,n.operations.appLogStart):await zu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Pu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):P(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Fu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=jl(a),s=Tu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Iu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Tu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:Ou(t.notes,o)}}}function Lu(e,t,n){let r=n.resolveAppLogPath(t);return Ml(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ru(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return P(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Nl(r.resolveAppLogPath(n));return pi({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function zu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await mi({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:hi.resolvePath(o.resolveSessionDir(a))});let s=Nl(o.resolveAppLogPath(a)),c=await Hu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Bu(e,t,n,r){let{session:i}=e;return i.appLog?P(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Hu(e,t,r,n)}async function Vu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return P(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await mi({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:hi.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Hu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=hi.resolvePath(o.resolveSessionDir(a));try{let l=Pl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await vi({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:gi({session:i,sessionName:a,sessionStore:o,error:e})}}}function Uu(e){if(!e.bindDevice||!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new t(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Wu(e){if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new t(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Gu(e){let t=Ku(e),n=Ge(t);return fa(`sha256`).update(n,`utf8`).digest(`hex`)}function Ku(e){let{actions:t,actionLines:n,actionSourcePaths:r,metadata:i}=e;return{platform:i.platform??null,target:i.target??null,steps:t.map((e,t)=>qu(e,n[t]??null,r?.[t]??null))}}function qu(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function Ju(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=Yu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Yu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Xu({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Zu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Qu(n,r)];for(let e of s){let t=e();if(t)return t}}function Xu(e){let{from:t,actionCount:n,pendingRecordAndHeal:r}=e,i=t===n+1&&r!==void 0&&r.expectedFrom===t;return Number.isInteger(t)&&t>=1&&(t<=n||i)?void 0:`replay --from ${t} is out of range for a ${n}-step plan.`}function Zu(e){let{from:t,pendingRecordAndHeal:n,sessionActionsLength:r}=e;if(n?.expectedFrom===t&&r===n.actionsCountAtDivergence)return`replay --from ${t} continues a record-and-heal-shaped repair, but no corrective action was recorded in this repair segment; press the correct control via a blessed @ref from the divergence's screen.refs (recorded, no --no-record) — or, if your corrective action was a read (get/is/find/snapshot), re-run it with --record so it lands in the heal — before resuming with --from ${t}.`}function Qu(e,t){if(e!==t)return`replay --plan-digest does not match the current plan digest; the script, its includes, or its platform-conditioned expansion changed since the divergence report was generated. Run a fresh full replay to get a new digest.`}function $u(e,n){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new t(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=rt(e),a=at(e),o=Gu({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??$e(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>Ju(e,s,o)}}function ed(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function td(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Ve(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function nd(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function rd(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=nd(i,a);return{matchCount:n,observed:r,mismatches:[...r?Ye(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function id(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Ye(e,r),...fe(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function ad(e,t,n,r,i,a){if(n.targetEvidences)return od(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return cd(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return cd(e,n,r,i,a);if(s.kind===`post-resolution`){let c=ed({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return cd(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return ld(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=td({recorded:o,token:s.token});if(c.kind===`skip`)return cd(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,sd(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?ld(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function od(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return cd(e,n,r,i,a);let d=td({recorded:o[c],token:u.token});if(d.kind===`skip`)return cd(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,sd(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return ld(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function sd(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function cd(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function ld(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=ud(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=dd(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function ud(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function dd(e,t,n){return n.status===`guard-mismatch`?rd(e,n.evidence,t):id(e,n.evidence)}async function fd(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=jt(e.varSources),o=[],s=[],c=gd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!hd(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(_d(u,n.length,r,e))}let d=At(r,a,md(e,u)),f=Dt(a),p=t.diagnosticsMarker(),m=await ad(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:pd(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function pd(e,t){return t.length===0?e:[...new Set([...e,...t])]}function md(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function hd(e){return!!(e&&e.command!==`replay`)}function gd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(hd(n))return n.command===`close`?t:void 0}}function _d(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function vd(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:ft(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){n.update(t=>{vt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:yd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){ft(r())!==void 0&&n.update(ct)},markCompleteIfArmed(){ft(r())!==void 0&&n.update(ht)},markSessionHeldIfArmed(e){if(e.ok||!gt(r()))return e;let t=Tr(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&xd(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{bd({session:t,...e})})}}}}function yd(e){let t=V.dirname(e),n=V.basename(e,V.extname(e));return V.join(t,`${n}.healed.ad`)}function bd(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Sd({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function xd(e){e.pendingRecordAndHeal=void 0}function Sd(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Cd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Ve(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function wd(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),nt(e.command)){let n=Td(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Ve(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Cd([...e.positionals]);n&&t.push(n)}return Ue(t).filter(e=>e.trim().length>0)}function Td(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&Ed(n)?t.slice(0,-1):t}function Ed(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Dd(e){let t=Od({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function Od(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=kd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function kd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function Ad(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!jd(n))return`manual`;let i=Md(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function jd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Nd(e.scrollRegion)}function Md(e,t){let n=Xt(t),r=Fd(e.ancestry,n,t),i=e.scrollRegion;return i&&Nd(i)?r&&Pd(i,n,t):r}function Nd(e){return e.id!==void 0||e.label!==void 0}function Pd(e,t,n){return n.some(n=>St(xt(n,t),e))}function Fd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Yt(n,t,e.length);return!r.broken&&ve(r.chain,e)})}const Id=new WeakMap;function Ld(e){return{store:t=>Rd(e,t),finalize:(t,n)=>zd({...e,evidence:t,projection:n})}}function Rd(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Zr(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Id.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Yr(a),refFrame:Qr(a)}),{evidence:s,refsGeneration:o}}function zd(e){let t=Id.get(e.evidence);Id.delete(e.evidence);let n=Vd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Bd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Hd(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ei(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Bd(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Yr(n)===t.runtimeRevision&&Qr(n)===t.refFrame}function Vd(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Hd(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Ud(t){let{sessionStore:n,observationStore:r,sessionName:i,divergence:a,responseLevel:o}=t,s,c,l=Dr({divergence:a,level:o,writeOverflowArtifact:t=>{let r=e(t),i=Kd(n,r);return`artifactPath`in i&&(s=r,c=i.artifactPath),i}}),u=(s??l).screen;if(u.state!==`available`||u.refs.length===0)return t.evidence&&Ld({sessionStore:r,sessionName:i,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:u.state===`available`?u.refsGeneration:void 0,refs:[]}),l;if(!t.evidence)return Gd(c),Wd(l,`missing-evidence`);let d=Ld({sessionStore:r,sessionName:i,...t.signal?{signal:t.signal}:{}}).finalize(t.evidence,{refsGeneration:u.refsGeneration,refs:u.refs.map(e=>e.ref)});return d.published===!0?l:(Gd(c),Wd(l,d.reason))}function Wd(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function Gd(e){if(e)try{H.unlinkSync(e)}catch{}}function Kd(e,t){try{let n=V.join(e.ensureSessionDir(),`replay-divergence`);H.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=V.join(n,r);return H.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const qd={id:0,"role-label":1,label:2,other:3};function Jd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Yd(n.basis)<Yd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Yd(e.basis)-Yd(t.basis)||e.nodeIndex-t.nodeIndex)}function Yd(e){return qd[e]}async function Xd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,observationStore:l,resumeStamper:u,logPath:d,responseLevel:f,scrubVars:p=[],planActions:m,planDigest:h,signal:g}=e,_=Er(p),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await $d({session:o,sessionName:s,observationStore:l,logPath:d,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},b=rf(y,_),x=y.state===`available`&&o?lf({action:n,session:o,nodes:y.nodes,sanitize:_}):[],S=Ad({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Zd(y)}),C=Dd({failedIndex:r+1,actions:m,planDigest:h,repairHint:S,resumeStamper:u});return Ud({sessionStore:c,observationStore:l,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(tt(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:C,repairHint:S},responseLevel:f,evidence:y.state===`available`?y.evidence:void 0,...g?{signal:g}:{}})}function Zd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Qd=[300,500,800,1200,2e3,3e3,4e3];async function $d(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=tf(a),c=Date.now()+12e3,l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Qd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await xr(Math.min(e,a)),l=await ef({session:t,sessionName:n,observationStore:r,logPath:i,flags:s})}return l.observation}async function ef(e){let{session:t,sessionName:n,observationStore:r,logPath:i,flags:a}=e;try{let e=(await ti({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(Yi(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let o=Ld({sessionStore:r,sessionName:n}).store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:o.refsGeneration,evidence:o.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:Pr(e)}}}function tf(e){return{snapshotInteractiveOnly:nf(e)}}function nf(e){return!uf(e.command)||df(e).requiresRect}function rf(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=cf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function af(e){return!!ur(e,cr(e.type??`Element`))||e.hittable===!0}function of(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function sf(e,t){let n=$t(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&af(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>of(e,t)),...o.filter(e=>!of(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function cf(e,t,n){let{nodes:r,truncated:i}=sf(e,n);return{refs:r.map(e=>{let n=cr(e.type??`Element`),r=ur(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function lf(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!uf(t.command))return[];let a=wd(t);return a.length===0?[]:ff({candidates:a,nodes:r,session:n,action:t,matching:df(t),sanitize:i})}function uf(e){return nt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function df(e){let t=nt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function ff(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=pf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Jd(s).map(e=>e.suggestion)}function pf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Pe(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:mf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function mf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Oe(t,r.device.platform,{action:i.command===`fill`?`fill`:nt(i.command)?`click`:`get`,nodes:n}),c=cr(t.type??`Element`),l=ur(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function hf(e){return{...e,hint:e.hint??vf(e.details,`hint`),diagnosticId:e.diagnosticId??vf(e.details,`diagnosticId`),logPath:e.logPath??vf(e.details,`logPath`)}}function gf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return _f({error:t,actionLabel:tt(n),action:n.command,positionals:lt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function _f(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u,warnings:d}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:wr(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:wr(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...bf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},...d&&d.length>0?{warnings:d.map(e=>wr(e,u))}:{},divergence:l}}}}function vf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const yf=[`reason`,`recovery`,`retriable`,`snapshotQuality`,`supportedOn`,`systemSurface`];function bf(e){if(!e)return{};let t={};for(let n of yf)e[n]!==void 0&&(t[n]=e[n]);return t}async function xf(e){return await Sf({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function Sf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,planActions:g,planDigest:_}=e;if(t.ok)return t;let v=Cf(t.error.details?.replaySource),y=hf(t.error),b=await Xd({error:y,action:n,index:r,sourcePath:v?.path??a,sourceLine:v?.line??o,session:p.get(),sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:g,planDigest:_,signal:N(u.meta?.requestId)});return gf({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function Cf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(n!==void 0||r!==void 0)return{path:n,line:r}}function wf(t,n){if(t)try{H.appendFileSync(t,`${JSON.stringify(e(n))}\n`)}catch(e){M({level:`warn`,phase:`replay_trace_write_failed`,data:{path:t,error:e instanceof Error?e.message:String(e)}})}}async function Tf(e){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=e,p=Date.now();wf(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:lt(o)??[]});let m;try{m=await Df({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(e){if(!(e instanceof t))throw e;m={ok:!1,error:n(e)}}let h=Date.now();return wf(d,{type:`replay_action_stop`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:m.ok,durationMs:h-p,resultTiming:m.ok?kf(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Ef(m,u??s,c)}function Ef(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function Df(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Af(t.flags,r.flags),s=i.command===`fill`?Bt(Wt(i)):void 0;return s&&(o.recordAs=s),await a(Of({token:t.token,session:n,flags:o,runtime:r.runtime,meta:t.meta,internal:{...t.internal,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:t.internal?.resolvedSessionScope??zi(t)}:{}}},r))}function Of(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:et(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:ot(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function kf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function Af(e,t){return p(e,{...t??{}})}function jf(e){return Rf(e.ok?Nf(e.data):Mf(e.error.details?.artifactPaths))}function Mf(e){return Array.isArray(e)?e.filter(Lf):[]}function Nf(e){return e?[If(e.path),If(e.outPath),...Pf(e.artifacts)].filter(Lf):[]}function Pf(e){return Array.isArray(e)?e.map(Ff).filter(Lf):[]}function Ff(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return If(t.localPath)??If(t.path)}function If(e){return typeof e==`string`?e:void 0}function Lf(e){return typeof e==`string`}function Rf(e){return[...new Set(e.filter(zf))]}function zf(e){try{return H.statSync(e).isFile()}catch{return!1}}function Bf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Vf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Xt(r),u=ie(t),d=Jt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Ct(r,e)===t.sibling),p=d.filter(e=>St(xt(e,l),t.scrollRegion)),m=yt(p)[t.viewportOrder]?.ref,h=bt({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Wf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Vf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Hf(n,t,i,a):Uf(n,t,r,a,o)}function Hf(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),o=a(t),c=o?s(e,o):null;if(i(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Qt(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Uf(e,t,n,r,i){let a=Le(t,e,{platform:n,requireRect:r,allowDisambiguation:i});if(a.kind===`resolved`)return{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref};let o=en(e,a.matchedNodes);return{matchedNodes:[...a.matchedNodes],winnerRef:o?.ref??``}}function Wf(e){let{classification:t,matchCount:n,winnerNode:r,identitySet:i,byIndex:a,recorded:o}=e;switch(t.reason){case`selector-miss`:return{kind:`selector-miss`,matchCount:0,observedNode:void 0,candidateNodes:[],mismatches:[],causeCode:`SELECTOR_MISS`,causeMessage:`The recorded target no longer matches any current element.`};case`identity-set-empty`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`The recorded selector/ref still matches, but nothing in the current tree carries the recorded identity.`};case`unique-but-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Exactly one current element carries the recorded identity, but the resolved target is a different element.`};case`signal-isolated-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Gf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`A disambiguation signal (sibling or viewport position) isolated a different element than the resolved target.`};case`no-signal-isolation`:return{kind:`identity-unverifiable`,matchCount:n,observedNode:r,candidateNodes:i.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`${i.length} current elements carry the recorded identity and neither disambiguation signal isolated one.`}}}function Gf(e,t,n){let r=wt(t),i=Yt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Ye(e,r),...fe(e.ancestry,i)].slice(0,5)}function Kf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=st(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Ve(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!nt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Jf(r)&&Jf(n[1])))return r}function qf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Jf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Yf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionName:l,sessionStore:u,resumeStamper:d,responseLevel:f,scrubVars:p,planActions:m,planDigest:h}=e,g=Er(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:ap(ie(n),g),...t.observed?{observed:ap(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>op(e,g))},v=Ad({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Dd({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b={version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(tt(r)),cause:{code:t.causeCode,message:g(t.causeMessage),...t.causeHint?{hint:g(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:y,repairHint:v,targetBinding:_},x=Ud({sessionStore:u,observationStore:e.observationStore,sessionName:l,divergence:b,responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return gf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:x,scrubVars:p})}function Xf(e,t,n){let r=Er(e.scrubVars);return Yf(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:rf(n,r),publicationEvidence:ep(n),repairCapture:Zd(n)})}async function Zf(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await $d({session:t,sessionName:n,observationStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function Qf(e,t){return Xf(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await Zf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function $f(e,t,n){return Xf(e,t,await Zf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function ep(e){return e.state===`available`?e.evidence:void 0}function tp(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?he(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Re(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Kf(n,i),platform:a.device.platform}:{kind:`inactive`}}function np(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=df(r),s=Bf({recorded:t,token:n,nodes:i,platform:a,refLabel:qf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:wt(s.winnerNode),structural:xe(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?wt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function rp(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function ip(e){return!e.ok&&e.error.details?.reason===Zt}function ap(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function op(e,t){let n=cr(e.type??`Element`),r=ur(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function sp(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function cp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.role==`string`)return{...typeof t.id==`string`?{id:t.id}:{},role:t.role,...typeof t.label==`string`?{label:t.label}:{}}}function lp(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function up(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.documentOrder==`number`&&typeof t.sibling==`number`)return{documentOrder:t.documentOrder,sibling:t.sibling}}function dp(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:cp(e?.observed),expectedStructural:up(e?.expectedStructural),observedStructural:up(e?.observedStructural)}}function fp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:cp(e?.observed),observedAncestry:lp(e?.observedAncestry)}}function pp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function mp(e,t,n){let r=pp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&rp(e)?{status:`guard-mismatch`,evidence:dp(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&ip(e)?{status:`landmark-mismatch`,evidence:fp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function hp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionName:t.sessionName,sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,pp(gp(e),jf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return tp({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await $d({session:i,sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return np({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await Tf({req:sp(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke});o=l,jf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:mp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await Qf(c(e,n,r,i),{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Xf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await $f(c(e,n,i,a),r,{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=gp(o),u=await _p(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>vp(e),onStep:i,diagnosticsMarker:()=>bp(t.sessionStore),diagnosticsSince:e=>xp(t.sessionStore,e)},readLastResponse:()=>o}}function gp(e){return e&&!e.ok?e:P(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function _p(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return yp(i)?c(i):c(await xf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionName:e.sessionName,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function vp(e){let t=e.positionals??[],n=Me(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function yp(e){if(e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence,n=t&&typeof t==`object`?t.kind:void 0;return typeof n==`string`&&n!==`action-failure`}function bp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function xp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function Sp(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Cp(t,i)};return Tp(o,`AD_PLATFORM`,a.platform??r.platform),Tp(o,`AD_TARGET`,a.target??r.target),Tp(o,`AD_DEVICE`,a.device),Tp(o,`AD_DEVICE_ID`,wp(a)),Ep(o,`AD_SHARD_INDEX`,a.shardIndex),Ep(o,`AD_SHARD_COUNT`,a.shardCount),Tp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Cp(e,t){let n=e.meta?.cwd??process.cwd();return V.relative(n,t)||t}function wp(e){return typeof e.serial==`string`?e.serial:e.udid}function Tp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Ep(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Dp=3e4,Op=1e3;function kp(e){let{scriptPath:r,env:i,publicNetworkOnly:a}=e,o=H.readFileSync(r,`utf8`),s=Object.create(null);try{ga.runInNewContext(o,Ap(i,s,a),{filename:r,timeout:Dp})}catch(e){let i=n(e);throw new t(i.code,`Maestro runScript failed: ${i.message}`,u({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),e instanceof Error?e:void 0)}return Lp(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,Rp(t)]))}function Ap(e,t,n){return{...e,output:t,json:jp,http:{post:(e,t)=>Np(`POST`,e,n,t)}}}function jp(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Mp)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,Op)},n instanceof Error?n:void 0)}}function Mp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Np(e,n,r,i){let a=br(process.execPath,Pp(),{stdin:JSON.stringify(Ip(e,n,i,r)),timeoutMs:Dp,allowFailure:!0});if(a.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${zp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:a.stdout.slice(0,Op),stderr:a.stderr.slice(0,Op)},r instanceof Error?r:void 0)}}function Pp(){let e=Fp(import.meta.url);if(!e)throw new t(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Fp(e){try{let t=ma(e),n=V.extname(t)||`.js`;return[V.join(V.dirname(t),`run-script-http-child`+n),V.join(V.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>H.existsSync(e))??null}catch{return null}}function Ip(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Lp(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function Rp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function zp(e){let t=e.trim();return t.length>0?t.slice(0,Op):`request process exited without stderr`}async function Bp(e){return await Vp(`tap`,async t=>{let n=V.join(t,`before.png`),r=V.join(t,`after.png`),i=await Up(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Up(e,r)))return await Hp(n,r,e.signal,`tap`)}})})}async function Vp(e,t){let n=await U.mkdtemp(V.join(pa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await U.rm(n,{recursive:!0,force:!0})}catch{}}}async function Hp(e,t,n,r){try{let[i,a]=await Promise.all([U.readFile(e),U.readFile(t)]);qp(n);let o=await Ji(i,a,`Maestro screenshot`);return qp(n),Wp(o,r)}catch(e){Kp(e,n),M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Up(e,t){try{return await U.rm(t,{force:!0}),qp(e.signal),await e.capture(t),qp(e.signal),!0}catch(t){return Kp(t,e.signal),!1}}function Wp(e,t){if(e.status!==`compared`)return Gp(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return Gp(t,n?`stable`:`changed`,e),n}function Gp(e,t,n){M({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Kp(e,t){if(t?.aborted||o(e))throw r()}function qp(e){if(e?.aborted)throw r()}async function Jp(e){Xp(e.timeoutMs),qp(e.signal);let t=e.now()+e.timeoutMs;return await Vp(`animation`,async n=>{let r=V.join(n,`first.png`),i=V.join(n,`second.png`);for(;;){if(qp(e.signal),await Yp(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Yp(e,t,n){let r=[await Up(e,t),await Up(e,n)];return!r[0]||!r[1]?!1:await Hp(t,n,e.signal,`animation`)===!0}function Xp(e){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Zp=J.observationPollMs;async function Qp(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!mm(n)||(Z(e.context.signal),!await fm(e.dependencies,t,Zp,e.context.signal)))throw n}}}function $p(e){return em({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function em(e){let t=Ri(e.snapshot),n=e.platform===`ios`?ea(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:i(n.nodes)}:e.snapshot;return am(mo(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function tm(e){pm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await Qp(e,n),i=em({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ya(e.condition,i))return i;if(e.dependencies.now()>=n)break;await fm(e.dependencies,n,Zp,e.context.signal)}return Z(e.context.signal),_m(t)}async function nm(e){pm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await Qp(e,t);if(r=void 0,n=em({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===J.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),_m(n)}async function rm(e){pm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Qp(e,t),r=hm(n);for(;;){Z(e.context.signal),await fm(e.dependencies,t,Zp,e.context.signal);let i=await Qp(e,t),a=hm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function im(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function am(e,t,n,r,i,a,o){if(!e.ok){let t=im(r);return{generation:n,matched:e.evidence.matched,visible:e.evidence.visible,candidateCount:e.evidence.candidateCount,...e.evidence.ref?{ref:e.evidence.ref}:{},...t?{viewport:t}:{}}}let s=sm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=im(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:om(e.rect,c)}:{},candidateCount:e.evidence.candidateCount,rect:e.rect,...e.evidence.ref?{ref:e.evidence.ref}:{},...c?{viewport:c}:{},...s?{dispatchSelector:s}:{},...i.includeSurfaceSignature?{surfaceSignature:hm(t)}:{}}}function om(e,t){return!Xe(e)||!Xe(t)?0:_e(t,e)?100:Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))*100/(e.width*e.height)}function sm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!cm(t,n,r)||i!==1))return lm(t.selector)}function cm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!ho(e.selector)}function lm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!um(n)||typeof r!=`string`)return;let i=tn(r)?.trim();return i?{key:n,value:i}:void 0}function um(e){return e===`id`||e===`label`||e===`text`}async function dm(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?r():e}Z(n)}async function fm(e,t,n,r){let i=t-e.now();return i<=0?!1:(await dm(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw r()}function pm(e,n){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function mm(e){return e instanceof t&&e.details?.retriable===!0}function hm(e){return fa(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,bounds:gm(e.rect)})))).digest(`hex`)}function gm(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function _m(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function vm(e){return e.kind===`clearState`?Cm(e):ym(e)?bm(e):jm(e)?Mm(e):Tm(e)}function ym(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function bm(e){switch(e.kind){case`launchApp`:return xm(e);case`stopApp`:return Sm(e);case`openLink`:return wm(e)}}function xm(e){return{command:`open`,positionals:e.appId?[e.appId]:[],flags:{...e.relaunch?{relaunch:!0}:{},...e.clearState?{clearAppState:!0}:{},...e.launchArgs.length>0?{launchArgs:e.launchArgs}:{}}}}function Sm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],dispatch:{closeAppOnly:!0}}}function Cm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function wm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Tm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Em(e);case`clickPoint`:return Dm(e);case`swipe`:return Om(e);case`scroll`:return km(e);case`pressKey`:return Am(e)}}function Em(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Dm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Om(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},dispatch:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function km(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Am(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function jm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Mm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0},dispatch:{observationOnly:!0}}}}async function Nm(e,n){let r=vm(n),i=await e.invoke(u({...r,flags:Pm(e.flags,r.flags??{})}));if(!i.ok)throw Bm(i);if(n.kind===`gestureViewport`){let e=i.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new t(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return i.data}function Pm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=u({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Fm(e){return e?e.kind===`scalar`?[String(e.value)]:e.kind===`list`?e.values.map(String):Object.entries(e.values).flatMap(([e,t])=>[e,String(t)]):[]}function Im(e,t){return{generation:t.generation,matched:t.matched&&t.visible,candidateCount:t.candidateCount,evidence:{kind:`selector`,selector:e,visible:t.visible,candidateCount:t.candidateCount,...t.ref?{ref:t.ref}:{}}}}function Lm(e){if(!e)return[];let t=[];if(typeof e.path==`string`&&t.push(e.path),Array.isArray(e.artifactPaths)&&t.push(...e.artifactPaths.filter(e=>typeof e==`string`)),Array.isArray(e.artifacts))for(let n of e.artifacts)typeof n.localPath==`string`?t.push(n.localPath):typeof n.path==`string`&&t.push(n.path);return[...new Set(t)]}function Rm(e,n,r){if(V.isAbsolute(e))return e;let i=n.source?.path??r;if(!i)throw new t(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return V.resolve(V.dirname(i),e)}function zm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Bm(e){let n=e.error,r=u({...n.details??{},hint:n.hint??Vm(n.details,`hint`),diagnosticId:n.diagnosticId??Vm(n.details,`diagnosticId`),logPath:n.logPath??Vm(n.details,`logPath`),retriable:n.retriable??Hm(n.details,`retriable`),supportedOn:n.supportedOn??Vm(n.details,`supportedOn`)});return new t(n.code,n.message,Object.keys(r).length?r:void 0)}function Vm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Hm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Um(e){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Nm(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new t(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=_(i,i);return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function Wm(e){let{input:t,context:n,snapshots:r,options:i}=e,a=i.dependencies.now()+t.timeoutMs,o=e.allowObservationReuse===!1?void 0:r.reuseObservation(n);for(;;){let e=i.dependencies.now(),s=o!==void 0;o??=await Qp({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=$p({query:t,context:n,snapshot:o,platform:i.platform});if(Xm(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await fm(i.dependencies,a,Zp,n.signal)}}}async function Gm(e,t,n,r,i,a){let o=async()=>await Jm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Bp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Nm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await Km(e,t,n,r,i,a.click,o)});return}await Km(e,t,n,r,i,a.click)}async function Km(e,t,n,r,i,a,o){let s=async()=>await Jm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:hm(await t.capture(i))),l=async()=>{let r=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await qm({baselineSignature:c,screenshotBaseline:o,dispatch:s,settle:l,onRetry:()=>{n.tapRetries+=1}});t.prime(i.generation,e.snapshot)}catch(e){throw t.requireStability(i.generation),e}}async function qm(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<J.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Jm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Zm(e,o,n.point,i);return}catch(n){if(!Qm(n))throw n;let o=await Wm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Ym(o))throw n;t.invalidate(r.generation),await $m(e,Nr(o.rect),i);return}}t.invalidate(r.generation),await $m(e,n.point,i)}function Ym(e){return e.matched&&e.visible&&e.rect!==void 0}function Xm(e,t){return Ym(e)?!t||e.dispatchSelector!==void 0:!1}async function Zm(e,t,n,r){M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Nm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Qm(e){let t=l(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===lr.selectorNotFound}async function $m(e,n,r){if(!n)throw new t(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);M({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await Nm(e,{kind:`clickPoint`,point:n,options:r})}function eh(e){let t=Um(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},r=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},i=e.platform,a=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Nm(e,t)),o=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},s=async(e,t,n=`none`)=>await o(()=>a(e),t,n),c=async(n,i)=>{hr(n),await s({kind:`typeText`,text:n},i);let a=await rm({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});r(a),t.prime(i.generation,a.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await Wm({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await tm({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async()=>await a({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Fm(e.arguments),...Fm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;await s({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`stopApp`,...n?{appId:n}:{}},t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await s({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(r,i)=>await Gm(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>$m(e,t.target.point,u({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>$m(e,t.target.point,{holdMs:J.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??J.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await nm({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=Oa(o,n.selector,n.direction,n.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await rm({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw jn(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Im(n.selector,a))}},pressKey:async(e,t)=>{await s({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await s({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await s({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await Jp({timeoutMs:t.timeoutMs??J.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Lm(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:kp({scriptPath:Rm(t.file,n,e.sourcePath),publicNetworkOnly:e.publicNetworkOnly,env:{...n.env,...t.env?zm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function th(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=eh(e);return So(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function nh(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),rh(()=>oh(r,e)),rh(()=>sh(n,t,e))},actionCompleted:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!0))},actionFailed:e=>{let r=ih(i,e.stepIndex);rh(()=>ch(n,t,ah(r,e),!1))}}}function rh(e){try{e()}catch{}}function ih(e,t){let n=e.get(t);return e.delete(t),n}function ah(e,t){return u({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function oh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function sh(e,t,n){wf(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function ch(e,n,r,i){let a=lh(r);wf(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof t?{errorCode:r.error.code}:{}})}function lh(e){let t=`data`in e?e.data:void 0,n=uh(t?.timing)?t.timing:void 0;return u({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function uh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function dh(e,t){let n=u({...e.internal,...fh(t.dispatch)});return u({...e,command:t.command,positionals:t.positionals,input:t.input,flags:t.flags,internal:Object.keys(n).length>0?n:void 0})}function fh(e){return u({closeAppOnly:e?.closeAppOnly,observationOnly:e?.observationOnly,gestureViewport:e?.gestureViewport,gestureExecutionProfile:e?.gestureExecutionProfile})}function ph(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:_h(e.action),positionals:vh(e.action,e.value),flags:t.flags??{}}}}async function mh(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,observationStore:o,logPath:s}=e,c=N(r.meta?.requestId),l=ph(t,r),u=hf(e.error),d=[...t.redactions],f=Er(d),p={...u,message:f(u.message),...u.hint?{hint:f(u.hint)}:{}},m=o.get(),h=m?await $d({session:m,sessionName:i,observationStore:o,logPath:s,action:l.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},g=m&&h.state===`available`&&!t.isControl?hh({failure:t,action:l.action,session:m,nodes:h.nodes,sanitize:f}):[],_=[t.action,gh(t.value)].filter(Boolean).join(` `),v=Ud({sessionStore:a,observationStore:o,sessionName:i,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:f(t.source.path??n),line:t.source.line}},action:f(_),cause:{code:p.code,message:p.message,...p.hint?{hint:p.hint}:{}},screen:rf(h,f),suggestions:g.slice(0,5),suggestionCount:g.length,resume:t.resume,repairHint:Ad({kind:`action-failure`,targetEvidence:void 0,capture:Zd(h)})},responseLevel:r.meta?.responseLevel,evidence:h.state===`available`?h.evidence:void 0,...c?{signal:c}:{}});return _f({error:p,actionLabel:_,action:t.action,positionals:[...l.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:v,scrubVars:d,warnings:t.warnings})}function hh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Jd(pn(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>mf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function gh(e){return!e||e===`<text>`?e??``:it(e)}function _h(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function vh(e,t){return!t||e===`inputText`?[]:[t]}function yh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=xh(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:Sh(c,Date.now()-r)}}}async function bh(e){let{command:t,replayPath:r,state:i,outcome:a}=e,{request:o,session:{name:s,store:c,observationStore:l,logPath:u}}=t,{failure:d}=a,f=n(a.error);return d?await mh({error:f,failure:d,replayPath:r,req:o,sessionName:s,sessionStore:c,observationStore:l,logPath:u,snapshotDiagnostics:xh(c,i.snapshotStart)}):{ok:!1,error:f}}function xh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return m(n)}function Sh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function Ch(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return P(`INVALID_ARGS`,sn);if(t.flags?.saveScript!==void 0)return P(`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 wh({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await bh({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function wh(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c,invoke:l}=t,u=await Th({command:t,bundle:n}),d=Mh({req:a,invoke:l,device:u.device,platform:u.platform,runtimeHints:u.runtimeHints,sourcePath:u.filePath});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await _n(u.flow,d,{defaults:u.defaults,env:u.env,platform:u.platform,target:u.target,runtimeHints:u.runtimeHints,signal:u.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,trustedScripts:a.internal?.publicNetworkOnly!==!0,readSource:e=>un(n,e),observer:nh({filePath:u.filePath,tracePath:s,onStep:c})});return f.ok?yh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await bh({command:t,replayPath:n.entry,state:i,outcome:f})}async function Th(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=tr(un(n,o),o),c=a.lookup(),l=c?.session;c&&Wi(c,r.flags);let u=await Eh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Ah({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:jh(r),signal:N(r.meta?.requestId)}}async function Eh(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 Fi(t.flags??{},mn(a.appTarget,o))),c=Lh(t,s),l=Oh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await Dh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Rh(t,s),runtimeHints:l,flow:a})}async function Dh(e){if(e.device||!kh(e.runtimeHints))return e;let t=await Fi(e.req.flags??{},mn(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Rh(e.req,t),runtimeHints:Oh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function Oh(e){return Bn({req:e.req,sessionStore:{getRuntimeHints:t=>t===e.sessionName?e.sessionStore.getRuntimeHints():void 0},sessionName:e.sessionName,device:e.device,platform:e.platform})}function kh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Ah(e){return{...Sp({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function jh(e){return{...kt(Ot(e.flags?.replayShellEnv)),...Et(Tt(e.flags?.replayEnv))}}function Mh(e){let{req:t,invoke:n,device:r,platform:i,runtimeHints:a,sourcePath:o}=e,s={...t,runtime:a};return th({invoke:e=>n(dh(s,e)),flags:Nh(r,i,t.flags),publicNetworkOnly:t.internal?.publicNetworkOnly===!0,platform:i,sourcePath:o,dependencies:{now:Date.now,sleep:async(e,t)=>{await ha(e,void 0,{signal:t})}}})}function Nh(e,t,n){if(!e)return Ph(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 Ph(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Fh(n,t):Ih(n,t)}function Fh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Ih(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Lh(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new t(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Rh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function zh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(Nt(t,a.flags?.replayBackend)===`maestro`)return n?P(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await Ch(i):P(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Bh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Vh(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=Hh(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(),_=Uh({req:t,coordinator:s,manifest:l,preEntrySession:g});return _.ok?{ok:!0,value:{replayReq:u,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h,preEntrySession:g,entryIndex:_.value,varSources:Gh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Vh(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return P(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Hh(e,t){let n=$u(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Wh({...e,flags:hn(e.flags,n.actions)},n.metadata)}}function Uh(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:P(`INVALID_ARGS`,a.message)}}function Wh(e,t){return!t.platform&&!t.target?e:{...e,flags:Kh(e.flags,t)}}function Gh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Sp({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:kt(Ot(t.flags?.replayShellEnv)),cliEnv:Et(Tt(t.flags?.replayEnv))}}function Kh(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function qh(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=Jh({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Zh({req:t,coordinator:a}),Xh({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function Jh(e){let t=Qh(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return Kr()}function Yh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?P(`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.`):$h({saveScript:t,liveForce:n,persistedForce:Vt(r)||void 0,sourcePath:i,existingSaveScriptPath:Ft(r)})}function Xh(e){let{req:t,sessionStore:n,sourcePath:r,coordinator:i}=e,a=n.get(),{saveScript:o,force:s}=t.flags??{},c=Yh({saveScript:o,force:s,preRunState:a?.scriptPublication??It,sourcePath:r});return c?{ok:!1,response:c}:(i.demoteForRerunIfArmed(),{ok:!0,armSaveScript:eg({saveScript:o,force:s,coordinator:i,sourcePath:r})})}function Zh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Qh(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return P(`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 $h(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?kr(t):a??yd(i);if(!(n||r&&o===a)&&H.existsSync(o))return P(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function eg(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 tg(e){let{request:t,session:{name:n,logPath:r,store:i,mutationStore:a,observationStore:o},tracePath:s,onStep:c,invoke:u}=e,d=t.flags?.replayScriptSource;if(!d)return P(`INVALID_ARGS`,sn);let f=Date.now(),p=t.flags?.replayKeepSession===!0,m=``,h=new Set,g=vd({sessionStore:i,mutationStore:a});try{if(m=d.entry,Pt(m)&&t.flags?.replayBackend!==`maestro`)return P(`INVALID_ARGS`,Mt(`replay`,m));let a=await zh({resolved:m,keepSession:p,coordinator:g,command:e});if(a)return a;let l=Bh({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:m,script:un(d,m),coordinator:g});if(!l.ok)return l.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=l.value,T=qh({req:t,entryIndex:S,sessionStore:i,sourcePath:m,coordinator:g});if(!T.ok)return T.response;let{runtime:E,readLastResponse:ee}=hp({ctx:{replayReq:_,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:m,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:u,signal:N(t.meta?.requestId),coordinator:g},req:t,artifactPaths:h,onStep:c,armSaveScript:T.armSaveScript}),D=await fd({actions:v,entryIndex:S,keepSession:p,actionLines:y,actionSourcePaths:b,resolvedPath:m,varSources:C},E);return D.status===`failed`?ee()??P(`COMMAND_FAILED`,`replay step failed with no recorded response`):ng({startedAt:f,sessionName:n,sessionStore:i,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:g,keepSession:p})}catch(e){let t=l(e);return P(t.code,t.message,h.size>0?{artifactPaths:[...h]}:void 0)}}function ng(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=ig({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=m([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:rg(i,Date.now()-t)}}}function rg(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function ig(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return P(`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 ag(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=V.resolve(n??`.`,t??`.agent-device/test-artifacts`);return V.join(i,r)}function og(e,t){let n=t?V.relative(t,e):V.basename(e),r=n.length===0||n.startsWith(`..`)?V.basename(e):n;return ze(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function sg(e,t){H.mkdirSync(t,{recursive:!0}),ug(e,t)}function cg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=new Set(t.artifactPaths);t.status===`failed`&&typeof t.error.logPath==`string`&&c.add(t.error.logPath);let l=V.join(o,`result.txt`),u=V.join(o,`failure.txt`),d=lg([...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=>V.basename(e)).join(`, `)}`);let p=`${f.join(`
|
|
2
|
-
`)}\n`;H.writeFileSync(l,p),s||H.writeFileSync(u,p)}function lg(e,t,n){let r=[],i=new Set(n.map(e=>V.basename(e).toLowerCase()));for(let n of e){if(!fg(n))continue;let e=V.basename(n);if(V.resolve(n)===V.resolve(t,e)&&!i.has(e.toLowerCase())){r.push(n);continue}let a=dg(e,t,i),o=V.join(t,a);H.copyFileSync(n,o),r.push(o)}return r}function ug(e,t){let n=V.join(t,`replay.ad`);if(H.copyFileSync(e,n),V.extname(e).toLowerCase()===`.ad`)return;let r=V.join(t,V.basename(e));V.resolve(r)!==V.resolve(n)&&H.copyFileSync(e,r)}function dg(e,t,n){let r=V.extname(e),i=r?e.slice(0,-r.length):e,a=e,o=2;for(;n.has(a.toLowerCase())||H.existsSync(V.join(t,a));)a=`${i}-${o++}${r}`;return a}function fg(e){try{return H.statSync(e).isFile()}catch{return!1}}function pg(e){let{platformFilter:n,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}yg(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=n?` for --platform ${n}`:``;throw new t(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function mg(e,t,n,r,i=0){let a=V.basename(n,V.extname(n)),o=ze(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function hg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return ze(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function gg(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,V.basename(r),`attempt`,a+1].join(`:`)}function _g(e,t){return typeof e==`number`?e:t}function vg(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function yg(e,t){return e===`apple`?b(t):t===e}function bg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],warnings:e.warnings??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const xg=2e3;async function Sg(e){let{filePath:t,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=kg({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>bg({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Ag(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 wg(w)||(x=Dg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:xg}}),Tg({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await Eg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=Og(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=Cg(x,i,v)}}return x??bg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function Cg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:bg({error:t,artifactPaths:[...n],infrastructure:!0})}async function wg(e){return await Promise.race([e.then(()=>!0),ha(xg).then(()=>!1)])}async function Tg(e){let{replayPromise:t,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:n(e).message}})}}}async function Eg(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Q(o,e)});return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=n(e);return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:t.message}}),bg({error:t})}}function Dg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Og(e,t){return{...e,warnings:[...e.warnings,t]}}function kg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=V.join(t,`replay-timing.ndjson`);return H.mkdirSync(V.dirname(l),{recursive:!0}),H.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&&H.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Ag(e,t=[]){return bg({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 jg(e){let t=Mg(e),n=await Ng(e,t);return{result:zg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Mg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:V.join(i,...a?[`shard-${a.shardIndex+1}`]:[],og(t.path,n)),maxAttempts:r+1}}async function Ng(e,t){Fg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Pg(e,t,r);if(Ig(n,i),Lg(e,i.outcome,r))break;Rg(e,t,i)}return n}async function Pg(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=mg(i,a,r.path,o,n),h=V.join(t.testArtifactsDir,`attempt-${f}`);sg(r.path,h);let g=gg({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,...Wg(d)},v=await Sg({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return cg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Fg(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:mg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Wg(c)})}function Ig(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 Lg(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Rg(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,...Wg(e.shard)})}function zg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Bg(e,t,n,r):Vg(e,t,n,r)}function Bg(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,...Wg(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}:{},...Ug(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Vg(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,...Wg(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...Hg(c),...Ug(s)}}function Hg(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 Ug(e){return Wg(e)}function Wg(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Gg(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 Kg(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c,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(),l=await qg(t,u,d);Zg(l,a);let p=l.shardPlan?Qg({entries:l.entries,total:l.total,emitProgress:a}):[];return l.shardPlan?p.push(...await $g({shards:l.shardPlan.shards,sessionName:f,suiteInvocationId:l.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:l.suiteArtifactsDir,suiteTotal:l.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c})):p.push(...await r_({discoveryEntries:l.entries,sessionName:f,suiteInvocationId:l.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:l.suiteArtifactsDir,suiteTotal:l.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:c})),{status:`completed`,data:o_(l.total,p,Date.now()-e,l.suiteArtifactsDir)}}catch(e){let t=l(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function qg(e,t,n){let r=Jg(e,t),i=Yg(r),a=r.length-i.length,o=hg(e.requestId),s=await Gg(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:Xg(e,o),total:s?.total??r.length}}function Jg(e,t){return pg({platformFilter:e.platformFilter,discoverSources:t})}function Yg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Xg(e,t){return ag({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Zg(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 Qg(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 $g(e){return(await Promise.allSettled(e.shards.map(async t=>await t_({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[e_(r,e.sessionName,t.reason)]:[]})}function e_(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:n_(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function t_(e){let{shard:t,sessionName:n}=e;return await i_({...e,entries:t.entries,sessionName:n_(n,t),shard:t})}function n_(e,t){return`${e}:shard-${t.shardIndex+1}`}async function r_(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 jg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:vg(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:_g(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),a_(t,o,p))break}return g}async function i_(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 jg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:vg(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:_g(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),a_(b,o,m))break}return _}function a_(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function o_(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=g(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function s_(e,t){return()=>e.map(e=>c_(e,t))}function c_(e,t){let n=e.entry,r=un(e,n),i=Nt(n,t)===`maestro`,a=at(r);return{path:n,manifest:{...i?{title:tr(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 l_(e){return async t=>(await f_(e,t)).map(u_)}function u_(e){if(e.platform===`web`||!x(e))throw new t(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function d_(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 f_(e,n){let r=g_(e),i=m_(await Ni(p_(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${h_(n)}, but only ${i.length} matched`);return i.slice(0,n)}function p_(e){let t=L(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:y({simulatorSetPath:ji(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function m_(e,t,n){return t.length>0?__(e,t,n):e.filter(e=>v_(e,n)).sort(x_)}function h_(e){return`${e} device${e===1?``:`s`}`}function g_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function __(e,n,r){return n.map(n=>{let i=b_(n),a=e.find(e=>y_(e,r)&&(e.id===n||b_(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function v_(e,t){return!y_(e,t)||!x(e)?!1:e.booted!==!1}function y_(e,t){return!(!v(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function b_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function x_(e,t){return e.id.localeCompare(t.id)}function S_(e){let n=C_(e?.shardAll,`--shard-all`),r=C_(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function C_(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}const w_=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 T_(e){return w_.has(e.toUpperCase())}const E_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function D_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=O_(e);return t?k_(t.details)||A_(t.code,t.message):!1}function O_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function k_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||Wn(t)?!0:t?T_(t):!1}function A_(e,t){let n=`${e}\n${t}`.toLowerCase();return E_.some(e=>n.includes(e))}function j_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:P_(e.error.details?.artifactPaths),warnings:sr(e.error.details),infrastructure:D_(e),...F_(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:sr(t),artifactPaths:P_(t?.artifactPaths),...F_(t?.snapshotDiagnostics)}}function M_(e){if(!e||e.ok)return;let t=j_(e);return t.status===`failed`?t:void 0}function N_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function P_(e){return[...new Set(N_(e))]}function F_(e){let t=h(e);return t?{snapshotDiagnostics:t}:{}}const I_=1e3,L_=3e3;function R_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await z_(e)}}async function z_(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=Cr(o.device.platform),c=i?V.join(i,`recording${s}`):Sr(o.device.platform);V_(a,{type:`video_recording_start`,session:n,videoPath:c}),M({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(H_({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return V_(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await xr(I_),V_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:I_}),M({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:I_}}),l}async function B_(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;V_(a,{type:`video_tail_start`,session:n,requestedDurationMs:L_});let o=Date.now();await xr(L_);let s=Date.now(),c=await e.video.record(H_({req:t,sessionName:n,phase:`stop`}));return jf(c).forEach(e=>i.add(e)),V_(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),M({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function V_(e,t){e({...t,ts:new Date().toISOString()})}function H_(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 U_=[{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.`}],W_=({attemptId:e,parentAttemptId:t})=>{Hr(e);let n=G_(e,t);return{cancel:()=>zr(e),release:()=>{n(),Vr(e)}}};function G_(e,t){if(!t||t===e)return()=>{};let n=N(t);if(!n)return()=>{};let r=()=>{zr(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function K_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=q_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:d_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function q_(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 J_(e){let{request:t,session:{name:n,logPath:r},createSession:i,invoke:a,cleanupSession:o,video:s}=e;if(t.flags?.recordVideo===!0&&s===void 0)return P(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let c=t.flags??{};for(let e of U_)if(e.requested(c))return P(`INVALID_ARGS`,e.message);let u,d;try{u=Z_(t,n),d=X_(t)}catch(e){let t=l(e);return P(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Kg({request:u,emitProgress:Ur,isCanceled:()=>Br(t.meta?.requestId),emitDiagnostic:M,bindAttemptCancellation:W_,runReplay:async({filePath:e,sessionName:n,platform:o,target:c,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&jf(e).forEach(e=>d.add(e)),e),v=K_({parentFlags:t.flags,platform:o,target:c,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=i(n,r),b=s?{req:t,sessionName:n,sessionStore:y.store,artifactsDir:u,appendTimingEvent:m,video:s}:void 0,x=b?R_(b):void 0;return j_(await tg({request:{...t,command:`replay`,session:n,positionals:[e],flags:v,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||x?{internal:{...t.internal??{},...x?{openLifecycle:x}:{}}}:{}},session:y,tracePath:p,onStep:g,invoke:async e=>{let t=b?await z_(b):void 0;return t&&!t.ok?t:_(await a(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,appendTimingEvent:o})=>{if(s)return M_(await B_({req:t,sessionName:e,sessionStore:i(e,r).store,artifactsDir:a,appendTimingEvent:o,artifactPaths:n,video:s}))},discoverSources:s_(d,t.flags?.replayBackend),resolveShardTargets:l_(t.flags),cleanupSession:o});return p.status===`completed`?{ok:!0,data:Y_(p.data,t)}:P(p.error.code,p.error.message)}function Y_(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=V.join(n,V.basename(r)),a=e=>e===r||e.startsWith(r+V.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 H.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:V.basename(r)}]}:o}function X_(e){let n=e.flags?.replayScriptSources;if(!n)throw new t(`INVALID_ARGS`,sn);return n}function Z_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=$_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:kr(i,r),failFast:n.failFast===!0,retries:Q_(n.retries),timeoutMs:Q_(n.timeoutMs),shard:S_(n)}}function Q_(e){return typeof e==`number`?e:void 0}function $_(e){return typeof e==`string`?e:void 0}function ev(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await aa({req:tv(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function tv(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const nv=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await tg({request:e,session:iv(t,n,r),invoke:a??i}),rv=async({req:e,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=ev({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await J_({request:e,session:iv(n,r,i),createSession:(e,t)=>iv(e,t,i),invoke:s??o,cleanupSession:async t=>await av({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function iv(e,t,n){let r=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1};return{name:e,logPath:t,store:{get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)},mutationStore:{update:r,clearRepairTombstone:()=>n.clearRepairTombstone(e)},observationStore:{get:()=>n.get(e),update:r}}}async function av(e){let{req:n,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await sc({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new t(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function ov(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command!==rr.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return uv(new t(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return uv(new t(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=lv(a);if(o)return uv(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return uv(new t(`INVALID_ARGS`,`session save-script path cannot be empty.`));Rt(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:qt(a,n.flags?.force),publication:`active`});return c.written?(Ut(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...j(`Published script: ${c.path}`)}}):uv(c.error??new t(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function sv(e){if(dt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Lt(e)?void 0:`not-armed`}const cv={repair:()=>new t(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new t(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new t(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new t(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function lv(e){let t=sv(e);return t?cv[t]():void 0}function uv(e){return{ok:!1,error:n(e)}}function dv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function fv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$r(e)}}async function pv(e,n,r){if(r.length!==1)throw new t(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(fv(n))}}async function mv(e,n,r){if(r.length<2)throw new t(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...fv(n),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...j(`Clipboard updated`)}}async function hv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await I({command:`clipboard`,device:t,use:ke,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>pv(n,e,r)}}let o=await I({command:`clipboard`,device:t,use:Ne,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>mv(s,e,r)}}async function gv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=Y(nr.clipboard,s,c);if(l)return l;let u=t.positionals??[],d=dv(u);if(!d)return P(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let f=await X({session:s,flags:c}),p=await hv({device:f,action:d,positionals:u,inspectFacts:a,bindDevice:o});if(!p.ok)return p.response;let m=await p.execute(Jr(r,t.flags,s?.appBundleId,s?.trace?.outPath));return k(i,s,t,t.command,m),{ok:!0,data:{platform:E(f),...m}}}function _v(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function vv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function yv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function bv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Ur({type:`command`,status:`progress`,message:xv(t)})}function xv(e){return[ia(e),...ra(e)].join(`
|
|
3
|
-
`)
|
|
4
|
-
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Yv(e){let t=await yr(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Hv});if(t.exitCode===0)return t.stdout.split(`
|
|
5
|
-
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Xv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Zv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Qv(e,t){let n=Mr(e.meta?.cwd);return{targetApp:ry(e.flags?.targetApp)??t?.appBundleId,metroHost:ry(e.runtime?.metroHost)??`127.0.0.1`,metroPort:iy(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:ty(e,n)}}function $v(e,t={}){let n=ny(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function ey(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${E(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function ty(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function ny(e){let t={...Object.fromEntries([...Xv,...Zv].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function ry(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function iy(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function ay(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==nr.doctor)return null;let s=oy(e.hostDiagnostics),c=r.get(n),l=Qv(t,c),u=ly(r,n),d=[];if(bv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Or()} using ${u}`,evidence:{version:Or(),stateDir:u}},...$v(t,{required:l.remote}),...ey(r,n,c,{remote:l.remote})),l.remote)return my(d,l);let f=sy(l,u,i),p=await wv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await uy({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??cy(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return my(d,l,{device:h,includeMetro:!0,inventory:p})}function oy(e){if(!e)throw new t(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function sy(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>qr(e),emitProgress:e=>Ur({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Pi(e),shouldPropagateInventoryProbeError:Mi,transportOverrides:Object.freeze({androidAdb:n})})}function cy(e){let t=(e?.devices??[]).filter(e=>C(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function ly(e,t){let n=V.dirname(e.resolveSessionDir(t));return V.basename(n)===`sessions`?V.dirname(n):n}async function uy(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??Tv(t,i,a.targetApp);return u&&await dy(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await Uv(a.metroHost,a.metroPort,a.kind)),bv(t,...await r.ambientChecks(n)),u}async function dy(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await fy({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await Sv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),bv(e,...await r.deviceChecks(i,n))}async function fy(e){if(e.device.platform!==`harmonyos`)return py(e)}async function py(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Te),u=L(n.flags?.androidDeviceAllowlist),d=await fc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await pc(l,d,e)}function my(e,t,n={}){let r=_v(e);return{ok:!0,data:{status:r,summary:vv(r),kind:t.kind,platform:n.device?E(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:yv(e)}}}async function hy(e){return await I({...e,command:`prepare`,use:He})}async function gy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return P(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(nr.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s}),u=await hy({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let d=Date.now(),f=await u.runtime.operations.prepareAppleRunner({timeoutMs:_y(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Oi(t)}});return{ok:!0,data:vy(a,l,Math.max(0,Date.now()-d),f)}}function _y(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:Ae}function vy(e,t,n,r){return{action:e,platform:E(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:yy(n,r),message:`Prepared Apple runner: ${t.name}`}}function yy(e,t){let n=by(t.buildMs),r=xy(t.connectMs),i=xy(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function by(e){return e===void 0?void 0:xy(e)}function xy(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Sy=e=>mc(e),Cy=e=>yl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),wy=e=>sc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),Ty=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Ol({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),Ey=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ku({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),Dy={session_list:Sy,devices:Sy,capabilities:Sy,apps:Sy,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await ay({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:Ty,shutdown:Ty,appstate:Ty,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>ov({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ko({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await gv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Cs,perf:Ey,logs:Ey,events:Ey,network:Ey,audio:Ey,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await gy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Ls,reinstall:Ls,install_source:Ls,release_materialized_paths:async({req:e})=>await Ao({req:e}),push:Ls,"trigger-app-event":ws,open:Cy,replay:nv,test:rv,batch:async({req:e,sessionName:t,invoke:n})=>await Rs(e,t,n),close:wy};async function Oy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Vn,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=Dy[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{Oy as handleSessionCommands};
|
|
1
|
+
import{D as e,L as t,O as n,k as r,o as i,t as a}from"./sdk-contracts.js";import{O as o,n as s,r as c}from"./sdk-batch-runner.js";import{_ as l,d as u,h as d,l as f,u as p,v as m,x as h,y as g}from"./sdk-device.js";import{A as _,B as v,Ct as y,F as b,G as x,I as S,J as C,K as w,L as ee,N as te,Nt as T,P as ne,R as re,St as E,U as D,Vt as ie,W as O,X as ae,Y as oe,Z as se,ar as ce,d as le,f as ue,ft as de,it as fe,j as pe,nn as me,ot as he,pt as ge,q as _e,rt as ve,v as ye,wt as be,z as xe}from"./sdk-batch.js";import{_ as Se,c as k,d as Ce,f as we,g as Te,h as Ee,l as De,m as Oe,p as ke,t as A,u as Ae}from"./session-store.js";import{D as je,F as Me,M as j,P as Ne,g as M,h as Pe,i as Fe,k as Ie,m as Le,n as Re,s as ze,v as Be}from"./session-snapshot.js";import{O as Ve,c as He,f as Ue,g as We,h as Ge,k as Ke,l as qe,m as Je,o as Ye,p as Xe,u as Ze}from"./parameterized-recorded-fill.js";import{n as N,t as Qe}from"./catalog.js";import{g as $e,i as et}from"./observability.js";import{i as P,n as tt,r as F}from"./success-text.js";import{t as nt}from"./app-inventory.js";import{r as rt,t as it}from"./device.js";import{a as at,r as I}from"./diagnostics.js";import{a as ot,i as st,r as ct}from"./verified-file.js";import{c as lt}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import{i as ut}from"./replay-divergence.js";import{r as dt}from"./version.js";import{i as ft,r as pt}from"./session-artifact-paths.js";import{t as mt}from"./project-runtime.js";import{t as ht}from"./keyed-lock.js";import{n as gt,t as _t}from"./deploy-result-target.js";import{t as vt}from"./keyboard-actions.js";import{i as yt,r as bt}from"./request-cancel.js";import{t as xt}from"./request.js";import{i as St,s as Ct}from"./provider-session-ownership.js";import{A as wt,B as Tt,C as Et,E as Dt,F as Ot,G as kt,K as At,M as jt,O as Mt,P as Nt,S as Pt,_ as Ft,b as It,c as Lt,d as Rt,et as zt,f as Bt,g as Vt,h as Ht,k as Ut,l as Wt,m as Gt,n as Kt,p as qt,q as Jt,r as Yt,rt as Xt,s as Zt,t as Qt,tt as $t,u as L,v as en,w as tn,x as nn,y as rn}from"./device-claim-rule.js";import{i as an}from"./request-runtime-binding.js";import{c as on,i as sn,t as cn}from"./device-claim-inspection.js";import{t as ln}from"./audio-probe-result.js";import{T as un,_ as dn,a as fn,b as pn,c as mn,d as hn,f as gn,g as _n,h as vn,i as yn,l as bn,m as xn,n as Sn,o as Cn,r as wn,s as Tn,t as En,u as Dn,v as On,x as kn}from"./perf-runtime-plan.js";import{i as An,n as jn}from"./lease-context.js";import{h as Mn}from"./screenshot-runtime.js";import{n as R,r as Nn}from"./device-isolation.js";import{a as Pn,n as z,r as Fn}from"./device-inventory-context.js";import{n as In,r as Ln,t as Rn}from"./dispatch-resolve.js";import"./screen-recording-admission-ledger.js";import{a as zn,d as Bn,i as Vn,l as Hn,n as Un,o as Wn,s as Gn,u as Kn}from"./session-routing.js";import{a as qn,i as B,n as V,r as H,t as Jn}from"./session-runtime-admission.js";import{n as Yn,r as Xn}from"./device-selection-resolver.js";import{n as Zn,r as Qn}from"./doctor-output.js";import{t as $n}from"./record-runtime.js";import{n as er}from"./gesture-runtime.js";import{i as tr,n as nr,r as rr}from"./platform-runtime-open-target.js";import{t as ir}from"./snapshot-runtime.js";import{t as ar}from"./app-log-files.js";import U from"node:path";import W,{promises as or}from"node:fs";function sr(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority,capture:r.capture},coordinator:r.createCoordinator()}}function cr(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function lr(e,t){let n=o({...e,...t});return Object.keys(n).length>0?n:void 0}function ur(e,t){return async({dispatch:n,...r})=>{let i=lr(t.internal,n);return await e(i?{...r,internal:i}:r)}}function dr(t){throw new e(`UNSUPPORTED_OPERATION`,`install_from_source ${String(t.kind)} sources require a compatible remote daemon`)}function fr(t){let n=t.meta?.installSource;if(!n)throw new e(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new e(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new e(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new e(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:dr(n)}}function pr(e){let t=fr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Ct(n,e.meta?.tenantId)},cleanup:()=>{St(n)}}}function G(e,t,n){return t||At(n)?null:i(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function mr(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function K(e){return Jt(e.flags)||!e.session?await In(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await hr(e.session.device)}async function hr(t){if(an(t)||!p(t)||t.kind!==`simulator`||process.platform!==`darwin`)return t;if((await Be.observeRunnerSession(t.id))?.alive)return{...t,booted:!0};let n={platform:`ios`,target:t.target,udid:t.id,...t.simulatorSetPath?{iosSimulatorDeviceSet:t.simulatorSetPath}:{}};try{return await In(n)}catch(t){if(!(t instanceof e)||t.code!==`DEVICE_NOT_FOUND`)throw t}return await In({platform:`ios`,target:t.target,device:t.name,...t.simulatorSetPath?{iosSimulatorDeviceSet:t.simulatorSetPath}:{}})}function gr(e,t){return t?Hn(t,e).length===0:!1}async function _r(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=pr(n);let t=xr(n),l=await yr(a,n.flags),u=await H(e.inspectFacts)(l),d=B(`install_from_source`,u.operations.ensureReady)??B(`install_from_source`,u.operations.materializeAppSource)??B(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await V(e.bindDevice)(l,ae);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Sr({artifact:s,retention:t,req:n,session:a,sessionName:r}),a&&j(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Cr(l,s,p,c),h=P(m,`Installed: ${gt(m)}`);return k(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Mt(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:t(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function vr(n){let{req:r}=n;try{let t=r.meta?.materializationId?.trim();if(!t)throw new e(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Mt(t,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:t}}}catch(e){return{ok:!1,error:t(e)}}}async function yr(t,n){let r=br(n?.platform);if(t&&r&&t.device.platform!==r)throw new e(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${t.device.platform}`);if(!t&&!r)throw new e(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return t?t.device:await K({session:t,flags:n})}function br(e){return e===`ios`||e===`android`?e:void 0}function xr(t){let n=t.meta?.retainMaterializedPaths===!0,r=t.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new e(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Sr(e){if(e.retention.enabled)return await wt({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Cr(e,t,n,r){return p(e)?wr(t,n,r):Tr(t,n,r)}function wr(t,n,r){let i=n.bundleId??t.bundleId;if(!i)throw new e(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Dr(r),bundleId:i,...Er(n,t),launchTarget:n.launchTarget??i}}function Tr(t,n,r){let i=n.packageName??n.launchTarget??t.packageName;if(!i)throw new e(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Dr(r),packageName:i,...Er(n,t),launchTarget:n.launchTarget??i}}function Er(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Dr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Or(e){let{req:t,session:n,inspectFacts:r,bindDevice:a}=e,o=kr(t);if(!o.ok)return o.response;let s=G(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await K({session:n,flags:t.flags}),l=await M({device:c,inspectFacts:r,bindDevice:a,command:`runtime port-reverse`,use:v});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==o.options.provider)return i(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:o.options.provider});let u=await l.runtime.operations.configureProviderPortReverse(o.options);return u?{ok:!0,data:{action:`port-reverse`,...u}}:i(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function kr(e){let t=Ar(e);if(!t.ok)return t;let n=jr(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Ar(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function jr(e){let t=Mr(e.flags?.devicePort),n=Mr(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Mr(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Nr(e){return await M({...e,command:`runtime clear`,use:ee})}async function Pr(e){let{req:t,sessionName:n,sessionStore:r}=e,a=(t.positionals?.[0]??`show`).toLowerCase();if(a===`port-reverse`)return await Or({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(a===`gesture-viewport`)return await Fr({...e,session:r.get(n)});if(!Ir(a))return i(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let o=r.get(n),s=r.getRuntimeHints(n);return a===`clear`?await Lr({sessionName:n,sessionStore:r,session:o,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):a===`show`?Rr(n,s):Br({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function Fr(e){if(!e.session)return i(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await er({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Ie(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function Ir(e){return e===`set`||e===`show`||e===`clear`}async function Lr(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(L(i)&&r?.appBundleId){let e=await Nr({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;j(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Gt(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Rr(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function zr(e){return e?g(e.device):void 0}function Br(e){let{req:t,sessionName:n,sessionStore:r,session:a,current:o}=e,s=zr(a),c=Ft(t.flags?.platform??o?.platform??s);if(!c)return i(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(s!==void 0&&s!==c)return i(`INVALID_ARGS`,`runtime set targets ${c}, but session "${n}" is already bound to ${s}.`);let l=Bt(o,Lt(t.flags,c));return Wt(l)===0?i(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,l),{ok:!0,data:{session:n,configured:!0,runtime:l}})}const Vr=/^[A-Za-z0-9_.:-]{1,64}$/,Hr=8192,Ur=4096;function Wr(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Vr.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:Kr(r,n)}}function Gr(t,n,r){let i=g(t),a=qr(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>Ur)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:Ur});return s}function Kr(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>Hr)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${Hr} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function qr(e){return((p(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:u(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function Jr(e,t,n,r){let{eventName:i,payload:a}=Wr([...r]),o=Gr(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Le(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...F(`Triggered app event: ${i}`)}}async function Yr(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await M({command:`trigger-app-event`,device:t,use:ve,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>Jr(s,t,e,n)}}function Xr(t){let n=(t[0]??`status`).toLowerCase();if(!vt(n))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(t.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return Zr(n)}function Zr(e){return e===`get`?`status`:e===`return`?`enter`:e}const Qr={"ime-probe":`android`},$r={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ei={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ti(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Le(e)}}async function ni(e,t){let n=await M(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ri(e,t){return e.operations.keyboardStatus(ti(t)).then(e=>({platform:Qr[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function ii(e,t){let n=await e.operations.keyboardDismiss(ti(t)),r=$r[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...F(si(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...F(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function ai(e,t){let n=await e.operations.keyboardEnter(ti(t)),r=ei[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...F(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...F(`Keyboard enter pressed`)}}async function oi(e){let t=Xr(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ni({command:`keyboard status`,device:n,use:be,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ri(e,t)):t===`dismiss`?await ni({command:`keyboard dismiss`,device:n,use:E,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ii(e,t)):await ni({command:`keyboard enter`,device:n,use:y,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ai(e,t))}function si(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ci(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=G(i,l,u);if(d)return d;let f=await K({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Mn(t)===`may-invalidate`&&j(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function li(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return i(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function ui(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ci({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Ie(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function di(e){return li(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await ui({...e,command:N.keyboard,resolveRuntime:e=>oi(e)})}async function fi(e){return await ui({...e,command:N.triggerAppEvent,resolveRuntime:e=>Yr(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await rr(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function pi(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function mi(t,n){let r=n?.subject??`Payload`,i=t.trim();if(!i)throw new e(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!W.statSync(a).isFile())throw new e(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(t){if(t instanceof e)throw t;let n=t.code;if(n===`EACCES`||n===`EPERM`)throw new e(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new e(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(t)})}if(pi(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function hi(t){let n=mi(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await gi(n.path);try{let t=JSON.parse(r);if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`push payload must be a JSON object`);return t}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid push payload JSON: ${t}`)}}async function gi(t){try{return await or.readFile(t,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new e(`INVALID_ARGS`,`Push payload file not found: ${t}`):r===`EISDIR`?new e(`INVALID_ARGS`,`Push payload path is not a file: ${t}`):r===`EACCES`||r===`EPERM`?new e(`INVALID_ARGS`,`Push payload file is not readable: ${t}`):new e(`COMMAND_FAILED`,`Unable to read push payload file: ${t}`,{cause:String(n)})}}async function _i(e){let{req:t,command:n,sessionName:r,sessionStore:a}=e,o=a.get(r),s=t.flags??{},c=G(n,o,s);if(c)return c;let l=Ci(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let c=u?Ct(u,t.meta?.tenantId):A.expandHome(l.appPathInput);if(!W.existsSync(c))return i(`INVALID_ARGS`,`App binary not found: ${c}`);let d=await K({session:o,flags:s}),f=await H(e.inspectFacts)(d),p=B(n,f.operations.deployApp);if(p)return p;let m=await V(e.bindDevice)(d,oe);o&&j(o);let h=await m.operations.deployApp({app:l.app,appPath:c,replaceExisting:n===`reinstall`}),g=yi(d,l.app,c,h),_=P(g,`Installed: ${g.appName??_t(g)}`),v=Si(o,g);return v&&v!==o&&a.set(r,v),k(a,v,t,n,_),{ok:!0,data:_}}finally{u&&St(u)}}async function vi(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n),o=t.flags??{},s=G(`push`,a,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return i(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await hi(wi(l,t.meta?.cwd)),d=await K({session:a,flags:o}),f=await H(e.inspectFacts)(d),m=B(`push`,f.operations.ensureReady)??B(`push`,f.operations.sendPushNotification);if(m)return m;let h=await V(e.bindDevice)(d,se);await h.operations.ensureReady({}),a&&j(a);let _=await h.operations.sendPushNotification({appId:c,payload:u}),v=p(d)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:g(d),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return k(r,a,t,`push`,v,{positionals:[c,l]}),{ok:!0,data:v}}function yi(e,t,n,r){return p(e)?bi(t,n,r):xi(e,t,n,r)}function bi(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function xi(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function Si(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ci(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:i(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:i(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function wi(e,t){let n=mi(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function q(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await _i({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await _r({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await vi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Ti(e,t,n){return await s(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Ei=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Di(e){return Ei.has(e)}const Oi=new Map(le.map(e=>[e.name,e]));function ki(e){let t=new Set;for(let n of e){let e=Ai(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Ai(e){let t=Oi.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(Di)?n:void 0}function ji(e){if(e!==void 0&&e.remainingSteps.length!==0)return ki(e.remainingSteps)}function Mi(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:An(e),plannedOperations:ji(e.internal?.executionPlan)}}function Ni(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...F(`Closed: ${t.name}`)}})}function Pi(e,t,n){if(!we(t))return{kind:`not-armed`};let r=t.actions.length;Ni(e,t,n);let i=Ue(t),a=e.writeSessionLog(t,{force:qe(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(De(t),{kind:`aborted`})}function Fi(e,n){let r=t(n),i=Ke(e.scriptPublication??We);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ii(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Ni(r,n,t);try{let e=r.writeSessionLog(n,{force:qe(n,t.flags?.force)});e.written&&Je(n,e.path);return}catch(e){return Li(e)}}function Li(n){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return n instanceof e?new e(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n.message}`,{...n.details,...r},n.cause):new e(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${t(n).message}`,r)}async function Ri(e){let t=e.clearRuntimeHints?xe:re,n=await Pe({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,re)};let r=await n.bind(e.device,xe);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function zi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await Bi({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&L(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Gt(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>Ut(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Bi(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>It({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>Pt({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>rn({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Et({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>tn(a,r))}function Vi(e,t){return nn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Hi(t){if(t instanceof e)return t;let n=t instanceof Error?t.message:String(t);return new e(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const Ui=(e,t)=>(e.positionals?.length??0)>0||Dt(t);async function Wi(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=we(n),s=JSON.stringify(t.positionals??[]);if(o&&!Ce(n,s)){let e=await Ki({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Fi(n,Hi(e))};Ee(n,s)}let c=Pi(i,n,t);return c.kind===`failed`?{response:Fi(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function Gi(e){try{return{providerData:await zt(e)}}catch(n){let r=t(n);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function Ki(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Ui(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Mi(t,r,n.trace?.outPath)});return}catch(e){return e}}function qi(t,n){if(!t.flags?.saveScript||Ze(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new e(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new e(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function Ji(t){let{req:n,sessionName:r,logPath:a,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c}=t,l=o.get(r);if(!l)return await Qi({req:n,logPath:a,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});qi(n,l);let u=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!u)return i(`INVALID_ARGS`,`App-only close requires an app target`);if(!t.platformResourceCleanup)throw new e(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=t.platformResourceCleanup,f=await Ri({device:l.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!l.appBundleId&&L(o.getRuntimeHints(r)),inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(f.type===`response`)return f.response;if(j(l),n.internal?.closeAppOnly===!0&&u)return await Zi({req:n,session:l,logPath:a,lifecycle:f.runtime,app:u});let p=await Wi({req:n,session:l,logPath:a,sessionStore:o,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await Yi({req:n,session:l,sessionName:r,logPath:a,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:Xi({session:l,repair:p,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function Yi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await zi({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Ki,finalizeOrdinaryCloseScript:Ii,platformResourceCleanup:e.platformResourceCleanup}),m=await Gi({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Vi(r,u),g=d??h;if(g?n.deviceClaim&&I({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await pn(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function Xi(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:P({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...F(c),...o,...s}}}async function Zi(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await Ki({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...F(`Closed: ${a}`)}}}async function Qi(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:a}=e;if(!t.positionals||t.positionals.length===0)return i(`SESSION_NOT_FOUND`,`No active session`);let o=await Ri({device:await K({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:a});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Mi(t,n)}),{ok:!0,data:{app:t.positionals[0],...F(`Closed: ${t.positionals[0]}`)}})}function $i(e,t){return e.operations.ensureReady(t)}function ea(e,t,n){return e.operations.listApps({device:t,filter:n})}async function ta(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return na(t,r);case`devices`:return await ia(t);case`capabilities`:return await fa({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await va({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function na(e,t){let n=zn(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Wn(e.session,n)).map(e=>ra(e,t))}}}function ra({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:ft(r),platform:g(t.device),...f(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...f(t.device.platform)&&!u(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function ia(e){try{let t=aa();return{ok:!0,data:{devices:(await sa(e)).map(e=>({...Ta(e),...oa(e,t)}))}}}catch(e){let t=n(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function aa(){let e=new Map;for(let t of sn({})){let n=t.claim;!n||cn(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function oa(e,t){let n=t.get(on(kn(e)));return n?{claimedBy:n}:{}}async function sa(e){let t=e.flags?.platform;return da(await z(ca(e,t)),e.flags?.platform,e.flags?.target)}function ca(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:la(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:ua(n?.androidDeviceAllowlist)}}function la(e,t,n){return h({simulatorSetPath:Nn(e),platform:t,target:n})}function ua(e){let t=R(e);return t?Array.from(t).sort():void 0}function da(e,t,n){let r=t?e.filter(e=>Ea(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function fa(e){let t=await wa({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=pa(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await xa(n,e.inspectFacts);return{ok:!0,data:{device:Ta(n),availableCommands:ye().filter(e=>e===`appstate`&&r?!0:ga(e,i))}}}function pa(e,t,n){return!t||!p(e)&&!u(e)||!gr(n,t)?!1:ma(t)||ha(e,t)}function ma(e){return!!(e.appName||e.appBundleId)}function ha(e,t){return!!(u(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function ga(e,t){let n=ue(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>_a(t,e)))}function _a(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function va(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await ya(t,e.providerAppCatalog);if(o)return o;let s=await wa({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=nt(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await Sa({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ca(await ea(f,await $i(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function ya(e,t){let n=ba(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,bt(e.meta?.requestId))]}}}function ba(e){let t=jn(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function xa(e,t){if(t)try{return await t(e)}catch{return}}async function Sa(t){if(!t.inspectFacts)throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await t.inspectFacts(t.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!t.bindDevice)throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await t.bindDevice(t.device,he)}}function Ca(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function wa(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=G(t.command,a,o);return s?{response:s}:{device:await K({session:a,flags:o,androidAvdSelection:i})}}function Ta({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:g({platform:r.platform,appleOs:n}),...f(r.platform)&&n?{appleOs:n}:{}}}function Ea(e,t){return m(e,t)}function J(e){return i(`INVALID_ARGS`,e)}function Da(t,n,r,a){try{return nr({device:t,surfaceFlag:n,openTarget:r,existingSurface:a})}catch(t){return i(t instanceof e?t.code:`INVALID_ARGS`,String(t.message))}}async function Oa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await tr({target:n,platform:i.platform,surface:r});return a?J(a):null}async function ka(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await tr({target:n,platform:r});return i?J(i):null}function Aa(e){let t=en(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:L(n),clearRemovedRuntimeHints:Vt({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function ja(t){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=t;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!c(a??``),execution:{startupDeadlineAtMs:Na(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:An(n)}});let{appBundleId:f,appName:p}=await Ma({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:d});if(l.clearRemovedRuntimeHints){if(!u)throw new e(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Rt({replacedStoredRuntime:l.replacedStoredRuntime,previousRuntime:l.previousRuntime,runtime:l.runtime,session:o,clearRuntimeHints:u})}return{type:`details`,details:{appBundleId:f,appName:p,runtime:l.runtime}}}async function Ma(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function Na(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Pa(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:i(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:i(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:i(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function Fa(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||n.flags?.foreground!==!0)return o;try{let t=await ir({req:{...n,command:`snapshot`,positionals:[],flags:{...n.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return t.ok?{ok:!0,data:{...o.data,snapshot:t.data}}:Ia(o.data,t.error)}catch(e){return Ia(o.data,t(e))}}function Ia(e,t){return{ok:!0,data:{...e,warnings:[...tt(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function La(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:f,runtime:m,runtimeHintCount:h,sessionReused:_,selection:v}=e,y={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:_,...Ra(v)};return o&&(y.appName=o),s&&(y.appBundleId=s),l&&(y.startup=l),u&&(y.timing=u),m&&h(m)>0&&(y.runtime=m),f&&(y.platform=g(f),y.target=f.target??`mobile`,y.device=f.name,y.id=f.id,y.kind=f.kind,d(f.platform)&&(y.serial=f.id)),f&&p(f)&&(y.device_udid=f.id,y.ios_simulator_device_set=f.simulatorSetPath??null),{...y,...F(`Opened: ${o??s??t}`)}}function Ra(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function za(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const Ba=Object.freeze({async observeBootTimeMs(e){if(p(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function Va(e,t){e.warnings=[...tt(e),t]}function Ha(e){return e.internal?.resolvedSessionScope??zn(e)}function Ua(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){He(t,{});return}Ze(n)&&(Ye(t),Va(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function Wa(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function Ga(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ka(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function qa(e,t){if(!t)return;let n=await un(t);if(n.status!==`renewed`)return n.conflict?Yt(e,n.conflict):i(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function Ja(e){let{req:t,sessionName:n,sessionStore:a,logPath:o,device:s,openTarget:c,openPositionals:l,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=t.flags?.relaunch===!0,x=f,S=Date.now(),C=await Ya({req:t,sessionName:n,sessionStore:a,device:s,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(C.type===`response`)return C.response;let w=C.session??g,ee=Date.now(),te=await m.operations.openApplication({target:c,positionals:l,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:Ga(s,t),stateDir:a.resolveDaemonStateDir(),runtimeHints:Gt(p),applyRuntimeHints:h,execution:Mi(t,o,g?.trace?.outPath)});x=te.appBundleId??x;let T={...te.timing},ne=Yn(y),re=c?Ka(ee,c,x):void 0;if(yt(t.meta?.requestId)){let e=r();return i(e.code,e.message,e.details)}g&&je({session:g,command:`open`,positionals:[],flags:void 0});let E=za({existingSession:w,sessionName:g?.name??Vn(t),sessionScope:g?.sessionScope??Ha(t),device:s,surface:d,appBundleId:x,appName:u});E.lease=$t({req:t,existingLease:g?.lease}),_&&(E.deviceClaim=_),t.runtime!==void 0&&Ht(a,n,p);let D=a.ensureSessionDir(n),ie=pt(D,t.meta?.requestId??at().requestId);T.totalDurationMs=Math.max(0,Date.now()-S),I({level:`info`,phase:`open_timing`,durationMs:T.totalDurationMs,data:T});let O=La({sessionName:E.name,sessionStateDir:D,runnerLogPath:ft(D),requestLogPath:ie,eventLogPath:a.resolveEventLogPath(n),appName:u,appBundleId:x,surface:d,startup:re,timing:T,device:s,runtime:p,runtimeHintCount:Wt,sessionReused:g!==void 0,selection:ne});return v&&Va(O,Wa(v)),Ua({session:E,existingSession:g,saveScriptRequested:!!t.flags?.saveScript,responseData:O}),a.set(n,E),a.recordAction(E,{command:`open`,positionals:l,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:O}),{ok:!0,data:O}}async function Ya(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=Xa(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function Xa(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=za({existingSession:o,sessionName:o?.name??Vn(t),sessionScope:o?.sessionScope??Ha(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=$t({req:t,existingLease:o?.lease}),s}function Za(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=jt(t);return Un(t,i.session)?Bn(i,n,a):Kn(i,n,a)}async function Qa(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Qt(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Kt(n,r,Zt({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await On({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:Ba})}}async function $a(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=Za({req:t,device:a,sessionStore:i});if(m)return m;let h=await Qa({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Yt(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await eo({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await ja({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await qa(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await Ja({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function eo(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await dn(t);I({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const to=new Map;async function no(e){let t=C({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Pe({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,D)};case`open-apply-runtime-hints`:{let t=await r(e.device,x);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,w);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,O);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ro(e){let t=Aa(e);if(t.type===`response`)return t;let n=await no({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function io(e){let{sessionName:t,logPath:n,sessionStore:r}=e,a=r.get(t),o=await Pa({req:e.req,hasExistingSession:!!a});if(o.type===`response`)return o.response;let s=o.type===`resolved`?o.req:e.req;if(a){if(s.flags?.saveScript)return i(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let o=s.flags?.relaunch===!0,c=s.positionals?.[0],l=c??(o?a.appName:void 0),u=Da(a.device,s.flags?.surface,l,a.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return J(o?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let d=await Oa({shouldRelaunch:o,openTarget:l,surface:u,device:a.device});if(d)return d;let f=await qa(a.device,a.deviceClaim);if(f)return f;let p=await hr(a.device),m=Xn(p);await s.internal?.retainDeviceExecutionLock?.(p.id);let h=await ro({req:s,sessionStore:r,sessionName:t,device:p,existingSession:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;j(a);let v=await ja({req:s,logPath:n,surface:u,openTarget:l,existingSession:a,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await qa(p,a.deviceClaim)||await Ja({req:s,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:l,openPositionals:c?s.positionals??[]:l?[l]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:u,existingSession:a,selection:m})}let c=s.flags?.relaunch===!0,l=s.positionals?.[0];if(c&&!l)return J(`open --relaunch requires an app argument.`);let u=await ka({shouldRelaunch:c,openTarget:l,platform:s.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await Ln(s.flags??{},kt(l)),f=d.device;await s.internal?.retainDeviceExecutionLock?.(f.id);let p=Da(f,s.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Oa({shouldRelaunch:c,openTarget:l,surface:p,device:f});if(m)return m;let h=await ro({req:s,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await ht(to,f.id,async()=>await $a({req:s,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:l,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:d}))}async function ao(e){let t=await io(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Fa({...e,inspectFacts:H(e.inspectFacts),bindDevice:V(e.bindDevice),openResponse:t})}const oo=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,so=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function co(e){return t=>i(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function lo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function uo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function fo(e){return e.available?null:i(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function po(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function mo(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n),o=t.flags??{},s=o.platform;if(!a&&mr(o)){let e=s===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return i(`SESSION_NOT_FOUND`,e)}let c=G(`appstate`,a,o);if(c)return c;let l=f(a?.device.platform)&&gr(o,a),d=s===`ios`,m=s===`macos`;if(d&&!l)return i(`SESSION_NOT_FOUND`,oo);if(m&&!l)return i(`SESSION_NOT_FOUND`,so);if(l&&a){let e=a.appName??a.appBundleId;if(!a.appName&&!a.appBundleId){if(u(a.device)&&a.surface&&a.surface!==`app`&&a.surface!==`frontmost-app`)return{ok:!0,data:{platform:g(a.device),appName:a.surface,appBundleId:a.appBundleId,source:`session`,surface:a.surface}};let e=u(a.device)?`macOS`:`iOS`;return i(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:g(a.device),appName:e??`unknown`,appBundleId:a.appBundleId,source:`session`,surface:a.surface??`app`,...p(a.device)?{device_udid:a.device.id,ios_simulator_device_set:a.device.simulatorSetPath??null}:{}}}}let h=await K({session:a,flags:o});if(p(h))return i(`SESSION_NOT_FOUND`,oo);if(u(h))return i(`SESSION_NOT_FOUND`,so);let _=await M({command:`appstate`,device:h,use:fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>i(`UNSUPPORTED_OPERATION`,h.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(_.type===`response`)return _.response;let v=_.runtime;await v.operations.ensureReady({serial:o.serial,androidSerialAllowlist:go(o.androidDeviceAllowlist)});let y=await v.operations.appState();return{ok:!0,data:{platform:g(h),package:y.package,activity:y.activity}}}async function ho(e){let{req:t,sessionName:r,sessionStore:a}=e;if(t.command===`boot`){let o=a.get(r),s=t.flags??{},c=G(t.command,o,s);if(c)return c;let l=R(s.androidDeviceAllowlist),u=l?[...l].sort():void 0,d=T({headless:s.headless===!0}),p;try{p=await K({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=n(e);if(d.kind===`boot-target-headless`&&!po(s.device,o?.device)&&t.code===`DEVICE_NOT_FOUND`)return i(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(s.target&&(p.target??`mobile`)!==s.target)return i(`DEVICE_NOT_FOUND`,`No ${p.platform} device found matching --target ${s.target}.`);let m=await Pe({command:`boot`,device:p,required:d.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:co(d.kind===`boot-target-headless`)});if(m.type===`response`)return m.response;let h={serial:s.serial,androidSerialAllowlist:u};return p=d.kind===`boot-target-headless`?await(await m.bind(p,d.use)).operations.bootTargetHeadless(h):await(await m.bind(p,d.use)).operations.bootTarget(h),{ok:!0,data:{platform:g(p),target:p.target??`mobile`,device:p.name,id:p.id,kind:p.kind,booted:!0,...f(p.platform)&&p.appleOs?{appleOs:p.appleOs}:{}}}}if(t.command===`shutdown`){let n=a.get(r),o=t.flags??{},s=G(t.command,n,o);if(s)return s;let c=await K({flags:o,session:n,androidAvdSelection:`include-stopped`}),l=fo((await lo(e.inspectFacts)(c)).operations.shutdownTarget);if(l)return l;if(n&&n.device.platform===c.platform&&n.device.id===c.id)return i(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${r}`,session:r,platform:g(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let u=await(await uo(e.bindDevice)(c,ie)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:g(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u,...f(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:i(u.error?.code??`COMMAND_FAILED`,_o(u),{platform:g(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u})}return t.command===`appstate`?await mo({req:t,sessionName:r,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function go(e){let t=R(e);return t?[...t].sort():void 0}function _o(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function vo(e){let t=st(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=W.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{W.closeSync(t)}}function yo(e,t){ar(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=ct(e);try{W.writeFileSync(r,n,`utf8`)}finally{W.closeSync(r)}}function bo(e){let t=U.dirname(e),n=U.basename(e);W.existsSync(t)||W.mkdirSync(t,{recursive:!0});let r=ot(e);try{W.fsyncSync(r)}finally{W.closeSync(r)}let i=0;for(let e of W.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{W.unlinkSync(U.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function xo(e){return Dn.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function So(e){try{return await Co(e)}catch(e){return{ok:!1,error:t(e)}}}async function Co(e){let t=wo(e);if(!t.ok)return t;let n=t.session,r=te(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return To(a,o);let c=ne({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await Eo(e,n,r,c.use);case`capture-status`:return await Do(e,n);case`capture-stop`:return await Oo(e,n)}}function wo(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:i(`SESSION_NOT_FOUND`,`audio requires an active session`)}function To(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return i(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Eo(e,t,n,r){if(t.audioProbe){await mn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return i(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let a=await e.bindDevice(t.device,r),o=Tn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=Tn.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:o,device:t.device}),c=U.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await a.operations.audioProbeStart({sessionId:e.sessionName,statusPath:c,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:s});await Cn({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:a.owner,fence:s,...l,throwIfCanceled:e.throwIfCanceled});let u=e.sessionStore.get(e.sessionName)?.audioProbe;if(!u)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await u.handle.status()}}async function Do(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:ko()};let r=await n.handle.status();return r.state===`stopped`&&await mn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Oo(e,t){return t.audioProbe?{ok:!0,data:await mn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:ko()}}function ko(){return ln({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Ao(n){let r=n.sessionStore.get(n.sessionName);if(!r)return i(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if($e(n.req.positionals?.[0]))throw new e(`INVALID_ARGS`,et);Zo(n.req);let t=En({positionals:n.req.positionals,kind:$o(n.req.flags?.kind),outPath:$o(n.req.flags?.out)}),a=Sn(t);if(a.kind===`capture-stop`)return jo(n,await Fo(n,r,a.request));let o=await Jn({device:r.device,plan:a,inspectFacts:n.inspectFacts});return o.admitted?jo(n,await Mo(n,r,o)):B(`perf`,o.fact)??i(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:t(e)}}}function jo(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,Ko(t.data)?{...t.data}:{}),t}async function Mo(t,n,r){let{device:i,plan:a}=qn(r),o=V(t.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:Vo(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:qo(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Jo(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,t.req.meta?.cwd):void 0,artifactsDir:U.join(t.sessionStore.ensureSessionDir(t.sessionName),`artifacts`)}))};case`capture-start`:return await No(t,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new e(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new e(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=Xo(t,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:A.expandHome(c,t.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function No(e,t,n,r){if(t.perfCapture)return i(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return i(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let a=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,o=Xo(e,r.outPath,a),s=fn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=fn.createNextFence({admissionLedger:Po(e),resourcePath:s,device:t.device}),l=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:o,fence:c});return await wn({admissionLedger:Po(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:c,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function Po(t){if(t.perfCaptureAdmissionLedger)return t.perfCaptureAdmissionLedger;throw new e(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Fo(e,t,n){let r=t.perfCapture;if(!r)return i(`INVALID_ARGS`,`no active native perf capture`);let a=Bo(r.handle.inspect(),n);if(a)return i(`INVALID_ARGS`,a);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let o=await yn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Io(o),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:o}}function Io(t){if(Lo(t)||Ro(t))return t;throw new e(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Lo(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Ro(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&zo(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function zo(e,t){return t.every(t=>typeof e[t]==`string`)}function Bo(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function Vo(e,t){return{...Yo(e),metrics:{fps:Ho(t.metric,e)},sampling:{fps:t.sampling}}}function Ho(e,t){if(!Ko(e)||e.available!==!0)return e;let n=Uo(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Uo(e,t){let n=Wo(t.windowStartedAt),r=Wo(t.windowEndedAt)??Wo(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:Go(e)})).slice(-12)}function Wo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Go(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Ko(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qo(e,t){return{...Yo(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Jo(e,t){return{...Yo(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Yo(e){return{session:e.name,platform:g(e.device),device:e.device.name,deviceId:e.device.id}}function Xo(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):U.join(e.sessionStore.ensureSessionDir(e.sessionName),`${Qo()}-${n}`)}function Zo(t){let n=t.positionals?.[0]?.toLowerCase(),r=t.positionals?.[1]?.toLowerCase();if(t.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new e(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function Qo(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function $o(e){return typeof e==`string`&&e.length>0?e:void 0}const es=[`dump`,`log`],ts=`network requires ${es.join(` or `)}`,ns=`network include mode must be one of: ${a.join(`, `)}`,rs=2048;async function is(e){let n=e.sessionStore.get(e.sessionName);if(!n)return i(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=as(e.bindDevice),r=(await t(n.device,_)).facts.networkDump;if(!r.available)return us(r.hint);let i=os(e.req);if(!i.ok)return i;let a=pe({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return ds(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:n.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:rs,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function as(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function os(e){let t=ss(e);if(!t.ok)return t;let n=cs(e);if(!n.ok)return n;let r=ls(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function ss(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return es.includes(t)?{ok:!0,action:t}:i(`INVALID_ARGS`,ts)}function cs(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?i(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ls(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return i(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return a.includes(r)?{ok:!0,include:r}:i(`INVALID_ARGS`,ns)}function us(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ds(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:rs,maxScanLines:e.entries.length},notes:e.notes}}}function fs(e,t){let n=xn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[ps(e.appLogFailure)]:ms(n.state)}}function ps(e){return e.hint?`${e.message} ${e.hint}`:e.message}function ms(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function hs(e,t){return ce([...e,...t.notes??[]])}async function gs(e){let{req:t}=e;return t.command===`perf`?await Ao({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?vs(e):t.command===`events`?await _s(e):t.command===`network`?await is(e):t.command===`audio`?await So(As(e)):null}async function _s(e){let{req:n,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(e){return{ok:!1,error:t(e)}}}async function vs(e){let{req:n,sessionName:r,sessionStore:a}=e,o=a.get(r);if(!o)return i(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=js({...e,session:o}),r=(await t.bindDevice(o.device,b)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=xs(S({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),o);return`ok`in i?i:await ys(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function ys(e,t){switch(t.kind){case`path`:return Ss(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Cs(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await bs(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Os(e);case`mark`:return await e.bindDevice(e.session.device,t.use),ws(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ts(e)}}async function bs(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Ds(e,t.appBundleId,n.owner,n.operations.appLogStart):await Es(e,t.appBundleId,n.owner,n.operations.appLogStart)}function xs(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):i(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ss(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=vo(a),s=fs(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Cs(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=fs(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:hs(t.notes,o)}}}function ws(e,t,n){let r=n.resolveAppLogPath(t);return yo(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ts(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return i(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let a=bo(r.resolveAppLogPath(n));return hn({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:a}}async function Es(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await gn({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:_n.resolvePath(o.resolveSessionDir(a))});let s=bo(o.resolveAppLogPath(a)),c=await ks(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Ds(e,t,n,r){let{session:a}=e;return a.appLog?i(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await ks(e,t,r,n)}async function Os(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return i(`INVALID_ARGS`,`no app log stream active`);let a=r.resolveAppLogPath(n);return await gn({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:_n.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:a,stopped:!0}}}async function ks(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=_n.resolvePath(o.resolveSessionDir(a));try{let l=xo({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await bn({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:vn({session:i,sessionName:a,sessionStore:o,error:e})}}}function As(t){if(!t.bindDevice||!t.inspectFacts)throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!t.audioProbeAdmissionLedger)throw new e(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,throwIfCanceled:t.throwIfCanceled??(()=>{})}}function js(t){if(!t.bindDevice)throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!t.appLogAdmissionLedger)throw new e(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...t,bindDevice:t.bindDevice,appLogAdmissionLedger:t.appLogAdmissionLedger}}const Ms=new WeakMap;function Ns(e){return{store:t=>Ps(e,t),finalize:(t,n)=>Fs({...e,evidence:t,projection:n})}}function Ps(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Fe(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return Ms.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ne(a),refFrame:Me(a)}),{evidence:s,refsGeneration:o}}function Fs(e){let t=Ms.get(e.evidence);Ms.delete(e.evidence);let n=Ls(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Is(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Rs(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Re(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Is(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Ne(n)===t.runtimeRevision&&Me(n)===t.refFrame}function Ls(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Rs(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function zs(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:Te(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Bs(e.scriptPublication??We)}},armStep(e){n.update(t=>{Ae(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Tt(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){Te(r())!==void 0&&n.update(Se)},markCompleteIfArmed(){Te(r())!==void 0&&n.update(Oe)},markSessionHeldIfArmed(e){if(e.ok||!ke(r()))return e;let t=ut(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&Hs(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Vs({session:t,...e})})}}}}function Bs(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Ke(e),targetForce:Ve(e)}}function Vs(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Us({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Hs(e){e.pendingRecordAndHeal=void 0}function Us(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Ws(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await $n({req:Gs(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function Gs(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const Ks={resolveSessionScope:zn},qs=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await Ot({...cr(e),session:Ys(t,n,r),invoke:ur(a??i,e),dependencies:Ks}),Js=async({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new e(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Ws({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await Nt({...cr(t),session:Ys(n,r,i),createSession:(e,t)=>Ys(e,t,i),invoke:ur(s??o,t),dependencies:Ks,cleanupSession:async e=>await Xs({req:t,sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Ys(t,n,r){let i=e=>{let n=r.get(t);return n?(e(n),r.set(t,n),!0):!1},a={get:()=>r.get(t),lookup:()=>r.lookup(t),getRuntimeHints:()=>r.getRuntimeHints(t),ensureSessionDir:()=>r.ensureSessionDir(t)};return sr(t,n,a,{createCoordinator:()=>zs({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(t)}}),assertSelectorMatches:e=>{let n=r.lookup(t);n&&Gn(n,e)},resolveOpenRuntimeHints:({request:e,device:n,platform:i})=>qt({req:e,sessionStore:{getRuntimeHints:e=>e===t?r.getRuntimeHints(t):void 0},sessionName:t,device:n,platform:i}),bindAuthority:e=>Ns({sessionStore:{get:()=>r.get(t),update:i},sessionName:t,...e?{signal:e}:{}}),capture:async({flags:n,logPath:i})=>{let a=r.get(t);if(!a)throw new e(`NO_ACTIVE_SESSION`,`Session "${t}" is no longer active.`);return await ze({device:a.device,session:a,flags:n,logPath:i})}})}async function Xs(t){let{req:n,sessionName:r,logPath:i,sessionStore:a}=t;if(!a.get(r))return;let o=await Ji({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:t.leaseRegistry,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup});if(!o.ok)throw new e(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function Zs(t){let{req:n,sessionName:r,sessionStore:i}=t;if(n.command!==Qe.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return Y(new e(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return Y(new e(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=ec(a);if(o)return Y(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return Y(new e(`INVALID_ARGS`,`session save-script path cannot be empty.`));Ge(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:qe(a,n.flags?.force),publication:`active`});return c.written?(Xe(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...F(`Published script: ${c.path}`)}}):Y(c.error??new e(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Qs(e){if(we(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Ze(e)?void 0:`not-armed`}const $s={repair:()=>new e(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new e(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new e(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new e(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function ec(e){let t=Qs(e);return t?$s[t]():void 0}function Y(e){return{ok:!1,error:t(e)}}function tc(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function nc(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Le(e)}}async function rc(t,n,r){if(r.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await t.operations.readClipboard(nc(n))}}async function ic(t,n,r){if(r.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...nc(n),text:i};return await t.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...F(`Clipboard updated`)}}async function ac(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await M({command:`clipboard`,device:t,use:de,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>rc(n,e,r)}}let o=await M({command:`clipboard`,device:t,use:ge,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>ic(s,e,r)}}async function oc(e){let{req:t,sessionName:n,logPath:r,sessionStore:a,inspectFacts:o,bindDevice:s}=e,c=a.get(n),l=t.flags??{},u=G(N.clipboard,c,l);if(u)return u;let d=t.positionals??[],f=tc(d);if(!f)return i(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let p=await K({session:c,flags:l}),m=await ac({device:p,action:f,positionals:d,inspectFacts:o,bindDevice:s});if(!m.ok)return m.response;let h=await m.execute(Ie(r,t.flags,c?.appBundleId,c?.trace?.outPath));return k(a,c,t,t.command,h),{ok:!0,data:{platform:g(p),...h}}}function sc(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function cc(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function lc(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function uc(e,...t){for(let n of t)X(e,n)}function X(e,t){e.push(t),xt({type:`command`,status:`progress`,message:dc(t)})}function dc(e){return[Qn(e),...Zn(e)].join(`
|
|
2
|
+
`)}async function fc(e,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let t=o?pc(i,await o(`all`))?.id:void 0;if(!t){X(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${g(r)}.`,evidence:{requested:i,platform:g(r)}});return}X(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(n){let i=t(n);X(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${g(r)} --all`,evidence:{code:i.code,message:i.message}})}}function pc(t,n){let r=t.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new e(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${t}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new e(`APP_NOT_INSTALLED`,`No launchable installed app matched "${t}"`)}async function mc(e,n,r){let i=gc(n,r);try{let t=await vc(i),n=_c(t.devices,i);return X(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Sc(n,i,t.failures),hint:n.length===0?Tc(t.failures):void 0,command:n.length===0?kc(i):void 0,evidence:Ac(n,t.failures)}),n.length>0&&yc(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=t(n);return X(e,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function hc(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];X(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:g(e),id:e.id,name:e.name}))}})}function gc(e,t){let n=e.flags??{};return Rn({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function _c(e,t){return e.filter(e=>l(e,t,{includeExplicitSelectors:!0}))}async function vc(e){if(e.platform)return{devices:await z(e),failures:[]};let t=[],n=[];for(let r of it)try{t.push(...await z({...e,platform:r}))}catch(e){n.push(xc(r,e))}return{devices:t,failures:n}}function yc(e,t){for(let n of t)X(e,bc(n))}function bc(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Z(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Z(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function xc(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Sc(e,t,n){if(e.length===0)return n.length>0?`No ${Cc(t)} devices found; ${wc(n)}.`:`No ${Cc(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Cc(t)} ${Oc(e.length,`device`)} available; ${r} booted`,a=Ec(e,t);return a?`${i} (${a}).`:`${i}.`}function Cc(e){let t=e.platform?Z(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function wc(e){return e.slice(0,2).map(e=>`${Z(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Tc(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Ec(e,t){if(t.platform||t.target)return;let n=rt(e),r=Dc();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function Dc(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Z(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function Oc(e,t){return e===1?t:`${t}s`}function kc(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Ac(e,t){let n=new Map;for(let t of e){let e=g(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const jc=1500;async function Mc(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await Nc(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Pc(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function Nc(e,t,n){try{return await(n.resolveProcessInfo??Fc)(e,t)}catch{return}}function Pc(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function Fc(e,t){if(!Ic(e))return;let n=await Lc(t);if(n!==void 0)return{pid:n,cwd:await Rc(n)}}function Ic(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Lc(e){let t=await lt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:jc});if(t.exitCode===0)return t.stdout.split(`
|
|
3
|
+
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Rc(e){let t=await lt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:jc});if(t.exitCode===0)return t.stdout.split(`
|
|
4
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const zc=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Bc=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Vc(e,t){let n=mt(e.meta?.cwd);return{targetApp:Kc(e.flags?.targetApp)??t?.appBundleId,metroHost:Kc(e.runtime?.metroHost)??`127.0.0.1`,metroPort:qc(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Wc(e,n)}}function Hc(e,t={}){let n=Gc(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Uc(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${g(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Wc(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Gc(e){let t={...Object.fromEntries([...zc,...Bc].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function Kc(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function qc(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Jc(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=Yc(e.hostDiagnostics),c=r.get(n),l=Vc(t,c),u=Qc(r,n),d=[];if(uc(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${dt()} using ${u}`,evidence:{version:dt(),stateDir:u}},...Hc(t,{required:l.remote}),...Uc(r,n,c,{remote:l.remote})),l.remote)return rl(d,l);let f=Xc(l,u,i),p=await mc(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&X(d,m);let h=await $c({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??Zc(p);if(g){let e=await s.warmupCheck(g,f);e&&X(d,e)}return rl(d,l,{device:h,includeMetro:!0,inventory:p})}function Yc(t){if(!t)throw new e(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return t}function Xc(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>an(e),emitProgress:e=>xt({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Fn(e),shouldPropagateInventoryProbeError:Pn,transportOverrides:Object.freeze({androidAdb:n})})}function Zc(e){let t=(e?.devices??[]).filter(e=>p(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function Qc(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function $c(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??hc(t,i,a.targetApp);return u&&await el(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&X(t,await Mc(a.metroHost,a.metroPort,a.kind)),uc(t,...await r.ambientChecks(n)),u}async function el(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await tl({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await fc(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),uc(e,...await r.deviceChecks(i,n))}async function tl(e){if(e.device.platform!==`harmonyos`)return nl(e)}async function nl(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,he),u=R(n.flags?.androidDeviceAllowlist),d=await $i(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await ea(l,d,e)}function rl(e,t,n={}){let r=sc(e);return{ok:!0,data:{status:r,summary:cc(r),kind:t.kind,platform:n.device?g(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:lc(e)}}}async function il(e){return await M({...e,command:`prepare`,use:_e})}async function al(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return i(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=a.get(n),c=t.flags??{},l=G(N.prepare,s,c);if(l)return l;let u=await K({session:s,flags:c}),d=await il({device:u,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:ol(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:s?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:An(t)}});return{ok:!0,data:sl(o,u,Math.max(0,Date.now()-f),p)}}function ol(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:me}function sl(e,t,n,r){return{action:e,platform:g(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:cl(n,r),message:`Prepared Apple runner: ${t.name}`}}function cl(e,t){let n=ll(t.buildMs),r=ul(t.connectMs),i=ul(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function ll(e){return e===void 0?void 0:ul(e)}function ul(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Q=e=>ta(e),dl=e=>ao({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),fl=e=>Ji({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),pl=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await ho({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),$=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await gs({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),ml={session_list:Q,devices:Q,capabilities:Q,apps:Q,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Jc({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:pl,shutdown:pl,appstate:pl,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Zs({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Pr({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await oc({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:di,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await al({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:q,reinstall:q,install_source:q,release_materialized_paths:async({req:e})=>await vr({req:e}),push:q,"trigger-app-event":fi,open:dl,replay:qs,test:Js,batch:async({req:e,sessionName:t,invoke:n})=>await Ti(e,t,n),close:fl};async function hl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Xt,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=ml[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{hl as handleSessionCommands};
|