agent-device 0.21.13 → 0.21.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.apk → agent-device-android-ime-helper-0.21.15.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.15.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.manifest.json → agent-device-android-ime-helper-0.21.15.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.15.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.15.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.13.manifest.json → agent-device-android-snapshot-helper-0.21.15.manifest.json} +6 -6
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +11 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +110 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +4 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerMainOwnedState.swift +27 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.h +8 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.m +26 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +12 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +59 -20
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +2 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +179 -91
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +21 -24
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+GestureExecution.swift +9 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +36 -49
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+MainThreadWork.swift +11 -15
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +136 -29
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +20 -21
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +3 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +6 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollDragExecution.swift +12 -24
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +22 -42
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +15 -18
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotAcquisition.swift +73 -31
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +20 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +9 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +5 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +2 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +51 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +5 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +78 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +32 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +7 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +23 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +17 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +8 -9
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +9 -15
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +12 -11
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +16 -19
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +24 -9
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +66 -10
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +12 -10
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +1 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +27 -5
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +1 -0
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +1 -1
- package/dist/src/adb-failure.js +1 -1
- package/dist/src/adb-transport.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/android-adb.d.ts +1 -8
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android-snapshot-quality.js +1 -0
- package/dist/src/android-system-chrome.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-inventory.js +1 -1
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +1 -1
- package/dist/src/app-lifecycle2.js +1 -1
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-runtime2.js +1 -1
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/archive.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/capture-disclosure.js +1 -1
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +2 -2
- package/dist/src/cli.js +4 -4
- package/dist/src/click-button.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +102 -95
- package/dist/src/clipboard-shell-response.js +1 -1
- package/dist/src/command-schema.js +1 -1
- package/dist/src/command-tools.js +3 -3
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +1 -1
- package/dist/src/contracts.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-claim-rule.js +2 -2
- package/dist/src/device-input-state.d.ts +15 -2
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-rotation.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/device-shell.js +1 -1
- package/dist/src/device2.js +1 -1
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/dispatch-resolve.js +1 -1
- package/dist/src/doctor2.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/exec.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/format.js +1 -1
- package/dist/src/gesture-plan-types.d.ts +1 -1
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/human-control-contract.js +1 -1
- package/dist/src/human-control.js +1 -1
- package/dist/src/index.d.ts +7 -3
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-artifact-facade.js +1 -1
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-binding.js +1 -1
- package/dist/src/interactor.js +4 -4
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.js +1 -1
- package/dist/src/inventory.js +1 -1
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -0
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-download-file.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +16 -3
- package/dist/src/linux.js +1 -1
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/mechanics.js +17 -17
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/multitouch-support.js +1 -1
- package/dist/src/native-build-cache.js +1 -0
- package/dist/src/observation.js +1 -1
- package/dist/src/overlay.js +3 -0
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/perf-target.js +2 -2
- package/dist/src/perf.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-size.js +1 -1
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/png.js +1 -1
- package/dist/src/prepare-kind.js +1 -1
- package/dist/src/provider-session-ownership.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/recording.js +1 -1
- package/dist/src/rect-center.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +36 -36
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +1 -1
- package/dist/src/reporting.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/runner-cache-metadata.js +1 -1
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-device-readiness.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-error-classification.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +1 -3
- package/dist/src/runtime10.js +2 -2
- 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 -1
- package/dist/src/screen-recording-completion.js +1 -1
- package/dist/src/screen-recording-options.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-image.js +1 -1
- package/dist/src/screenshot-overlay-draw.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot3.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-command.d.ts +13 -6
- 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 +59 -12
- 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-io.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-routing.js +1 -1
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +1 -1
- package/dist/src/session.js +1 -1
- package/dist/src/session2.js +4 -4
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -0
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-state.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -1
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src4.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/src8.js +1 -1
- package/dist/src/string-enum.js +1 -1
- package/dist/src/surface-snapshot.js +1 -1
- package/dist/src/takeover.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider-facade.js +1 -1
- package/dist/src/tool-provider.js +2 -2
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/transport.js +1 -1
- package/dist/src/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/package.json +1 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.13.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk.sha256 +0 -1
- package/dist/src/absence-observation-errors.js +0 -1
- package/dist/src/runner-presentation.js +0 -1
- package/dist/src/semantic-index.js +0 -1
- package/dist/src/snapshot-process.js +0 -1
- package/dist/src/snapshot-scope.js +0 -1
package/dist/src/session2.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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{i as o,k as s,n as c}from"./sdk-batch-runner.js";import{S as l,b as u,d,f,g as p,l as m,v 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,Ut as ie,W as O,X as ae,Y as oe,Z as se,d as ce,f as le,ft as ue,in as de,it as fe,j as pe,ot as me,pt as he,q as ge,rt as _e,sr 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,I as Me,U as Ne,W as Pe,g as j,h as Fe,i as Ie,m as Le,n as Re,s as ze,v as Be,z as M}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{a 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=s({...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)||!d(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&&M(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 d(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 j({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 j({...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=Me(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;M(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?u(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=u(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((d(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:f(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 j({command:`trigger-app-event`,device:t,use:_e,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 j(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`&&M(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:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Me(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&&M(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 f=await hi(wi(l,t.meta?.cwd)),p=await K({session:a,flags:o}),m=await H(e.inspectFacts)(p),h=B(`push`,m.operations.ensureReady)??B(`push`,m.operations.sendPushNotification);if(h)return h;let g=await V(e.bindDevice)(p,se);await g.operations.ensureReady({}),a&&M(a);let _=await g.operations.sendPushNotification({appId:c,payload:f}),v=d(p)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:u(p),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 d(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 c(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.readSetting.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(ce.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 Fe({...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(M(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:u(t.device),...m(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,...m(t.device.platform)&&!f(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 l({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||!d(e)&&!f(e)||!gr(n,t)?!1:ma(t)||ha(e,t)}function ma(e){return!!(e.appName||e.appBundleId)}function ha(e,t){return!!(f(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function ga(e,t){let n=le(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,me)}}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:u({platform:r.platform,appleOs:n}),...m(r.platform)&&n?{appleOs:n}:{}}}function Ea(e,t){return g(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:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=t;await c.operations.prepareApplicationOpen({target:a,currentAppBundleId:s?.appBundleId,hasExistingSession:s!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!o(a??``),execution:{startupDeadlineAtMs:Na(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:s?.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:c,surface:i,openTarget:a,existingAppBundleId:s?.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:s,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:f,device:m,runtime:h,runtimeHintCount:g,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),f&&(y.timing=f),h&&g(h)>0&&(y.runtime=h),m&&(y.platform=u(m),y.target=m.target??`mobile`,y.device=m.name,y.id=m.id,y.kind=m.kind,p(m.platform)&&(y.serial=m.id)),m&&d(m)&&(y.device_udid=m.id,y.ios_simulator_device_set=m.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(d(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 Fe({...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;M(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=m(a?.device.platform)&&gr(o,a),p=s===`ios`,h=s===`macos`;if(p&&!l)return i(`SESSION_NOT_FOUND`,oo);if(h&&!l)return i(`SESSION_NOT_FOUND`,so);if(l&&a){let e=a.appName??a.appBundleId;if(!a.appName&&!a.appBundleId){if(f(a.device)&&a.surface&&a.surface!==`app`&&a.surface!==`frontmost-app`)return{ok:!0,data:{platform:u(a.device),appName:a.surface,appBundleId:a.appBundleId,source:`session`,surface:a.surface}};let e=f(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:u(a.device),appName:e??`unknown`,appBundleId:a.appBundleId,source:`session`,surface:a.surface??`app`,...d(a.device)?{device_udid:a.device.id,ios_simulator_device_set:a.device.simulatorSetPath??null}:{}}}}let g=await K({session:a,flags:o});if(d(g))return i(`SESSION_NOT_FOUND`,oo);if(f(g))return i(`SESSION_NOT_FOUND`,so);let _=await j({command:`appstate`,device:g,use:fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>i(`UNSUPPORTED_OPERATION`,g.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:u(g),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),d=l?[...l].sort():void 0,f=T({headless:s.headless===!0}),p;try{p=await K({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=n(e);if(f.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 h=await Fe({command:`boot`,device:p,required:f.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:co(f.kind===`boot-target-headless`)});if(h.type===`response`)return h.response;let g={serial:s.serial,androidSerialAllowlist:d};return p=f.kind===`boot-target-headless`?await(await h.bind(p,f.use)).operations.bootTargetHeadless(g):await(await h.bind(p,f.use)).operations.bootTarget(g),{ok:!0,data:{platform:u(p),target:p.target??`mobile`,device:p.name,id:p.id,kind:p.kind,booted:!0,...m(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:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let d=await(await uo(e.bindDevice)(c,ie)).operations.shutdownTarget();return d.success?{ok:!0,data:{platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:d,...m(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:i(d.error?.code??`COMMAND_FAILED`,_o(d),{platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:d})}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:u(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 ve([...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=>{Ie(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:Pe(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&&Pe(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 j({command:`clipboard`,device:t,use:ue,inspectFacts:i,bindDevice:a,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>rc(n,e,r)}}let o=await j({command:`clipboard`,device:t,use:he,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>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??{},d=G(N.clipboard,c,l);if(d)return d;let f=t.positionals??[],p=tc(f);if(!p)return i(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let m=await K({session:c,flags:l}),h=await ac({device:m,action:p,positionals:f,inspectFacts:o,bindDevice:s});if(!h.ok)return h.response;let g=await h.execute(Me(r,t.flags,c?.appBundleId,c?.trace?.outPath));return k(a,c,t,t.command,g),{ok:!0,data:{platform:u(m),...g}}}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
|
|
3
|
-
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function
|
|
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 ${u(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=>d(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,me),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?u(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 j({...e,command:`prepare`,use:ge})}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:de}function sl(e,t,n,r){return{action:e,platform:u(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};
|
|
1
|
+
import{A as e,B as t,M as n,R as r,j as i,o as a,t as o}from"./sdk-contracts.js";import{i as s,k as c,n as l}from"./sdk-batch-runner.js";import{S as u,b as d,d as f,f as p,g as m,l as h,v as g,y as _}from"./sdk-device.js";import{A as v,B as y,Ct as b,F as x,G as ee,I as S,J as C,K as te,L as ne,N as w,Nt as re,P as ie,R as T,St as E,U as ae,Ut as D,W as oe,X as se,Y as ce,Z as le,d as ue,f as de,ft as fe,in as pe,it as me,j as he,ot as ge,pt as _e,q as ve,rt as ye,sr as be,v as xe,wt as Se,z as Ce}from"./sdk-batch.js";import{_ as we,c as O,d as Te,f as Ee,g as De,h as Oe,l as ke,m as Ae,p as je,t as k,u as Me}from"./session-store.js";import{B as A,G as Ne,L as Pe,O as Fe,W as Ie,g as j,h as Le,i as Re,m as ze,n as Be,s as Ve,y as He}from"./session-snapshot.js";import{O as Ue,c as We,f as Ge,g as Ke,h as qe,k as Je,l as Ye,m as Xe,o as Ze,p as Qe,u as M}from"./parameterized-recorded-fill.js";import{n as N,t as $e}from"./catalog.js";import{g as et,i as tt}from"./observability.js";import{i as P,n as nt,r as F}from"./success-text.js";import{t as rt}from"./app-inventory.js";import{r as it,t as at}from"./device.js";import{a as ot,r as I}from"./diagnostics.js";import{a as st,i as ct,r as lt}from"./verified-file.js";import{c as ut}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import{i as dt}from"./replay-divergence.js";import{a as ft}from"./version.js";import{i as pt,r as mt}from"./session-artifact-paths.js";import{t as ht}from"./project-runtime.js";import{t as gt}from"./keyed-lock.js";import{n as _t,t as vt}from"./deploy-result-target.js";import{t as yt}from"./keyboard-actions.js";import{i as bt,r as xt}from"./request-cancel.js";import{t as St}from"./request.js";import{i as Ct,s as wt}from"./provider-session-ownership.js";import{A as Tt,B as Et,C as Dt,E as Ot,F as kt,G as At,K as jt,M as Mt,O as Nt,P as Pt,S as Ft,_ as It,b as Lt,c as Rt,d as zt,et as Bt,f as Vt,g as Ht,h as Ut,k as Wt,l as Gt,m as Kt,n as qt,p as Jt,q as Yt,r as Xt,rt as Zt,s as Qt,t as $t,tt as en,u as L,v as tn,w as nn,x as rn,y as an}from"./device-claim-rule.js";import{i as on}from"./request-runtime-binding.js";import{c as sn,i as cn,t as ln}from"./device-claim-inspection.js";import{t as un}from"./audio-probe-result.js";import{T as dn,_ as fn,a as pn,b as mn,c as hn,d as gn,f as _n,g as vn,h as yn,i as bn,l as xn,m as Sn,n as Cn,o as wn,r as Tn,s as En,t as Dn,u as On,v as kn,x as An}from"./perf-runtime-plan.js";import{i as jn,n as Mn}from"./lease-context.js";import{h as Nn}from"./screenshot-runtime.js";import{n as R,r as Pn}from"./device-isolation.js";import{a as Fn,n as In,r as Ln}from"./device-inventory-context.js";import{n as Rn,r as zn,t as Bn}from"./dispatch-resolve.js";import"./screen-recording-admission-ledger.js";import{a as Vn,d as Hn,i as Un,l as Wn,n as Gn,o as Kn,s as qn,u as Jn}from"./session-routing.js";import{a as Yn,i as z,n as B,r as V,t as Xn}from"./session-runtime-admission.js";import{n as Zn,r as Qn}from"./device-selection-resolver.js";import{n as $n,r as er}from"./doctor-output.js";import{t as tr}from"./record-runtime.js";import{n as nr}from"./gesture-runtime.js";import{i as rr,n as ir,r as ar}from"./platform-runtime-open-target.js";import{t as or}from"./snapshot-runtime.js";import{t as sr}from"./app-log-files.js";import H from"node:path";import U,{promises as cr}from"node:fs";function lr(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 ur(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function dr(e,t){let n=c({...e,...t});return Object.keys(n).length>0?n:void 0}function fr(e,t){return async({dispatch:n,...r})=>{let i=dr(t.internal,n);return await e(i?{...r,internal:i}:r)}}function pr(t){throw new e(`UNSUPPORTED_OPERATION`,`install_from_source ${String(t.kind)} sources require a compatible remote daemon`)}function mr(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:pr(n)}}function hr(e){let t=mr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:wt(n,e.meta?.tenantId)},cleanup:()=>{Ct(n)}}}function W(e,t,n){return t||jt(n)?null:a(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function gr(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function G(e){return Yt(e.flags)||!e.session?await Rn(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await _r(e.session.device)}async function _r(t){if(on(t)||!f(t)||t.kind!==`simulator`||process.platform!==`darwin`)return t;if((await He.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 Rn(n)}catch(t){if(!(t instanceof e)||t.code!==`DEVICE_NOT_FOUND`)throw t}return await Rn({platform:`ios`,target:t.target,device:t.name,...t.simulatorSetPath?{iosSimulatorDeviceSet:t.simulatorSetPath}:{}})}function vr(e,t){return t?Wn(t,e).length===0:!1}async function yr(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=hr(n);let t=Cr(n),l=await xr(a,n.flags),u=await V(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await B(e.bindDevice)(l,se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await wr({artifact:s,retention:t,req:n,session:a,sessionName:r}),a&&A(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Tr(l,s,p,c),h=P(m,`Installed: ${_t(m)}`);return O(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Nt(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:t(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function br(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 Nt(t,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:t}}}catch(e){return{ok:!1,error:t(e)}}}async function xr(t,n){let r=Sr(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 G({session:t,flags:n})}function Sr(e){return e===`ios`||e===`android`?e:void 0}function Cr(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 wr(e){if(e.retention.enabled)return await Tt({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 Tr(e,t,n,r){return f(e)?Er(t,n,r):Dr(t,n,r)}function Er(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{...kr(r),bundleId:i,...Or(n,t),launchTarget:n.launchTarget??i}}function Dr(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{...kr(r),packageName:i,...Or(n,t),launchTarget:n.launchTarget??i}}function Or(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function kr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Ar(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,o=jr(t);if(!o.ok)return o.response;let s=W(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await G({session:n,flags:t.flags}),l=await j({device:c,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:y});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==o.options.provider)return a(`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}}:a(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function jr(e){let t=Mr(e);if(!t.ok)return t;let n=Nr(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 Mr(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Nr(e){let t=Pr(e.flags?.devicePort),n=Pr(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Pr(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Fr(e){return await j({...e,command:`runtime clear`,use:ne})}async function Ir(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Ar({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Lr({...e,session:r.get(n)});if(!Rr(i))return a(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let o=r.get(n),s=r.getRuntimeHints(n);return i===`clear`?await zr({sessionName:n,sessionStore:r,session:o,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Br(n,s):Hr({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function Lr(e){if(!e.session)return a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await nr({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Pe(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 Rr(e){return e===`set`||e===`show`||e===`clear`}async function zr(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(L(i)&&r?.appBundleId){let e=await Fr({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;A(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Kt(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Br(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Vr(e){return e?d(e.device):void 0}function Hr(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:o}=e,s=Vr(i),c=It(t.flags?.platform??o?.platform??s);if(!c)return a(`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 a(`INVALID_ARGS`,`runtime set targets ${c}, but session "${n}" is already bound to ${s}.`);let l=Vt(o,Rt(t.flags,c));return Gt(l)===0?a(`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 Ur=/^[A-Za-z0-9_.:-]{1,64}$/,Wr=8192,Gr=4096;function Kr(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Ur.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:Jr(r,n)}}function qr(t,n,r){let i=d(t),a=Yr(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>Gr)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:Gr});return s}function Jr(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`)>Wr)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${Wr} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function Yr(e){return((f(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:p(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 Xr(e,t,n,r){let{eventName:i,payload:a}=Kr([...r]),o=qr(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ze(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...F(`Triggered app event: ${i}`)}}async function Zr(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await j({command:`trigger-app-event`,device:t,use:ye,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=>Xr(s,t,e,n)}}function Qr(t){let n=(t[0]??`status`).toLowerCase();if(!yt(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 $r(n)}function $r(e){return e===`get`?`status`:e===`return`?`enter`:e}const ei={"ime-probe":`android`},ti={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ni={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ri(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ii(e,t){let n=await j(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ai(e,t){return e.operations.keyboardStatus(ri(t)).then(e=>({platform:ei[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 oi(e,t){let n=await e.operations.keyboardDismiss(ri(t)),r=ti[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...F(li(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 si(e,t){let n=await e.operations.keyboardEnter(ri(t)),r=ni[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 ci(e){let t=Qr(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ii({command:`keyboard status`,device:n,use:Se,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ai(e,t)):t===`dismiss`?await ii({command:`keyboard dismiss`,device:n,use:E,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>oi(e,t)):await ii({command:`keyboard enter`,device:n,use:b,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>si(e,t))}function li(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ui(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=W(i,l,u);if(d)return d;let f=await G({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Nn(t)===`may-invalidate`&&A(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;O(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function di(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return a(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function fi(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ui({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Pe(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function pi(e){return di(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await fi({...e,command:N.keyboard,resolveRuntime:e=>ci(e)})}async function mi(e){return await fi({...e,command:N.triggerAppEvent,resolveRuntime:e=>Zr(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await ar(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function hi(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function gi(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(!U.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(hi(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function _i(t){let n=gi(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await vi(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 vi(t){try{return await cr.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 yi(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,o=i.get(r),s=t.flags??{},c=W(n,o,s);if(c)return c;let l=Ti(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let c=u?wt(u,t.meta?.tenantId):k.expandHome(l.appPathInput);if(!U.existsSync(c))return a(`INVALID_ARGS`,`App binary not found: ${c}`);let d=await G({session:o,flags:s}),f=await V(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await B(e.bindDevice)(d,ce);o&&A(o);let h=await m.operations.deployApp({app:l.app,appPath:c,replaceExisting:n===`reinstall`}),g=xi(d,l.app,c,h),_=P(g,`Installed: ${g.appName??vt(g)}`),v=wi(o,g);return v&&v!==o&&i.set(r,v),O(i,v,t,n,_),{ok:!0,data:_}}finally{u&&Ct(u)}}async function bi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=W(`push`,i,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return a(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await _i(Ei(l,t.meta?.cwd)),p=await G({session:i,flags:o}),m=await V(e.inspectFacts)(p),h=z(`push`,m.operations.ensureReady)??z(`push`,m.operations.sendPushNotification);if(h)return h;let g=await B(e.bindDevice)(p,le);await g.operations.ensureReady({}),i&&A(i);let _=await g.operations.sendPushNotification({appId:c,payload:u}),v=f(p)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:d(p),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return O(r,i,t,`push`,v,{positionals:[c,l]}),{ok:!0,data:v}}function xi(e,t,n,r){return f(e)?Si(t,n,r):Ci(e,t,n,r)}function Si(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 Ci(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 wi(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ti(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:a(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:a(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ei(e,t){let n=gi(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>k.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function K(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await yi({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await yr({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await bi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Di(e,t,n){return await l(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Oi=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function ki(e){return Oi.has(e)}const Ai=new Map(ue.map(e=>[e.name,e]));function ji(e){let t=new Set;for(let n of e){let e=Mi(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Mi(e){let t=Ai.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(ki)?n:void 0}function Ni(e){if(e!==void 0&&e.remainingSteps.length!==0)return ji(e.remainingSteps)}function Pi(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:jn(e),plannedOperations:Ni(e.internal?.executionPlan)}}function Fi(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...F(`Closed: ${t.name}`)}})}function Ii(e,t,n){if(!Ee(t))return{kind:`not-armed`};let r=t.actions.length;Fi(e,t,n);let i=Ge(t),a=e.writeSessionLog(t,{force:Ye(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`}:(ke(t),{kind:`aborted`})}function Li(e,n){let r=t(n),i=Je(e.scriptPublication??Ke);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ri(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Fi(r,n,t);try{let e=r.writeSessionLog(n,{force:Ye(n,t.flags?.force)});e.written&&Xe(n,e.path);return}catch(e){return zi(e)}}function zi(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 Bi(e){let t=e.clearRuntimeHints?Ce:T,n=await Le({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,T)};let r=await n.bind(e.device,Ce);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Vi(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 Hi({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:Kt(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`,()=>Wt(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Hi(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>Lt({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>Ft({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>an({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Dt({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>nn(a,r))}function Ui(e,t){return rn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Wi(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 Gi=(e,t)=>(e.positionals?.length??0)>0||Ot(t);async function Ki(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=Ee(n),s=JSON.stringify(t.positionals??[]);if(o&&!Te(n,s)){let e=await Ji({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Li(n,Wi(e))};Oe(n,s)}let c=Ii(i,n,t);return c.kind===`failed`?{response:Li(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function qi(e){try{return{providerData:await Bt(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 Ji(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Gi(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Pi(t,r,n.trace?.outPath)});return}catch(e){return e}}function Yi(t,n){if(!t.flags?.saveScript||M(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 Xi(t){let{req:n,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c}=t,l=o.get(r);if(!l)return await ea({req:n,logPath:i,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});Yi(n,l);let u=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!u)return a(`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 Bi({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(A(l),n.internal?.closeAppOnly===!0&&u)return await $i({req:n,session:l,logPath:i,lifecycle:f.runtime,app:u});let p=await Ki({req:n,session:l,logPath:i,sessionStore:o,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await Zi({req:n,session:l,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:Qi({session:l,repair:p,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function Zi(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 Vi({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Ji,finalizeOrdinaryCloseScript:Ri,platformResourceCleanup:e.platformResourceCleanup}),m=await qi({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Ui(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 mn(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function Qi(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 $i(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await Ji({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...F(`Closed: ${a}`)}}}async function ea(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return a(`SESSION_NOT_FOUND`,`No active session`);let o=await Bi({device:await G({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Pi(t,n)}),{ok:!0,data:{app:t.positionals[0],...F(`Closed: ${t.positionals[0]}`)}})}function ta(e,t){return e.operations.ensureReady(t)}function na(e,t,n){return e.operations.listApps({device:t,filter:n})}async function ra(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return ia(t,r);case`devices`:return await oa(t);case`capabilities`:return await ma({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await ba({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function ia(e,t){let n=Vn(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Kn(e.session,n)).map(e=>aa(e,t))}}}function aa({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:pt(r),platform:d(t.device),...h(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,...h(t.device.platform)&&!p(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function oa(e){try{let t=sa();return{ok:!0,data:{devices:(await la(e)).map(e=>({...Da(e),...ca(e,t)}))}}}catch(e){let t=i(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function sa(){let e=new Map;for(let t of cn({})){let n=t.claim;!n||ln(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function ca(e,t){let n=t.get(sn(An(e)));return n?{claimedBy:n}:{}}async function la(e){let t=e.flags?.platform;return pa(await In(ua(e,t)),e.flags?.platform,e.flags?.target)}function ua(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:da(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:fa(n?.androidDeviceAllowlist)}}function da(e,t,n){return u({simulatorSetPath:Pn(e),platform:t,target:n})}function fa(e){let t=R(e);return t?Array.from(t).sort():void 0}function pa(e,t,n){let r=t?e.filter(e=>Oa(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function ma(e){let t=await Ea({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=ha(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Ca(n,e.inspectFacts);return{ok:!0,data:{device:Da(n),availableCommands:xe().filter(e=>e===`appstate`&&r?!0:va(e,i))}}}function ha(e,t,n){return!t||!f(e)&&!p(e)||!vr(n,t)?!1:ga(t)||_a(e,t)}function ga(e){return!!(e.appName||e.appBundleId)}function _a(e,t){return!!(p(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function va(e,t){let n=de(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>ya(t,e)))}function ya(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function ba(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await xa(t,e.providerAppCatalog);if(o)return o;let s=await Ea({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=rt(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await wa({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ta(await na(f,await ta(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function xa(e,t){let n=Sa(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,xt(e.meta?.requestId))]}}}function Sa(e){let t=Mn(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 Ca(e,t){if(t)try{return await t(e)}catch{return}}async function wa(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,ge)}}function Ta(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Ea(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=W(t.command,a,o);return s?{response:s}:{device:await G({session:a,flags:o,androidAvdSelection:i})}}function Da({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:d({platform:r.platform,appleOs:n}),...h(r.platform)&&n?{appleOs:n}:{}}}function Oa(e,t){return _(e,t)}function q(e){return a(`INVALID_ARGS`,e)}function ka(t,n,r,i){try{return ir({device:t,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(t){return a(t instanceof e?t.code:`INVALID_ARGS`,String(t.message))}}async function Aa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await rr({target:n,platform:i.platform,surface:r});return a?q(a):null}async function ja(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await rr({target:n,platform:r});return i?q(i):null}function Ma(e){let t=tn(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:Ht({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Na(t){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:c,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=t;await c.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!s(a??``),execution:{startupDeadlineAtMs:Fa(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:jn(n)}});let{appBundleId:f,appName:p}=await Pa({runtime:c,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 zt({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 Pa(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 Fa(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Ia(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:a(`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:a(`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:a(`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 La(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 or({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}}:Ra(o.data,t.error)}catch(e){return Ra(o.data,t(e))}}function Ra(e,t){return{ok:!0,data:{...e,warnings:[...nt(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function za(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:p,runtime:h,runtimeHintCount:g,sessionReused:_,selection:v}=e,y={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:_,...Ba(v)};return o&&(y.appName=o),s&&(y.appBundleId=s),l&&(y.startup=l),u&&(y.timing=u),h&&g(h)>0&&(y.runtime=h),p&&(y.platform=d(p),y.target=p.target??`mobile`,y.device=p.name,y.id=p.id,y.kind=p.kind,m(p.platform)&&(y.serial=p.id)),p&&f(p)&&(y.device_udid=p.id,y.ios_simulator_device_set=p.simulatorSetPath??null),{...y,...F(`Opened: ${o??s??t}`)}}function Ba(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function Va(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 Ha=Object.freeze({async observeBootTimeMs(e){if(f(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 Ua(e,t){e.warnings=[...nt(e),t]}function Wa(e){return e.internal?.resolvedSessionScope??Vn(e)}function Ga(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){We(t,{});return}M(n)&&(Ze(t),Ua(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 Ka(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 qa(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ja(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 Ya(e,t){if(!t)return;let n=await dn(t);if(n.status!==`renewed`)return n.conflict?Xt(e,n.conflict):a(`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 Xa(e){let{req:t,sessionName:r,sessionStore:i,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,ee=Date.now(),S=await Za({req:t,sessionName:r,sessionStore:i,device:s,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(S.type===`response`)return S.response;let C=S.session??g,te=Date.now(),ne=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:qa(s,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Kt(p),applyRuntimeHints:h,execution:Pi(t,o,g?.trace?.outPath)});x=ne.appBundleId??x;let w={...ne.timing},re=Zn(y),ie=c?Ja(te,c,x):void 0;if(bt(t.meta?.requestId)){let e=n();return a(e.code,e.message,e.details)}g&&Fe({session:g,command:`open`,positionals:[],flags:void 0});let T=Va({existingSession:C,sessionName:g?.name??Un(t),sessionScope:g?.sessionScope??Wa(t),device:s,surface:d,appBundleId:x,appName:u});T.lease=en({req:t,existingLease:g?.lease}),_&&(T.deviceClaim=_),t.runtime!==void 0&&Ut(i,r,p);let E=i.ensureSessionDir(r),ae=mt(E,t.meta?.requestId??ot().requestId);w.totalDurationMs=Math.max(0,Date.now()-ee),I({level:`info`,phase:`open_timing`,durationMs:w.totalDurationMs,data:w});let D=za({sessionName:T.name,sessionStateDir:E,runnerLogPath:pt(E),requestLogPath:ae,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:x,surface:d,startup:ie,timing:w,device:s,runtime:p,runtimeHintCount:Gt,sessionReused:g!==void 0,selection:re});return v&&Ua(D,Ka(v)),Ga({session:T,existingSession:g,saveScriptRequested:!!t.flags?.saveScript,responseData:D}),i.set(r,T),i.recordAction(T,{command:`open`,positionals:l,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:D}),{ok:!0,data:D}}async function Za(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=Qa(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 Qa(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=Va({existingSession:o,sessionName:o?.name??Un(t),sessionScope:o?.sessionScope??Wa(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=en({req:t,existingLease:o?.lease}),s}function $a(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=Mt(t);return Gn(t,i.session)?Hn(i,n,a):Jn(i,n,a)}async function eo(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch($t(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=qt(n,r,Qt({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await kn({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:Ha})}}async function to(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=$a({req:t,device:a,sessionStore:i});if(m)return m;let h=await eo({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Xt(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 no({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Na({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 Ya(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await Xa({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 no(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await mn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await fn(t);I({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const ro=new Map;async function io(e){let t=C({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Le({...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,ae)};case`open-apply-runtime-hints`:{let t=await r(e.device,ee);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,te);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,oe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ao(e){let t=Ma(e);if(t.type===`response`)return t;let n=await io({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 oo(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),o=await Ia({req:e.req,hasExistingSession:!!i});if(o.type===`response`)return o.response;let s=o.type===`resolved`?o.req:e.req;if(i){if(s.flags?.saveScript)return a(`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?i.appName:void 0),u=ka(i.device,s.flags?.surface,l,i.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return q(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 Aa({shouldRelaunch:o,openTarget:l,surface:u,device:i.device});if(d)return d;let f=await Ya(i.device,i.deviceClaim);if(f)return f;let p=await _r(i.device),m=Qn(p);await s.internal?.retainDeviceExecutionLock?.(p.id);let h=await ao({req:s,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;A(i);let v=await Na({req:s,logPath:n,surface:u,openTarget:l,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await Ya(p,i.deviceClaim)||await Xa({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:i,selection:m})}let c=s.flags?.relaunch===!0,l=s.positionals?.[0];if(c&&!l)return q(`open --relaunch requires an app argument.`);let u=await ja({shouldRelaunch:c,openTarget:l,platform:s.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await zn(s.flags??{},At(l)),f=d.device;await s.internal?.retainDeviceExecutionLock?.(f.id);let p=ka(f,s.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Aa({shouldRelaunch:c,openTarget:l,surface:p,device:f});if(m)return m;let h=await ao({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 gt(ro,f.id,async()=>await to({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 so(e){let t=await oo(e);return!t.ok||e.req.flags?.foreground!==!0?t:await La({...e,inspectFacts:V(e.inspectFacts),bindDevice:B(e.bindDevice),openResponse:t})}const co=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,lo=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function uo(e){return t=>a(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 fo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function po(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function mo(e){return e.available?null:a(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function ho(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function go(e,t){if(!t.appBundleId)return;let n=await j({command:`appstate`,device:t.device,use:me,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(n.type!==`response`)try{return(await n.runtime.operations.appState({appBundleId:t.appBundleId})).applicationState}catch(e){if(r(e))throw e;I({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:i(e).code,message:i(e).message}});return}}async function _o(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=o.platform;if(!i&&gr(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 a(`SESSION_NOT_FOUND`,e)}let c=W(`appstate`,i,o);if(c)return c;let l=h(i?.device.platform)&&vr(o,i),u=s===`ios`,m=s===`macos`;if(u&&!l)return a(`SESSION_NOT_FOUND`,co);if(m&&!l)return a(`SESSION_NOT_FOUND`,lo);if(l&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(p(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:d(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=p(i.device)?`macOS`:`iOS`;return a(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await go(e,i);return{ok:!0,data:{platform:d(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...f(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let g=await G({session:i,flags:o});if(f(g))return a(`SESSION_NOT_FOUND`,co);if(p(g))return a(`SESSION_NOT_FOUND`,lo);let _=await j({command:`appstate`,device:g,use:me,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>a(`UNSUPPORTED_OPERATION`,g.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:yo(o.androidDeviceAllowlist)});let y=await v.operations.appState();return{ok:!0,data:{platform:d(g),package:y.package,activity:y.activity}}}async function vo(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let o=r.get(n),s=t.flags??{},c=W(t.command,o,s);if(c)return c;let l=R(s.androidDeviceAllowlist),u=l?[...l].sort():void 0,f=re({headless:s.headless===!0}),p;try{p=await G({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=i(e);if(f.kind===`boot-target-headless`&&!ho(s.device,o?.device)&&t.code===`DEVICE_NOT_FOUND`)return a(`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 a(`DEVICE_NOT_FOUND`,`No ${p.platform} device found matching --target ${s.target}.`);let m=await Le({command:`boot`,device:p,required:f.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:uo(f.kind===`boot-target-headless`)});if(m.type===`response`)return m.response;let g={serial:s.serial,androidSerialAllowlist:u};return p=f.kind===`boot-target-headless`?await(await m.bind(p,f.use)).operations.bootTargetHeadless(g):await(await m.bind(p,f.use)).operations.bootTarget(g),{ok:!0,data:{platform:d(p),target:p.target??`mobile`,device:p.name,id:p.id,kind:p.kind,booted:!0,...h(p.platform)&&p.appleOs?{appleOs:p.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),o=t.flags??{},s=W(t.command,i,o);if(s)return s;let c=await G({flags:o,session:i,androidAvdSelection:`include-stopped`}),l=mo((await fo(e.inspectFacts)(c)).operations.shutdownTarget);if(l)return l;if(i&&i.device.platform===c.platform&&i.device.id===c.id)return a(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:d(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let u=await(await po(e.bindDevice)(c,D)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:d(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u,...h(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:a(u.error?.code??`COMMAND_FAILED`,bo(u),{platform:d(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u})}return t.command===`appstate`?await _o({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function yo(e){let t=R(e);return t?[...t].sort():void 0}function bo(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function xo(e){let t=ct(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=U.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{U.closeSync(t)}}function So(e,t){sr(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=lt(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function Co(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=st(e);try{U.fsyncSync(r)}finally{U.closeSync(r)}let i=0;for(let e of U.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{U.unlinkSync(H.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function wo(e){return On.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function To(e){try{return await Eo(e)}catch(e){return{ok:!1,error:t(e)}}}async function Eo(e){let t=Do(e);if(!t.ok)return t;let n=t.session,r=w(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 Oo(a,o);let c=ie({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 ko(e,n,r,c.use);case`capture-status`:return await Ao(e,n);case`capture-stop`:return await jo(e,n)}}function Do(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:a(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Oo(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return a(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function ko(e,t,n,r){if(t.audioProbe){await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),o=En.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=En.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:o,device:t.device}),c=H.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:c,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:s});await wn({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.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 Ao(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Mo()};let r=await n.handle.status();return r.state===`stopped`&&await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function jo(e,t){return t.audioProbe?{ok:!0,data:await hn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Mo()}}function Mo(){return un({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 No(n){let r=n.sessionStore.get(n.sessionName);if(!r)return a(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(et(n.req.positionals?.[0]))throw new e(`INVALID_ARGS`,tt);es(n.req);let t=Dn({positionals:n.req.positionals,kind:ns(n.req.flags?.kind),outPath:ns(n.req.flags?.out)}),i=Cn(t);if(i.kind===`capture-stop`)return Po(n,await Ro(n,r,i.request));let o=await Xn({device:r.device,plan:i,inspectFacts:n.inspectFacts});return o.admitted?Po(n,await Fo(n,r,o)):z(`perf`,o.fact)??a(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:t(e)}}}function Po(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return O(e.sessionStore,n,e.req,`perf`,Yo(t.data)?{...t.data}:{}),t}async function Fo(t,n,r){let{device:i,plan:a}=Yn(r),o=B(t.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:Wo(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:Xo(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Zo(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?k.expandHome(a.request.outPath,t.req.meta?.cwd):void 0,artifactsDir:H.join(t.sessionStore.ensureSessionDir(t.sessionName),`artifacts`)}))};case`capture-start`:return await Io(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=$o(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:k.expandHome(c,t.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Io(e,t,n,r){if(t.perfCapture)return a(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return a(`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`,o=$o(e,r.outPath,i),s=pn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=pn.createNextFence({admissionLedger:Lo(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 Tn({admissionLedger:Lo(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 Lo(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 Ro(e,t,n){let r=t.perfCapture;if(!r)return a(`INVALID_ARGS`,`no active native perf capture`);let i=Uo(r.handle.inspect(),n);if(i)return a(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(k.expandHome(n.outPath,e.req.meta?.cwd));let o=await bn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=zo(o),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:o}}function zo(t){if(Bo(t)||Vo(t))return t;throw new e(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Bo(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Vo(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ho(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ho(e,t){return t.every(t=>typeof e[t]==`string`)}function Uo(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 Wo(e,t){return{...Qo(e),metrics:{fps:Go(t.metric,e)},sampling:{fps:t.sampling}}}function Go(e,t){if(!Yo(e)||e.available!==!0)return e;let n=Ko(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Ko(e,t){let n=qo(t.windowStartedAt),r=qo(t.windowEndedAt)??qo(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({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:Jo(e)})).slice(-12)}function qo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Jo(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Yo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Xo(e,t){return{...Qo(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Zo(e,t){return{...Qo(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Qo(e){return{session:e.name,platform:d(e.device),device:e.device.name,deviceId:e.device.id}}function $o(e,t,n){return t?k.expandHome(t,e.req.meta?.cwd):H.join(e.sessionStore.ensureSessionDir(e.sessionName),`${ts()}-${n}`)}function es(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 ts(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function ns(e){return typeof e==`string`&&e.length>0?e:void 0}const rs=[`dump`,`log`],is=`network requires ${rs.join(` or `)}`,as=`network include mode must be one of: ${o.join(`, `)}`,os=2048;async function ss(e){let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=cs(e.bindDevice),r=(await t(n.device,v)).facts.networkDump;if(!r.available)return ps(r.hint);let i=ls(e.req);if(!i.ok)return i;let a=he({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return ms(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:os,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function cs(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function ls(e){let t=us(e);if(!t.ok)return t;let n=ds(e);if(!n.ok)return n;let r=fs(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function us(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return rs.includes(t)?{ok:!0,action:t}:a(`INVALID_ARGS`,is)}function ds(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?a(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function fs(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return a(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return o.includes(r)?{ok:!0,include:r}:a(`INVALID_ARGS`,as)}function ps(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ms(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:os,maxScanLines:e.entries.length},notes:e.notes}}}function hs(e,t){let n=Sn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[gs(e.appLogFailure)]:_s(n.state)}}function gs(e){return e.hint?`${e.message} ${e.hint}`:e.message}function _s(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 vs(e,t){return be([...e,...t.notes??[]])}async function ys(e){let{req:t}=e;return t.command===`perf`?await No({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?xs(e):t.command===`events`?await bs(e):t.command===`network`?await ss(e):t.command===`audio`?await To(Ns(e)):null}async function bs(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 xs(e){let{req:n,sessionName:r,sessionStore:i}=e,o=i.get(r);if(!o)return a(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=Ps({...e,session:o}),r=(await t.bindDevice(o.device,x)).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=ws(S({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),o);return`ok`in i?i:await Ss(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function Ss(e,t){switch(t.kind){case`path`:return Ts(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Es(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Cs(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await js(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Ds(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Os(e)}}async function Cs(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await As(e,t.appBundleId,n.owner,n.operations.appLogStart):await ks(e,t.appBundleId,n.owner,n.operations.appLogStart)}function ws(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):a(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ts(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=xo(a),s=hs(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 Es(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=hs(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:vs(t.notes,o)}}}function Ds(e,t,n){let r=n.resolveAppLogPath(t);return So(r,e),{ok:!0,data:{path:r,marked:!0}}}function Os(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return a(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Co(r.resolveAppLogPath(n));return gn({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function ks(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await _n({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:vn.resolvePath(o.resolveSessionDir(a))});let s=Co(o.resolveAppLogPath(a)),c=await Ms(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function As(e,t,n,r){let{session:i}=e;return i.appLog?a(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Ms(e,t,r,n)}async function js(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return a(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await _n({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:vn.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Ms(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=vn.resolvePath(o.resolveSessionDir(a));try{let l=wo({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 xn({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:yn({session:i,sessionName:a,sessionStore:o,error:e})}}}function Ns(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 Ps(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 J=new WeakMap;function Fs(e){return{store:t=>Is(e,t),finalize:(t,n)=>Ls({...e,evidence:t,projection:n})}}function Is(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Re(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 J.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ie(a),refFrame:Ne(a)}),{evidence:s,refsGeneration:o}}function Ls(e){let t=J.get(e.evidence);J.delete(e.evidence);let n=zs(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Rs(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Bs(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Be(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Rs(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&&Ie(n)===t.runtimeRevision&&Ne(n)===t.refFrame}function zs(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 Bs(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Vs(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:De(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Hs(e.scriptPublication??Ke)}},armStep(e){n.update(t=>{Me(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Et(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){De(r())!==void 0&&n.update(we)},markCompleteIfArmed(){De(r())!==void 0&&n.update(Ae)},markSessionHeldIfArmed(e){if(e.ok||!je(r()))return e;let t=dt(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&&Ws(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Us({session:t,...e})})}}}}function Hs(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Je(e),targetForce:Ue(e)}}function Us(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Gs({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Ws(e){e.pendingRecordAndHeal=void 0}function Gs(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 Ks(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 tr({req:qs(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function qs(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 Js={resolveSessionScope:Vn},Ys=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await kt({...ur(e),session:Zs(t,n,r),invoke:fr(a??i,e),dependencies:Js}),Xs=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=Ks({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await Pt({...ur(t),session:Zs(n,r,i),createSession:(e,t)=>Zs(e,t,i),invoke:fr(s??o,t),dependencies:Js,cleanupSession:async e=>await Qs({req:t,sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Zs(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 lr(t,n,a,{createCoordinator:()=>Vs({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(t)}}),assertSelectorMatches:e=>{let n=r.lookup(t);n&&qn(n,e)},resolveOpenRuntimeHints:({request:e,device:n,platform:i})=>Jt({req:e,sessionStore:{getRuntimeHints:e=>e===t?r.getRuntimeHints(t):void 0},sessionName:t,device:n,platform:i}),bindAuthority:e=>Fs({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 Ve({device:a.device,session:a,flags:n,logPath:i})}})}async function Qs(t){let{req:n,sessionName:r,logPath:i,sessionStore:a}=t;if(!a.get(r))return;let o=await Xi({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 $s(t){let{req:n,sessionName:r,sessionStore:i}=t;if(n.command!==$e.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=nc(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.`));qe(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:Ye(a,n.flags?.force),publication:`active`});return c.written?(Qe(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 ec(e){if(Ee(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:M(e)?void 0:`not-armed`}const tc={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 nc(e){let t=ec(e);return t?tc[t]():void 0}function Y(e){return{ok:!1,error:t(e)}}function rc(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function ic(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ac(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(ic(n))}}async function oc(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={...ic(n),text:i};return await t.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...F(`Clipboard updated`)}}async function sc(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await j({command:`clipboard`,device:t,use:fe,inspectFacts:i,bindDevice:a,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>ac(n,e,r)}}let o=await j({command:`clipboard`,device:t,use:_e,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>oc(s,e,r)}}async function cc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:o,bindDevice:s}=e,c=i.get(n),l=t.flags??{},u=W(N.clipboard,c,l);if(u)return u;let f=t.positionals??[],p=rc(f);if(!p)return a(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let m=await G({session:c,flags:l}),h=await sc({device:m,action:p,positionals:f,inspectFacts:o,bindDevice:s});if(!h.ok)return h.response;let g=await h.execute(Pe(r,t.flags,c?.appBundleId,c?.trace?.outPath));return O(i,c,t,t.command,g),{ok:!0,data:{platform:d(m),...g}}}function lc(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function uc(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function dc(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function fc(e,...t){for(let n of t)X(e,n)}function X(e,t){e.push(t),St({type:`command`,status:`progress`,message:pc(t)})}function pc(e){return[er(e),...$n(e)].join(`
|
|
2
|
+
`)}async function mc(e,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let t=o?hc(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 ${d(r)}.`,evidence:{requested:i,platform:d(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 ${d(r)} --all`,evidence:{code:i.code,message:i.message}})}}function hc(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 gc(e,n,r){let i=vc(n,r);try{let t=await bc(i),n=yc(t.devices,i);return X(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:wc(n,i,t.failures),hint:n.length===0?Dc(t.failures):void 0,command:n.length===0?jc(i):void 0,evidence:Mc(n,t.failures)}),n.length>0&&xc(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 _c(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:d(e),id:e.id,name:e.name}))}})}function vc(e,t){let n=e.flags??{};return Bn({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 yc(e,t){return e.filter(e=>g(e,t,{includeExplicitSelectors:!0}))}async function bc(e){if(e.platform)return{devices:await In(e),failures:[]};let t=[],n=[];for(let r of at)try{t.push(...await In({...e,platform:r}))}catch(e){n.push(Cc(r,e))}return{devices:t,failures:n}}function xc(e,t){for(let n of t)X(e,Sc(n))}function Sc(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 Cc(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function wc(e,t,n){if(e.length===0)return n.length>0?`No ${Tc(t)} devices found; ${Ec(n)}.`:`No ${Tc(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Tc(t)} ${Ac(e.length,`device`)} available; ${r} booted`,a=Oc(e,t);return a?`${i} (${a}).`:`${i}.`}function Tc(e){let t=e.platform?Z(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Ec(e){return e.slice(0,2).map(e=>`${Z(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Dc(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Oc(e,t){if(t.platform||t.target)return;let n=it(e),r=kc();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 kc(){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 Ac(e,t){return e===1?t:`${t}s`}function jc(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Mc(e,t){let n=new Map;for(let t of e){let e=d(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Nc=1500;async function Pc(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 Fc(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Ic(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 Fc(e,t,n){try{return await(n.resolveProcessInfo??Lc)(e,t)}catch{return}}function Ic(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 Lc(e,t){if(!Rc(e))return;let n=await zc(t);if(n!==void 0)return{pid:n,cwd:await Bc(n)}}function Rc(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function zc(e){let t=await ut(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Nc});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 Bc(e){let t=await ut(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Nc});if(t.exitCode===0)return t.stdout.split(`
|
|
4
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Vc=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Hc=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Uc(e,t){let n=ht(e.meta?.cwd);return{targetApp:Jc(e.flags?.targetApp)??t?.appBundleId,metroHost:Jc(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Yc(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Kc(e,n)}}function Wc(e,t={}){let n=qc(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 Gc(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 ${d(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 Kc(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function qc(e){let t={...Object.fromEntries([...Vc,...Hc].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 Jc(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Yc(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Xc(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=Zc(e.hostDiagnostics),c=r.get(n),l=Uc(t,c),u=el(r,n),d=[];if(fc(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${ft()} using ${u}`,evidence:{version:ft(),stateDir:u}},...Wc(t,{required:l.remote}),...Gc(r,n,c,{remote:l.remote})),l.remote)return al(d,l);let f=Qc(l,u,i),p=await gc(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&X(d,m);let h=await tl({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??$c(p);if(g){let e=await s.warmupCheck(g,f);e&&X(d,e)}return al(d,l,{device:h,includeMetro:!0,inventory:p})}function Zc(t){if(!t)throw new e(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return t}function Qc(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>on(e),emitProgress:e=>St({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ln(e),shouldPropagateInventoryProbeError:Fn,transportOverrides:Object.freeze({androidAdb:n})})}function $c(e){let t=(e?.devices??[]).filter(e=>f(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function el(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function tl(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??_c(t,i,a.targetApp);return u&&await nl(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&X(t,await Pc(a.metroHost,a.metroPort,a.kind)),fc(t,...await r.ambientChecks(n)),u}async function nl(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await rl({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await mc(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),fc(e,...await r.deviceChecks(i,n))}async function rl(e){if(e.device.platform!==`harmonyos`)return il(e)}async function il(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,ge),u=R(n.flags?.androidDeviceAllowlist),d=await ta(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await na(l,d,e)}function al(e,t,n={}){let r=lc(e);return{ok:!0,data:{status:r,summary:uc(r),kind:t.kind,platform:n.device?d(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:dc(e)}}}async function ol(e){return await j({...e,command:`prepare`,use:ve})}async function sl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return a(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=i.get(n),c=t.flags??{},l=W(N.prepare,s,c);if(l)return l;let u=await G({session:s,flags:c}),d=await ol({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:cl(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:jn(t)}});return{ok:!0,data:ll(o,u,Math.max(0,Date.now()-f),p)}}function cl(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:pe}function ll(e,t,n,r){return{action:e,platform:d(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:ul(n,r),message:`Prepared Apple runner: ${t.name}`}}function ul(e,t){let n=dl(t.buildMs),r=fl(t.connectMs),i=fl(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 dl(e){return e===void 0?void 0:fl(e)}function fl(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Q=e=>ra(e),pl=e=>so({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),ml=e=>Xi({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}),hl=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await vo({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 ys({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),gl={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 Xc({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:hl,shutdown:hl,appstate:hl,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>$s({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ir({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 cc({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:pi,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await sl({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:K,reinstall:K,install_source:K,release_materialized_paths:async({req:e})=>await br({req:e}),push:K,"trigger-app-event":mi,open:pl,replay:Ys,test:Xs,batch:async({req:e,sessionName:t,invoke:n})=>await Di(e,t,n),close:ml};async function _l(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Zt,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:ee,platformResourceCleanup:S}=e,C=gl[t.command];return C?await C({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:ee,platformResourceCleanup:S}):null}export{_l as handleSessionCommands};
|
package/dist/src/settings.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{A as e}from"./sdk-contracts.js";const t=[`grant`,`deny`,`reset`],n=[`full`,`limited`],r=[`all`,`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],i=[`accessibility`,`screen-recording`,`input-monitoring`],a=[`extra-small`,`small`,`medium`,`large`,`extra-large`,`extra-extra-large`,`extra-extra-extra-large`,`accessibility-medium`,`accessibility-large`,`accessibility-extra-large`,`accessibility-extra-extra-large`,`accessibility-extra-extra-extra-large`],o=[`light`,`dark`,`toggle`],s=[`on`,`true`,`1`],c=[`off`,`false`,`0`];function l(e,t){return Object.freeze({setting:`text-size`,category:e,platformValue:t})}function u(e){return`Text size is ${e.category}`}function d(e,t,n){return e===`clear-app-state`?`Cleared user data for ${n}`:e===`text-size`?`Text size set to ${t}`:`Updated setting: ${e}`}const f=`<wifi|airplane|location> <on|off>`,p=`location set <lat> <lon>`,m=`animations <on|off>`,h=`appearance <${o.join(`|`)}>`,g=`faceid <match|nonmatch|enroll|unenroll>`,_=`touchid <match|nonmatch|enroll|unenroll>`,v=`fingerprint <match|nonmatch>`,y=`clear-app-state [app-id]`,b=`reset-keychain clear`,x=`text-size [${a.join(`|`)}]`,S=`permission <${t.join(`|`)}> <${r.join(`|`)}> [${n.join(`|`)}]`,C=`permission <grant|reset> <${i.join(`|`)}>`,w=`macOS supports only settings ${h} and settings ${C}. wifi|airplane|location|animations|text-size remain unsupported on macOS.`,T=[`settings ${f}`,`settings ${p}`,`settings ${m}`,`settings ${h}`,`settings ${x}`,`settings ${g}`,`settings ${_}`,`settings ${v}`,`settings ${y}`,`settings ${b}`,`settings ${S}`,`settings ${C}`].join(` | `),E=`settings requires ${f}, ${p}, ${m}, ${h}, ${x}, ${g}, ${_}, ${v}, ${y}, ${b}, ${S}, or ${C}`;function D(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function O(e){return`Unsupported macOS setting: ${e}. ${w}`}function k(t){let n=j(t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,A(t))}function A(e){return`Invalid text size: ${e??``}. Use ${a.join(`|`)}.`}function j(e){return N(a,e)}const M=Object.freeze({message:`Reading or setting a text size is supported on iOS and iPadOS simulators.`,hint:"Run `xcrun simctl ui <device> content_size` on a booted iPhone or iPad simulator.",reason:`setting-unsupported-on-leaf`});function N(e,t){let n=t?.trim().toLowerCase();return n===void 0?void 0:e.find(e=>e===n)}function P(n){let r=N(t,n);if(r!==void 0)return r;throw new e(`INVALID_ARGS`,`Invalid permission action: ${n}. Use ${t.join(`|`)}.`)}function F(t){let n=N(r,t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${r.join(`|`)}`)}function I(t){let n=N(o,t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,`Invalid appearance state: ${t}. Use ${o.join(`|`)}.`)}function L(t){let n=t.toLowerCase();if(s.includes(n))return!0;if(c.includes(n))return!1;throw new e(`INVALID_ARGS`,`Invalid setting state: ${t}`)}export{l as S,P as _,t as a,k as b,C as c,u as d,d as f,I as g,D as h,r as i,T as l,A as m,M as n,n as o,O as p,i as r,E as s,o as t,a as u,F as v,j as x,L as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e}from"./sdk-contracts.js";import{runHarmonyShell as t}from"./hdc.js";async function n(n,r,i,a){if(r!==`clear-app-state`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS setting "${r}" is not supported`,{hint:`HarmonyOS currently supports settings clear-app-state for an app bundle only.`});if(i!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);return await t(n,[`aa`,`force-stop`,a],{timeoutMs:15e3}),await t(n,[`bm`,`clean`,`-n`,a,`-d`,`-c`],{timeoutMs:15e3}),{bundleId:a,forceStopped:!0,clearedData:!0,clearedCache:!0}}export{n as setHarmonySetting};
|
package/dist/src/simctl.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as e}from"./sdk-device.js";import"./command.js";import{r as t}from"./device-isolation.js";import{o as n}from"./tool-provider.js";function
|
|
1
|
+
import{d as e}from"./sdk-device.js";import"./command.js";import{r as t}from"./device-isolation.js";import{o as n,s as r}from"./tool-provider.js";function i(t){let n=e(t)&&t.kind===`simulator`?t.simulatorSetPath:void 0;return Object.freeze({udid:t.id,simulatorSetPath:n})}function a(e,n){let r=t(e),i=r?[`--set`,r,...n]:[...n];return Object.freeze(i)}function o(){return a(void 0,[`help`])}function s(e){return a(e,[`list`,`devices`,`-j`])}function c(e,t){return a(i(e).simulatorSetPath,t)}function l(e,t){return r(a(e.simulatorSetPath,t))}function u(e,t){return l(i(e),t)}function d(e,t,r){return n(u(e,t),r)}function f(e){return JSON.parse(e).devices??{}}function p(e,t){try{for(let n of Object.values(f(e))){let e=n.find(e=>e.udid===t);if(e)return e.state??null}return null}catch{return null}}export{d as a,s as c,f as i,i as l,u as n,c as o,p as r,o as s,l as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{o as e,r as t}from"./simctl.js";async function n(n,r,i,a){let o=await n.run({tool:`simctl`,args:e(r,[`list`,`devices`,`-j`]),allowFailure:!0,timeoutMs:a},i);return o.exitCode===0?t(o.stdout,r.id):null}export{n as t};
|
package/dist/src/simulator.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{A as e}from"./sdk-contracts.js";import{a as t,n}from"./exec.js";import"./command.js";import{i as r,n as i}from"./retry.js";import{t as a}from"./ttl-memo.js";import{n as o,t as s}from"./boot-diagnostics.js";import{t as c}from"./scoped-provider.js";import{l,r as u,u as d}from"./config.js";import{a as f,o as p}from"./tool-provider.js";import{n as m,r as h}from"./simctl.js";const g=c(void 0);async function _(e,t){return await g.run(e,t)}const v=a({ttlMs:5e3});function y(e){return`${e.id}|${e.simulatorSetPath??``}`}function b(e){return v.get(y(e))===!0}function x(e){v.set(y(e),!0)}function S(t,n){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`${n} is only supported on iOS simulators`)}async function C(e={}){await f(`open`,[`-a`,`Simulator`],{allowFailure:!0,signal:e.signal,timeoutMs:d})}async function w(a,c={}){if(a.kind!==`simulator`)return;c.signal?.throwIfAborted();let l=g.resolve();if(l){await l(a),c.signal?.throwIfAborted();return}if((b(a)?`Booted`:await T(a,c.signal))===`Booted`){x(a);return}let d=i.fromTimeoutMs(u),f,h;try{await r(async({deadline:r})=>{if(r?.isExpired())throw new e(`COMMAND_FAILED`,`iOS simulator boot deadline exceeded`,{timeoutMs:u});let i=Math.max(1e3,r?.remainingMs()??18e4);f=await p(m(a,[`boot`,a.id]),{allowFailure:!0,signal:c.signal,timeoutMs:i});let o=`${f.stdout}\n${f.stderr}`.toLowerCase(),s=o.includes(`already booted`)||o.includes(`current state: booted`);if(f.exitCode!==0&&!s)throw new e(`COMMAND_FAILED`,`simctl boot failed`,n(f));h=await p(m(a,[`bootstatus`,a.id,`-b`]),{allowFailure:!0,signal:c.signal,timeoutMs:i}),t(h,`simctl bootstatus failed`);let l=await T(a,c.signal);if(l!==`Booted`)throw new e(`COMMAND_FAILED`,`Simulator is still booting`,{state:l})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=o({error:e,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}});return t!==`IOS_BOOT_TIMEOUT`&&t!==`CI_RESOURCE_STARVATION_SUSPECTED`}},{deadline:d,phase:`boot`,signal:c.signal,classifyReason:e=>o({error:e,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}})})}catch(t){let n=o({error:t,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}});throw new e(`COMMAND_FAILED`,`iOS simulator failed to boot`,{platform:`ios`,deviceId:a.id,timeoutMs:u,elapsedMs:d.elapsedMs(),reason:n,hint:s(n),boot:f,bootstatus:h})}x(a),await C({signal:c.signal})}async function T(e,t){let n=m(e,[`list`,`devices`,`-j`]),r=await p(n,{allowFailure:!0,signal:t,timeoutMs:l});return r.exitCode===0?h(r.stdout,e.id):null}export{_ as a,b as i,x as n,S as r,w as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
const e={healthy:!0,recovered:!0,sparse:!0},t={tree:!0,queries:!0,"private-ax":!0,"android-helper":!0};function n(e){let t=o(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{},...e.targetActivation?{targetActivation:e.targetActivation}:{}}}function r(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{},...e.targetActivation?{targetActivation:e.targetActivation}:{}}}function i(e){let t=c(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,i=o(e.snapshotQuality),s=a(e.targetActivation);return r({...t?{androidSnapshot:t}:{},...i?{quality:i}:{},...n?{warnings:n}:{},...s?{targetActivation:s}:{}})}function a(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e;return typeof t.reason==`string`&&typeof t.priorState==`string`?t:void 0}function o(n){if(!n||typeof n!=`object`)return;let r=n;if(!(!s(e,r.state)||!s(t,r.backend)))return r}function s(e,t){return typeof t==`string`&&Object.hasOwn(e,t)}function c(e){return typeof e==`object`&&e?e:void 0}export{i as n,n as r,r as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Br as e,Hr as t,Ur as n}from"./sdk-batch.js";const r=[`button`,`menu`,`textfield`,`searchfield`,`checkbox`,`radio`,`switch`];function i(e,t){let n=e.nodes??[];return t.scope&&(n=a(n,t.scope,e=>!t.interactiveOnly||n.slice(e.start,e.end).some(c))),t.interactiveOnly&&(n=o(n)),typeof t.depth==`number`&&(n=s(n,t.depth)),{...e,nodes:n}}function a(r,i,a){let o=t(i);if(!o)return n(r);let s=e(r,o,a);if(!s)return[];let c=r.slice(s.start,s.end);return n(c,c[0]?.depth??0)}function o(e){if(e.length===0)return e;let t=new Map(e.map(e=>[e.index,e])),r=new Set;for(let n of e){if(!c(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}return r.size===0?e:n(e.filter(e=>r.has(e.index)))}function s(e,t){return n(e.filter(e=>(e.depth??0)<=t))}function c(e){if([e.focused,e.hittable,e.rect].some(Boolean))return!0;let t=`${e.type??``} ${e.role??``} ${e.subrole??``}`.toLowerCase();return r.some(e=>t.includes(e))}export{i as n,a as t};
|