agent-device 0.21.24 → 0.21.25
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.25.apk +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.24.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +47 -103
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
- package/dist/src/absence-observation-errors.js +1 -0
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +2 -2
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android-system-surface-disclosure.js +1 -0
- package/dist/src/android-text-entry.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/app-backend.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +4 -3
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-resolution-facade.js +1 -1
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/aws-device-farm-connection.js +1 -1
- package/dist/src/back-mode.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/browserstack-connection.js +1 -1
- package/dist/src/capture-disclosure.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +17 -14
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +3 -1
- package/dist/src/cli.js +3 -3
- package/dist/src/client-companion-tunnel.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +8 -2
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/code-signature.js +1 -1
- package/dist/src/command-metadata.js +73 -1
- package/dist/src/command-policy.js +1 -0
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection-verification.js +1 -1
- package/dist/src/connection.js +3 -3
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-liveness-probe.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/daemon-registration-owner.js +1 -1
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-resolution.js +3 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-input-state.d.ts +5 -3
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-readiness-runtime.js +1 -1
- package/dist/src/device-release.js +1 -1
- package/dist/src/device-shell.js +1 -1
- package/dist/src/device.js +3 -1
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/durable-capture-resource.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/exec.js +1 -1
- package/dist/src/expo-dev-client-launch.js +1 -0
- package/dist/src/file.js +3 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/human-control.js +1 -1
- package/dist/src/ime-rebind.js +1 -1
- package/dist/src/ime-state.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +2 -2
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-error.js +1 -0
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/interactor2.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +5 -1
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/inventory.js +2 -2
- package/dist/src/inventory6.js +1 -1
- package/dist/src/io.d.ts +2 -2
- package/dist/src/ios-client.js +1 -1
- package/dist/src/ios-settings.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-adapter.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/keyed-lock.js +1 -1
- package/dist/src/launch-confirmation.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +2 -10
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/load.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/log-stream.js +9 -9
- package/dist/src/mechanics.js +16 -16
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/observability.js +1 -1
- package/dist/src/open-target-resolution.js +1 -1
- package/dist/src/output-path.js +1 -1
- package/dist/src/overlay.js +1 -3
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-apple-resources.js +1 -0
- package/dist/src/platform-runtime-claim-recovery.js +1 -0
- package/dist/src/platform-runtime-daemon-services.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/plugin.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-resize.js +1 -0
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/process-entry.js +1 -1
- package/dist/src/process.js +1 -1
- package/dist/src/provider-credential-fingerprint.js +1 -1
- package/dist/src/provider-device-admission.js +1 -1
- package/dist/src/provider-policy.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +2 -2
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native-overlay2.js +3 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording.js +2 -2
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/remote-config-core.js +1 -1
- package/dist/src/replay-backend-registry.js +1 -0
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay-maestro-backend.js +117 -0
- package/dist/src/replay-script-selection.js +1 -0
- package/dist/src/replay.js +1 -3
- package/dist/src/replay2.js +1 -0
- package/dist/src/reporting.js +3 -3
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-providers.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/result-serialization.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/runner-cache-retention.js +1 -1
- package/dist/src/runner-cache-trim.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-device-set.js +1 -1
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-retention.js +1 -0
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-startup-transport.js +1 -0
- package/dist/src/runner-toolchain-probe.js +1 -1
- package/dist/src/runner.js +2 -1
- package/dist/src/runtime-command-surface.js +1 -0
- package/dist/src/runtime-deployment.js +1 -1
- package/dist/src/runtime-factory.js +1 -0
- package/dist/src/runtime-session.js +1 -0
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +2 -1
- package/dist/src/runtime10.js +2 -1
- package/dist/src/runtime2.js +5 -2
- package/dist/src/runtime3.js +1 -5
- package/dist/src/runtime4.js +5 -1
- package/dist/src/runtime5.js +1 -5
- 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/screenshot-image.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -0
- package/dist/src/screenshot3.js +5 -5
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +1 -1
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.d.ts +4 -2
- package/dist/src/sdk-selectors.d.ts +4 -5
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-pipeline-policy.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-replay-runtime-failure-response.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -0
- package/dist/src/session.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -1
- package/dist/src/simctl-settings.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-chrome.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-evidence.js +1 -0
- package/dist/src/snapshot-node-lookup.js +1 -0
- package/dist/src/snapshot-occlusion.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/src.js +5 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +2 -1
- package/dist/src/store.js +1 -1
- package/dist/src/surface-snapshot2.js +1 -1
- package/dist/src/target-evidence-tree.js +1 -0
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.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/undici.js +8 -8
- package/dist/src/update-check.js +1 -1
- package/dist/src/vars.js +2 -0
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/wait.js +1 -0
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/package.json +9 -11
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.manifest.json +0 -16
- package/dist/src/adb-transport.js +0 -1
- package/dist/src/alert-runtime.js +0 -1
- package/dist/src/app-deployment-resolution.js +0 -2
- package/dist/src/app-inventory-contract.js +0 -1
- package/dist/src/app-log-session-resource.js +0 -1
- package/dist/src/application-lifecycle-runtime.js +0 -1
- package/dist/src/auth-session.js +0 -1
- package/dist/src/browserstack-device-features.js +0 -1
- package/dist/src/browserstack.js +0 -1
- package/dist/src/cache.js +0 -1
- package/dist/src/capture.js +0 -1
- package/dist/src/catalog.js +0 -1
- package/dist/src/click-button.js +0 -1
- package/dist/src/client-metro-companion.js +0 -1
- package/dist/src/client-options.js +0 -3
- package/dist/src/daemon-client-transport.js +0 -1
- package/dist/src/daemon-http.js +0 -1
- package/dist/src/device-rotation.js +0 -1
- package/dist/src/device-session.js +0 -3
- package/dist/src/device2.js +0 -1
- package/dist/src/device3.js +0 -3
- package/dist/src/dispatch-resolve.js +0 -4
- package/dist/src/format.js +0 -2
- package/dist/src/gesture-plan-types.js +0 -1
- package/dist/src/host.js +0 -1
- package/dist/src/ime-settings-record.js +0 -1
- package/dist/src/interaction-ref-policy.js +0 -1
- package/dist/src/interactor-operation-binding.js +0 -1
- package/dist/src/keyboard-actions.js +0 -1
- package/dist/src/lease-context.js +0 -1
- package/dist/src/lease-registry-scope.js +0 -1
- package/dist/src/lease-scope.js +0 -1
- package/dist/src/managed-device-scope.js +0 -1
- package/dist/src/manifest.js +0 -1
- package/dist/src/observe-until.js +0 -1
- package/dist/src/output-common.js +0 -5
- package/dist/src/owner-identity.js +0 -3
- package/dist/src/path-resolution.js +0 -1
- package/dist/src/perf-runtime-plan.js +0 -1
- package/dist/src/platform-runtime-app-log-process.js +0 -1
- package/dist/src/platform-runtime-managed-owner.js +0 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
- package/dist/src/png.js +0 -1
- package/dist/src/provider-session-ownership.js +0 -2
- package/dist/src/providers.js +0 -1
- package/dist/src/registry.js +0 -68
- package/dist/src/remote-connection-state.js +0 -1
- package/dist/src/request-admission.js +0 -1
- package/dist/src/request-cancellation.js +0 -1
- package/dist/src/request-progress-protocol.js +0 -1
- package/dist/src/runner-cache-metadata.js +0 -2
- package/dist/src/runner-disposal.js +0 -1
- package/dist/src/runner-session-types.js +0 -1
- package/dist/src/runtime-admission.js +0 -1
- package/dist/src/runtime11.js +0 -2
- package/dist/src/screen-recording-resource-recovery.js +0 -1
- package/dist/src/screenshot-result.js +0 -1
- package/dist/src/script.js +0 -1
- package/dist/src/scroll-command.js +0 -1
- package/dist/src/scroll-gesture.js +0 -1
- package/dist/src/scroll-indicator.js +0 -1
- package/dist/src/session-artifact-paths.js +0 -1
- package/dist/src/session-paths.js +0 -1
- package/dist/src/session-repair-tombstone.js +0 -1
- package/dist/src/session-snapshot.js +0 -1
- package/dist/src/snapshot-private-evidence.js +0 -1
- package/dist/src/snapshot4.js +0 -1
- package/dist/src/src4.js +0 -1
- package/dist/src/src5.js +0 -1
- package/dist/src/src6.js +0 -1
- package/dist/src/src7.js +0 -2
- package/dist/src/src8.js +0 -115
- package/dist/src/string-enum.js +0 -1
- package/dist/src/success-text.js +0 -1
- package/dist/src/transport.js +0 -3
- package/dist/src/ttl-memo.js +0 -1
- package/dist/src/verified-file.js +0 -1
- package/dist/src/window-state.js +0 -1
- /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
|
@@ -1 +1,5 @@
|
|
|
1
|
-
import{r as e}from"../rolldown-runtime.js";import{F as t,H as n,I as r,J as i,P as a,Q as o,R as s,a as c,b as l,f as u,l as d,rt as f,s as p,t as m,z as h}from"../sdk-contracts.js";import{f as g,l as _,r as v,u as ee}from"../capture.js";import{i as y,m as b}from"../sdk-batch-runner.js";import{U as te}from"../registry.js";import{a as x,i as S,l as ne,o as re,r as C,s as w,t as ie}from"../diagnostics.js";import"../diagnostics2.js";import{A as T,E,N as D,P as ae,S as O,T as oe,_ as se,b as ce,f as le,g as ue,h as k,i as de,u as fe,w as pe}from"../sdk-device.js";import{f as me,m as he,n as ge,u as _e}from"../lease-scope.js";import{$ as ve,Br as ye,Dt as be,H as xe,It as Se,Jr as Ce,Jt as we,Kt as Te,Lr as Ee,Lt as De,Mr as A,Or as j,Qt as Oe,Rr as ke,S as Ae,U as je,Xr as Me,Yt as Ne,_r as Pe,b as Fe,ct as Ie,ei as Le,en as Re,f as ze,gn as Be,l as Ve,m as He,o as Ue,ot as We,ri as Ge,ti as Ke,tn as qe,u as Je,vt as Ye,xt as Xe,yt as Ze}from"../sdk-batch.js";import{d as Qe,g as $e,h as et}from"../scroll-gesture.js";import{a as tt,n as nt,r as rt}from"../script.js";import{_ as it,a as at,c as ot,i as st,n as ct,o as lt,s as ut,u as dt}from"../dispatch-resolve.js";import{r as ft}from"../format.js";import{M as pt,n as mt,t as ht}from"../provider-device-admission.js";import{D as gt,O as _t,T as vt,d as yt}from"../runtime.js";import{i as bt}from"../back-mode.js";import{a as xt}from"../session.js";import{i as St,r as M}from"../success-text.js";import{d as Ct,t as wt}from"../overlay.js";import{a as Tt,c as Et,i as Dt,l as Ot,o as kt,r as At,s as jt}from"../scroll-command.js";import"../device.js";import{d as Mt,f as Nt,h as Pt,m as Ft,p as It}from"../device-rotation.js";import{b as Lt,j as Rt,m as zt,o as Bt,v as Vt}from"../owner-identity.js";import{n as Ht}from"../verified-file.js";import{l as Ut,v as Wt}from"../exec.js";import{i as Gt,n as Kt,t as qt}from"../retry.js";import"../file.js";import{r as Jt}from"../tv-remote.js";import{c as Yt,g as Xt,i as Zt,n as Qt,o as $t,p as en,r as tn}from"../daemon-http.js";import"../command.js";import{a as nn,r as rn,t as an}from"../transport.js";import{a as on,i as sn,o as cn,r as ln}from"../request-progress-protocol.js";import{n as un,t as dn}from"../session-paths.js";import{a as fn,o as pn,s as mn}from"../session-artifact-paths.js";import{n as hn,r as gn}from"../process.js";import{a as _n}from"../version.js";import{n as vn,t as yn}from"../daemon-resolution.js";import"../retry2.js";import{n as bn}from"../runtime-transport-hints.js";import{t as xn}from"../platform-runtime-android-mechanics.js";import{a as Sn,r as Cn}from"../archive.js";import{t as wn}from"../byte-limit-stream.js";import{s as Tn}from"../device-shell.js";import{t as En}from"../keyed-lock.js";import{l as Dn}from"../android-input-ownership.js";import{t as On}from"../snapshot-state.js";import{_ as kn,a as An,c as jn,d as Mn,f as Nn,g as Pn,h as Fn,i as In,l as Ln,m as Rn,n as zn,o as Bn,p as Vn,r as Hn,s as N,t as Un,u as Wn,v as Gn,y as Kn}from"../lease-registry-scope.js";import{a as qn,c as Jn,i as Yn,o as Xn,s as Zn,t as Qn}from"../request-cancel.js";import{n as $n,t as er}from"../request.js";import{a as tr,c as nr,l as rr,n as ir,o as ar,r as or,t as sr,u as cr}from"../provider-session-ownership.js";import{i as lr,r as ur,t as dr}from"../interactors.js";import{n as fr,r as pr}from"../daemon-policy-file.js";import{C as mr,D as hr,E as gr,L as _r,O as vr,R as yr,S as br,T as xr,b as Sr,d as Cr,g as wr,h as P,j as Tr,l as Er,p as Dr,s as Or,v as kr,w as Ar,y as jr}from"../session-snapshot.js";import{i as Mr,n as Nr,r as Pr,t as Fr}from"../platform-runtime.js";import{r as Ir}from"../application-lifecycle-runtime.js";import{r as Lr,t as Rr}from"../provider-webdriver.js";import{i as zr}from"../provider-limrun-credentials.js";import{n as Br}from"../provider-credential-fingerprint.js";import{i as Vr}from"../daemon-registration.js";import{a as Hr,c as Ur,l as Wr,n as Gr,o as Kr,r as qr,t as Jr}from"../device-claim-inspection.js";import{c as Yr,d as Xr,f as Zr,h as Qr,i as $r,m as ei,p as ti}from"../perf-runtime-plan.js";import{n as ni,r as ri,t as ii}from"../lease-context.js";import{t as ai}from"../device-isolation.js";import{o as oi}from"../device-inventory-context.js";import{t as si}from"../observe-until.js";import{i as ci,o as li,s as ui}from"../durable-capture-resource.js";import{o as di}from"../screen-recording-resource-recovery.js";import{i as fi,r as pi,t as mi}from"../request-runtime-binding.js";import{i as hi,n as gi,r as _i,t as vi}from"../platform-request-scope.js";import{i as yi,n as bi,r as F}from"../runtime-admission.js";import{t as xi}from"../selector-pipeline-policy.js";import{c as Si,i as Ci,l as wi,o as Ti,r as Ei}from"../png-worker-client.js";import{t as Di}from"../png-size.js";import{r as Oi,t as ki}from"../screenshot-density.js";import{a as Ai,o as I,s as ji,t as Mi}from"../screenshot-overlay-draw.js";import{c as L,s as Ni,t as Pi}from"../daemon-registration-owner.js";import{i as Fi,o as Ii}from"../code-signature.js";import Li,{randomUUID as Ri}from"node:crypto";import R,{promises as z}from"node:fs";import zi from"node:os";import B from"node:path";import V from"node:fs/promises";import{pipeline as Bi}from"node:stream/promises";import Vi from"node:net";import{pathToFileURL as Hi}from"node:url";import Ui from"node:http";import{once as Wi}from"node:events";function Gi(e,t){if(t?.replayBackend&&t.replayBackend!==`maestro`)throw new a(`INVALID_ARGS`,`Unsupported replay backend "${t.replayBackend}".`);return{...nt(e),metadata:rt(e)}}function Ki(e){switch(e){case`INVALID_ARGS`:return 400;case`UNAUTHORIZED`:return 401;case`SESSION_NOT_FOUND`:case`REPAIR_SESSION_EXPIRED`:return 404;default:return 500}}function H(e,t){e.statusCode=Ki(t.code),e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function qi(e,t){if(e.headersSent){e.destroy(t);return}let n=i(t);e.statusCode=Ki(n.code),e.end(n.message)}async function Ji(e){let t=B.join(e.tempDir,`extracted`),n=``,r=await Yi(e.archivePath);await Cn({archivePath:e.archivePath,outputRoot:t,type:r,validateManifest:t=>{n=Xi(t,e.platform,e.expectedRootName)}});let i=B.join(t,n);if(!R.existsSync(i))throw R.rmSync(t,{recursive:!0,force:!0}),new a(`INVALID_ARGS`,`Expected extracted bundle "${n}" not found in archive`);return i}async function Yi(e){let t=await R.promises.open(e,`r`);try{let e=Buffer.alloc(2),{bytesRead:n}=await t.read(e,0,e.length,0);return n===e.length&&e[0]===31&&e[1]===139?`tgz`:`tar`}finally{await t.close()}}function Xi(e,t,n){if(e.length===0)throw new a(`INVALID_ARGS`,`Uploaded app bundle archive is empty`);let r=new Set(e.map(e=>e.name.split(`/`)[0]).filter(e=>!!e)),i=n??Zi([...r],t);if(!r.has(i))throw new a(`INVALID_ARGS`,`Uploaded archive must contain a top-level "${i}" bundle`);for(let t of e)if(t.name!==i&&!t.name.startsWith(`${i}/`))throw new a(`INVALID_ARGS`,`Archive entry must stay inside top-level "${i}" bundle: ${t.name}`);return i}function Zi(e,t){if(t===`ios`){let t=e.filter(e=>e.toLowerCase().endsWith(`.app`));if(t.length===1)return t[0];throw t.length===0?new a(`INVALID_ARGS`,`iOS app bundle archives must contain a single top-level .app directory`):new a(`INVALID_ARGS`,`iOS app bundle archives must contain exactly one top-level .app directory, found: ${t.join(`, `)}`)}if(e.length===1)return e[0];throw new a(`INVALID_ARGS`,`Archive must contain a single top-level bundle, found: ${e.join(`, `)}`)}const Qi=6e4;function $i(e){let t=e.trim(),n=B.basename(t);if(!n||n===`.`||n===`..`)throw new a(`INVALID_ARGS`,`Invalid artifact filename: ${e}`);return n}function ea(e){let t=ia(e);return R.mkdtempSync(B.join(zi.tmpdir(),`agent-device-artifact-${t}-`))}function ta(e){if(e===void 0)return;let t=String(e);if(!/^\d+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let n=Number(t);if(!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`Invalid content-length header`);if(n>2147483648)throw new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${Sn} bytes`)}function na(e,t){return new Promise((n,r)=>{let i=!1,o,s=R.createWriteStream(t),c=e=>{if(!i){if(i=!0,o&&clearTimeout(o),e){ra(s,t).finally(()=>r(e));return}n()}},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{let t=new a(`COMMAND_FAILED`,`Artifact transfer timed out due to inactivity`,{timeoutMs:Qi});`destroy`in e&&typeof e.destroy==`function`&&e.destroy(t),u.destroy(t),c(t)},Qi)},u=wn({maxBytes:Sn,createLimitError:()=>new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${Sn} bytes`)});u.on(`data`,l),e.on(`aborted`,()=>{c(new a(`COMMAND_FAILED`,`Artifact transfer was interrupted`))}),l(),Bi(e,u,s).then(()=>c(),e=>c(e))})}async function ra(e,t){if(e.destroy(),!e.closed)try{await Wi(e,`close`)}catch{}await R.promises.rm(t,{force:!0}).catch(()=>{})}function ia(e){let t=e?.trim();if(!t)return`request`;let n=t.replaceAll(/[^a-zA-Z0-9._-]+/g,`-`).replaceAll(/^-+|-+$/g,``);return n.length>0?n.slice(0,48):`request`}function aa(e,t){let n=Array.isArray(e)?e[0]:e;if(!n)return;let r=n.match(/^bytes (\d+)-(\d+)\/(\d+)$/);r||sa();let i=Number(r[1]),a=Number(r[2]),o=Number(r[3]);return(!Number.isSafeInteger(i)||!Number.isSafeInteger(a)||!Number.isSafeInteger(o)||i<0||a<i||a>=o||o<1||o!==t)&&sa(),{start:i,end:a,size:o,span:a-i+1}}function oa(e){if(e===void 0)return;if(!/^\d+$/.test(e))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new a(`INVALID_ARGS`,`Invalid content-length header`);return t}function sa(){throw new a(`INVALID_ARGS`,`Invalid content-range header`)}async function ca(e){let t=await ua(e.entry),n=aa(e.req.headers[`content-range`],e.entry.sizeBytes);if(n&&n.start!==t||!n&&t>0)return{complete:!1,offset:t,appended:!1};let r=e.entry.sizeBytes-t,i=n?.span??r,o=oa(e.req.headers[`content-length`]);if(o!==void 0&&o>i)throw new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`);if(n&&o!==void 0&&o!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);let s=wn({maxBytes:i,createLimitError:()=>new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`)});try{if(await Bi(e.req,s,R.createWriteStream(e.entry.payloadPath,{flags:`a`})),n&&s.bytesSeen!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);if(o!==void 0&&s.bytesSeen!==o)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-length`)}catch(n){throw await da(e.entry.payloadPath,t,n,e.invalidate),n}let c=await ua(e.entry);return{complete:c===e.entry.sizeBytes,offset:c,appended:c>t}}async function la(e){let t=Li.createHash(`sha256`);for await(let n of R.createReadStream(e))t.update(n);return t.digest(`hex`)}async function ua(e){let t=(await R.promises.stat(e.payloadPath).catch(e=>{if(e.code!==`ENOENT`)throw e}))?.size??0;if(t>e.sizeBytes)throw new a(`COMMAND_FAILED`,`Upload state is corrupt`,{reason:`UPLOAD_STATE_CORRUPT`});return t}async function da(e,t,n,r){try{await R.promises.truncate(e,t)}catch(e){let t=new a(`COMMAND_FAILED`,`Upload rollback failed; the upload ticket was invalidated`,{reason:`UPLOAD_ROLLBACK_FAILED`,originalError:String(n)},e);throw await r(t),t}}const fa=3e5,pa={label:`Upload`,expiredHint:`Resumable uploads expire ${fa/6e4} minutes after the last received chunk. Start the upload again from the beginning.`},ma=new Map,ha=new Map;function ga(e){ka(e);let t=Aa(e),n=ha.get(t),r=(n?ma.get(n):void 0)??ya(e,t);return{uploadId:r.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${r.id}`,e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`).toString(),headers:{...e.tokenHeaders,"content-type":e.contentType||`application/octet-stream`}}}}async function _a(e){let t=Oa(e.uploadId,e.tenantId);return await Sa(t,`receive`,e.req,async()=>{let{appended:n,...r}=await ca({entry:t,req:e.req,invalidate:async()=>await Ea(t)});return n&&!t.closed&&ba(t),r})}async function va(e,t){let n=Oa(e,t);return await Sa(n,`finalize`,void 0,async()=>{let t=R.statSync(n.payloadPath).size;if(t!==n.sizeBytes)throw new a(`INVALID_ARGS`,`Upload is incomplete`,{uploadId:e,offset:t,sizeBytes:n.sizeBytes});try{let t=await la(n.payloadPath);if(t!==n.sha256)throw new a(`INVALID_ARGS`,`Upload hash mismatch`,{uploadId:e,expectedSha256:n.sha256,actualSha256:t});let r=await Ca(n);return wa(n),{artifactPath:r,tempDir:n.tempDir}}catch(e){throw await Ta(n,e)}})}function ya(e,t){let n=Li.randomUUID(),r=ea(`upload`),i=B.join(r,`payload`);R.writeFileSync(i,``);let a={id:n,key:t,tempDir:r,payloadPath:i,fileName:$i(e.fileName),sizeBytes:e.sizeBytes,sha256:e.sha256.toLowerCase(),artifactType:e.artifactType,platform:e.platform,tenantId:e.tenantId,generation:0,tail:Promise.resolve(),closed:!1,finalized:!1};return ma.set(n,a),ha.set(t,n),ba(a),a}function ba(e){e.timer&&clearTimeout(e.timer),e.generation+=1;let t=e.generation;e.timer=setTimeout(()=>xa(e,t),fa),e.timer.unref()}function xa(e,t){if(e.generation!==t||e.closed)return;Da(e);let n=e.activeReceive;n?.once(`error`,()=>{}),n?.destroy(new a(`COMMAND_FAILED`,`Upload expired while receiving data`,{reason:`RESOURCE_EXPIRED`})),e.tail=e.tail.then(async()=>{e.finalized||await R.promises.rm(e.tempDir,{recursive:!0,force:!0})}).catch(()=>{})}async function Sa(e,t,n,r){let i=e.tail.catch(()=>{}).then(async()=>{e.closed&&Oa(e.id,e.tenantId),t===`receive`&&(e.activeReceive=n);try{return await r()}finally{t===`receive`&&(e.activeReceive=void 0)}});return e.tail=i.then(()=>{},()=>{}),await i}async function Ca(e){if(e.artifactType===`file`){let t=B.join(e.tempDir,e.fileName);return await R.promises.rename(e.payloadPath,t),t}let t=await Ji({archivePath:e.payloadPath,tempDir:e.tempDir,platform:e.platform===`android`?`android`:`ios`,expectedRootName:e.fileName});return await R.promises.rm(e.payloadPath,{force:!0}),t}function wa(e){e.finalized=!0,Da(e)}async function Ta(e,t){Da(e);try{return await R.promises.rm(e.tempDir,{recursive:!0,force:!0}),t}catch(e){return new a(`COMMAND_FAILED`,`Upload finalize cleanup failed`,{reason:`UPLOAD_FINALIZE_CLEANUP_FAILED`,originalError:String(t)},e)}}async function Ea(e){Da(e),await R.promises.rm(e.tempDir,{recursive:!0,force:!0}).catch(()=>{})}function Da(e){e.closed=!0,e.timer&&clearTimeout(e.timer),ma.delete(e.id),ha.delete(e.key)}function Oa(e,t){return cr(ma,e,t,pa)}function ka(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new a(`INVALID_ARGS`,`Invalid upload sha256`);if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new a(`INVALID_ARGS`,`Invalid upload sizeBytes`);if(ta(String(e.sizeBytes)),$i(e.fileName),!e.uploadAttemptId.trim())throw new a(`INVALID_ARGS`,`uploadAttemptId is required`)}function Aa(e){return[e.tenantId??``,e.uploadAttemptId,e.sha256.toLowerCase(),String(e.sizeBytes),$i(e.fileName),e.artifactType,e.platform??``].join(`\0`)}async function ja(e){let t=e.headers[`x-artifact-type`],n=e.headers[`x-artifact-filename`];if(!t||!n)throw new a(`INVALID_ARGS`,`Missing required headers: x-artifact-type and x-artifact-filename`);if(t!==`file`&&t!==`app-bundle`)throw new a(`INVALID_ARGS`,`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);ta(e.headers[`content-length`]);let r=$i(n),i=ea(`upload`);try{if(t===`file`){let t=B.join(i,r);return await na(e,t),{artifactPath:t,tempDir:i}}let n=B.join(i,`artifact.tar`);await na(e,n);let a=await Ji({archivePath:n,tempDir:i,platform:`ios`,expectedRootName:r});return R.rmSync(n,{force:!0}),{artifactPath:a,tempDir:i}}catch(e){throw R.rmSync(i,{recursive:!0,force:!0}),e}}function Ma(e){let{req:t,res:n,authorize:r,token:i}=e,a=Pa(t);return a!==null&&(Na(a,t,n,r,i),!0)}async function Na(e,t,n,r,i){switch(e.kind){case`preflight`:await Ia(t,n,r,i);return;case`direct`:await La(e.uploadId,t,n,r);return;case`finalize`:await Ra(t,n,r);return;case`upload`:await Fa(t,n,r);return}}function Pa(e){return e.method===`POST`&&e.url===`/upload/preflight`?{kind:`preflight`}:e.method===`PUT`&&e.url?.startsWith(`/upload/direct/`)?{kind:`direct`,uploadId:e.url.slice(15).replace(/\?.*$/,``)}:e.method===`POST`&&e.url===`/upload/finalize`?{kind:`finalize`}:e.method===`POST`&&e.url===`/upload`?{kind:`upload`}:null}async function Fa(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[]}});if(!r)return;Ba(t,await ja(e),r.tenantId)}catch(e){H(t,i(e))}}async function Ia(e,t,n,r){try{let i=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`preflight`]}});if(!i)return;let a=Ha(await Va(e,65536));za(t,{ok:!0,...ga({baseUrl:Ya(e),tokenHeaders:Ja(r),...a,tenantId:i.tenantId})})}catch(e){H(t,i(e))}}async function La(e,t,n,r){try{let i=await r({req:t,res:n,daemonRequest:{command:`upload`,positionals:[`direct`,e]}});if(!i)return;let a=await _a({uploadId:e,req:t,tenantId:i.tenantId});if(a.complete){n.statusCode=200,n.end(`ok`);return}n.statusCode=308,a.offset>0&&n.setHeader(`range`,`bytes=0-${a.offset-1}`),n.setHeader(`x-upload-offset`,String(a.offset)),n.end()}catch(e){H(n,i(e))}}async function Ra(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`finalize`]}});if(!r)return;Ba(t,await va(Ua(await Va(e,65536)).uploadId,r.tenantId),r.tenantId)}catch(e){H(t,i(e))}}function za(e,t){e.statusCode=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function Ba(e,t,n){za(e,{ok:!0,uploadId:rr({artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:n})})}async function Va(e,t){let n=(await rn(e,t,`Request body is too large.`)).toString(`utf8`);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`expected object`);return e}catch(e){throw new a(`INVALID_ARGS`,`Invalid JSON request body`,{},e)}}function Ha(e){return{sha256:Wa(e,`sha256`),uploadAttemptId:Wa(e,`uploadAttemptId`),fileName:Wa(e,`fileName`),sizeBytes:Ka(e,`sizeBytes`),artifactType:qa(e),platform:Ga(e,`platform`),contentType:Ga(e,`contentType`)}}function Ua(e){return{uploadId:Wa(e,`uploadId`)}}function Wa(e,t){let n=Ga(e,t)?.trim();if(!n)throw new a(`INVALID_ARGS`,`${t} is required`);return n}function Ga(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Ka(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`${t} must be an integer`);return n}function qa(e){let t=Wa(e,`artifactType`);if(t===`file`||t===`app-bundle`)return t;throw new a(`INVALID_ARGS`,`artifactType must be "file" or "app-bundle"`)}function Ja(e){return{authorization:`Bearer ${e}`,"x-agent-device-token":e}}function Ya(e){let t=typeof e.headers.host==`string`?e.headers.host:``;if(!t)throw new a(`INVALID_ARGS`,`Missing host header`);let n=e.headers[`x-forwarded-proto`];return`${(Array.isArray(n)?n[0]:n)||`http`}://${t}`}function Xa(e){try{return decodeURIComponent(e)}catch{return``}}function Za(e){let{req:t,res:n,authorize:r,retainArtifacts:i}=e,a=$a(t);return a!==null&&(Qa(a,t,n,r,{retainArtifacts:i}),!0)}async function Qa(e,t,n,r,i){switch(e.kind){case`inventory`:await to(t,n,r);return;case`download`:await eo(e.artifactId,t,n,r,i);return}}function $a(e){if(e.method!==`GET`)return null;let t=ro(e.url);return t===`/artifacts`||t===`/artifacts/`?{kind:`inventory`}:t.startsWith(`/artifacts/`)?{kind:`download`,artifactId:no(t)}:null}async function eo(e,t,n,r,a){if(!e){n.statusCode=400,n.end(`Missing artifact id`);return}try{let i=await r({req:t,res:n,daemonRequest:{command:`download_artifact`,positionals:[e]}});if(!i)return;let o=await ar(e,i.tenantId),s=a.retainArtifacts===!0,c=R.createReadStream(o.artifactPath);n.statusCode=200,n.setHeader(`content-type`,o.mimeType),n.setHeader(`content-length`,String(o.sizeBytes)),o.fileName&&n.setHeader(`content-disposition`,`attachment; filename="${o.fileName.replace(/"/g,``)}"`),c.on(`error`,e=>{qi(n,e)});let l=!1,u=()=>{l||s||(l=!0,or(e))},d=0;c.on(`data`,e=>{d+=e.length,d>=o.sizeBytes&&u()}),c.on(`end`,u),n.on(`finish`,u),n.on(`close`,()=>{n.writableFinished&&u()}),c.pipe(n)}catch(e){H(n,i(e))}}async function to(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`list_artifacts`,positionals:[]}});if(!r)return;t.statusCode=200,t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({artifacts:await tr(r.tenantId)}))}catch(e){H(t,i(e))}}function no(e){let t=e.slice(11);return!t||t.includes(`/`)?``:Xa(t)}function ro(e){let t=e||`/`,n=t.indexOf(`?`);return n>=0?t.slice(0,n)||`/`:t}function io(e,t){return ao(e,t)?t:`${e}:${t}`}function ao(e,t){return t.startsWith(`${e}:`)}function oo(e,t){return!e.partitioned||ao(e.tenant,t)}const so=[``,`sessions`,null,`requests`,null,`diagnostics`];function co(e){let t=lo(e.req);return t!==null&&(uo(t,e),!0)}function lo(e){if(e.method!==`GET`)return null;let t=(e.url??``).split(`?`,1)[0].split(`/`);return t.length!==so.length||!so.every((e,n)=>e===null||t[n]===e)?null:{session:Xa(t[2]??``),requestId:Xa(t[4]??``)}}async function uo(e,t){let{req:n,res:r,authorize:o,resolveRecordPath:s}=t;try{if(!un(e.session)||!un(e.requestId)){H(r,i(new a(`INVALID_ARGS`,`Invalid session or request id in diagnostics route`)));return}let t=await o({req:n,res:r,daemonRequest:{command:`request_diagnostics`,positionals:[e.session,e.requestId]}});if(!t)return;if(t.sessionNamespace&&!oo(t.sessionNamespace,e.session)){H(r,i(new a(`UNAUTHORIZED`,`Session is outside this tenant`,{session:e.session})));return}let c=s(e),l=await fo(c);if(!l){H(r,i(new a(`SESSION_NOT_FOUND`,`No diagnostics record for request ${e.requestId} in session ${e.session}`,{hint:`The daemon keeps a request record only for the session it ran in; re-run the command against this daemon to produce a fresh one.`})));return}let u=R.createReadStream(c);r.statusCode=200,r.setHeader(`content-type`,`application/x-ndjson`),r.setHeader(`content-length`,String(l.size)),u.on(`error`,e=>{qi(r,e)}),u.pipe(r)}catch(e){H(r,i(e))}}async function fo(e){try{let t=await R.promises.stat(e);return t.isFile()?t:null}catch{return null}}function po(e){let{hookConfigured:t,hookAttestedTenant:n,clientDeclaredTenant:r}=e;return n?{trusted:!0,tenantId:n,attested:!0}:t?{trusted:!1}:{trusted:!0,tenantId:r,attested:!1}}function mo(){return i(new a(`UNAUTHORIZED`,`Request tenant is not attested by the auth hook`))}function ho(e,t,n,r){let o=e.headers[Qt];return typeof o!=`string`||!o||o===r?!1:(t.statusCode=409,t.setHeader(`content-type`,`application/json`),t.setHeader(tn,`true`),t.end(JSON.stringify(en(n,`Daemon instance changed`,i(new a(`COMMAND_FAILED`,`Daemon instance changed`,{reason:`remote_instance_mismatch`}))))),!0)}function go(e){let t=vo(e,`Human-control request body`),n=t.reason;if(n!==void 0&&(typeof n!=`string`||n.trim().length>512))throw new a(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let r=t.ttlMs;if(r!==void 0&&(typeof r!=`number`||!Number.isInteger(r)||r<1e3||r>864e5))throw new a(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...t.scope===void 0?{}:{scope:_o(t.scope)},...typeof n==`string`&&n.trim()?{reason:n.trim()}:{},...typeof r==`number`?{ttlMs:r}:{}}}function _o(e){let t=vo(e,`Host human-control scope`);if(typeof t.backend!=`string`||!t.backend.trim()||typeof t.deviceKey!=`string`)throw new a(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(t.leaseProvider!==void 0&&typeof t.leaseProvider!=`string`)throw new a(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let n=Pn(t.leaseProvider);return{backend:Rn(t.backend),deviceKey:Nn(t.deviceKey),...n?{leaseProvider:n}:{}}}function vo(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`${t} must be an object.`);return e}function yo(e){let t=typeof e==`string`?e.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(t))throw new a(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function bo(e){return{...e,scope:{...e.scope}}}function xo(e){return new a(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:e.id,deviceKey:e.scope.deviceKey,pausedAt:new Date(e.createdAt).toISOString(),...e.expiresAt===void 0?{}:{expiresAt:new Date(e.expiresAt).toISOString()},...e.reason?{humanReason:e.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}function So(e){let t=Oo(e.req);return t?(Co(t,e),!0):!1}async function Co(e,t){let{req:n,res:r,expectedToken:a}=t;try{Mo(n,a),await wo(e,t)}catch(e){H(r,i(e))}}async function wo(e,t){switch(e.kind){case`list`:U(t.res,{ok:!0,holds:t.registry.listHumanControlHolds({kind:`host`})});return;case`upsert`:await To(e.holdId,t);return;case`remove`:Eo(e.holdId,t);return;case`unsupported`:Do(t.res);return;case`invalid`:throw new a(`INVALID_ARGS`,`Invalid request URL.`)}}async function To(e,t){let{req:n,res:i}=t,a=new AbortController,o=()=>{i.writableFinished||a.abort(r())};n.once(`aborted`,o),i.once(`close`,o),(n.aborted||i.destroyed)&&o();try{let r=await jo(n);U(i,{ok:!0,hold:await t.registry.putHumanControlHold({kind:`host`},e,r,a.signal),state:`active`})}finally{n.off(`aborted`,o),i.off(`close`,o)}}function Eo(e,t){let n=t.registry.removeHumanControlHold({kind:`host`},e);U(t.res,{ok:!0,released:!!n,...n?{hold:n}:{}})}function Do(e){e.statusCode=405,e.setHeader(`allow`,`GET, PUT, DELETE`),U(e,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`})}function Oo(e){let t=Ao(e.url);return t===null?{kind:`invalid`}:ko(t,e.method)}function ko(e,t){if(e===`/admin/human-control/holds`)return t===`GET`?{kind:`list`}:{kind:`unsupported`};if(!e.startsWith(`/admin/human-control/holds/`))return null;let n=e.slice(27);return!n||n.includes(`/`)?{kind:`unsupported`}:t===`PUT`?{kind:`upsert`,holdId:n}:t===`DELETE`?{kind:`remove`,holdId:n}:{kind:`unsupported`}}function Ao(e){try{return new URL(e??`/`,`http://127.0.0.1`).pathname}catch{return null}}async function jo(e){return go(await No(e,`Human-control`))}function Mo(e,t){let n=typeof e.headers.authorization==`string`?e.headers.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):``,i=(typeof e.headers[`x-agent-device-token`]==`string`?e.headers[`x-agent-device-token`]:``)||r;if(!i||!nn(i,t))throw new a(`UNAUTHORIZED`,`Invalid token`)}async function No(e,t){let n=await rn(e,16384,`${t} request body is too large.`);try{return JSON.parse(n.toString(`utf8`))}catch(e){throw new a(`INVALID_ARGS`,`${t} request body must be valid JSON.`,{},e)}}function U(e,t){e.statusCode||=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}const Po=Ve(ze),Fo=es(Po);function Io(e){return W(e)?.route??`generic`}function Lo(e){return W(e)?.sessionKind}function Ro(e){return W(e)?.leaseAdmissionExempt===!0}function zo(e){return W(e)?.appLease===`allowed`}function Bo(e){return W(e)?.selectorValidationExempt!==!0}function Vo(e){return W(e)?.sessionExecutionLockExempt!==!0}function Ho(e){return W(e)?.replayScopedAction===!0}function Uo(e){return W(e)?.allowInvalidRecording!==!0}function Wo(e){return W(e)?.saveScriptFlagOwner===!0}function Go(){return Po.filter(e=>e.saveScriptFlagOwner===!0).map(e=>e.command).sort()}function Ko(e){return W(e)?.lockPolicySelectorOverride===!0}function qo(e){return W(e)?.androidBlockingDialogGuard===!0}function Jo(e){if(e.command===`human_control`||e.command===`lease_heartbeat`)return!1;let t=Ae(e);return t===void 0?Lo(e.command)!==`observability`&&Fe(e.command)!==`observe`:t!==`observes-app`}function Yo(e){return W(e.command)?.preferExplicitDeviceOverExistingSession===!0}function Xo(e){let t=W(e.command)?.allowSessionlessDefaultDevice;return typeof t==`function`&&t(e)}function Zo(e){return W(e.command)?.sessionlessLeaseAdmissionExemption?.(e)}function Qo(e){let t=W(e.command)?.refFrameEffect;return typeof t==`function`?t(e):t}function $o(e,t){return t.hasExistingSession?Yo(e)&&t.hasExplicitDeviceIdentity?`explicit-device`:`existing-session`:ts(e)?`skip`:t.hasDeviceSelectionInput?`explicit-device`:Xo(e)?`sessionless-default-device`:`skip`}function W(e){return Fo.descriptorsByCommand.get(e)}function es(e){let t=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);t.set(n.command,n)}return{descriptorsByCommand:t}}function ts(e){let t=W(e.command);if(t?.route===`lease`)return!0;let n=t?.skipSessionlessProviderDevice;return typeof n==`function`&&n(e)}const ns=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/,rs=/^[1-9][0-9]{0,9}$/;function is(e){let t=e?.trim()??``,n=t.lastIndexOf(`@`),r=n<0?t:t.slice(0,n),i=n<0?void 0:t.slice(n+1);if(!ns.test(r)||i!==void 0&&!rs.test(i))throw new a(`INVALID_ARGS`,`A macos-app lease device key must be <bundleId> or <bundleId>@<pid>.`,{deviceKey:t});return i===void 0?{bundleId:r}:{bundleId:r,pid:Number(i)}}const as=new Set([`open`,`batch`]),os=[`out`,`saveScript`,`sessionSaveScript`,`baseline`,`launchConsole`,`launchArgs`,`launchUrl`,`bundleUrl`,`artifactsDir`,`stepsFile`,`searchPath`,`retainPaths`,`installSource`,`metroProjectRoot`,`metroRuntimeFile`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`],ss=[`device`,`udid`,`serial`,`target`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function G(e,t,n={}){return new a(`UNAUTHORIZED`,t,{...n,reason:`MACOS_APP_LEASE_DENIED`,rule:e,retriable:!1,hint:`This lease is limited to one macOS app; retrying will not help. Use an allowed command on the leased app.`})}function cs(e,t,n){if(e.backend!==`macos-app`)return;let r=is(e.deviceKey);if(us(r,t.command,t.positionals??[],ls(t.runtime,{...t.input,...t.flags})),(t.command===`open`||t.command===`batch`)&&t.flags?.platform!==`macos`)throw G(`device`,`A macos-app lease needs platform macos on ${t.command}.`);if(t.command===`batch`)for(let e of t.flags?.batchSteps??[]){let t=Array.isArray(e.positionals)?e.positionals.map(String):[];us(r,Ue(e.command),t,ls(e.runtime,{...e.input,...e.flags}))}if(n)_s(r,n);else if(!as.has(t.command))throw G(`session`,`A macos-app lease runs ${t.command} only in a session of ${r.bundleId}; open it first.`,{command:t.command,bundleId:r.bundleId})}function ls(e,t){return{...t,...e?.launchUrl?{launchUrl:e.launchUrl}:{},...e?.bundleUrl?{bundleUrl:e.bundleUrl}:{}}}function us(e,t,n,r){if(!zo(t))throw G(`command`,`A macos-app lease does not allow ${t}.`,{command:t});if(ms(r),ps(r),t===`screenshot`?ds(n,r):fs(r),t===`open`&&hs(e,n),t===`close`&&n.length>0&&n[0]!==e.bundleId)throw G(`app`,`A macos-app lease only closes ${e.bundleId}.`,{bundleId:e.bundleId})}function ds(e,t){if(t.screenshotFullscreen===!0)throw G(`capture`,`A macos-app lease captures only the app window.`);let{out:n,...r}=t;fs(r);for(let t of[e[0],n])if(!(t===void 0||typeof t==`string`&&Xt(t,`screenshot`,`.png`)))throw G(`host-path`,`A macos-app lease does not write files on the host.`)}function fs(e){let t=os.find(t=>e[t]!==void 0&&e[t]!==!1);if(t)throw G(`host-path`,`A macos-app lease does not accept ${t}, which names a host path or launch.`,{field:t})}function ps(e){let t=ss.find(t=>e[t]!==void 0&&e[t]!==``);if(t)throw G(`device`,`A macos-app lease does not accept the ${t} device selector.`,{field:t})}function ms(e){if(e.surface!==void 0&&e.surface!==`app`)throw G(`surface`,`A macos-app lease is limited to the app surface, not ${String(e.surface)}.`,{surface:e.surface});if(e.platform!==void 0&&e.platform!==`macos`)throw G(`app`,`A macos-app lease only drives a macOS app.`,{platform:e.platform})}function hs(e,t){if(t.length!==1||t[0]!==e.bundleId)throw G(`app`,`A macos-app lease only opens ${e.bundleId}.`,{bundleId:e.bundleId});gs()}function gs(){if(xt(Lt)!==`native`)throw G(`backend`,`A macos-app lease needs the native macOS app backend (AGENT_DEVICE_MACOS_APP_BACKEND=native).`)}function _s(e,t){if(!ue(t.device)||(t.surface??`app`)!==`app`||t.appBundleId!==e.bundleId)throw G(`app`,`This session is not the leased app ${e.bundleId}.`,{bundleId:e.bundleId})}const vs=/bundleID="([^"]+)"/,ys=async e=>{if(!zt(e))return;let t=await Ut(`/usr/bin/lsappinfo`,[`info`,`-only`,`bundleid`,String(e)],{allowFailure:!0,timeoutMs:5e3});return vs.exec(t.stdout)?.[1]};async function bs(e,t=ys){if(e.backend!==`macos-app`)return;let n=is(e.deviceKey);if(n.pid!==void 0&&await t(n.pid)!==n.bundleId)throw G(`process`,`The leased app process ${n.bundleId}@${n.pid} is no longer running.`,{bundleId:n.bundleId,pid:n.pid})}const xs=[`sessionStateDir`,`runnerLogPath`,`requestLogPath`,`eventLogPath`,`device`,`id`,`kind`,`serial`,`device_udid`,`ios_simulator_device_set`],Ss=/(?<![\p{L}\p{N}_./])\/(?:Users|home|private|var|tmp|Volumes|Library|Applications|opt|System|usr|etc|Network|cores)(?:\/[\p{L}\p{N}_.@%+~-]+)*\/?/gu;function Cs(){return{hostName:zi.hostname(),homeDirectory:zi.homedir()}}function ws(e,t,n=Cs()){return t.ok?{ok:!0,data:Ts(e,t.data,n)}:{ok:!1,error:Es(t.error,n)}}function Ts(e,t,n){if(!t)return t;let{fallbackScreenshotPath:r,...i}=t;if(e!==`open`)return i;for(let e of xs)delete i[e];let{snapshot:a,initialSnapshotError:o,warnings:s,...c}=i;return{...c,...a===void 0?{}:{snapshot:Ts(`snapshot`,a,n)},...o===void 0?{}:{initialSnapshotError:Es(o,n)},...s===void 0?{}:{warnings:Ds(s,n)}}}function Es(e,t){let{logPath:n,diagnosticsRecord:r,...i}=e;return Ds(i,t)}function Ds(e,t){return typeof e==`string`?Os(e,t):Array.isArray(e)?e.map(e=>Ds(e,t)):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Ds(n,t)]))}function Os(e,t){let n=e;if(t.homeDirectory.length>1){let e=t.homeDirectory.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);n=n.replaceAll(RegExp(`${e}[\\w.@%+~/-]*`,`g`),`<host-path>`)}for(let e of new Set([t.hostName,t.hostName.split(`.`)[0]]))e.length>=4&&(n=n.replaceAll(e,`<host>`));return n.replace(Ss,`<host-path>`)}function ks(e,t){if(!(t===void 0||!e.hasHeldMacOsAppLease(t)))throw G(`diagnostics`,`A macos-app lease does not serve request diagnostics.`)}const As=new Set([`tenantId`,`runId`,`clientId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`ttlMs`,`retainOnClose`]);function js(e){return Ms(e)||So(e)}function Ms(e){let t=Fs(e.req);return t?(Ns(t,e).catch(t=>{H(e.res,i(t))}),!0):!1}async function Ns(e,t){let{req:n,res:r,registry:i}=t;switch(Mo(n,t.expectedToken),e.kind){case`list`:U(r,{ok:!0,leases:i.listActiveLeases().filter(Ps)});return;case`put`:{let t=Rs(await No(n,`Host lease`));U(r,{ok:!0,lease:i.putHostLease(e.leaseId,t)});return}case`remove`:{let t=kn(e.leaseId),n=i.listActiveLeases().find(e=>e.leaseId===t),a=n?i.releaseLease(Ln(n)).released:!1;U(r,{ok:!0,released:a,...n&&a?{lease:n}:{}});return}case`unsupported`:r.statusCode=405,r.setHeader(`allow`,`GET, PUT, DELETE`),U(r,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`});return}}function Ps(e){return e.backend===`macos-app`}function Fs(e){let t=URL.parse(e.url??`/`,`http://127.0.0.1`)?.pathname??``;return t===`/admin/leases`?e.method===`GET`?{kind:`list`}:{kind:`unsupported`}:t.startsWith(`/admin/leases/`)?Is(t.slice(14),e.method):null}function Is(e,t){let n=Ls[t??``];return!n||!e||e.includes(`/`)?{kind:`unsupported`}:{kind:n,leaseId:e}}const Ls={PUT:`put`,DELETE:`remove`};function Rs(e){let t=zs(e);return is(Hs(t,`deviceKey`)),{tenantId:Hs(t,`tenantId`)??``,runId:Hs(t,`runId`)??``,clientId:Hs(t,`clientId`),leaseBackend:`macos-app`,leaseProvider:Hs(t,`leaseProvider`),deviceKey:Hs(t,`deviceKey`),ttlMs:Bs(t),retainOnClose:Vs(t)}}function zs(e){if(typeof e!=`object`||!e||Array.isArray(e))throw new a(`INVALID_ARGS`,`Host lease request body must be a JSON object.`);let t=e,n=Object.keys(t).filter(e=>!As.has(e));if(n.length>0)throw new a(`INVALID_ARGS`,`Unknown host lease field(s): ${n.join(`, `)}.`);if(t.leaseBackend!==`macos-app`)throw new a(`INVALID_ARGS`,`The host lease route allocates only macos-app leases.`);return t}function Bs(e){if(e.ttlMs===void 0||Number.isInteger(e.ttlMs))return e.ttlMs;throw new a(`INVALID_ARGS`,`Host lease ttlMs must be an integer.`)}function Vs(e){if(e.retainOnClose===void 0)return!0;if(typeof e.retainOnClose==`boolean`)return e.retainOnClose;throw new a(`INVALID_ARGS`,`Host lease retainOnClose must be a boolean.`)}function Hs(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Host lease ${t} must be a string.`);return n}}const Us=new Set([`agent_device.command`,`agent-device.command`]),Ws=new Set([`agent_device.install_from_source`,`agent-device.install_from_source`]),Gs=new Set([`agent_device.release_materialized_paths`,`agent-device.release_materialized_paths`]),Ks={"agent_device.lease.allocate":`lease_allocate`,"agent-device.lease.allocate":`lease_allocate`,"agent_device.lease.heartbeat":`lease_heartbeat`,"agent-device.lease.heartbeat":`lease_heartbeat`,"agent_device.lease.release":`lease_release`,"agent-device.lease.release":`lease_release`};function qs(e,t,n){if(n!==void 0&&n!==`public-only`)throw new a(`INVALID_ARGS`,`Invalid daemon HTTP network access marker`);if(!t&&n===void 0)return e;let r=e.meta?.installSource,i=e.meta?.uploadedArtifactId;if(r?.kind===`path`&&!(typeof i==`string`&&i.length>0))throw new a(`INVALID_ARGS`,`Invalid params: path install sources are disabled on the remote HTTP surface`);let{developerDir:o,providerCredentialFingerprint:s,...c}=e.meta??{};return{...e,...e.meta?{meta:c}:{},internal:{...e.internal,publicNetworkOnly:!0}}}const Js=new Set([...Us,...Ws,...Gs,...Object.keys(Ks)]);function K(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,data:r}}}function q(e,t,n=200){e.statusCode=n,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function Ys(e,t){e.destroyed||e.writableEnded||e.write(ln(t))}function Xs(e,t){e.destroyed||(e.write(on(t)),e.end())}function Zs(e){return e===`INVALID_ARGS`?-32602:-32e3}function Qs(e,t){let n=typeof t.authorization==`string`?t.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):void 0,i=typeof t[`x-agent-device-token`]==`string`?t[`x-agent-device-token`]:void 0;return(typeof e.token==`string`?e.token:void 0)??i??r??``}function $s(e,t){return{token:Qs(e,t),session:e.session??`default`,command:e.command??``,positionals:e.positionals??[],input:e.input,flags:e.flags,runtime:e.runtime,meta:e.meta}}function J(e,t){let n=e[t];return typeof n==`string`?n:void 0}function ec(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function tc(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function nc(e,t){let n=typeof e[t]==`string`?e[t].trim():``;if(!n)throw new a(`INVALID_ARGS`,`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function rc(e,t){let n=e[t],r=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isInteger(r))throw new a(`INVALID_ARGS`,`Invalid params: source.${t} must be an integer`);return r}function ic(e){let t=nc(e,`owner`),n=nc(e,`repo`),r=e.artifactId!==void 0,i=e.runId!==void 0,o=e.artifactName!==void 0;if(r&&(i||o))throw new a(`INVALID_ARGS`,`Invalid params: source must specify either artifactId or artifactName, not both`);if(!r&&i&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source.artifactName is required when source.runId is specified`);if(!r&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source must specify artifactId or artifactName`);if(r)return{kind:`github-actions-artifact`,owner:t,repo:n,artifactId:rc(e,`artifactId`)};let s;return i&&(s=rc(e,`runId`)),{kind:`github-actions-artifact`,owner:t,repo:n,...i?{runId:s}:{},artifactName:nc(e,`artifactName`)}}function ac(e,t,n){return{token:Qs(t,n),session:J(t,`session`)??`default`,command:e,positionals:[],flags:e===`lease_allocate`?he(t):void 0,meta:{tenantId:J(t,`tenantId`)??J(t,`tenant`),runId:J(t,`runId`),leaseId:J(t,`leaseId`),leaseTtlMs:ec(t,`ttlMs`),leaseRetainOnClose:tc(t,`retainOnClose`),leaseBackend:J(t,`backend`),leaseProvider:J(t,`leaseProvider`)??J(t,`provider`),deviceKey:J(t,`deviceKey`),clientId:J(t,`clientId`),providerCredentialFingerprint:e===`lease_allocate`?J(t,`providerCredentialFingerprint`):void 0}}}function oc(e){let t=e.source;if(!t||typeof t!=`object`)throw new a(`INVALID_ARGS`,`Invalid params: source is required`);let n=t;if(n.kind===`url`){let e=typeof n.url==`string`?n.url.trim():``;if(!e)throw new a(`INVALID_ARGS`,`Invalid params: source.url is required for url sources`);let t=n.headers,r={};if(t!==void 0){if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`Invalid params: source.headers must be a string map`);for(let[e,n]of Object.entries(t)){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Invalid params: source.headers values must be strings`);r[e]=n}}return Object.keys(r).length>0?{kind:`url`,url:e,headers:r}:{kind:`url`,url:e}}if(n.kind===`path`)throw new a(`INVALID_ARGS`,`Invalid params: source.kind "path" names a file on the daemon host and is not accepted over HTTP`,{hint:`Use a "url" or "github-actions-artifact" source.`});if(n.kind===`github-actions-artifact`)return ic(n);throw new a(`INVALID_ARGS`,`Invalid params: source.kind must be "url" or "github-actions-artifact"`)}function sc(e,t){let n=J(e,`platform`);if(n!==`ios`&&n!==`android`)throw new a(`INVALID_ARGS`,`Invalid params: platform must be "ios" or "android"`);return{token:Qs(e,t),session:J(e,`session`)??`default`,command:`install_source`,positionals:[],flags:{platform:n},meta:{requestId:J(e,`requestId`),installSource:oc(e),retainMaterializedPaths:tc(e,`retainPaths`),materializedPathRetentionMs:ec(e,`retentionMs`)}}}function cc(e,t){let n=J(e,`materializationId`)?.trim();if(!n)throw new a(`INVALID_ARGS`,`Invalid params: materializationId is required`);return{token:Qs(e,t),session:J(e,`session`)??`default`,command:`release_materialized_paths`,positionals:[],meta:{requestId:J(e,`requestId`),materializationId:n}}}function lc(e){let t=e.indexOf(`: `);if(t===-1||!e.startsWith(`$`))return e;let n=e.slice(0,t).replace(/^\$\.?/,``),r=e.slice(t+2);return n?`${n}: ${r}`:r}function uc(e){try{return c.parse(e)}catch(e){let t=e instanceof Error?lc(e.message):`invalid command params`;throw new a(`INVALID_ARGS`,`Invalid params: ${t}`)}}function dc(e,t,n){if(Us.has(e))return $s(uc(t),n);if(Ws.has(e))return sc(t,n);if(Gs.has(e))return cc(t,n);let r=Ks[e];if(r)return ac(r,t,n);throw new a(`INVALID_ARGS`,`Method not found: ${e}`)}function fc(e){return Us.has(e)}async function pc(e,t){if(!e)return{ok:!0};let n=await e(t);if(n===void 0||n===!0)return{ok:!0};let r=(e,n,r)=>{let a=i(r);return{ok:!1,statusCode:e,response:K(t.rpcRequest.id??null,n,a.message,a)}};if(n===!1||n.ok===!1){let e=n===!1?{}:n;return r(401,-32001,new a(f(e.code,`UNAUTHORIZED`),e.message??`Request rejected by auth hook`,e.details))}if(typeof n.tenantId==`string`&&n.tenantId.length>0){let e=Gn(n.tenantId);return e?{ok:!0,tenantId:e}:r(500,-32e3,new a(`INVALID_ARGS`,`Auth hook returned invalid tenantId`))}return{ok:!0}}async function mc(e=process.env){let t=e.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=e.AGENT_DEVICE_HTTP_AUTH_EXPORT||`default`,r=B.isAbsolute(t)?t:B.resolve(t),i;try{i=await import(Hi(r).href)}catch(e){throw new a(`COMMAND_FAILED`,`Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module`,{hookPath:r,error:e instanceof Error?e.message:String(e)})}let o=i[n];if(typeof o!=`function`)throw new a(`INVALID_ARGS`,`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return o}async function hc(e){let t=Ri(),n=await Vt(),r=m.filter(e=>e!==`macos-app`||process.platform===`darwin`),a=await mc(e.env??process.env),{handleRequest:o,token:s,retainArtifacts:c=!1,resolveRequestDiagnosticsPath:l}=e;return Ui.createServer((u,d)=>{if(u.method===`GET`&&u.url===`/health`){d.statusCode=200,d.setHeader(`content-type`,`application/json`),d.end(JSON.stringify(Yt(`agent-device-daemon`,_n(),{instanceId:t,hostArch:n,leaseBackends:r})));return}if(s&&e.leaseRegistry&&js({req:u,res:d,expectedToken:s,registry:e.leaseRegistry})||Ma({req:u,res:d,token:Qs({},u.headers),authorize:async e=>await _c({req:e.req,res:e.res,authHook:a,expectedToken:s,daemonRequest:e.daemonRequest})})||Za({req:u,res:d,retainArtifacts:c,authorize:async e=>await _c({req:e.req,res:e.res,authHook:a,expectedToken:s,daemonRequest:e.daemonRequest})})||l&&co({req:u,res:d,resolveRecordPath:l,authorize:async t=>await vc({...t,authHook:a,expectedToken:s,leaseRegistry:e.leaseRegistry})}))return;if(u.method!==`POST`||u.url!==`/rpc`){d.statusCode=404,d.end(`Not found`);return}let f=``;u.setEncoding(`utf8`),u.on(`data`,e=>{f+=e,f.length>1048576&&u.destroy(Error(`request too large`))}),u.on(`error`,()=>{d.headersSent||q(d,K(null,-32700,`Parse error`),400)}),u.on(`end`,async()=>{let e;try{e=JSON.parse(f)}catch{q(d,K(null,-32700,`Parse error`),400);return}if(e.jsonrpc!==`2.0`||typeof e.method!=`string`){q(d,K(e.id??null,-32600,`Invalid Request`),400);return}if(!Js.has(e.method)){q(d,K(e.id??null,-32601,`Method not found: ${e.method}`),404);return}if(!e.params||typeof e.params!=`object`){q(d,K(e.id??null,-32602,`Invalid params`),400);return}let n,r,c=!1;try{let i=e.params,l=dc(e.method,i,u.headers);if(fc(e.method)&&(typeof l.command!=`string`||l.command.length===0)){q(d,K(e.id??null,-32602,`Invalid params: command is required`),400);return}n=Zn(l.meta?.requestId,e.id),l.meta={...l.meta,requestId:n},r=Xn(n);let f=l.meta?.tenantId??l.flags?.tenant,p=await pc(a,{headers:u.headers,rpcRequest:e,daemonRequest:l});if(!p.ok){q(d,p.response,p.statusCode);return}let m=po({hookConfigured:a!==null,hookAttestedTenant:p.tenantId,clientDeclaredTenant:f});if(!m.trusted){let t=mo();q(d,K(e.id??null,-32001,t.message,t),401);return}let h=xc(l.token,s);if(h){q(d,K(e.id??null,-32e3,h.message,h),401);return}if(ho(u,d,e.id??null,t))return;l.meta={...l.meta,tenantId:m.tenantId,sessionIsolation:m.attested?`tenant`:l.meta?.sessionIsolation},l.flags?.tenant!==void 0&&(l.flags={...l.flags,tenant:m.tenantId}),m.attested&&l.flags?.sessionIsolation!==void 0&&(l.flags={...l.flags,sessionIsolation:`tenant`}),l=qs(l,a!==null,u.headers[Zt]);let g=!1,_=()=>{c||d.writableFinished||g||(g=!0,qn(n),C({level:`warn`,phase:`request_client_disconnected`,data:{requestId:n}}))};if(u.on(`aborted`,_),d.on(`close`,_),(u.aborted||d.destroyed)&&_(),cn(l)){d.statusCode=200,d.setHeader(`content-type`,`application/x-ndjson`);let t=await $n(e=>Ys(d,e),async()=>await o(l));c=!0,Xs(d,t.ok?{jsonrpc:`2.0`,id:e.id??null,result:t}:K(e.id??null,-32e3,t.error.message,t.error));return}let v=await o(l);if(c=!0,v.ok){q(d,{jsonrpc:`2.0`,id:e.id??null,result:v});return}q(d,K(e.id??null,-32e3,v.error.message,v.error),gc(v.error))}catch(t){c=!0;let n=i(t),r=Zs(n.code);if(d.headersSent){Xs(d,K(e.id??null,r,n.message,n));return}q(d,K(e.id??null,r,n.message,n),Ki(n.code))}finally{Qn(r)}})})}function gc(e){return e.code===`DEVICE_IN_USE`&&e.details?.reason===`human_control_active`?423:Ki(e.code)}async function _c(e){let{req:t,res:n,authHook:r,expectedToken:i,daemonRequest:a}=e,o=Qs({},t.headers),s=Gn(bc(t.headers,$t)),c=xc(o,i);if(c)return H(n,c),null;let l=await pc(r,{headers:t.headers,rpcRequest:{jsonrpc:`2.0`,id:null,method:`agent_device.command`},daemonRequest:{token:o,session:`default`,command:a.command,positionals:a.positionals,...s?{meta:{tenantId:s}}:{}}});if(!l.ok)return yc(n,l),null;let u=po({hookConfigured:r!==null,hookAttestedTenant:l.tenantId,clientDeclaredTenant:s});if(!u.trusted)return H(n,mo()),null;let d=u.tenantId;return{tenantId:d,...d?{sessionNamespace:{tenant:d,partitioned:u.attested}}:{}}}async function vc(e){let{leaseRegistry:t,...n}=e,r=await _c(n);if(!r||!t)return r;try{ks(t,r.tenantId)}catch(e){return H(n.res,i(e)),null}return r}function yc(e,t){e.statusCode=t.statusCode,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.response.error?.data?.message??t.response.error?.message??`Unauthorized`}))}function bc(e,t){let n=e[t];return typeof n==`string`?n:void 0}function xc(e,t){return!t||nn(e,t)?null:i(new a(`UNAUTHORIZED`,`Invalid token`))}function Sc(e,t){if(Cc(e,t.command,t.flags??{}),t.command===`batch`)for(let n of t.flags?.batchSteps??[])Cc(e,Ue(n.command),{...n.input,...n.flags})}function Cc(e,t,n){if(kc(e,t),t===`close`&&n.shutdown===!0&&Ec(e,`device-shutdown`),e.deviceIds)for(let t of[n.udid,n.serial]){let n=typeof t==`string`?t.trim():``;if(!(!n||e.deviceIds.has(n)))throw Ac(e,`device`,`Device ${n} is outside this daemon's policy.`,{deviceId:n})}}function wc(e,t){return!e.deviceIds||e.deviceIds.has(t.id)}function Tc(e,t){if(!wc(e,t))throw Ac(e,`device`,`Device ${t.id} is outside this daemon's policy.`,{deviceId:t.id})}function Ec(e,t){if(e.deniedCapabilities.has(t))throw Ac(e,`capability`,`This daemon's policy denies ${t}.`,{capability:t})}function Dc(e,t){let n=e.requiredLeaseBackend;if(!(!n||t?.backend===n))throw Ac(e,`lease`,`This daemon's policy requires a ${n} lease.`,{leaseBackend:n})}function Oc(e,t){if(!t.deviceIds)return e;let n=e=>e.filter(e=>wc(t,e)),r=Object.freeze({discover:async(t,r)=>n(await e.localOnly.discover(t,r))}),i=async(t,i)=>{let a=await e.providerFirst.discoverWithSource(t,i),o=n(a.devices);return o.length>0||a.source===`local`?{...a,devices:o}:{devices:await r.discover(t,i),source:`local`}},a=Object.freeze({discover:async(e,t)=>(await i(e,t)).devices,discoverWithSource:i});return Object.freeze({...e,localOnly:r,providerFirst:a})}function kc(e,t){let n=e.commands;if(!n)return;let r=pr(t);if(r===void 0)return;let i=n.names.has(r);if(!(n.mode===`allow`?i:!i))throw Ac(e,`command`,`This daemon's policy denies the ${r} command.`,{command:r})}function Ac(e,t,n,r){return new a(`UNAUTHORIZED`,n,{...r,reason:`DAEMON_POLICY_DENIED`,rule:t,policyDigest:e.digest,retriable:!1,hint:`The daemon operator's policy denies this request; retrying will not help. Use an allowed command and device, or ask the operator to change the policy.`})}function jc(){return Object.freeze({toolchainCheck:async(e,t)=>{if(e===`android`){let{androidToolchainCheck:e}=await xn();return await e(process.env,process.platform)}if(e===`vega`){let{vegaToolchainCheck:e}=await import(`../src3.js`).then(e=>e.r);return await e(t)}if(e===`harmonyos`){let{harmonyToolchainCheck:e}=await import(`../src4.js`).then(e=>e.b);return await e()}if(e===`ios`||e===`macos`||e===`apple`){let{appleToolchainCheck:e}=await import(`../doctor-facade.js`);return await e()}},deviceChecks:async(e,t)=>{if(e.platform!==`android`)return[];let{androidDeviceChecks:n}=await xn();return await n(e,t)},ambientChecks:async e=>{let{webBrowserLifecycleCheck:t}=await import(`../src6.js`).then(e=>e.i);return[await t(e.stateDir)]},warmupCheck:async(e,t)=>{if(e.platform!==`apple`)return;let{appleRunnerWarmupCheck:n}=await import(`../doctor-facade.js`);return await n(e,t)}})}const Mc=Object.freeze([...Rr,`limrun`]);function Nc(e){return Object.freeze(e.flatMap(e=>Ic(e)?[{runtime:e,module:Rc(e)}]:[]))}async function Pc(e=process.env){let t=await Fc(e);try{let[{loadProviderPlugins:n},{RESERVED_PLUGIN_PROVIDERS:r}]=await Promise.all([import(`../load.js`).then(e=>e.t),import(`../manifest.js`).then(e=>e.r)]),i=await n(e,r);return Object.freeze({...t,runtimes:Object.freeze([...t.runtimes,...i.map(({runtime:e})=>e)]),platformModules:Object.freeze([...t.platformModules,...i.map(({runtime:e,platformModule:t})=>({runtime:e,module:t}))])})}catch(e){throw await Promise.allSettled(t.runtimes.map(async e=>await e.shutdown())),e}}async function Fc(e=process.env){let n=Lr(e),r=[...Nc(n)],i;try{i=zr(e)}catch(e){return Object.freeze({runtimes:n,platformModules:Object.freeze(r),skipped:[{provider:`limrun`,error:t(e)}]})}if(!i)return Object.freeze({runtimes:n,platformModules:Object.freeze(r)});let[a,o]=await Promise.all([import(`../src.js`).then(e=>e.t),import(`../limrun-runtime-dependencies.js`).then(e=>e.n)]),s=a.createLimrunRuntime(i,o.createLimrunRuntimeDependencies(),{includePlatformModule:!0});return Object.freeze({runtimes:Object.freeze([...n,s.runtime]),platformModules:Object.freeze([...r,{runtime:s.runtime,module:s.platformModule}])})}function Ic(e){if(!(`owner`in e)||!(`loadRuntime`in e))return!1;let t=e.owner;return typeof e.loadRuntime==`function`&&Lc(t)&&t.provider===e.provider}function Lc(e){return typeof e==`object`&&!!e&&`kind`in e&&e.kind===`provider-runtime`&&`provider`in e&&typeof e.provider==`string`&&`instance`in e&&typeof e.instance==`string`}function Rc(e){return Object.freeze({owner:e.owner,loadRuntime:async t=>await e.loadRuntime(t)})}var zc=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},Bc=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},Vc=class{holdsByDevice=new Map;mutations=new zc;inFlightWork=new Bc;leases=new Map;runBindings=new Map;deviceBindings=new Map;hostTtlMsByLeaseId=new Map;macOsAppTenantIds=new Set;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=In(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new sr({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=Mn(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Hn(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}putHostLease(e,t){let n=kn(e),r=Mn(t);this.cleanupExpiredLeases();let i=this.resolveLeaseTtlMs(r.ttlMs),o=this.leases.get(n);if(o){if(!Bn(o,r))throw new a(`INVALID_ARGS`,`Lease id already names a lease with another scope.`,{reason:`LEASE_SCOPE_MISMATCH`});return this.hostTtlMsByLeaseId.set(n,i),this.refreshLease(o,i)}if(this.assertHumanControlAdmission(r),this.assertDeviceAvailable(r),r.backend===`macos-app`&&this.macOsAppTenantIds.add(r.tenantId),this.runBindings.has(Wn(r)))throw new a(`DEVICE_IN_USE`,`This tenant run already holds a lease for the device.`,{reason:`DEVICE_LEASE_BUSY`});this.enforceCapacity(r.backend);let s={...Hn(r,i,this.now()),leaseId:n};return this.leases.set(s.leaseId,s),this.hostTtlMsByLeaseId.set(n,i),this.bindLease(s),{...s}}refreshExistingRunBinding(e,t){let n=Wn(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(e.retainOnClose?{...i,retainOnClose:!0}:i,t);if(i.deviceKey)throw An(i);return zn(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=kn(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);Un(n,e),zn(n,e);let r=e.ttlMs===void 0?jn(n):this.resolveLeaseTtlMs(e.ttlMs),i=this.hostTtlMsByLeaseId.get(t);return this.refreshLease(n,i===void 0?r:Math.min(r,i))}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=kn(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return Un(n,e),zn(n,e),{...n}}assertLeaseAdmission(e){let t=Vn(e);this.cleanupExpiredLeases(),zn(this.getActiveLease(t.leaseId),t)}hasHeldMacOsAppLease(e){return this.macOsAppTenantIds.has(e)}findActiveLeaseBackend(e){let t=Fn(e);if(t)return this.cleanupExpiredLeases(),this.leases.get(t)?.backend}hasRetainedLeases(){let e=this.now();return this.listActiveLeases().some(t=>t.retainOnClose===!0&&t.expiresAt>e)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?N(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>bo(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,n,r){r?.throwIfAborted();let i=yo(t),o=go(n);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=N(s),l=this.findHumanControlHold(i);if(l&&(this.assertHoldAuthority(e,l),N(l.hold.scope)!==c))throw new a(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:i,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(i,d),await this.activateHumanControlHold(c,d,o.ttlMs,r)}async activateHumanControlHold(e,t,n,r){let i=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,r),r?.throwIfAborted(),i.get(o)!==t)throw new a(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...n===void 0?{}:{expiresAt:s+n}},this.refreshHeldLease(e,s),bo(t.hold)}catch(n){throw i.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=yo(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=N(r.hold.scope);return this.deleteHumanControlHold(i,n),bo(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=N(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw xo(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=N(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new a(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new a(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new a(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let n=this.requireHumanControlLease(e.leaseId);return{backend:n.backend,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let n=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==n.leaseId||N(n)!==N(t.hold.scope))throw new a(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=N(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,jn(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=Fn(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new a(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new a(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(Wn(e),e.leaseId);let t=N(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.hostTtlMsByLeaseId.delete(e.leaseId),this.runBindings.delete(Wn(e));let n=N(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=N({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw An(r)}};function Hc(e){let t=Kn(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,r=Gn(n);if(n&&!r)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!r)throw new a(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let i=e.session||`default`;return ao(r,i)?{...e,meta:{...e.meta,tenantId:r,sessionIsolation:t}}:{...e,session:io(r,i),meta:{...e.meta,tenantId:r,sessionIsolation:t}}}function Uc(e,t,n,r={}){if(Gc(e,t,n,r.daemonPolicy))return;let i=ni(e);Yc(e,i);let o=n?.lease;if(r.daemonPolicy?.requiredLeaseBackend){let i=ri(e,n).leaseId?Wc(e,t,n):void 0;return Dc(r.daemonPolicy,i),i}if(!(n===void 0&&!i.leaseId&&qc(e,r.providerAppCatalog))){if(e.command===`human_control`&&!o&&!i.leaseId)throw new a(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(!(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!i.leaseId||!i.tenantId&&!i.runId)))return Wc(e,t,n)}}function Wc(e,t,n){Xc(ni(e),n?.lease);let r=ri(e,n);t.assertLeaseAdmission(_e(r));let i=t.heartbeatLease(_e(r));return cs(i,e,n),Jo(e)&&t.assertHumanControlAdmission(i),i}function Gc(e,t,n,r){return Ro(e.command)?zo(e.command)?!0:!Kc(e,t,n,r):!1}function Kc(e,t,n,r){if(r?.requiredLeaseBackend)return!0;let i=ri(e,n);return i.leaseBackend===`macos-app`||i.leaseId!==void 0&&t.findActiveLeaseBackend(i.leaseId)===`macos-app`}function qc(e,t){let n=Zo(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function Jc(e){Ro(e.command)||Yc(e,ni(e))}function Yc(e,t){if(e.command!==`open`)return;let n=ge(t);if(n.length!==0)throw new a(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:n})}function Xc(e,t){t&&(Zc(`leaseId`,e.leaseId,t.leaseId),Zc(`tenantId`,e.tenantId,t.tenantId),Zc(`runId`,e.runId,t.runId),Zc(`leaseProvider`,e.leaseProvider,t.leaseProvider),Zc(`clientId`,e.clientId,t.clientId),Zc(`deviceKey`,e.deviceKey,t.deviceKey))}function Zc(e,t,n){if(!(!t||!n||t===n))throw new a(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function Qc(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),C({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return C({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}async function $c(e){let t=e.sessionStore.lookup(e.sessionName),n=t?.session,r=n?.lease;return!t||!n||!r||!e.leaseRegistry.consumeExpiredLease(r.leaseId)?!1:(C({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,deviceKey:r.deviceKey}}),await e.teardownSession(t).catch(e=>{C({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,error:e instanceof Error?e.message:String(e)}})}),await Zr(n.deviceClaim).catch(e=>{C({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:n.name,deviceKey:n.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.retire(t),!0)}function el(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.lookup(t),a=i?.session,o=Uc(e.req,r,a,{providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy});if(!o)return e.req;let s={...e.req,internal:{...e.req.internal,admittedLease:o}};return i&&a?.lease&&n.update(i,e=>({lease:{...e.lease,leaseBackend:o.backend,expiresAt:o.expiresAt}})),s}function tl(e){return ii(e.req,e.req.internal?.admittedLease)??e.existingLease}async function nl(e){let t=e.session.lease;if(!t)return;let n=me({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n);if(r?.retainOnClose){C({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:!1,retained:!0}});return}let i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=ir(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return C({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const rl=[`leaseId`,`tenantId`,`runId`,`backend`,`leaseProvider`],il=[`createdAt`,`heartbeatAt`,`expiresAt`];function al(e){let t=new Map,n=fl(e.stateDir),r=new Set(n.keys()),i=e.retryDelayMs??1e3,a,o=new Map,s=!1,c=new Map,l=e=>{s&&c.set(e.leaseId,e)},u=()=>{if(!e.stateDir)return dl(n.size,Error(`daemon state directory is unavailable`)),!1;let t=ml(e.stateDir);try{if(n.size===0)R.rmSync(t,{force:!0});else{R.mkdirSync(e.stateDir,{recursive:!0,mode:448});let r={version:1,leases:[...n.values()]};Rt({destination:t,contents:`${JSON.stringify(r)}\n`,mode:384}),R.chmodSync(t,384)}r.clear();for(let e of n.keys())r.add(e);return!0}catch(e){return dl(n.size,e),!1}},d=()=>{a||!sl(t,e.providerRuntimeIds)&&!cl(n,e.recoverableProviderIds)||(a=setTimeout(()=>{a=void 0,h()},i),a.unref?.(),C({level:`warn`,phase:`provider_lease_expiry_retry_scheduled`,data:{pendingLiveLeaseCount:t.size,pendingRecoveryLeaseCount:n.size,retryDelayMs:i}}))},f=(e,r)=>{o.set(e,r);let i=()=>{o.get(e)===r&&o.delete(e),t.size===0&&n.size===0&&a?(clearTimeout(a),a=void 0):d()};return r.then(i,i),r},p=n=>{if(!ll(n,e.providerRuntimeIds))return;let r=`live:${n.leaseId}`,i=o.get(r);if(i)return i;let a=(async()=>{await ol(e.leaseLifecycleProvider,n)&&(t.delete(n.leaseId),l(n))})();return f(r,a)},m=t=>{if(!ul(t,e.recoverableProviderIds)||!r.has(t.leaseId)&&!u())return;let i=`recovery:${t.leaseId}`,a=o.get(i);if(a)return a;let s=(async()=>{await Qc(e.recoverExpiredLease,t)&&(n.delete(t.leaseId),l(t),u())})();return f(i,s)},h=async()=>{let e=[...[...t.values()].map(p),...[...n.values()].map(m)].filter(e=>e!==void 0);if(e.length===0){d();return}await Promise.all(e)};return{beginShutdown:()=>{c.clear(),s=!0},release:async r=>{if(r.leaseProvider){if(ul(r,e.recoverableProviderIds)){n.set(r.leaseId,r),u()?await m(r):d();return}ll(r,e.providerRuntimeIds)&&e.leaseLifecycleProvider?.release&&(t.set(r.leaseId,r),await p(r),t.has(r.leaseId)&&d())}},retryPending:h,drain:async e=>{await Promise.race([h(),Gt(Math.max(0,e))]);let r={pending:[...t.values(),...n.values()],released:[...c.values()]};return s=!1,c.clear(),r},shutdown:()=>{a&&clearTimeout(a),a=void 0}}}async function ol(e,t){return await Qc(e?.release?async t=>{await e.release?.(t)}:void 0,t)}function sl(e,t){return[...e.values()].some(e=>ll(e,t))}function cl(e,t){return[...e.values()].some(e=>ul(e,t))}function ll(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function ul(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function dl(e,t){C({level:`error`,phase:`provider_lease_expiry_record_write_failed`,data:{pendingLeaseCount:e,error:t instanceof Error?t.message:String(t)}})}function fl(e){if(!e)return new Map;let t=ml(e);try{let e=JSON.parse(R.readFileSync(t,`utf8`));if(e.version!==1||!Array.isArray(e.leases))throw Error(`unsupported expiry release record`);return new Map(e.leases.filter(pl).map(e=>[e.leaseId,e]))}catch(e){return e.code===`ENOENT`||C({level:`warn`,phase:`provider_lease_expiry_record_read_failed`,data:{error:e instanceof Error?e.message:String(e)}}),new Map}}function pl(e){if(!e||typeof e!=`object`)return!1;let t=e;return rl.every(e=>typeof t[e]==`string`)&&il.every(e=>typeof t[e]==`number`)}function ml(e){return B.join(e,`expired-provider-leases.json`)}function hl(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.nodes)?e.nodes:[],r=n.filter(e=>e.hittable===!0&&e.interactionBlocked!==`covered`).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier})),i=Object.fromEntries([`visibility`,`viewport`,`snapshotQuality`,`targetActivation`,`observation`,`warnings`,`fallbackScreenshotPath`,`artifacts`,`refsGeneration`].filter(t=>e[t]!==void 0).map(t=>[t,e[t]]));return{nodeCount:n.length,refs:r,truncated:e.truncated,...i}}const gl=[`width`,`height`,`logicalWidth`,`logicalHeight`,`pixelDensity`];function _l(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.overlayRefs)?e.overlayRefs:[],r=n.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{...vl(e),overlayCount:n.length,overlayRefs:r,...e.warnings===void 0?{}:{warnings:e.warnings},...e.artifacts===void 0?{}:{artifacts:e.artifacts}}}function vl(e){let t={};typeof e.path==`string`&&(t.path=e.path),Mt(e.displayRotation)&&(t.displayRotation=e.displayRotation);for(let n of gl)typeof e[n]==`number`&&(t[n]=e[n]);return t}const yl=[`role`,`type`,`subrole`,`label`,`value`,`contentDescription`,`identifier`,`enabled`,`selected`,`checked`,`focused`,`heading`,`roleDescription`,`editable`,`password`,`hintShowing`,`placeholder`,`selectionStart`,`selectionEnd`,`hittable`];function bl(e){let t={ref:e.ref};for(let n of yl){let r=e[n];r!==void 0&&(t[n]=r)}return t}function xl(e,t){if(t!==`digest`)return e;let n=e.node;if(!n||typeof n!=`object`)return e;if(typeof e.text==`string`){let{node:t,...n}=e;return n}return{...e,node:bl(n)}}function Sl(e,t){return t===`digest`?wl(Cl(e)):e}function Cl(e){let t=e.resolution;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=t;if(n.kind!==`disambiguated`)return e;let{alternatives:r,...i}=n;return{...e,resolution:i}}function wl(e){let t=e.settle;if(!t||typeof t!=`object`||Array.isArray(t))return e;let{diff:n,tail:r,...i}=t;if(!n||typeof n!=`object`||Array.isArray(n))return e;let a=n,o=a.summary,s=El(a.lines);return{...e,settle:{...i,...s.length>0?{refs:s}:{},...Tl(r),diff:{summary:o}}}}function Tl(e){return!Array.isArray(e)||e.length===0?{}:{tail:e.slice(0,12)}}function El(e){return Array.isArray(e)?e.flatMap(Dl).slice(0,12):[]}function Dl(e){let t=kl(e);return t?.kind===`added`?Ol(t.ref):[]}function Ol(e){return typeof e==`string`&&e.length>0?[{ref:e}]:[]}function kl(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const Al=[`headers`,`requestHeaders`,`responseHeaders`,`requestBody`,`responseBody`,`raw`];function jl(e,t){if(t!==`digest`)return e;let n=e.entries;return Array.isArray(n)?{...e,entries:n.map(Ml)}:e}function Ml(e){let t=kl(e);if(!t)return e;let n={};for(let[e,r]of Object.entries(t))Al.includes(e)||(n[e]=r);return n}const Nl={snapshot:hl,screenshot:_l,find:xl,get:xl,press:Sl,click:Sl,fill:Sl,longpress:Sl,hover:Sl,network:jl},Pl=[`platform`,`target`],Fl=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function Il(e){return fe({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function Ll(e){return Il(e)||Bl(e,Pl)}function Rl(e){return Ll(e)||Bl(e,Fl)}function zl(e){return typeof e==`string`&&e.trim().length>0}function Bl(e,t){return e?t.some(t=>zl(e[t])):!1}function Vl(e){return{appleSimulatorAppTarget:Hl(e)}}function Hl(e){return e&&!y(e)?e:void 0}async function Ul(e){let t=await Wl(e.req,e.existingSession);if(t)return{device:t,...e.req.session===void 0?{}:{requestedSession:e.req.session},...e.req.meta?.requestId===void 0?{}:{requestId:e.req.meta.requestId},...e.existingSession?{session:{name:e.existingSession.name,device:e.existingSession.device,...e.existingSession.appBundleId?{appBundleId:e.existingSession.appBundleId}:{},...e.existingSession.appName?{appName:e.existingSession.appName}:{},...e.existingSession.surface?{surface:e.existingSession.surface}:{}}}:{},...e.useDefaultWebProvider?{useDefaultWebProvider:!0}:{}}}async function Wl(e,t){switch($o(e,{hasExistingSession:!!t,hasExplicitDeviceIdentity:Il(e.flags),hasDeviceSelectionInput:Ll(e.flags)})){case`existing-session`:return t?.device;case`explicit-device`:case`sessionless-default-device`:try{return await Gl(e)}catch{return}case`skip`:return}}async function Gl(e){let t=e.command===`open`?Vl(e.positionals?.[0]):void 0;return await ct(e.flags??{},t)}const Kl=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,ql=/^close app$/i,Jl=`Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.`;function Yl(e){if(!e)throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);return e}async function Xl(e){let{session:t}=e;if(t.device.platform!==`android`||!t.screenRecording||fu(t))return{status:`absent`};let n=Yl(e.observation),r;try{r=await au(t,n)}catch(e){let n=i(e);return C({level:`warn`,phase:`android_blocking_dialog_inspection_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`unknown`,reason:`inspection-failed`,warning:ru(n)}}let a=su(r);if(!a?.rect)return{status:`absent`};try{let e=await ou(t,a,n);return e.ok?await lu(t,n)?t.appBundleId&&(await n.openApp(t.device,t.appBundleId),!await uu(t,t.appBundleId,n))?(C({level:`warn`,phase:`android_blocking_dialog_relaunch_unfocused`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),{status:`failed`,reason:`relaunch-failed`}):(C({level:`warn`,phase:`android_blocking_dialog_recovered`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:e.x,y:e.y}}),{status:`recovered`}):(C({level:`warn`,phase:`android_blocking_dialog_still_present`,data:{session:t.name,deviceId:t.device.id}}),{status:`failed`,reason:`dismiss-failed`}):(C({level:`warn`,phase:`android_blocking_dialog_tap_failed`,data:{session:t.name,deviceId:t.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:`failed`,reason:`tap-failed`})}catch(e){return C({level:`warn`,phase:`android_blocking_dialog_recovery_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`failed`,reason:`error`}}}async function Zl(e){let{session:t,command:n}=e;if(t.device.platform!==`android`||fu(t))return{status:`clear`};let r=Yl(e.observation),i=await r.readBlockingDialog(t.device);if(i.status!==`dialog`)return i.status===`unknown`&&C({level:`warn`,phase:`android_blocking_dialog_unobserved`,data:{session:t.name,deviceId:t.device.id,command:n,commandPhase:e.phase}}),{status:`clear`};let a=i.focus;if($l(t,a)){if(await Ql(t,r)){let r=`Recovered Android app ANR before ${n}: closed and relaunched ${t.appBundleId}.`;if(e.phase===`before-command`)return{status:`recovered`,warning:r};throw tu({session:t,command:n,focus:a,message:`Android app ANR appeared after ${n}; ${t.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:`Retry the command. If the ANR returns, inspect app logs or restart the emulator.`})}throw tu({session:t,command:n,focus:a,message:`Android app ANR blocked ${n}: ${nu(a)}. Automatic recovery failed.`,hint:Jl})}throw tu({session:t,command:n,focus:a,message:`Android system dialog is blocking ${n}: ${nu(a)}.`,hint:Jl})}async function Ql(e,t){try{return await eu(e,t)}catch(t){return C({level:`warn`,phase:`android_app_anr_recovery_failed`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}function $l(e,t){return!!(e.appBundleId&&t.package===e.appBundleId)}async function eu(e,t){if(!e.appBundleId)return!1;let n=su(await au(e,t),{requireDialogSignal:!1});if(!n?.rect)return!1;let r=await ou(e,n,t);if(!r.ok)return!1;await t.openApp(e.device,e.appBundleId);let i=await uu(e,e.appBundleId,t,{requireNoBlockingDialog:!0});return i&&C({level:`warn`,phase:`android_app_anr_recovered`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),i}function tu(e){let{session:t,command:n,focus:r,message:i,hint:o}=e;return new a(`COMMAND_FAILED`,i,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:o})}function nu(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}function ru(e){let t=[`Inspection error: ${iu(e.message)}`];return e.hint&&t.push(`Hint: ${iu(e.hint)}`),[`Android blocking-dialog readiness could not be inspected; the command continued.`,...t].join(` `)}function iu(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}async function au(e,t){return await t.readSnapshotNodes(e.device)}async function ou(e,t,n){if(!t.rect)return{ok:!1,exitCode:1,stdout:``,stderr:`button has no rect`};let{x:r,y:i}=l(t.rect);Tr(e);let a=await n.tap(e.device,r,i);return a.exitCode===0?{ok:!0,x:r,y:i}:{ok:!1,exitCode:a.exitCode,stdout:a.stdout.trim(),stderr:a.stderr.trim()}}function su(e,t={}){if(!(t.requireDialogSignal!==!1&&!hu(e)))return e.filter(cu).find(e=>mu(e).some(e=>ql.test(e))&&e.rect)}function cu(e){return!Dn(e)}async function lu(e,t){for(let n=0;n<12;n+=1){if(!hu(await au(e,t)))return!0;await Gt(500)}return!hu(await au(e,t))}async function uu(e,t,n,r={}){for(let i=0;i<12;i+=1){if(await du(e,t,n,r))return!0;await Gt(500)}return await du(e,t,n,r)}async function du(e,t,n,r){return await n.readAppFocus(e.device,t,r)}function fu(e){return!!e.lease?.leaseProvider||mt(e.device)}function pu(e){return mu(e).join(` `).trim()}function mu(e){let t=[e.label,e.identifier];return typeof e.value==`string`&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim())}function hu(e){return e.filter(cu).some(e=>{let t=pu(e);return t.length>0&&Kl.test(t)})}function gu(e){if(typeof e.gestureClockOriginAtMs==`number`&&typeof e.gestureClockOriginUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`){let t=e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs);return Math.max(0,t-e.recordingStartedAt)}if(typeof e.runnerStartedAtUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`)return Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs);if(typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`){let t=e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs);return Math.max(0,t-e.recordingStartedAt)}return Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}function _u(e){return typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`?Math.max(0,e.gestureEndUptimeMs-e.gestureStartUptimeMs):typeof e.reportedDurationMs==`number`?Math.max(0,e.reportedDurationMs):Math.max(0,e.fallbackFinishedAtMs-e.fallbackStartedAtMs)}function vu(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return gu(e);let n=Math.min(Math.max(t*.15,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}const yu=new WeakMap;function bu(e){if(!e)return;let t=yu.get(e);if(t)return t;let n=Su(e.nodes??[]);if(n)return yu.set(e,n),n}function xu(e){return bu({nodes:e,createdAt:0})}const Su=et;function Y(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e!=`string`||e.trim().length===0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function Cu(e,t,n){for(let r of[e,...t,n]){let e=Y(r);if(e!==void 0&&e>=1)return Math.floor(e)}return n}function wu(e,t,n,r,i){switch(t.kind){case`pan`:case`fling`:case`rotate`:case`transform`:{let e=Ou(t.from),a=Ou(t.to);if(!e||!a)return[];let o=(t.kind===`pan`||t.kind===`fling`)&&Y(t.pointerCount)!==2;return[Tu(n,e.x,e.y,a.x,a.y,Cu(r,[t.durationMs],250),{referenceFrame:i,classifyBackSwipe:o})]}case`pinch`:{let a=Ou(t.from),o=Y(t.scale)??Y(e[1]);return!a||o===void 0||o<=0?[]:[{kind:`pinch`,tMs:n,x:a.x,y:a.y,...i,scale:o,durationMs:Cu(r,[t.durationMs],280)}]}default:return[]}}function Tu(e,t,n,r,i,a,o={}){let{referenceFrame:s,classifyBackSwipe:c=!0}=o,l=c?Eu(t,n,r,i,s):`swipe`;return l===`back-swipe`?{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a,edge:Du(t,r,s)}:{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a}}function Eu(e,t,n,r,i){if(!i||Math.abs(n-e)<=Math.abs(r-t)*1.25)return`swipe`;let a=i.referenceWidth*.08;return e<=a&&n>e||e>=i.referenceWidth-a&&n<e?`back-swipe`:`swipe`}function Du(e,t,n){if(n){let t=n.referenceWidth*.08;if(e<=t)return`left`;if(e>=n.referenceWidth-t)return`right`}return t>=e?`left`:`right`}function Ou(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=Y(t.x),r=Y(t.y);if(n!==void 0&&r!==void 0)return{x:n,y:r}}const ku={referenceWidth:1e3,referenceHeight:1e3};function Au(e,t,n,r,i={},a=Date.now(),o=Date.now()){let s=e.screenRecording?.handle;if(!s)return;let c=s.inspect(),l={...i,...r??{}},u=Y(l.effectiveDurationMs)??Y(l.durationMs),d={recordingStartedAt:c.startedAt,gestureClockOriginAtMs:c.gestureClockOriginAtMs,gestureClockOriginUptimeMs:c.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:c.runnerStartedAtUptimeMs,gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},f=_u({gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),reportedDurationMs:u,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}),p=k(e.device)&&Y(l.gestureStartUptimeMs)===void 0&&Fu(t,l)?vu({...d,gestureDurationMs:f}):gu(d),m=Nu(t,n,l,p,f,Wu(e.snapshot,l));m.length!==0&&(s.appendGestureEvents(m),C({level:`debug`,phase:`record_touch_visualization_event`,data:{session:e.name,command:t,count:m.length,tMs:p,gestureDurationMs:f,kinds:m.map(e=>e.kind)}}))}function ju(e,t,n,r){if(t!==`scroll`)return r;let i=bu(e.snapshot),a={...r??{}},o=Gu(a.direction)??Gu(n[0]);if(!o)return r;let s=Y(a.amount)??Y(n[1]),c=Y(a.pixels),l=Y(a.durationMs)??Mu(e),u=qu(a,[]),d=Y(a.referenceWidth),f=Y(a.referenceHeight),p=d!==void 0&&d>0&&f!==void 0&&f>0?{referenceWidth:d,referenceHeight:f}:i??ku;if(u&&(u.x1!==u.x2||u.y1!==u.y2))return{...a,x1:u.x1,y1:u.y1,x2:u.x2,y2:u.y2,contentDirection:o,...s===void 0?{}:{amount:s},...c===void 0?{}:{pixels:c},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l};let m=Qe({direction:o,amount:s,pixels:c,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:m.x1,y1:m.y1,x2:m.x2,y2:m.y2,contentDirection:o,...s===void 0?{}:{amount:s},...m.pixels===void 0?{}:{pixels:m.pixels},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l}}function Mu(e){return e.device.target===`desktop`||e.device.target===`tv`?250:300}function Nu(e,t,n,r,i,a){let o=Pu[e];return o?.(t,n,r,i,a)??[]}const Pu={click:(e,t,n,r,i)=>Iu(e,t,n,i),press:(e,t,n,r,i)=>Iu(e,t,n,i),"react-native":(e,t,n,r,i)=>e[0]===`dismiss-overlay`?Iu(e,t,n,i):[],fill:(e,t,n,r,i)=>Lu(e,t,n,i),focus:(e,t,n,r,i)=>Lu(e,t,n,i),longpress:Ru,scroll:Vu,gesture:wu,swipe:zu};function Fu(e,t){switch(e){case`click`:case`fill`:case`focus`:return!0;case`press`:{let e=X(Y(t.count),1)??1,n=t.doubleTap===!0,r=X(Y(t.holdMs),1);return e===1&&!n&&r===void 0}case`react-native`:return t.action===`dismiss-overlay`;default:return!1}}function Iu(e,t,n,r){let i=Ku(t,e);if(!i)return[];let{x:a,y:o}=i,s=X(Y(t.count),1)??1,c=X(Y(t.intervalMs),0)??0,l=t.doubleTap===!0,u=X(Y(t.holdMs),1),d=[];for(let e=0;e<s;e+=1){let t=n+e*c;if(u!==void 0&&u>0){d.push(Uu(t,a,o,u,r));continue}d.push(Hu(t,a,o,r)),l&&d.push(Hu(t+90,a,o,r))}return d}function Lu(e,t,n,r){let i=Ku(t,e);if(!i)return[];let{x:a,y:o}=i;return[Hu(n,a,o,r)]}function Ru(e,t,n,r,i){let a=Ku(t,e);if(!a)return[];let{x:o,y:s}=a;return[Uu(n,o,s,Cu(r,[Y(t.durationMs),Y(e[2])],800),i)]}function zu(e,t,n,r,i){let a=qu(t,e);if(!a)return[];let{x1:o,y1:s,x2:c,y2:l}=a,u=Cu(r,[Y(t.effectiveDurationMs),Y(t.durationMs)],250),d=X(Y(t.count),1)??1,f=X(Y(t.pauseMs),0)??0,p=t.pattern===`ping-pong`?`ping-pong`:`one-way`;return Array.from({length:d},(e,t)=>{let{startX:r,startY:a,endX:d,endY:m}=Bu(t,p,o,s,c,l);return Tu(n+t*(u+f),r,a,d,m,u,{referenceFrame:i})})}function Bu(e,t,n,r,i,a){return t===`ping-pong`&&e%2==1?{startX:i,startY:a,endX:n,endY:r}:{startX:n,startY:r,endX:i,endY:a}}function Vu(e,t,n,r,i){let a=qu(t,e),o=Gu(t.contentDirection)??Gu(t.direction);if(!a||!o)return[];let{x1:s,y1:c,x2:l,y2:u}=a,d=Cu(r,[],250),f=Y(t.amount)??Y(e[1]),p=Y(t.pixels);return[{kind:`scroll`,tMs:n,x:s,y:c,x2:l,y2:u,...i,durationMs:d,contentDirection:o,...f===void 0?{}:{amount:f},...p===void 0?{}:{pixels:p}}]}function Hu(e,t,n,r){return{kind:`tap`,tMs:e,x:t,y:n,...r}}function Uu(e,t,n,r,i){return{kind:`longpress`,tMs:e,x:t,y:n,...i,durationMs:r}}function Wu(e,t){let n=Y(t.referenceWidth),r=Y(t.referenceHeight);return n!==void 0&&n>0&&r!==void 0&&r>0?{referenceWidth:n,referenceHeight:r}:bu(e)}function Gu(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();switch(t){case`up`:case`down`:case`left`:case`right`:return t;default:return}}function X(e,t){if(e===void 0)return;let n=Math.floor(e);return n>=t?n:void 0}function Ku(e,t,n=0){let r=Y(e.x)??Y(t[n]),i=Y(e.y)??Y(t[n+1]);if(r!==void 0&&i!==void 0)return{x:r,y:i}}function qu(e,t){let n=Ju(e.x1,e.x,t[0]),r=Ju(e.y1,e.y,t[1]),i=Ju(e.x2,t[2]),a=Ju(e.y2,t[3]);if(n!==void 0&&r!==void 0&&i!==void 0&&a!==void 0)return{x1:n,y1:r,x2:i,y2:a}}function Ju(...e){return e.map(Y).find(e=>e!==void 0)}var Yu=e({dispatchGenericCommand:()=>Xu});async function Xu(e){let{req:t,ref:n,logPath:r,sessionStore:i,contextFromFlags:a}=e,o=i.requireCurrent(n),s=t.command,c=await nd(o,s,e.androidObservation);if(c.response)return c.response;let l=await $u({sessionRef:n,req:t,session:o,sessionName:e.sessionName,logPath:r,sessionStore:i,contextFromFlags:a,command:s,flags:t.flags});if(`response`in l)return l.response;let u=await td(o,s,e.androidObservation);if(`response`in u)return u.response;let d=t.positionals??[],f=e.recordedRequest??{positionals:d,flags:t.flags??{}},p=Date.now(),m=i.requireCurrent(n),h={...a(t.flags,m.appBundleId,m.trace?.outPath),surface:m.surface};return Qo(t)===`may-invalidate`&&Tr(m),await Zu({req:t,ref:n,sessionStore:i,command:s,resolvedPositionals:d,recorded:f,data:await e.executePlatformCommand({session:m,sessionName:e.sessionName,logPath:r,command:s,request:t,positionals:d,out:t.flags?.out,dispatchContext:h}),actionStartedAt:p,readinessWarnings:[c.warning,u.status===`recovered`?u.warning:void 0],observeSettle:l.observe,androidObservation:e.androidObservation})}async function Zu(e){let{req:t,ref:n,sessionStore:r,command:i}=e,a=await td(r.requireCurrent(n),i,e.androidObservation,`after-command`);if(`response`in a)return a.response;let o=Qu(e.data,e.readinessWarnings);if(rd({ref:n,sessionStore:r,command:i,resolvedPositionals:e.resolvedPositionals,recorded:e.recorded,data:o,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),flags:t.flags??{},clientArtifactPaths:t.meta?.clientArtifactPaths}),Sr({session:r.requireCurrent(n),command:i,positionals:e.resolvedPositionals,flags:t.flags}),e.observeSettle){let t=await e.observeSettle();t&&(o={...o??{},settle:t})}return{ok:!0,data:o??{}}}function Qu(e,t){let n=t.filter(e=>typeof e==`string`&&e.length>0);if(n.length===0||e&&typeof e!=`object`)return e;let r=e&&typeof e.warning==`string`&&e.warning.length>0?[e.warning]:[];return{...e??{},warning:[...r,...n].join(` `)}}async function $u(e){return!He(e.command)||!ed(e.flags)?{}:(await import(`../generic-settle.js`)).planGenericSettleObservation(e)}function ed(e){return e?.settle===!0||e?.settleQuietMs!==void 0}async function td(e,t,n,r=`before-command`){if(e.device.platform!==`android`||!qo(t)||mt(e.device))return{status:`clear`};try{return await Zl({session:e,command:t,phase:r,observation:n})}catch(e){return{response:{ok:!1,error:i(e)}}}}async function nd(e,t,n){if(e.device.platform!==`android`||mt(e.device)||!e.screenRecording||t===`record`)return{};let r=await Xl({session:e,observation:n});return r.status===`failed`?{response:{ok:!1,error:{code:`COMMAND_FAILED`,message:`Android system dialog blocked the recording session`}}}:r.status===`unknown`?{warning:r.warning}:{}}function rd(e){let{ref:t,sessionStore:n,command:r,resolvedPositionals:i,recorded:a,data:o,actionStartedAt:s,actionFinishedAt:c,flags:l,clientArtifactPaths:u}=e,d=n.requireCurrent(t);Au(d,r,i,ju(d,r,i,o),l,s,c),n.recordAction(t,{command:r,positionals:a.positionals,flags:a.flags,result:dt({command:r,meta:{clientArtifactPaths:u}},o??{})})}function id(e){let t=e.now??Date.now,n=e.undurableCleanupTtlMs??3e5,r=new Map;return Object.freeze({blockUndurableCleanup(e,i){let a=D(e);r.set(ae(a),{device:a,reason:i,expiresAt:t()+n})},clearUndurableCleanup(e){r.delete(ae(D(e)))},assertStartAllowed(n){let i=ae(D(n)),o=r.get(i);if(o){if(t()>o.expiresAt){r.delete(i),e.onUndurableCleanupExpired?.({device:o.device,reason:o.reason});return}throw new a(`COMMAND_FAILED`,`The existing ${e.displayName.toLowerCase()} resource has process-local unconfirmed ownership`,{reason:`cleanup-unconfirmed`,hint:`Do not start a replacement in this daemon process: ${o.reason}`})}}})}function ad(){return id({displayName:`audio probe`})}function od(){return id({displayName:`perf capture`})}function sd(){return id({displayName:`screen recording`})}const cd={humanControl:Z({load:()=>import(`../human-control.js`),run:dd}),lease:Z({load:()=>import(`../lease.js`),run:fd}),session:Z({load:()=>import(`../session2.js`),run:pd}),snapshot:Z({load:()=>import(`../snapshot4.js`),run:md}),reactNative:Z({load:()=>import(`../react-native.js`),run:hd}),recordTrace:Z({load:()=>import(`../record-trace.js`),run:gd}),find:Z({load:()=>import(`../interaction.js`),run:_d}),interaction:Z({load:()=>import(`../interaction.js`),run:vd}),generic:Z({load:async()=>Yu,run:async()=>null})};async function ld(e){let t=Io(e.req.command);return await cd[t].run(e)}async function ud(){return await cd.generic.loadModule()}async function dd({handleHumanControlCommand:e},t){return await e({req:t.req,registry:t.leaseRegistry})}async function fd({handleLeaseCommands:e},t){return Q(t.req.command,`lease`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,providerRuntimeIds:t.providerRuntimeIds,providerRuntimeRequiredIds:t.providerRuntimeRequiredIds,providerCredentials:t.providerCredentials,leaseLifecycleProvider:t.leaseLifecycleProvider,cloudArtifactProvider:t.cloudArtifactProvider}))}async function pd({handleSessionCommands:e},t){return Q(t.req.command,`session`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,leaseLifecycleProvider:t.leaseLifecycleProvider,providerAppCatalog:t.providerAppCatalog,invoke:t.invoke,invokeReplayAction:t.invokeReplayAction,androidAdbExecutor:t.providerScope.androidAdbExecutor,bindDevice:t.bindDevice,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:t.reconcileOrphanedDeviceClaim,appLogAdmissionLedger:t.appLogAdmissionLedger,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,perfCaptureAdmissionLedger:t.perfCaptureAdmissionLedger,screenRecordingAdmissionLedger:t.screenRecordingAdmissionLedger,hostDiagnostics:t.hostDiagnostics,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,platformResourceCleanup:t.platformResourceCleanup}))}async function md({handleSnapshotCommands:e},t){return Q(t.req.command,`snapshot`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup}))}async function hd({handleReactNativeCommands:e},t){return Q(t.req.command,`react-native`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice}))}async function gd({handleRecordTraceCommands:e},t){return Q(t.req.command,`record-trace`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,bindDevice:t.bindDevice,bindExactDevice:t.bindExactDevice,admissionLedger:t.screenRecordingAdmissionLedger,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled}))}async function _d({handleFindCommands:e},t){return Q(t.req.command,`find`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,invoke:t.invoke,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice}))}async function vd({handleInteractionCommands:e},t){return Q(t.req.command,`interaction`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,androidObservation:t.androidObservation}))}function Z(e){let t=yd(e.load);return{loadModule:t,run:async n=>await e.run(await t(),n)}}function yd(e){let t;return()=>(t??=e(),t)}function Q(e,t,n){if(n)return n;throw new a(`UNKNOWN`,`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`,{hint:`This is a daemon-internal routing bug in agent-device — please report it.`})}function bd(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function xd(e,t,n={}){return e.session.screenRecording?wd(e.address,t):Ed(e,t,n)}function Sd(e,t,n={}){return p(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:xd(e,`device-in-use`,n)})}function Cd(e,t,n={}){return p(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:Td(e.address,n)})}function wd(e,t){let n=Tn(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function Td(e,t){let n=Tn(e);return`${Dd(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${Od(t)}Run agent-device session list to inspect active sessions.`}function Ed(e,t,n){let r=e.address,i=Tn(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+kd(e,n):`${Dd(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${Od(n)}`.trimEnd()}function Dd(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function Od(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function kd(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function Ad(e,t){let{address:n,session:r}=e,i=jd(r,t);if(i.length!==0)throw new a(`INVALID_ARGS`,`Session "${n}" is already bound to ${bd(r)}, but this request selected ${i.map(Md).join(`, `)}.`,{session:n,conflicts:i.map(Md),hint:xd(e,`selector-conflict`,{offersPlatformSession:i.some(e=>e.key===`platform`)})})}function jd(e,t){if(!t)return[];let n=[],r=e.device,i=t.platform;if(i&&!pe(r,i)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(r.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!k(r)||t.udid!==r.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!ce(r.platform)||t.serial!==r.id)&&n.push({key:`serial`,value:t.serial}),t.device&&!O(r,t.device)&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=r.simulatorSetPath?.trim();(!k(r)||r.kind!==`simulator`||e!==i)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=ai(t.androidDeviceAllowlist);(r.platform!==`android`||!e.has(r.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function Md(e){return`${Nd(e.key)}=${e.value}`}function Nd(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const Pd=`default`,Fd=new Set(de);function Id(e,t,n={}){let r=e.session||Pd;if(Hd(e))return r;let i=zd(e);return i.kind===`cwd`?Wd(e,t,i.id,n):r}function Ld(e){return e.session||Pd}function Rd(e){let t=zd(e);return t.kind===`cwd`?t:void 0}function zd(e){if(e.meta?.sessionIsolation===`tenant`||e.flags?.sessionIsolation===`tenant`){let t=e.meta?.tenantId;if(!t)throw new a(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:t}}if(Hd(e)||(e.session||Pd)!==Pd)return{kind:`named-local`};let t=nf(e.meta?.cwd);return t?{kind:`cwd`,id:tf(t)}:{kind:`global-default`}}function Bd(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function Vd(e,t){let n=Rd(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function Hd(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function Ud(e,t){return`cwd:${e}:${t}`}function Wd(e,t,n,r){let i=Xd(t,n),a=Zd(e);return a?Gd(e,t,n,a,i,r):Yd(n,i,r)}function Gd(e,t,n,r,i,a){let o=Ud(n,r);if(t.get(o))return o;let s=Jd(e.flags,r),c=i.map(e=>({ref:e,conflicts:jd(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?($d(a,l.map(e=>e.ref)),o):Kd(c)?.address??o}function Kd(e){return e.find(e=>!qd(e.conflicts))?.ref}function qd(e){return e.some(e=>e.key===`platform`)}function Jd(e,t){return{...e,platform:t}}function Yd(e,t,n){let[r]=t;return r&&t.length===1?r.address:($d(n,t),Ud(e,Pd))}function Xd(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function Zd(e){return Qd(e.flags?.platform)??Qd(e.meta?.lockPlatform)}function Qd(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return Fd.has(t)?t:void 0}function $d(e,t){if(t.length>1&&e.attachesToSession===!0)throw ef(t)}function ef(e){let t=e.map(e=>e.address),n=e.map(e=>E(e.session.device)),r=n.map(e=>`--platform ${e}`).join(` or `);return new a(`AMBIGUOUS_MATCH`,`This workspace has ${e.length} implicit sessions (${t.join(`, `)}); select one explicitly.`,{sessions:t,platforms:n,hint:`Run agent-device session list to inspect them. Add ${r} to run in that platform's session, or pass --session <address> copied from that list.`})}function tf(e){return Li.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function nf(e){if(!e||e.trim().length===0)return;let t=rf(e);return af(t)??t}function rf(e){let t=B.resolve(e);try{return R.realpathSync.native(t)}catch{return t}}function af(e){let t=e;for(;;){if(R.existsSync(B.join(t,`.git`)))return t;let e=B.dirname(t);if(e===t)return;t=e}}const of=new Set([`udid`,`serial`,`device`]);function sf(e){return of.has(e.key)}function cf(e,t){let n=e.meta?.lockPolicy;if(!n)return e;let r={...e.flags??{}},i=Ko(e.command),o=i?[]:t?jd(t.session,r):mf(r,e.meta?.lockPlatform),s=e.meta?.lockPlatform;if(o.length===0)return ff(i,t,r,s)&&(r.platform=s),{...e,flags:r};let c=o.filter(sf);if(n===`strip`&&c.length===0)return pf(r,o,s,t?.session),{...e,flags:r};throw new a(`INVALID_ARGS`,uf(e,o,t),{session:t?.address??e.session,conflicts:o.map(Md),...lf(c,t?.session),hint:df(e,t,c)})}function lf(e,t){return e.length===0?{}:{requestedDevice:Object.fromEntries(e.map(e=>[e.key,e.value])),...t?{boundDevice:{platform:t.device.platform,name:t.device.name,id:t.device.id}}:{}}}function uf(e,t,n){let r=t.map(Md).join(`, `);if(n)return`Session "${n.address}" is already bound to ${bd(n.session)}, but ${e.command} selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:``;return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}function df(e,t,n){if(t)return xd(t,`selector-conflict`);let r=e.meta?.lockPlatform,i=e.session?` --session ${Tn(e.session)}`:``,a=r?`Run agent-device open <app>${i} --platform ${r} first if no session is active. `:`Run agent-device open <app>${i} first if no session is active. `;return n.length>0?`Remove ${n.map(Md).join(`, `)} and rerun to use the session-lock device, or drop --session so this command binds to the device you selected. `+a+`Run agent-device session list to inspect active sessions.`:`Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. `+a+`Run agent-device session list to inspect active sessions.`}function ff(e,t,n,r){return!r||t||n.platform!==void 0?!1:!e||!Rl(n)}function pf(e,t,n,r){if(r){xf(e,t),e.platform=E(r.device);return}xf(e,t),n&&e.platform===void 0&&(e.platform=n)}function mf(e,t){let n=[],r=t;return e.platform!==void 0&&r&&oe(e.platform,r)&&n.push({key:`platform`,value:e.platform}),r?(hf(n,e,r),_f(n,e,r),n):n}function hf(e,t,n){let r=t.target;r&&gf(r,n)&&e.push({key:`target`,value:r})}function gf(e,t){switch(t){case`android`:case`harmonyos`:case`ios`:return e===`desktop`;case`vega`:return e!==`tv`;case`macos`:case`linux`:case`web`:return e!==`desktop`;case`apple`:return!1;default:return Sf(t)}}function _f(e,t,n){for(let r of vf(n,t)){let n=t[r];zl(n)&&e.push({key:r,value:n})}}function vf(e,t){if(yf(e))return[`udid`,`iosSimulatorDeviceSet`];switch(e){case`vega`:return[`udid`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];case`ios`:return[`serial`,`androidDeviceAllowlist`];case`apple`:return bf(t)?[`udid`,`serial`,`androidDeviceAllowlist`,`iosSimulatorDeviceSet`]:[`serial`,`androidDeviceAllowlist`];case`macos`:case`linux`:case`web`:return[`udid`,`serial`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];default:return Sf(e)}}function yf(e){return e===`android`||e===`harmonyos`}function bf(e){return e.target===`desktop`||e.platform===`macos`}function xf(e,t){for(let n of t)delete e[n.key]}function Sf(e){throw Error(`Unhandled lock platform: ${String(e)}`)}const Cf=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;function wf(e,t){let n=e.files[t];if(n===void 0)throw new a(`INVALID_ARGS`,`replay script source is missing ${t}; it was not part of the script sources sent with this request.`,{path:t,entry:e.entry});return n}function Tf(e){let t=tt(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return Of(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function Ef(e,t){return t===`ios`?kf(e)??{}:{}}function Df(e,t){let n=Tf(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function Of(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!y(e))}function kf(e){let t=Hl(e);return t?{appleSimulatorAppTarget:t}:void 0}async function Af(e){if(e.command!==`replay`||e.flags?.replayFrom!==void 0)return;let t=e.flags?.replayScriptSource;if(t)return Nf(async()=>{let n=t.entry,r=wf(t,n);return ft(n,e.flags?.replayBackend)===`maestro`?await jf(r,n,e.flags):Mf(r,e.flags)})}async function jf(e,t,n){let{inspectMaestroFlow:r}=await import(`../src8.js`).then(e=>e.t),i=r(e,t);return{flags:n??{},options:Ef(i.appTarget,n?.platform)}}function Mf(e,t){let n=Gi(e,t),r=Tf(n.actions);if(!r.appTarget)return;let i=Df(t,n.actions),a=i.platform??n.metadata.platform;return{flags:a&&i.platform===void 0?{...i,platform:a}:i,options:a===`ios`?kf(r.appTarget):void 0}}async function Nf(e){try{return await e()}catch{return}}function Pf(e,t){return Gf([Uf(e),Wf(t)])}async function Ff(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i)return{keys:Pf(n,i.device.id),deviceId:i.device.id};let a=new Set([Uf(n)]),o=await zf(t);return o&&a.add(Wf(o.id)),{keys:Gf(a),deviceId:o?.id}}function If(e){let{existingRef:t}=e;return{req:cf(e.req,t),existingRef:t}}function Lf(e){if(!e.meta?.lockPolicy)return e;try{return cf(e)}catch{return e}}async function Rf(e){return e.command===`open`?Bf(e):e.command===`replay`?await Vf(e):Hf(e)}async function zf(e){let t=await Rf(Lf(e));if(t)try{return await ct(t.flags,t.options)}catch{return}}function Bf(e){let t=Vl(e.positionals?.[0]);return t?{flags:e.flags??{},options:t}:void 0}async function Vf(e){return await Af(e)??Hf(e)}function Hf(e){return Ll(e.flags)?{flags:e.flags??{},options:{}}:void 0}function Uf(e){return`session:${e}`}function Wf(e){return`device:${e}`}function Gf(e){return Array.from(e).sort((e,t)=>{let n=Kf(e)-Kf(t);return n===0?e.localeCompare(t):n})}function Kf(e){return+!e.startsWith(`session:`)}function qf(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[n]=bt(`waitMs`);if(!n)throw new a(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return b(t,`waitMs`,{min:n.min,max:n.max})}function Jf(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function Yf(e){return{...Jf(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function Xf(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return Qf({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function Zf(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function Qf(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=qt.fromTimeoutMs(a),s=()=>Zf(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;er({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await Gt(Math.min(250,o.remainingMs())),Jn(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};$f(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function $f(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}function ep(e){let{locks:t,initialKeys:n}=e,r=new Set(n),i=new Map,a=!1,o=async()=>{let e=[...i.values()];for(let t of e)t.release();await Promise.all(e.map(async e=>await e.completion)),i.clear()};return{run:async e=>{if(a)throw Error(`Request execution locks cannot run the same scope concurrently.`);a=!0;try{return await tp(t,n,e)}finally{try{await o()}finally{a=!1}}},retainDevice:async e=>{if(!a)throw Error(`A device execution lock can only be retained by a running request.`);let n=`device:${e}`;if(r.has(n))return;let o=i.get(n);o||(o=np(t,n),i.set(n,o)),await o.acquired}}}async function tp(e,t,n){let[r,...i]=t;return r?await En(e,r,async()=>await tp(e,i,n)):await n()}function np(e,t){let n=()=>{},r=()=>{},i=new Promise(e=>{n=e}),a=new Promise(e=>{r=e});return{acquired:i,completion:En(e,t,async()=>{n(),await a}),release:r}}function rp(e,t,n){let r=x();if(!t.ok){C({level:`error`,phase:`request_failed`,data:{code:t.error.code,message:t.error.message}});let e=S({force:!0});return{ok:!1,error:i(new a(f(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??(typeof t.error.details?.hint==`string`?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath,diagnosticsRecord:t.error.diagnosticsRecord,retriable:t.error.retriable??(typeof t.error.details?.retriable==`boolean`?t.error.details.retriable:void 0),supportedOn:t.error.supportedOn??(typeof t.error.details?.supportedOn==`string`?t.error.details.supportedOn:void 0)}),{diagnosticId:r.diagnosticId,logPath:e?.path,diagnosticsRecord:e?.ref})}}return C({level:`info`,phase:`request_success`}),S(),{ok:!0,data:ip(e,t.data,n)}}function ip(e,t,n){if(!t)return t;let r=ap(e,t);return r.length===0?t:{...t,artifacts:r.map(t=>{let r=t.path;return{field:t.field,...t.artifactType===void 0?{}:{artifactType:t.artifactType},artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,artifactType:t.artifactType,fileName:t.fileName,...Mt(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),fileName:t.fileName,localPath:t.localPath}})}}function ap(e,t){let n=Array.isArray(t.artifacts)?[...t.artifacts]:[];return e.command===`screenshot`&&!(e=>n.some(t=>t?.field===e))(`path`)&&typeof t.path==`string`&&n.push({field:`path`,artifactType:`screenshot`,path:t.path,localPath:e.meta?.clientArtifactPaths?.path,fileName:B.basename(e.meta?.clientArtifactPaths?.path??t.path),...Mt(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),n.filter(e=>!!(e&&typeof e.field==`string`&&typeof e.path==`string`&&(typeof e.localPath==`string`&&e.localPath.length>0||e.field===`fallbackScreenshotPath`&&e.artifactType===`screenshot`)))}async function op(e,t){let n=e.requireCurrent(t);if(!sp(n))return;let r=n.screenRecording,i=r.handle,a=await wr.observeRunnerSession(n.device.id);if(e.resolveCurrent(t)?.screenRecording!==r)return;let o=i.inspect();if(!o.runnerSessionId){a?.alive&&i.setRunnerSessionId(a.sessionId);return}if(!a?.alive){i.invalidate(`iOS runner session exited during recording`);return}a.sessionId!==o.runnerSessionId&&i.invalidate(`iOS runner session restarted during recording`)}function sp(e){let t=e.screenRecording?.handle.inspect();return!t||!k(e.device)?!1:t.backend===`runner AVAssetWriter`&&t.showTouches!==!1}async function cp(e){let{leaseRegistry:t,req:n,task:r}=e,i=n.internal?.admittedLease;if(!i)return await r();let a=n.meta?.requestId,o=t.retainLeaseWork(i,()=>!Yn(a));try{return await(Jo(n)?t.runDeviceMutation(i,r):r())}finally{o.release()}}const lp={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},up=new Map;async function dp(e){let t=await V.mkdtemp(B.join(zi.tmpdir(),`agent-device-materialized-`));try{let n=await gp(e.installablePath,B.join(t,`installable`)),r=e.archivePath?await gp(e.archivePath,B.join(t,`archive`)):void 0,i=Li.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{mp(i)},a);return up.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await V.rm(t,{recursive:!0,force:!0}),e}}async function fp(e,t){await hp(e,cr(up,e,t,lp))}async function pp(e){let t=Array.from(up.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await hp(e,t)}))}async function mp(e){let t=up.get(e);if(t)try{await hp(e,t)}catch{}}async function hp(e,t){clearTimeout(t.timer),up.delete(e),await V.rm(t.rootPath,{recursive:!0,force:!0})}async function gp(e,t){let n=await V.stat(e);await V.mkdir(t,{recursive:!0});let r=B.join(t,B.basename(e));return n.isDirectory()?(await V.cp(e,r,{recursive:!0}),r):(await V.copyFile(e,r),r)}function _p(e){return e.device.platform===`web`}function vp(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function yp(e){let t=e.sessionStore.refresh(e.ref);if(!t.session.appLog)return;let{forceCleanupSessionAppLog:n}=await import(`../app-log-session-resource.js`).then(e=>e.r);await n({...e,ref:t})}async function bp(e){let t=li(e.sessionStore,e.ref);t.read()&&await $r({binding:t,intent:`disposal`})}async function xp(e,t){await t.stopSnapshotHelper(e.device)}async function Sp(e){let{ref:t,sessionStore:n,platformCleanup:r}=e,i=n.resolveCurrent(t)??t.session,a=t.address;await r.closeManagedBrowser({device:i.device,sessionName:a,stateDir:n.resolveDaemonStateDir(),openSessionNames:()=>vp(n)})}async function Cp(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function wp(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),n=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return C({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:n}}),new a(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${n.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function Tp(e){let{ref:t,sessionStore:n}=e,r=n.resolveCurrent(t)??t.session,i=t.address;if(!e.platformCleanup)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let o=e.platformCleanup,s=[{step:`recording`,run:()=>Ep({ref:t,sessionStore:n})},...e.appLog===`run`?[{step:`app_log`,run:()=>yp({ref:t,sessionStore:n})}]:[],{step:`audio_probe`,run:()=>Dp({ref:t,sessionStore:n})},{step:`perf_capture`,run:()=>bp({ref:t,sessionStore:n})},{step:`platform_snapshot_helper`,run:()=>xp(r,o)},{step:`web_browser`,run:()=>Sp({ref:t,sessionStore:n,platformCleanup:o})}];s.push({step:`materialized_paths`,run:()=>pp(i)});let c=wp({sessionName:i,phase:`session_teardown_cleanup_failed`,failures:await Cp(s)});if(c)throw c}async function Ep(e){let t=ui(e.sessionStore,e.ref);t.read()&&await di({binding:t,intent:`disposal`})}async function Dp(e){let t=ci(e.sessionStore,e.ref);t.read()&&await Yr({binding:t,intent:`disposal`})}async function Op(e){let{inspectFacts:t,bind:n,session:r,stateDir:i,runtimeHints:a}=e,o={...Mp(r,i),...e.daemonShutdown?{daemonShutdown:!0}:{}};if(!Np(r,a)){let e=xe;jp(await t(r.device),e.required,r),await(await n(r.device,e)).operations.finalizeApplicationClose(o);return}let s=je;jp(await t(r.device),s.required,r);let c=await n(r.device,s);await c.operations.finalizeApplicationClose(o),await c.operations.clearRuntimeHints({appId:r.appBundleId,values:a})}async function kp(e){await Op({...e,bind:e.bindDevice})}async function Ap(e){let{gateway:t,scope:r,session:i,stateDir:a,runtimeHints:o}=e,s;try{await Op({inspectFacts:async e=>await t.inspectFacts(e),bind:async(e,n)=>(s??=await t.bind({device:e,intent:{kind:`ordinary`},scope:r}),Oe(s,n)),session:i,stateDir:a,runtimeHints:o,...e.daemonLeaving===!1?{}:{daemonShutdown:!0}})}catch(e){try{await s?.[Symbol.asyncDispose]()}catch(t){r.diagnostics.emit({level:`error`,phase:`daemon_lifecycle_binding_cleanup_failed`,data:{session:i.name,error:n(t),operationError:n(e)}})}throw e}await s?.[Symbol.asyncDispose]()}function jp(e,t,n){for(let r of t){let t=e.operations[r];if(!t?.available)throw new a(`UNSUPPORTED_OPERATION`,`Session lifecycle ${r} is not supported on this device.`,{reason:t?.reason,...t?.hint===void 0?{}:{hint:t.hint},deviceId:n.device.id})}}function Mp(e,t){return{appBundleId:e.appBundleId,surface:e.surface??`app`,retainRunner:!1,stateDir:t}}function Np(e,t){return e.appBundleId!==void 0&&Ir(t)}function Pp(e){return k(e)&&e.kind===`simulator`}function Fp(e){return e.platform===`android`&&e.kind===`emulator`}const Ip=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Lp(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Rp(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function zp(e){return Ir(Rp(e))}function Bp(e,t){if(e!==void 0){if(typeof e!=`string`)throw new a(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return bn(e)}}function Vp(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new a(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Hp(e){if(e!==void 0){if(typeof e!=`number`)throw new a(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Vp(e)}}function Up(e,t,n){if(e===void 0)return n;if(!d(e))throw new a(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(n&&e!==n)throw new a(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${n}.`);return e}function Wp(e){if(d(e))return e}function Gp(e,t){return{platform:t,metroHost:bn(e?.metroHost),metroPort:Vp(e?.metroPort),bundleUrl:bn(e?.bundleUrl),launchUrl:bn(e?.launchUrl)}}function Kp(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function qp(e){if(Fp(e))return`10.0.2.2`;if(Pp(e))return`127.0.0.1`}function Jp(e,t){if(!e||bn(e.metroHost)||bn(e.bundleUrl)||e.metroPort===void 0)return e;let n=qp(t);return n?{...e,metroHost:n}:e}function Yp(e){let{runtime:t,sessionName:n,platform:r}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`open runtime must be an object.`);let i=t,o=Object.keys(i).find(e=>!Ip.includes(e));if(o)throw new a(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Ip.join(`, `)}.`);return{platform:Up(i.platform,n,r),metroHost:Bp(i.metroHost,`metroHost`),metroPort:Hp(i.metroPort),bundleUrl:Bp(i.bundleUrl,`bundleUrl`),launchUrl:Bp(i.launchUrl,`launchUrl`)}}function Xp(e,t,n){if(n){if(Lp(n)===0){e.setRuntimeHints(t,void 0);return}return e.setRuntimeHints(t,n),n}}function Zp(e,t,n,r){let i=e.getRuntimeHints(t);if(!i)return;let o=n?E(n):void 0,s=Wp(o)??r;if(i.platform&&n&&!s)throw new a(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(i.platform&&s&&i.platform!==s)throw new a(`INVALID_ARGS`,`Session runtime hints target ${i.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&i.platform!==s?{...i,platform:s}:i}function Qp(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Wp(E(i)):e.platform,o=n.getRuntimeHints(r),s=Yp({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Zp(n,r,i,a);return{runtime:i?Jp(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Lp(s)>0?s:void 0;return{runtime:i?Jp(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function $p(e){return Qp(e).runtime}function em(e){try{return{ok:!0,data:Qp(e)}}catch(e){let n=t(e);return p(n.code,n.message,n.details)}}async function tm(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!nm(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Rp(t)})}function nm(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&zp(e.previousRuntime)&&!zp(e.runtime)}function rm(e){let{device:t,owner:n,stateDir:r,intent:i}=e,a=i.kind===`exact-owner`&&qe(i.owner,n)?Ne(i.fence):null;if(!a)return{status:`binding-invalid`};let o=Ur(ti(t)),s=qr(Wr(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!am(c.stateDir,r)||!qe(Kr(c),n)?{status:`conflict`,conflict:s}:c.allocator.identityIncarnationId===a.identityIncarnationId?{status:`covered`}:{status:`incarnation-stale`,heldIncarnationId:c.allocator.identityIncarnationId}}function im(e){let t=Ur(ti(e));return Hr(Wr(t))}function am(e,t){return B.resolve(e)===B.resolve(t)}function om(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=E(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=le(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${Tn(i)}`,`${a} ${Tn(e.id)}`,...n===`release`||Gr(t.classification)?[`--stale`]:[]].join(` `)}function sm(e,t){if(t.classification===`allocator-held`)return lm(e,t);let n=t.claim,r=om(e,t,Jr(t.classification)?`release`:`status`),i=E(n?{platform:n.device.family,appleOs:n.device.appleOs}:e);return new a(`DEVICE_IN_USE`,n?`${i} device ${e.id} is owned by session "${n.session}" in workspace "${n.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:gm(t.classification),classification:t.classification,deviceKey:t.deviceKey,...n?{owner:{session:n.session,workspace:n.workspace,stateDir:n.stateDir}}:{},recovery:{command:r},hint:Jr(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${r}`:`Inspect the owner with: ${r}`,retriable:!1})}function cm(e,t){return hm(sm(e,t))}function lm(e,t){let n=t.allocatorClaim,r=E({platform:n.device.family,appleOs:n.device.appleOs}),i=om(e,t);return new a(`DEVICE_IN_USE`,`${r} device ${e.id} is held by managed-device allocator "${n.allocator.instanceId}" for installation "${n.stateDir}".`,{reason:`DEVICE_CLAIM_ALLOCATOR_HELD`,classification:t.classification,deviceKey:t.deviceKey,owner:{kind:`allocator`,stateDir:n.stateDir,allocator:n.allocator},recovery:{command:i},hint:`This device belongs to a managed pool and is released only after its allocator proves the identity removed; inspect with: ${i}`,retriable:!1})}function um(e,t){return new a(`COMMAND_FAILED`,`${E(e)} device ${e.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:Re(t),deviceKey:Ur(ti(e)),retriable:!1,hint:`A managed identity becomes executable only after its allocator activates it and this installation holds its allocator-held claim.`})}function dm(e,t,n){return new a(`COMMAND_FAILED`,`${E(e)} device ${e.id} is held for identity incarnation "${n}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:Re(t),deviceKey:Ur(ti(e)),heldIncarnationId:n,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function fm(e,t){return new a(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:Re(t),deviceKey:Ur(ti(e)),retriable:!1})}function pm(e,t,n){switch(n.status){case`binding-invalid`:return{admitted:!1,error:fm(e,t)};case`missing`:return{admitted:!1,error:um(e,t)};case`covered`:return{admitted:!0};case`incarnation-stale`:return{admitted:!1,error:dm(e,t,n.heldIncarnationId)};case`conflict`:return{admitted:!1,error:sm(e,n.conflict)}}}function mm(e,t,n){let r=pm(e,t,n);return r.admitted?void 0:hm(r.error)}function hm(e){let{hint:t,retriable:n,...r}=e.details??{};return p(e.code,e.message,r,{hint:t,retriable:n})}function gm(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:case`allocator-inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function _m(e,t){if(t?.backend===`macos-app`)return`none`;switch(e.kind){case`local-family`:return`ordinary`;case`managed-local`:return`allocator-held`;case`provider-runtime`:return`none`}}function vm(e){let t=[];async function n(n){if(e.policy===`none`)return;let r=im(n);if(r)throw sm(n,r);if(e.policy!==`transient-exclusive`)return;let i=await Xr({device:n,command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim});if(i.status===`conflict`)throw sm(n,i.conflict);i.status===`acquired`&&t.push(i.ownership)}return{admit:async(t,r,i)=>{switch(_m(r)){case`none`:return;case`allocator-held`:{let n=pm(t,r,rm({device:t,owner:r,stateDir:e.stateDir,intent:i}));if(!n.admitted)throw n.error;return}case`ordinary`:return await n(t)}},[Symbol.asyncDispose]:async()=>{for(let n of t.splice(0))try{await Zr(n)}catch(t){C({level:`error`,phase:`transient_device_claim_release_failed`,data:{command:e.command,deviceKey:n.deviceKey,error:t instanceof Error?t.message:String(t)}})}}}}const ym=new WeakMap,bm=new WeakMap,xm=async()=>{throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})};async function Sm(e){let{sessionStore:t,leaseRegistry:n}=e,r=Em(Hc(e.req)),a=r.command,o=Date.now(),s=Vo(a),c=Id(r,t,{attachesToSession:Lo(a)!==`inventory`}),l=x(),u=t.resolveSessionDir(c),d=fn({sessionDir:u,session:c,requestId:r.meta?.requestId??l.requestId}),f=d.path,p=mn(u);w({session:c,logPath:d.path,logRecord:d.ref}),C({level:`info`,phase:`request_start`,data:{publicSession:r.session,effectiveSession:c,command:r.command,tenant:r.meta?.tenantId,isolation:r.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:p}});let m=ot(r);m&&t.recordEvent(c,ut({req:r}));try{e.daemonPolicy&&Sc(e.daemonPolicy,r),Jc(r);let i=r.command===`open`?qf(r):void 0,l=Vo(a)?await Ff({req:r,sessionName:c,sessionStore:t}):{keys:[],deviceId:void 0},u=Xf({req:r,budgetMs:i,sessionName:c,sessionStore:t,deviceId:l.deviceId});await u?.waitForDeviceOutsideLocks();let d=ep({locks:Am(n),initialKeys:l.keys}),h=fi(r),{claimAdmission:g,runtimeBindings:_}=Cm({command:a,dispatchLedger:h,workspace:r.meta?.cwd??process.cwd(),stateDir:t.resolveDaemonStateDir(),deviceRuntimeGateway:e.deviceRuntimeGateway,platformRequestScope:e.platformRequestScope,daemonPolicy:e.daemonPolicy}),v={req:r,command:a,sessionName:c,requestLogPath:f,runnerLogPath:p,startedAtMs:o,retainDeviceExecutionLock:async e=>await d.retainDevice(e),bindDevice:_?.bindDevice??xm,inspectFacts:_?.inspectFacts??xm,bindExactDevice:_?.bindExactDevice??xm,dispatchLedger:h,throwIfCanceled:()=>Jn(r.meta?.requestId),runAdmitted:async i=>{Jn(r.meta?.requestId);try{await $c({sessionName:c,sessionStore:t,leaseRegistry:n,teardownSession:async n=>await wm({ref:n,sessionStore:t,inspectFacts:v.inspectFacts,bindDevice:v.bindDevice,platformCleanup:Tm(e.platformResourceCleanup)})}),r=el({req:r,sessionName:c,sessionStore:t,leaseRegistry:n,providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy}),v.req=r;let a=r.internal?.admittedLease;return a&&await bs(a),await cp({leaseRegistry:n,req:r,task:i})}finally{s&&!Yn(r.meta?.requestId)&&t.noteSessionActivity(c)}},runLocked:async e=>(Jn(r.meta?.requestId),u?await u.runWhenDeviceIsUnheld({acquireLocks:d.run,task:async()=>await v.runAdmitted(e)}):await d.run(async()=>await v.runAdmitted(e))),[Symbol.asyncDispose]:async()=>{try{await _?.[Symbol.asyncDispose]()}finally{await g?.[Symbol.asyncDispose]()}}};return bm.set(v,e=>(m&&t.recordEvent(c,lt({req:r,response:e,durationMs:Math.max(0,Date.now()-o)})),e)),v}catch(e){throw m&&t.recordEvent(c,lt({req:r,response:{ok:!1,error:i(e,{diagnosticId:x().diagnosticId,logPath:f})},durationMs:Math.max(0,Date.now()-o)})),e}}function Cm(e){let{deviceRuntimeGateway:t,platformRequestScope:n,daemonPolicy:r}=e;if(!t||!n)return{claimAdmission:void 0,runtimeBindings:void 0};let i=vm({policy:Fe(e.command),command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:_i(n)});return{claimAdmission:i,runtimeBindings:mi({gateway:t,scope:n,dispatchLedger:e.dispatchLedger,admitDeviceClaim:i.admit,admitDevice:r?e=>Tc(r,e):void 0})}}async function wm(e){let{ref:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformCleanup:a}=e,o=n.resolveCurrent(t)??t.session,s=t.address,c=Rp(n.getRuntimeHints(t.address)),l;try{await Tp({appLog:`run`,ref:t,sessionStore:n,platformCleanup:a})}catch(e){l=e}try{await kp({inspectFacts:r,bindDevice:i,session:o,stateDir:n.resolveDaemonStateDir(),runtimeHints:c})}catch(e){if(l!==void 0)C({level:`error`,phase:`expired_session_lifecycle_cleanup_failed`,data:{session:s,error:e instanceof Error?e.message:String(e),primaryError:l instanceof Error?l.message:String(l)}});else throw e}if(l!==void 0)throw l}function Tm(e){if(!e)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);return e}function Em(e){let t={...e.flags??{}};return Je(e.command,t)?{...e,flags:t}:e}async function Dm(e){let{scope:t,sessionStore:n,trackDownloadableArtifact:r}=e,i=t.runnerLogPath;t.throwIfCanceled();let a=n.lookup(t.sessionName);a&&(await op(n,a),t.throwIfCanceled(),n.requireCurrent(a));let o=If({req:t.req,existingRef:a?n.refresh(a):void 0}),s=o.req,c=o.existingRef,l=c?.session;w({traceLogPath:l?.trace?.outPath}),bm.set(t,e=>{let i=rp(s,e,r);return ot(s)&&n.recordEvent(t.sessionName,lt({req:s,response:i,durationMs:Math.max(0,Date.now()-t.startedAtMs)})),i});let u=l?.screenRecording?.handle.inspect().invalidatedReason;if(u&&Uo(t.command))return{type:`response`,response:{ok:!1,error:{code:`COMMAND_FAILED`,message:u}}};c&&!s.meta?.lockPolicy&&Bo(t.command)&&Ad(c,s.flags);let d=(e,t,n)=>km(i,e,t,n,s.meta);return{type:`scope`,scope:{req:s,sessionName:t.sessionName,logPath:i,existingSession:l,retainDeviceExecutionLock:t.retainDeviceExecutionLock,bindDevice:t.bindDevice,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,dispatchLedger:t.dispatchLedger,throwIfCanceled:t.throwIfCanceled,contextFromFlags:d,handlerContextFromFlags:(e,r,i)=>({...d(e,r,i),surface:(a?n.resolveCurrent(a):n.get(t.sessionName))?.surface})}}}function Om(e,t){let n=bm.get(e);return bm.delete(e),n?n(t):t}function km(e,t,n,r,i){let a=x().requestId;return{...kr(e,t,n,r,a,i),requestId:a}}function Am(e){let t=ym.get(e);return t||(t=new Map,ym.set(e,t)),t}const jm=`--save-script is supported only by ${Go().join(`, `)}.`;function Mm(e){if(e.flags?.saveScript===void 0||Wo(e.command))return;C({level:`warn`,phase:`save_script_flag_rejected`,data:{command:e.command}});let t=x(),n=S({force:!0});return{ok:!1,error:i(new a(`INVALID_ARGS`,jm,{hint:`Arm publication on the session instead: open/close --save-script, replay --save-script, or session save-script to publish an armed recording without closing its session.`}),{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}const Nm=`AGENT_DEVICE_SESSION_IDLE_TIMEOUT_MS`;function Pm(e=process.env){let t=e[Nm]?.trim();if(!t)return 0;let n=Number(t);return!Number.isFinite(n)||n<=0?0:Math.max(1,Math.floor(n))}function Fm(e){return e.lastActivityAtMs??e.createdAt}function Im(e){return e.deviceClaim!==void 0&&e.lease===void 0&&e.screenRecording===void 0&&e.appLog===void 0&&e.audioProbe===void 0&&e.perfCapture===void 0&&e.trace===void 0}function Lm(e,t,n=Date.now()){return t<=0?!1:n-Fm(e)>=t}function Rm(e,t,n=Date.now()){return Im(e)&&Lm(e,t,n)}function zm(e,t){if(!(!Im(e)||t<=0))return Fm(e)+t}function Bm(e,t){return{owner:e,expiredAtMs:t.expiredAtMs,expiresAt:t.expiredAtMs+36e5,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{}}}function Vm(e,t,n=Date.now()){let r=Math.max(0,n-t.expiredAtMs);return new a(`SESSION_NOT_FOUND`,`Session "${t.owner}" expired ${Hm(r)} ago for idleness (window ${Hm(t.idleExpiryMs)}). Run open again to start a new session.`,{reason:`SESSION_IDLE_EXPIRED`,session:e,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{},hint:t.deviceKey?`Run open again to claim ${t.deviceKey} and start a new session. Set ${Nm}=0 to keep sessions open indefinitely.`:`Run open again to start a new session. Set ${Nm}=0 to keep sessions open indefinitely.`})}function Hm(e){let t=e/1e3;if(t<90)return`${Math.round(t)}s`;let n=t/60;return n<90?`${Math.round(n)}m`:`${Math.round(n/60)}h`}function Um(e,t,n){let r;for(let[i,a]of e)if(!(!a.device||ae(a.device)!==t)){if(!n(i)){e.delete(i);continue}r??=a}return r}function Wm(e={}){let t=e.markerExists??R.existsSync,n=id({displayName:`app-log`,now:e.now,undurableCleanupTtlMs:e.undurableCleanupTtlMs,onUndurableCleanupExpired:e.onUndurableCleanupExpired}),r=new Map;return Object.freeze({...n,retainLegacyMarkers(e){for(let t of e)t.device&&r.set(t.markerPath,t)},assertStartAllowed(e){let i=ae(D(e));if(Um(r,i,t))throw new a(`COMMAND_FAILED`,`A retained legacy app-log marker prevents replacement capture`,{reason:`cleanup-unconfirmed`,hint:`Inspect and remove the retained app-log.pid only after manually confirming its process is gone.`});n.assertStartAllowed(e)}})}function Gm(e){return gt(e,`focus requires x y`)}function Km(e,t){return{point:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:P(t)}}async function qm(e){let t=Gm(e.positionals);return await F({command:`focus`,device:e.device,use:Ye,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},(e,n)=>Jm(e,t,n))}async function Jm(e,t,n){return await e.operations.focusPoint(Km(t,n)),{x:t.x,y:t.y,...M(`Focused (${t.x}, ${t.y})`)}}const $=v.pendingPixelIdentityEvidence,Ym=[{target:`ios-simulator`,status:`accepted`},{target:`android-emulator`,status:`accepted`},{target:`android-device`,status:`rejected`,rejectionReason:$},{target:`macos-app-window`,status:`rejected`,rejectionReason:$},{target:`ios-physical`,status:`rejected`,rejectionReason:$},{target:`macos-helper`,status:`rejected`,rejectionReason:$},{target:`web`,status:`rejected`,rejectionReason:$},{target:`linux`,status:`rejected`,rejectionReason:$},{target:`tvos`,status:`rejected`,rejectionReason:$},{target:`harmonyos`,status:`rejected`,rejectionReason:$},{target:`vega`,status:`rejected`,rejectionReason:$}];function Xm(e,t){switch(e.platform){case`apple`:return Zm(e,t);case`android`:return e.kind===`device`?`android-device`:`android-emulator`;case`harmonyos`:return`harmonyos`;case`vega`:return`vega`;case`linux`:return`linux`;case`web`:return`web`}}function Zm(e,t){let n=T(e);switch(n){case`ios`:case`ipados`:return e.kind===`device`?`ios-physical`:`ios-simulator`;case`tvos`:return`tvos`;case`macos`:return Qm(t);case`watchos`:case`visionos`:throw $m(n)}}function Qm(e){return(e??`app`)===`app`?`macos-app-window`:`macos-helper`}function $m(e,t){return new a(`UNSUPPORTED_OPERATION`,`screenshot --crop-on is not accepted on ${e} targets`,{reason:v.targetNotAccepted,...t?{rejectionReason:t}:{}})}function eh(e){if(e.overlayRefs||e.fullscreen)throw new a(`INVALID_ARGS`,`--crop-on cannot be combined with --overlay-refs or --fullscreen: both move the captured frame away from the snapshot viewport the crop is measured against`,{reason:v.frameMismatch});try{Be(e.cropOn)}catch{throw new a(`INVALID_ARGS`,`screenshot --crop-on requires a valid selector expression`,{reason:v.selectorInvalid})}let t=Xm(e.device,e.surface),n=Ym.find(e=>e.target===t);if(!n||n.status===`rejected`)throw $m(t,n?.status===`rejected`?n.rejectionReason:void 0)}async function th(e,t){if(!nh(t))throw new a(`INVALID_ARGS`,`Screenshot crop box must be positive integer pixel offsets`);let n=await Ei(await z.readFile(e),t,`screenshot`);n!==null&&await z.writeFile(e,n)}function nh(e){return Number.isInteger(e.x)&&e.x>=0&&Number.isInteger(e.y)&&e.y>=0&&Number.isInteger(e.width)&&e.width>0&&Number.isInteger(e.height)&&e.height>0}function rh(e){switch(e){case`android`:return`device-pixels`;case`xctest`:case`macos-helper`:return`viewport-points`;default:throw new a(`UNSUPPORTED_OPERATION`,`screenshot --crop-on does not accept snapshot backend "${e??`unknown`}"`,{reason:v.targetNotAccepted})}}function ih(e,t,n,r,i){if(e===`device-pixels`||t===null)return lh(n);let a=r/t.width,o=i/t.height;return{x:Math.round((n.x-t.x)*a),y:Math.round((n.y-t.y)*o),width:Math.round(n.width*a),height:Math.round(n.height*o)}}function ah(e,t,n){let r=Math.max(e.x,0),i=Math.max(e.y,0),a=Math.min(e.x+e.width,t),o=Math.min(e.y+e.height,n);return a<=r||o<=i?null:{x:r,y:i,width:a-r,height:o-i}}function oh(e){let t=null;for(let n of e)!A(n)||!Me(n.rect)||(!t||Le(n.rect)>Le(t))&&(t=n.rect);return t||sh(e.filter(e=>Me(e.rect)&&!ch(e)))}function sh(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)Me(a.rect)&&(t=Math.min(t,a.rect.x),n=Math.min(n,a.rect.y),r=Math.max(r,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(n)||r<=t||i<=n?null:{x:t,y:n,width:r-t,height:i-n}}function ch(e){return ke(e.type??``)===`image`&&!Ee(e.label)}function lh(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}const uh=`${v.partialIntersection}: the selector frame extends past the captured image; the crop was clipped to the image frame`;function dh(e){return e?.partialIntersection?[uh]:[]}async function fh(e){let{device:t,session:n,surface:r,cropOn:i,screenshotPath:o,logPath:s,dispatchContext:c}=e,l={snapshotInteractiveOnly:!1},u=await Cr({device:t,session:n,flags:l,logPath:s,snapshotScope:void 0,captureData:async()=>await e.captureSnapshot({options:{appBundleId:c.appBundleId,interactiveOnly:!1,includeRects:!0,surface:r},execution:P(c)})}),d=On(u,l);if(d.snapshotQuality?.state===`sparse`)throw new a(`COMMAND_FAILED`,`the snapshot taken for --crop-on was sparse and cannot be read as the screen`,{reason:v.captureUnreadable});let f=await ph(d.nodes,i,d.truncated,t),p=await Di(o),m=ih(rh(d.backend),oh(d.nodes),f.rect,p.width,p.height),h=ah(m,p.width,p.height);if(h===null)throw new a(`COMMAND_FAILED`,`the frame resolved by --crop-on occupies no pixel of the capture`,{reason:v.emptyIntersection});let g=h.x!==m.x||h.y!==m.y||h.width<m.width||h.height<m.height;return await th(o,h),{partialIntersection:g}}async function ph(e,t,n,r){let i=await yt(xi.cropTarget,e,t,{platform:E(r)});if(i.kind===`ambiguous`)throw new a(`COMMAND_FAILED`,`--crop-on matched ${i.matchedNodes.length} nodes and must resolve to one`,{reason:v.targetAmbiguous,candidates:i.matchedNodes.map(e=>e.label??e.ref),matches:i.matchedNodes.length});if(i.kind===`none`)throw n?new a(`COMMAND_FAILED`,`the snapshot taken for --crop-on was truncated, so a missing match is not proven`,{reason:v.captureIncomplete}):new a(`COMMAND_FAILED`,`--crop-on matched no node: ${t}`,{reason:v.targetNotFound,hint:`find ${t} list`});return i.node}const mh=[`scroll`,`list`,`recyclerview`,`edittext`,`textfield`];function hh(e,t,n){if(e.backend!==`android`||!n.hittable||!I(n.rect)||A(n))return!1;let r=ke(n.type??``);return!(mh.some(e=>r.includes(e))||t&&ji(n.rect)>ji(t)*.25)}function gh(e,t,n,r){return!e.rect||e.hittable!==!0||n(e)||r(e)?null:_h(e,t,r)}function _h(e,t,n){let r=e.rect,i=vh(e,t,n);if(!i)return null;let a=i.y-r.y,o=r.y+r.height-(i.y+i.height);if(a<0||o<0||Math.abs(o-a)<16)return null;let s=Math.min(a,o),c=Math.round(i.y-s),l=Math.round(i.height+s*2);return l<=0||l>=r.height?null:{x:r.x,y:c,width:r.width,height:l}}function vh(e,t,n){let r=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&bh(t,e,i)&&yh(t,n)&&I(t.rect)&&Ke(r,t.rect)).map(e=>e.rect);return a.length<2?null:Ge(a)}function yh(e,t){let n=ke(e.type??``);return n.includes(`text`)||n.includes(`image`)&&t(e)}function bh(e,t,n){let r=e;for(;r.parentIndex!==void 0;){let e=n.get(r.parentIndex);if(!e)return!1;if(e.ref===t.ref)return!0;r=e}return!1}const xh=[`button`,`link`,`menu`,`tab`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];async function Sh(e){let t=await z.readFile(e.screenshotPath),n=await Ci(t,`screenshot`),r=Ch(e.snapshot,n.width,n.height,{maxRefs:e.maxRefs});for(let e of r)Mi(n,e);return await z.writeFile(e.screenshotPath,await Ti(n)),r}function Ch(e,t,n,r={}){let i=oh(e.nodes),a=new Map;for(let r of e.nodes){if(!Eh(e,i,r))continue;let o=Dh(e.nodes,r);if(!o?.rect||!I(o.rect))continue;let s=Oh(r,o,e.nodes),c=kh(r,o,s),l=jh(e,i,Th(e,o,e.nodes),t,n);if(!I(l))continue;let u=a.get(o.ref);(!u||c>u.score)&&a.set(o.ref,{ref:o.ref,label:s,rect:o.rect,overlayRect:l,score:c})}return wh(e,i,a,t,n),Ah([...a.values()]).sort(qh).slice(0,r.maxRefs??24).sort(Kh).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:l(e.overlayRect)}))}function wh(e,t,n,r,i){let a=wt(e.nodes).primaryAction;if(!a?.ref||!a.rect||!I(a.rect))return;let o=jh(e,t,a.rect,r,i);if(!I(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},c=n.get(a.ref);n.set(a.ref,c?{...c,score:Math.max(c.score,s.score)}:s)}function Th(e,t,n){return e.backend===`android`?gh(t,n,Mh,e=>!!Rh(e))??t.rect:t.rect}function Eh(e,t,n){let r=[n.label,n.value].some(Ih)||Lh(n.identifier);return hh(e,t,n)?!0:Mh(n)?r:r&&Ph(n)}function Dh(e,t){return[Nh(t)?t:null,ye(e,t,Nh),t.hittable?t:null,ye(e,t,e=>e.hittable===!0)].find(Fh)??null}function Oh(e,t,n){let r=Rh(e);return e.ref!==t.ref&&r?r:zh(t,n)||Rh(t)}function kh(e,t,n){let r=0;return e.ref===t.ref&&(r+=4),t.hittable&&(r+=3),Mh(t)&&(r+=3),Mh(e)&&(r+=2),n&&(r+=2),Lh(t.identifier)&&(r+=1),Ee(t.value)&&(r+=1),r}function Ah(e){let t=[];for(let n of e.sort((e,t)=>ji(e.overlayRect)-ji(t.overlayRect))){let e=t.findIndex(e=>e.label!==void 0&&e.label===n.label&&(Ke(e.overlayRect,n.overlayRect)||Ke(n.overlayRect,e.overlayRect)));if(e===-1){t.push(n);continue}ji(n.overlayRect)<ji(t[e].overlayRect)&&(t[e]=n)}return t}function jh(e,t,n,r,i){return Gh(ih(e.backend===`android`?`device-pixels`:`viewport-points`,t,n,r,i),r,i)}function Mh(e){let t=[e.type,e.role,e.subrole].map(e=>ke(e??``)).join(` `);return xh.some(e=>t.includes(e))}function Nh(e){return Mh(e)&&!A(e)}function Ph(e){let t=ke(e.type??``);return t.includes(`statictext`)||t.includes(`image`)||t.includes(`text`)||t.includes(`other`)}function Fh(e){return!!(e?.rect&&I(e.rect)&&!A(e))}function Ih(e){return Ee(e)?!Hh(e):!1}function Lh(e){return typeof e!=`string`||!Ih(e)?!1:!Uh(e)}function Rh(e){let t=[e.label,e.value].find(Ih);if(t)return t.trim();if(Lh(e.identifier))return e.identifier.trim()}function zh(e,t){let n=null;for(let r of t){if(r.ref===e.ref||!Bh(r,e,t))continue;let i=Rh(r);if(!i)continue;let a=Vh(r);(!n||a>n.score)&&(n={label:i,score:a})}return n?.label}function Bh(e,t,n){let r=e;for(;r.parentIndex!==void 0;){let e=n[r.parentIndex];if(!e)return!1;if(e.ref===t.ref)return!0;r=e}return!1}function Vh(e){let t=0;return ke(e.type??``).includes(`text`)&&(t+=2),Ih(e.label)&&(t+=2),Ih(e.value)&&(t+=1),t}function Hh(e){let t=e?.trim().toLowerCase();return t===`toolbar`||t===`window`||t===`application`||t?.startsWith(`vertical scroll bar`)===!0}function Uh(e){return/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(e.trim())}function Wh(e,t){return Number.parseInt(e.replace(/^\D+/,``),10)-Number.parseInt(t.replace(/^\D+/,``),10)}function Gh(e,t,n){let r=Ai(e.x,0,Math.max(0,t-1)),i=Ai(e.y,0,Math.max(0,n-1)),a=Math.max(1,t-r),o=Math.max(1,n-i);return{x:r,y:i,width:Ai(e.width,1,a),height:Ai(e.height,1,o)}}function Kh(e,t){let n=e.overlayRect.y-t.overlayRect.y;if(n!==0)return n;let r=e.overlayRect.x-t.overlayRect.x;return r===0?Wh(e.ref,t.ref):r}function qh(e,t){return t.score===e.score?Kh(e,t):t.score-e.score}function Jh(e,t){return t.available?void 0:yi(e,t)}function Yh(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}const Xh=new WeakMap;let Zh;(class e{static{Zh=(t,n)=>{let r=new e;return Xh.set(r,{device:Object.freeze({...t}),plan:n}),Object.freeze(r),r}}#e;constructor(){this.#e=void 0}get admitted(){return this.#e,!0}});function Qh(e){let t=Xh.get(e);if(t===void 0)throw new a(`COMMAND_FAILED`,`Runtime plan admission is not one minted by admitRuntimePlan; refusing to bind.`);return t}async function $h(e){let t=await Yh(e.inspectFacts)(e.device);for(let n of e.plan.use.required){let e=t.operations[n];if(!e.available)return{admitted:!1,operation:n,fact:e}}return Zh(e.device,e.plan)}function eg(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}async function tg(e){let t=Se({overlayRefs:e.overlayRefs,cropOn:e.cropOn!==void 0}),n=await $h({device:e.device,plan:t,inspectFacts:e.inspectFacts});return n.admitted?{ok:!0,runtime:await ng(e.bindDevice,n)}:{ok:!1,response:ag(t.kind,n.operation,n.fact)}}async function ng(e,t){let n=eg(e),{device:r,plan:i}=Qh(t);switch(i.kind){case`capture`:{let e=await n(r,i.use);return Object.freeze({captureScreenshot:rg(e)})}case`capture-with-overlay-refs`:case`capture-with-crop-on`:{let e=await n(r,i.use);return Object.freeze({captureScreenshot:rg(e),captureSnapshot:ig(e)})}}}function rg(e){return async t=>await e.operations.captureScreenshot(t)}function ig(e){return async t=>await e.operations.captureSnapshot(t)}function ag(e,t,n){return t===`captureScreenshot`?Jh(`screenshot`,n):e===`capture-with-crop-on`?p(`UNSUPPORTED_OPERATION`,`--crop-on crops the capture to a selector frame using a snapshot taken on the same screen, which this target cannot capture.`,{reason:n.available?void 0:n.reason},{hint:(n.available?void 0:n.hint)??`Re-run screenshot without --crop-on.`}):p(`UNSUPPORTED_OPERATION`,`--overlay-refs annotates a capture with the refs of a snapshot taken on the same screen, which this target cannot capture.`,{reason:n.available?void 0:n.reason},{hint:(n.available?void 0:n.hint)??`Re-run screenshot without --overlay-refs.`})}async function og(e){let{req:t,session:n}=e,r=_(`screenshot`,t.flags);if(r)throw new a(`INVALID_ARGS`,r);ki(n.device,t.flags?.screenshotPixelDensity);let i=pg(t),o=typeof t.flags?.screenshotCropOn==`string`&&t.flags.screenshotCropOn.length>0?t.flags.screenshotCropOn:void 0;o!==void 0&&eh({device:n.device,surface:n.surface,cropOn:o,overlayRefs:t.flags?.overlayRefs===!0,fullscreen:t.flags?.screenshotFullscreen===!0});let s=await tg({device:n.device,overlayRefs:t.flags?.overlayRefs===!0,cropOn:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!s.ok)return s;let c=s.runtime,l={warnings:[]};return{ok:!0,recorded:i.recorded,execute:async e=>await lg({session:e.session,sessionName:e.sessionName,logPath:e.logPath,dispatchContext:e.dispatchContext,flags:e.request.flags,outPath:i.outPath,runtime:c,cropOn:o,cropRun:l})}}async function sg(e){let{session:t,sessionName:n,outPath:r,dispatchContext:i}=e;return await Dr({backend:mg(e),artifacts:hg(),sessions:Er(n,t),policy:vt()}).capture.screenshot({session:n,requestId:i.requestId,appBundleId:t.appBundleId,...g(i),surface:t.surface,...r?{out:{kind:`path`,path:r}}:{}})}function cg(e){return P(e)}async function lg(e){let{session:t,runtime:n,flags:r}=e,i=ug({cropOn:e.cropOn,captureSnapshot:n.captureSnapshot,cropRun:e.cropRun,logPath:e.logPath}),a=await sg({session:t,sessionName:e.sessionName,outPath:e.outPath,dispatchContext:e.dispatchContext,captureScreenshot:n.captureScreenshot,...i?{crop:i}:{}}),o=[...a.warnings??[],...i?.run?.warnings??[]];return{...a,...o.length>0?{warnings:o}:{},...await dg({session:t,cropOn:e.cropOn,captureSnapshot:n.captureSnapshot,screenshotPath:a.path,logPath:e.logPath,dispatchContext:e.dispatchContext}),...await Oi({device:t.device,path:a.path,requestedPixelDensity:r?.screenshotPixelDensity,scale:r?.screenshotScale})}}function ug(e){let{cropOn:t,captureSnapshot:n,cropRun:r}=e;if(t!==void 0&&n!==void 0&&r!==void 0)return{cropOn:t,captureSnapshot:n,run:r,logPath:e.logPath}}async function dg(e){let{session:t,cropOn:n,captureSnapshot:r}=e;return n!==void 0||r===void 0?{}:{overlayRefs:await fg({session:t,logPath:e.logPath,screenshotPath:e.screenshotPath,dispatchContext:e.dispatchContext,captureSnapshot:r})}}async function fg(e){let{session:t,dispatchContext:n}=e,r={snapshotInteractiveOnly:!0},i=await Cr({device:t.device,session:t,flags:r,logPath:e.logPath,snapshotScope:void 0,captureData:async()=>await e.captureSnapshot({options:{appBundleId:t.appBundleId,interactiveOnly:!0,surface:t.surface},execution:cg(n)})}),a=On(i,r);return Or(t,a),await Sh({screenshotPath:e.screenshotPath,snapshot:a})}function pg(e){let t=e.positionals??[],n=e.flags??{},r=t=>t===void 0?void 0:dn(t,e.meta?.cwd),i=r(t[0]),a=r(n.out);return{outPath:i??a,recorded:{positionals:i?[i,...t.slice(1)]:t,flags:a?{...n,out:a}:n}}}function mg(e){let{session:t,dispatchContext:n,captureScreenshot:r,crop:i}=e;return{platform:E(t.device),captureScreenshot:async(e,a,o)=>{let s=g({...n,...ee(o)}),c=await r({outPath:a,options:{appBundleId:n.appBundleId,pixelDensity:s.pixelDensity,fullscreen:s.fullscreen,normalizeStatusBar:s.normalizeStatusBar,stabilize:s.stabilize,surface:o?.surface,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck??(k(t.device)&&t.device.kind===`simulator`),captureBackend:n.screenshotCaptureBackend},execution:cg(n)});if(i){let e=await fh({device:t.device,session:t,surface:t.surface,cropOn:i.cropOn,screenshotPath:a,logPath:i.logPath,dispatchContext:n,captureSnapshot:i.captureSnapshot});i.run.warnings.push(...dh(e))}return c.displayRotation?{displayRotation:c.displayRotation}:void 0}}}function hg(){return{resolveInput:async()=>{throw new a(`UNSUPPORTED_OPERATION`,`screenshot does not resolve input artifacts`)},reserveOutput:async e=>{let t,n;return e?.kind===`path`?n=e.path:(t=await z.mkdtemp(B.join(zi.tmpdir(),`agent-device-screenshot-`)),n=B.join(t,`screenshot.png`)),await z.mkdir(B.dirname(n),{recursive:!0}),{path:n,visibility:`client-visible`,publish:async()=>void 0,...t?{cleanup:async()=>{await z.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await z.mkdtemp(B.join(zi.tmpdir(),`${e.prefix}-`));return{path:B.join(t,`file${e.ext}`),visibility:`internal`,cleanup:async()=>{await z.rm(t,{recursive:!0,force:!0})}}}}}function gg(e){if(e===`down`)return`bottom`;if(e===`up`)return`top`}async function _g(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=await i(r),{analyzeScrollEdgeState:a}=await import(`../selection.js`),o=a(e,t,n);return r&&o.emptySnapshot?await _g({edge:t,target:n,captureNodes:i}):o}catch(e){throw Dg(t,r,e)}}async function vg(e,t,n={}){let{analyzeScrollEdgeState:r}=await import(`../selection.js`);return r(e,t,n)}async function yg(e,t){return(await vg(e,t)).canScroll}async function bg(e,t){let{analyzeScrollEdgeState:n}=await import(`../selection.js`);return n(e,t).fingerprint??``}function xg(e){if(e.length<4)return!1;let t=e.slice(-6);if(new Set(t).size>2)return!1;let n=t.at(-1);return n!==void 0&&t.slice(0,-1).includes(n)}function Sg(e,t,n){t&&(e.push(t),e.length>n&&e.shift())}async function Cg(e){let{edge:t,captureState:n,scroll:r,settleAfterPass:i=async()=>{}}=e,o=await n();o.scope&&(o=await n(o.scope));let s=0,c,l=[];for(Sg(l,o.fingerprint,6);o.canScroll;){if(s>=40)throw new a(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{reason:`scroll_edge_pass_limit`,edge:t,passes:s,hint:`The scoped scroll container still reports hidden content. Run scroll <dir> --until <selector> to stop on the element you are after, or snapshot -i to inspect the current state.`});if(c=await r(),s+=1,await i(),o=await n(o.scope),Sg(l,o.fingerprint,6),o.canScroll&&xg(l))throw Tg(t,s)}return{passes:s,result:c}}function wg(e){let{direction:t,edge:n,passes:r,amount:i,pixels:a,honoredPixels:o,movement:s}=e;if(n&&r===0)return`Already at ${n}; no hidden content ${n===`bottom`?`below`:`above`} detected`;if(n)return`Scrolled to ${n} with ${r} ${t} passes`;let c=gg(t);return s===`at-edge`&&c?`Scrolled ${t} and no hidden content ${c===`bottom`?`below`:`above`} was detected`:s===`unchanged`?`Scrolled ${t} and the visible content did not change`:a===void 0?i===void 0?`Scrolled ${t}`:o===void 0?`Scrolled ${t} by ${i}`:`Scrolled ${t} by ${i} of the viewport (${o}px)`:`Scrolled ${t} by ${o??a}px`}function Tg(e,t){let n=`${t} ${t===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} moved nothing across ${n}: the container still reports hidden content but its contents never shifted`,{reason:`scroll_edge_no_progress`,edge:e,passes:t,hint:Eg({targetDirectly:`with scroll <dir> --until <selector>`})})}function Eg(e={}){let t=`The scroll is not reaching this container. If a field is focused, dismiss the keyboard first; if it is nested inside another scroller, ${e.targetDirectly===void 0?`target it directly`:`target it directly ${e.targetDirectly}`}.`;return e.rawDrag===!1?t:t+` Some lists ignore synthesized scrolls — a raw drag moves them: swipe x1 y1 x2 y2 started inside the list.`}function Dg(e,t,n){return t?new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},n):new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},n)}async function Og(e){let{selector:t,direction:n,platform:r,capture:i,scroll:o}=e,s=e.passLimit??12,c=gg(n),l=0,u,d=[],f=!1;try{for(;;){if((await kg({captured:await i(),selector:t,direction:n,platform:r,edge:c,passes:l,passLimit:s,recentSignatures:d})).visible)return{passes:l,...u===void 0?{}:{result:u}};f=!0,u=await o(),f=!1,l+=1}}catch(e){throw l===0&&!f&&e instanceof a?h(e,`no`):e}}async function kg(e){let{captured:t,selector:n,direction:r,platform:i,edge:a,passes:o,passLimit:s,recentSignatures:c}=e,l=Mg(t);if(l)throw Fg(r,n,l);let u=t.nodes??[];if(await jg(u,n,i))return{visible:!0};if(a&&!await yg(u,a))throw Ng(r,n,`edge-reached`,o);if(o>=s)throw Ng(r,n,`pass-limit`,o);if(a&&(Sg(c,await bg(u,a),6),xg(c)))throw Pg(r,n,o);return{visible:!1}}function Ag(e,t,n){return n===0?`${t} was already visible; no ${e} scroll needed`:`Scrolled ${e} ${n} ${n===1?`pass`:`passes`} until ${t} was visible`}async function jg(e,t,n){let r=await yt(xi.wait,e,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[],a=j(e);return i.some(e=>Pe({predicate:`visible`,node:e,visibility:a,platform:n}).pass)}function Mg(e){let t=e.nodes;if(t===void 0)return{reason:`no-capture`,detail:`the capture returned no accessibility tree`};if(t.length===0)return{reason:`no-capture`,detail:`the capture returned an empty accessibility tree`};let n=Ct({backend:e.backend,nodes:t,...e.quality?{snapshotQuality:e.quality}:{}});if(n)return{reason:`sparse-tree`,detail:n.reason??`the capture backend reported a sparse tree`}}function Ng(e,t,n,r){let i=`${r} ${r===1?`pass`:`passes`}`;return n===`edge-reached`?new a(`COMMAND_FAILED`,`scroll ${e} reached the end of the scrollable content after ${i} without ${t} becoming visible`,{reason:`scroll_until_edge_reached`,selector:t,direction:e,passes:r,hint:`The content ends here, so no further ${e} scroll can reveal it. Run snapshot -i to see what is on screen, scroll the opposite direction, or check the selector — the element may be on another screen.`}):new a(`COMMAND_FAILED`,`scroll ${e} spent its ${r}-pass budget without ${t} becoming visible`,{reason:`scroll_until_pass_limit`,selector:t,direction:e,passes:r,hint:`Raise the step with an amount (scroll ${e} 0.8 --until <selector>), or run snapshot -i to confirm the selector matches something on this screen.`})}function Pg(e,t,n){let r=`${n} ${n===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} moved nothing across ${r}: the on-screen content never shifted`,{reason:`scroll_until_no_progress`,selector:t,direction:e,passes:n,hint:Eg()})}function Fg(e,t,n){return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} could not read the screen: ${n.detail}`,{reason:`scroll_until_capture_unreadable`,selector:t,direction:e,captureRefusal:n.reason,hint:n.reason===`no-capture`?`Run snapshot -i to see whether the app is producing an accessibility tree at all, and retry once it does.`:`The accessibility tree came back sparse, so its refs and selectors are not trustworthy. Run screenshot, inspect the image, and navigate by coordinates until snapshot -i reports a full tree.`})}const Ig={intervalMs:200,budgetMs:1500};function Lg(e){return se(e.device)?e.flags?.postGestureStabilization===!1?{kind:`declined`,reason:`caller-declined-observation`}:e.flags?.settle===!0?{kind:`declined`,reason:`settle-observer-owns-outcome`}:zg(e.session):{kind:`declined`,reason:`non-swipe-platform`}}function Rg(e){if(!e||e.nodes.length===0)return;let t=mr(e.nodes);if(t.length!==0)return{signature:t,presentationKey:e.presentationKey,comparisonKey:hr(e),nodes:e.nodes}}function zg(e){let t=Rg(e.snapshot);return t?_r(e)===`active`?jr(e)?{kind:`unobservable`,reason:`prior-gesture-unsettled`}:{kind:`observe`,baseline:t}:{kind:`unobservable`,reason:`stored-surface-not-current`}:{kind:`unobservable`,reason:`stored-surface-unusable`}}async function Bg(e){let{direction:t,baseline:n,swipe:r}=e,i=await Hg(n,e);switch(i.kind){case`moved`:return await Yg({...i,direction:t,baseline:n,swipe:r});case`blind`:return n_(t,i.reason,{swipe:r});case`settled`:return await Xg({...i,direction:t,baseline:n,swipe:r})}}function Vg(e,t){if(e.presentationKey!==t.presentationKey)return`baseline-presentation-drift`;if(e.comparisonKey!==t.comparisonKey)return`capture-lineage-drift`}async function Hg(e,t){let n,r,i=await si({capture:async()=>{let n=await Gg(e,t.capture);return n.kind===`changed`&&(r??=await Wg(e,t.direction,t.swipe)),n},schedule:{intervalMs:t.pollMs??Ig.intervalMs,budgetMs:t.budgetMs??Ig.budgetMs},verdict:e=>{if(e.kind===`blind`)return{kind:`done`,result:{kind:`blind`,reason:e.reason}};let t=Ug(e,{previous:n,changeNeedsRest:r===!0});return n=e.observed.signature,t?{kind:`done`,result:t}:{kind:`continue`}},...t.clock?{clock:t.clock}:{}}),a=i.polls.length;if(i.kind===`failed`)throw i.error;if(i.kind!==`done`)return Kg(t,a,i.waitedMs);let o=Date.now()-i.waitedMs;return i.result.kind===`blind`?i.result:{...i.result,attempts:a,startedAt:o}}function Ug(e,t){let n=qg(t.previous,e.observed.signature);if(e.kind===`changed`)return!t.changeNeedsRest||n?{kind:`moved`,observed:e.observed}:void 0;if(n)return{kind:`settled`,observed:e.observed,evidence:e.evidence}}async function Wg(e,t,n){let r=gg(t);if(!r)return!1;let i=await vg(e.nodes,r,{point:n.midpoint}),a=i.containerRect!==void 0&&!i.canScroll;return a&&C({level:`debug`,phase:`scroll_movement_edge_rest_required`,data:{direction:t,containerRect:i.containerRect}}),a}async function Gg(e,t){let n=await Jg(t);if(!n)return{kind:`blind`,reason:`capture-unreadable`};let r=Vg(e,n);if(r)return{kind:`blind`,reason:r};let i=Ar(e.signature,n.signature);return i===`changed`?{kind:`changed`,observed:n}:{kind:`unchanged`,observed:n,evidence:i}}function Kg(e,t,n){return C({level:`warn`,phase:`scroll_movement_budget_expired`,data:{direction:e.direction,attempts:t,durationMs:n,...e.swipe.pixels===void 0?{}:{requestedPixels:e.swipe.pixels}}}),{kind:`blind`,reason:`surface-unsettled`}}function qg(e,t){return e!==void 0&&br(e,t)}async function Jg(e){let t;try{t=await e()}catch{return}let n=On(t,void 0);return{signature:mr(n.nodes),presentationKey:n.presentationKey,comparisonKey:hr(n),nodes:n.nodes}}async function Yg(e){let{direction:t,baseline:n,swipe:r,observed:i}=e,a=gg(t),o=a?(await vg(i.nodes,a)).containerRect:void 0;return o&&!xr(n.signature,i.signature,o)?n_(t,`change-outside-container`,{swipe:r,containerRect:o}):r_(t,`moved`,r,e.attempts,e.startedAt)}async function Xg(e){let{direction:t,baseline:n,observed:r,evidence:i,swipe:a}=e,o=Zg(n,r,i);return o?n_(t,o.reason,{swipe:a,divergence:o.divergence}):await Qg(e)}function Zg(e,t,n){if(n===`ambiguous`)return{reason:`no-comparable-content`};if(!gr(e.signature,t.signature))return{reason:`surface-divergence`,divergence:vr(e.signature,t.signature)}}async function Qg(e){let{direction:t,observed:n,swipe:r}=e,i=gg(t);if(!i)return r_(t,`unchanged`,r,e.attempts,e.startedAt);let a=await vg(n.nodes,i),o=a.containerRect;if(!o)return n_(t,`no-scroll-container`,{swipe:r});if(r.midpoint&&!$g(o,r.midpoint))return n_(t,`container-outside-swipe`,{swipe:r,containerRect:o});if(a.canScroll)throw e_(t,i,r,o);return r_(t,`at-edge`,r,e.attempts,e.startedAt)}function $g(e,t){return Ce(e,t.x,t.y)}function e_(e,t,n,r){let i=new a(`COMMAND_FAILED`,`scroll ${e} moved nothing: the container still reports hidden content ${t===`bottom`?`below`:`above`} and its contents never shifted`,{reason:`scroll_no_progress`,direction:e,hiddenContentAt:t,containerRect:r,...n.pixels===void 0?{}:{requestedPixels:n.pixels},hint:Eg({targetDirectly:`with scroll ${e} --until <selector>`,rawDrag:n.midpoint!==void 0})});return h(i,`unknown`)}function t_(e,t){C({level:`debug`,phase:`scroll_movement_not_applicable`,data:{direction:e,reason:t}})}function n_(e,t,n){return C({level:`info`,phase:`scroll_movement_unobserved`,data:{direction:e,reason:t,...n.swipe.pixels===void 0?{}:{requestedPixels:n.swipe.pixels},...n.divergence??{},...n.containerRect===void 0?{}:{containerRect:n.containerRect}}}),`unobserved`}function r_(e,t,n,r,i){return C({level:t===`moved`?`debug`:`info`,phase:`scroll_movement_observed`,data:{direction:e,movement:t,attempts:r,durationMs:Date.now()-i,...n.pixels===void 0?{}:{requestedPixels:n.pixels}}}),t}function i_(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:$e(e)}}function a_(e,t,n){if(e!==void 0&&!Number.isFinite(e))throw new a(`INVALID_ARGS`,`scroll amount must be a number`);Et(n),At({amount:e,pixels:t})}async function o_(e){let t=e.positionals[0],n=e.positionals[1]?Number(e.positionals[1]):void 0,r=e.context.pixels,i=e.context.durationMs,o=e.context.until;if(!t)throw new a(`INVALID_ARGS`,`scroll requires direction`);a_(n,r,i);let s=i_(t),c={...s.edge===void 0?{}:{edge:s.edge},...o===void 0?{}:{until:o}};Dt(c);let l=Ot({amount:n,pixels:r,durationMs:i},s.edge),u=De(c),d={command:`scroll`,device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice};switch(u.kind){case`direction`:{let t=Lg({device:e.device,flags:e.flags,session:e.session});return await F({...d,use:u.use},async(e,n)=>await c_(e,s,l,n,t))}case`edge`:{let e=u.edge;return await F({...d,unavailableResponse:t=>s_(`scroll ${e}, which verifies hidden content before scrolling,`,t.hint),use:u.use},async(t,n)=>await f_(t,e,s,l,n))}case`until`:{let t=u.until;return await F({...d,unavailableResponse:e=>s_(`scroll --until, which checks whether the selector became visible,`,e.hint),use:u.use},async(n,r)=>await p_(n,e.device,t,s,l,r))}}}function s_(e,t){return p(`UNSUPPORTED_OPERATION`,`${e} requires snapshot support`,void 0,t===void 0?void 0:{hint:t})}async function c_(e,t,n,r,i){let a=await h_(e,t,n,r)??{};return __(t,n,1,a,await l_(e,t.direction,r,i,a))}async function l_(e,t,n,r,i){if(r.kind===`declined`){t_(t,r.reason);return}let a=e.operations.captureSnapshot;if(!a){t_(t,`owner-without-capture`);return}return r.kind===`unobservable`?n_(t,r.reason,{swipe:d_(i)}):await Bg({direction:t,baseline:r.baseline,swipe:d_(i),capture:async()=>await a(u_(n))})}function u_(e,t){return{options:{...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...t},execution:P(e)}}function d_(e){let t=jt(e),n=kt(e);return{...t===void 0?{}:{midpoint:t},...n===void 0?{}:{pixels:n}}}async function f_(e,t,n,r,i){let a,o=await Cg({edge:t,captureState:async n=>{let r=await m_(e,t,n,i);return a=r.scope??a,r},scroll:async()=>await h_(e,n,r,i),settleAfterPass:async()=>{await g_(async()=>(await e.operations.captureSnapshot(u_(i,{scope:a}))).nodes??[],t)}});return __(n,r,o.passes,o.result??{})}async function p_(e,t,n,r,i,a){let o=await Og({selector:n,direction:r.direction,platform:E(t),capture:async()=>await e.operations.captureSnapshot(u_(a)),scroll:async()=>await h_(e,r,i,a)});return St({direction:r.direction,until:n,passes:o.passes,...i.amount===void 0?{}:{amount:i.amount},...i.pixels===void 0?{}:{pixels:i.pixels},...o.result??{}},Ag(r.direction,n,o.passes))}async function m_(e,t,n,r){return await _g({edge:t,scope:n,captureNodes:async t=>(await e.operations.captureSnapshot(u_(r,{scope:t}))).nodes??[]})}async function h_(e,t,n,r){return await e.operations.scrollDirection(v_(t.direction,n,r))}async function g_(e,t,n=1200,r=120){let i,a=Date.now()+n;for(;Date.now()<a;){let n=await bg(await e(),t);if(n===i)return;i=n,await new Promise(e=>setTimeout(e,r))}}function __(e,t,n,r,i){let a=Tt(r),o=kt(r);return St({direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...a===void 0?{}:{durationMs:a},...r,...i===void 0?{}:{movement:i}},wg({direction:e.direction,edge:e.edge,passes:n,amount:t.amount,pixels:t.pixels,honoredPixels:o,...i===void 0?{}:{movement:i}}))}function v_(e,t,n){return{direction:e,options:t,...n.appBundleId===void 0?{}:{target:{appBundleId:n.appBundleId}},execution:P(n)}}async function y_(e){let t=te(e.positionals),n=await bi({command:`viewport`,device:e.device,use:we,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?{ok:!1,response:n.response}:{ok:!0,execute:async()=>(await n.runtime.operations.setViewport(t),{...t,message:`Viewport set: ${t.width}x${t.height}`})}}function b_(e,t){return{mode:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:P(t)}}async function x_(e){return await F({command:`back`,device:e.device,use:Ie,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},S_)}async function S_(e,t){return await e.operations.back(b_(t.backMode,t)),{action:`back`,mode:t.backMode??`in-app`,...M(`Back`)}}const C_={home:{use:Xe,message:`Home`},"app-switcher":{use:We,message:`Opened app switcher`},"action-button":{use:ve,message:`Pressed Action Button`}};function w_(e){return Object.hasOwn(C_,e)}function T_(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:P(e)}}async function E_(e,t){let n=C_[e];return await F({command:e,device:t.device,use:n.use,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice},async(t,r)=>{let[i]=n.use.required;return await t.operations[i](T_(r)),{action:e,...M(n.message)}})}function D_(e){return Nt(e[0])}function O_(e,t){return{rotation:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:P(t)}}async function k_(e){let t=D_(e.positionals);return await F({command:`orientation`,device:e.device,use:be,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},(e,n)=>A_(e,t,n))}async function A_(e,t,n){let r=(await e.operations.setOrientation(O_(t,n)))?.orientation;return r?{action:`orientation`,orientation:r,...M(`Rotated to ${r}`)}:{action:`orientation`,orientation:t,confirmed:!1,warning:`Requested ${t}; the device owner reported no resulting orientation, so the rotation is unconfirmed.`,...M(`Rotation requested: ${t} (unconfirmed)`)}}function j_(e){return Pt(e[0])}async function M_(e){let t=e.keyframes===void 0?{pose:j_(e.positionals)}:It({pose:e.positionals[0],keyframes:Ft(e.keyframes)});return await F({command:`fold`,device:e.device,use:Ze,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},e=>N_(e,t))}async function N_(e,t){let n=await e.operations.setFoldPose(t),r=n.screen;return{action:`fold`,pose:n.pose,hingeAngleDegrees:n.hingeAngleDegrees,...r?{screen:r}:{},...M(r?`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°, ${r.display} native panel ${r.widthPt}x${r.heightPt}pt, not snapshot coordinates); refs from before the pose change are stale`:`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°); refs from before the pose change are stale`)}}function P_(e){if(e.length!==1)throw new a(`INVALID_ARGS`,`tv-remote requires exactly one button`);return Jt(e[0])}function F_(e,t,n){return{button:e,durationMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:P(n)}}async function I_(e){let t=P_(e.positionals),n=e.durationMs===void 0?void 0:_t(e.durationMs,`durationMs`,0,1e4);return await F({command:`tv-remote`,device:e.device,use:Te,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},(e,r)=>L_(e,t,n,r))}async function L_(e,t,n,r){return await e.operations.tvRemote(F_(t,n,r)),{action:`tv-remote`,button:t,...n===void 0?{}:{durationMs:n},...M(`Pressed TV remote ${t}`)}}async function R_(e){if(w_(e.req.command))return await E_(e.req.command,{device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});switch(e.req.command){case`screenshot`:return await og(e);case`focus`:return await qm({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`scroll`:return await o_({device:e.session.device,positionals:e.req.positionals??[],context:e.context,session:e.session,flags:e.req.flags,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`viewport`:return await y_({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`back`:return await x_({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`orientation`:return await k_({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`fold`:return await M_({keyframes:e.req.flags?.keyframes,device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`tv-remote`:return await I_({device:e.session.device,positionals:e.req.positionals??[],durationMs:e.req.flags?.durationMs,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});default:return{ok:!1,response:p(`COMMAND_FAILED`,`${e.req.command} has no runtime execution on the generic route`,{reason:`generic-route-runtime-missing`})}}}async function z_(e,n,r){let i=Ae(e);try{let e=await r();if(!e||e.ok)return e;let t=B_(i,e.error.details,n);return t===e.error.details?e:{...e,error:{...e.error,details:t}}}catch(e){let r=t(e),a=B_(i,r.details,n);throw a===r.details?e:(r.details=a,r)}}function B_(e,t,n){return n.dispatchedSteps>0?s(t,n.dispatchedSteps):e===void 0?t:e===`observes-app`?t?.dispatched===`no`?t:{...t,dispatched:`no`}:t?.dispatched===void 0?{...t,dispatched:`unknown`}:t}function V_(e){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,dispatched:`no`}}}}function H_(e){return h(t(e),`no`)}const U_=new Proxy({},{get(){return async()=>{throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`)}}});function W_(){return new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`)}const G_=Object.freeze({stopSnapshotHelper:async()=>{throw W_()},closeManagedBrowser:async()=>{throw W_()},cleanupSessionlessExecutionHost:async()=>{throw W_()},retainExecutionHostAfterClose:()=>{throw W_()}});function K_(e){let{logPath:t,token:n,requestPlatformProviders:r=J_,deviceRuntimeGateway:i,appLogAdmissionLedger:a=Wm(),audioProbeAdmissionLedger:o=ad(),perfCaptureAdmissionLedger:s=od(),screenRecordingAdmissionLedger:c=sd(),hostDiagnostics:l,providerRuntimeIds:u,providerRuntimeRequiredIds:d,providerCredentials:f,leaseLifecycleProvider:p,cloudArtifactProvider:m,providerAppCatalog:h,androidObservation:g=U_,platformResourceCleanup:_=G_,providerDeviceRuntimeScope:v,trackDownloadableArtifact:ee,daemonPolicy:y}=e,{sessionStore:b,leaseRegistry:te}=e,x=y?Oc(e.deviceInventoryGateways,y):e.deviceInventoryGateways;async function S(e){let n=Date.now(),r=!!(e.meta?.debug||e.flags?.verbose);return await ne({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{let t=await Wt(q_(e),async()=>await re(e));return t.ok?dv(e,t,n):{ok:!1,error:uv(sv(e,ov(e,t.error,b),b))}})}async function re(e){if(!nn(e.token,n))return X_();ev(e);let t=Q_(e);if(t)return t;let r=$_(e);if(r)return r;let a=Mm(e);if(a)return a;let o,s,c=gi(e);try{s=await oi({...x,requestScope:c},async()=>await st(async()=>(o=await Sm({req:e,sessionStore:b,leaseRegistry:te,deviceRuntimeGateway:i,platformRequestScope:c,platformResourceCleanup:_,providerAppCatalog:h,daemonPolicy:y}),await w(o))))}catch(e){s=iv(e)}return C(e,o,await av(o,s))}function C(e,t,n){let r=t?b.lookup(t.sessionName)?.session:void 0;return Kc(t?.req??e,te,r,y)?ws(e.command,n):n}async function w(e,t){let n=async()=>{let n=await Dm({scope:e,sessionStore:b,trackDownloadableArtifact:ee});if(n.type===`response`)return n.response;let i=n.scope,a=async e=>{let n=async()=>await ie({lockedScope:i,providerScope:e,allowReplayActions:t===void 0});return v?await v(n):await n()};if(t)return await a(t);let o=Y_(i);if(!r.hasConfiguredResolvers&&!o)return await a({});let s=await Ul({req:i.req,existingSession:i.existingSession,useDefaultWebProvider:o});return s?await r.run(s,a):await a({})};return t?await e.runAdmitted(n):await e.runLocked(n)}async function ie(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e;return await z_(t.req,t.dispatchLedger,async()=>await T({lockedScope:t,providerScope:n,allowReplayActions:r}))}async function T(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e,{dispatchLedger:i}=t,v=gi(t.req);return await ld({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:b,leaseRegistry:te,leaseLifecycleProvider:p,providerRuntimeIds:u,providerRuntimeRequiredIds:d,providerCredentials:f,cloudArtifactProvider:m,providerAppCatalog:h,invoke:pi(S,i),invokeReplayAction:r?pi(E(t,n),i):void 0,providerScope:n,androidObservation:g,platformResourceCleanup:_,bindDevice:t.bindDevice,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:_i(v),appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,screenRecordingAdmissionLedger:c,hostDiagnostics:l,requestScope:v,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,contextFromFlags:t.handlerContextFromFlags})||await tv({lockedScope:t,logPath:t.logPath,sessionStore:b,androidObservation:g})}function E(e,t){return async r=>{if(!rv(r,e))return await S(r);if(!nn(r.token,n))return X_();ev(r);let a,o;try{let n=nv(r,e);a=await Sm({req:n,sessionStore:b,leaseRegistry:te,deviceRuntimeGateway:i,platformRequestScope:gi(n),platformResourceCleanup:_,providerAppCatalog:h,daemonPolicy:y}),o=a.sessionName===e.sessionName?await w(a,t):await w(a)}catch(e){o=iv(e)}return await av(a,o)}}return S}function q_(e){let t=e.meta?.developerDir;return typeof t==`string`?{DEVELOPER_DIR:t}:void 0}const J_=Object.freeze({hasConfiguredResolvers:!1,run:async(e,t)=>await t({})});function Y_(e){return e.existingSession!==void 0&&_p(e.existingSession)||e.req.flags?.platform===`web`}function X_(){return{ok:!1,error:i(new a(`UNAUTHORIZED`,`Invalid token`))}}function Z_(){return p(`INVALID_ARGS`,`--record and --no-record are mutually exclusive; pass at most one.`)}function Q_(e){if(e.flags?.record&&e.flags?.noRecord)return Z_();if(e.flags?.recordAs!==void 0&&e.command!==`fill`)return p(`INVALID_ARGS`,`--record-as is supported only by fill.`)}function $_(e){if(e.flags?.snapshotCustomActions===!0&&e.flags?.snapshotRaw===!0)return p(`INVALID_ARGS`,`--actions and --raw are mutually exclusive: custom actions are only readable through the private-AX snapshot path, which a raw capture does not use.`)}function ev(e){e.command===`fill`&&typeof e.flags?.recordAs==`string`&&re(pt({ts:0,command:`fill`,positionals:e.positionals??[],flags:e.flags}))}async function tv(e){let{lockedScope:t,logPath:n,sessionStore:r,androidObservation:i}=e,a=r.lookup(t.sessionName);if(!a)return u();let o=r.requireCurrent(a),s=await R_({req:t.req,session:o,context:t.contextFromFlags(t.req.flags,o.appBundleId,o.trace?.outPath),inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(!s.ok)return V_(s.response);let{dispatchGenericCommand:c}=await ud();return await c({req:t.req,ref:a,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags,executePlatformCommand:s.execute,androidObservation:i,...s.recorded?{recordedRequest:s.recorded}:{}})}function nv(e,t){if(e.command!==`open`)return e;let n=e.internal?.retainDeviceExecutionLock;return{...e,internal:{...e.internal,retainDeviceExecutionLock:async e=>{await t.retainDeviceExecutionLock(e),await n?.(e)}}}}function rv(e,t){return e.session===t.sessionName&&Ho(e.command)}function iv(e){C({level:`error`,phase:`request_failed`,data:{error:e instanceof Error?e.message:String(e)}});let t=x(),n=S({force:!0});return{ok:!1,error:i(e,{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}async function av(e,t){if(!e)return t;let n=t;try{await e[Symbol.asyncDispose]()}catch(e){t.ok?n=iv(e):(C({level:`error`,phase:`request_binding_cleanup_failed`,data:{primaryCode:t.error.code,cleanupError:e instanceof Error?e.message:String(e)}}),S({force:!0}))}return Om(e,n)}function ov(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=cv(e,n);if(r===void 0)return t;let o=n.readRepairTombstone(r);if(!o)return t;let s=o.sourcePath?`re-run: replay ${o.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return o.commitFailure?i(new a(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${e.session}" completed, but committing its healed script failed at teardown: ${o.commitFailure.message}. ${s}.`)):i(new a(`REPAIR_SESSION_EXPIRED`,`The --save-script repair session "${e.session}" was reaped before it was finalized (idle-reap); ${s}.`))}function sv(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=lv(e,n);return r?i(Vm(r.owner,r)):t}function cv(e,t){try{return Id(Hc(e),t,{attachesToSession:!1})}catch{return}}function lv(e,t){let n=cv(e,t);if(n!==void 0)try{return t.readIdleExpiryTombstone(n)}catch{return}}function uv(e){let t=e.retriable??o(e.code);return t===void 0?e:{...e,retriable:t}}function dv(e,t,n){let r=fv(e,t);if(!e.meta?.includeCost)return r;let i=mv(t.data,n);return{ok:!0,data:{...r.data??{},cost:i}}}function fv(e,t){let n=e.meta?.responseLevel??`default`;if(n==="default")return t;let r=Nl[e.command];return r?{ok:!0,data:r(t.data??{},n)}:t}const pv=[`ios_runner_command_send`,`ios_runner_readiness_preflight`];function mv(e,t){let n={wallClockMs:Date.now()-t,runnerRoundTrips:ie(pv)},r=e?.nodes;return Array.isArray(r)&&(n.nodeCount=r.length),n}function hv(e){let t=5e3;return e.screenRecording&&(t+=11e3),_p(e)&&(t+=3e4),t}function gv(e){e.destroyConnections?.();let t=`closeAllConnections`in e?e.closeAllConnections:void 0;if(typeof t==`function`){t.call(e);return}let n=`closeIdleConnections`in e?e.closeIdleConnections:void 0;typeof n==`function`&&n.call(e)}async function _v(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{gv(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function vv(e=process.env){let t=e.AGENT_DEVICE_DAEMON_IDLE_TIMEOUT_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function yv(e){return e.toArray().some(e=>!bv(e))}function bv(e){return it(e)}function xv(e){return e.toArray().some(e=>!!e.screenRecording)}function Sv(e){return e.inFlightRequestCount>0||yv(e.sessionStore)?!1:!xv(e.sessionStore)}function Cv(e){let t=vv(e.env),n,r=()=>Sv({sessionStore:e.sessionStore,inFlightRequestCount:e.getInFlightRequestCount()}),i=()=>{n&&=(clearTimeout(n),void 0)},a=()=>{i(),!(t<=0)&&(n=setTimeout(()=>{if(n=void 0,r()){if(e.hasRetainedLeases()){a();return}C({level:`info`,phase:`daemon_idle_reap`,data:{idleMs:t}}),e.onIdleReap()}},t),n.unref?.())};return{noteActivity:()=>{r()?a():i()},cancel:i,idleMs:t}}const wv=`claim-clear-failed`,Tv=Object.freeze({deleted:!0,absent:!0,"ownership-changed":!0,unattributable:!1}),Ev=2147483647;function Dv(e){let{sessionStore:t,idleExpiryMs:n}=e,r=e.now??Date.now,i,a=!1,o=!1,s=new Set,c=new Map,l=()=>{i&&=(clearTimeout(i),void 0)},u=()=>{o=!0,l()},d=()=>{let e,r=new Set;for(let i of t.listRefs()){r.add(i.address);let t=zm(i.session,n);if(t===void 0)continue;let a=c.get(i.address),o=a===void 0?t:Math.max(t,a);(e===void 0||o<e)&&(e=o)}for(let e of c.keys())r.has(e)||c.delete(e);return e},f=()=>{if(l(),o||n<=0||a)return;let e=r(),t=d();if(t===void 0)return;let s=Math.max(0,t-e),c=s>Ev;i=setTimeout(()=>{i=void 0,c?f():p()},Math.min(s,Ev)),i.unref?.()},p=async()=>{a=!0;let t=async()=>{try{await Ov({...e,now:r,retryNotBeforeMs:c,settling:s,closing:()=>o,notifyExpired:e.onSessionExpired})}catch(e){C({level:`warn`,phase:`session_idle_expiry_sweep_failed`,data:{idleExpiryMs:n,error:e instanceof Error?e.message:String(e)}})}};try{await(e.withinDiagnosticsScope?e.withinDiagnosticsScope(t):t())}finally{a=!1,f()}};return{noteSessionsChanged:f,cancel:u,idleExpiryMs:n}}async function Ov(e){for(let t of e.sessionStore.listRefs())if(Im(t.session)){if(e.closing())return;await kv({...e,ref:t})}}async function kv(e){let{address:t}=e.ref;if(e.settling.has(t)){e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs);return}let n=Pf(t,e.ref.session.device.id),r=Mv({...e,lockKeys:n}),i=e.settleBudgetMs?.(e.ref.session);if(i===void 0)return void await r;let a=jv(i);try{if(await Promise.race([r,a.promise])!==Av)return}finally{a.cancel()}C({level:`warn`,phase:`session_idle_expiry_settle_timeout`,data:{session:t,idleExpiryMs:e.idleExpiryMs,settleBudgetMs:i,...e.ref.session.deviceClaim?{deviceKey:e.ref.session.deviceClaim.deviceKey}:{}}}),e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}const Av=Symbol(`session-idle-settle-budget-elapsed`);function jv(e){let t;return{promise:new Promise(n=>{t=setTimeout(()=>n(Av),e),t.unref?.()}),cancel:()=>clearTimeout(t)}}async function Mv(e){let{address:t,session:n}=e.ref;e.settling.add(t);let r;try{r=await tp(e.executionLocks,e.lockKeys,async()=>{if(e.closing())return Nv;let t=e.sessionStore.resolveCurrent(e.ref);if(!t||t.device.id!==n.device.id)return Nv;let r=e.now();return Rm(t,e.idleExpiryMs,r)?{outcome:await Fv({ref:e.sessionStore.refresh(e.ref),idleExpiryMs:e.idleExpiryMs,expiredAtMs:r,sessionStore:e.sessionStore,settleSession:e.settleSession}),retry:!0}:Nv}),r.retry?Pv(e,t,r.outcome):e.retryNotBeforeMs.delete(t)}catch(n){C({level:`warn`,phase:`session_idle_expiry_settle_failed`,data:{session:t,idleExpiryMs:e.idleExpiryMs,error:n instanceof Error?n.message:String(n)}}),Pv(e,t,void 0);return}finally{e.settling.delete(t)}return r.outcome&&e.notifyExpired?.(r.outcome),r.outcome}const Nv=Object.freeze({outcome:void 0,retry:!1});function Pv(e,t,n){if(n){e.retryNotBeforeMs.delete(t);return}e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}async function Fv(e){let{ref:t,idleExpiryMs:n,expiredAtMs:r}=e,{address:i,session:a}=t,o=a.deviceClaim?.deviceKey,s={session:i,idleExpiryMs:n,...o?{deviceKey:o}:{}};if(!await Iv(e,s))return;let c=await Lv(i,a.deviceClaim);if(c===wv||!Tv[c]){C({level:`warn`,phase:`session_idle_expiry_device_claim_unconfirmed`,data:s});return}if(e.sessionStore.finalizeRepairTeardown(t),!e.sessionStore.retire(t)){C({level:`info`,phase:`session_idle_expiry_superseded`,data:s});return}e.sessionStore.writeIdleExpiryTombstone(i,Bm(i,{expiredAtMs:r,idleExpiryMs:n,deviceKey:o}));let l=r-Fm(a);return C({level:`info`,phase:`session_idle_expired`,data:{...s,idleForMs:l,claim:c}}),{sessionName:i,idleExpiryMs:n,idleForMs:l,claim:c,...o?{deviceKey:o}:{}}}async function Iv(e,t){try{return await e.settleSession(e.ref),!0}catch(e){return C({level:`warn`,phase:`session_idle_expiry_cleanup_failed`,data:{...t,error:e instanceof Error?e.message:String(e)}}),!1}}async function Lv(e,t){if(!t)return`absent`;try{return await Zr(t)}catch(n){return C({level:`warn`,phase:`session_idle_expiry_device_claim_clear_failed`,data:{session:e,deviceKey:t.deviceKey,error:n instanceof Error?n.message:String(n)}}),wv}}async function Rv(e){let{leaseRegistry:t,expiredProviderLeaseReleaser:n,timeoutMs:r}=e;await Promise.all(t.listActiveLeases().map(async e=>{try{let i=await zv(n.release(e),r);t.releaseLease(Ln(e)),i||C({level:`warn`,phase:`daemon_shutdown_lease_release_timed_out`,data:{leaseId:e.leaseId,timeoutMs:r}})}catch(t){C({level:`warn`,phase:`daemon_shutdown_lease_release_failed`,data:{leaseId:e.leaseId,error:t instanceof Error?t.message:String(t)}})}}))}async function zv(e,t){return await new Promise((n,r)=>{let i=setTimeout(()=>n(!1),t);e.then(()=>{clearTimeout(i),n(!0)},e=>{clearTimeout(i),r(e)})})}const Bv=`clear-unrecorded`;function Vv(){let e={released:[],orphaned:[],superseded:[],unattributable:[]},t=new Map;return{claims:e,releaseClaim:async e=>{if(e.deviceClaim)try{t.set(e.name,await Zr(e.deviceClaim))}catch(n){t.set(e.name,Bv),C({level:`warn`,phase:`daemon_shutdown_device_claim_release_failed`,data:{session:e.name,deviceKey:e.deviceClaim.deviceKey,error:n instanceof Error?n.message:String(n)}})}},finalize:n=>{let r=n.deviceClaim;if(!r)return;let i={deviceKey:r.deviceKey,session:n.name,platform:E(n.device),deviceId:n.device.id},a=t.get(n.name);switch(a){case`deleted`:case`absent`:e.released.push(i);return;case`ownership-changed`:e.superseded.push(i);return;case`unattributable`:e.unattributable.push(i);return;case Bv:case void 0:e.orphaned.push(i);return;default:Hv(a)}}}}function Hv(e){throw Error(`Undeclared device-claim outcome: ${String(e)}`)}function Uv(e){if(e===void 0)return;let t=Number(e);if(Number.isInteger(t))return t}const Wv=Object.freeze({match:!1,replaced:!0,absent:!0,unreadable:!1,ownerless:!1,unproven:!1});function Gv(e){let t=Vr(e.infoPath,e.owner);if(Wv[t.state]&&!(t.state===`absent`&&qv(e.stateDir)))return t.state===`replaced`?{state:`replaced`,registeredPid:t.identity.pid}:{state:`absent`}}function Kv(e){let t,n=()=>{t&&=(clearInterval(t),void 0)};return t=setInterval(()=>{if(qv(e.stateDir)){n();return}let t=Gv(e);t&&(n(),e.onLoss(t))},15e3),t.unref?.(),n}function qv(e){try{return Ht(e)===void 0}catch{return!1}}function Jv(e){let t=new Set,n=Vi.createServer(n=>{t.add(n),n.on(`close`,()=>t.delete(n));let a=``,o=0,s=new Set,c=!1,l=()=>{if(!(c||o===0)){c=!0;for(let e of s)qn(e);C({level:`warn`,phase:`request_client_disconnected`,data:{inFlightRequests:o}})}};n.setEncoding(`utf8`),n.on(`close`,l),n.on(`error`,l),n.on(`data`,async t=>{let c=an(a,t);a=c.buffer;for(let t of c.lines){let a;o+=1;let c,l,u=!1;try{let i=Yv(t);if(u=cn(i),c=Zn(i.meta?.requestId,`socket`),i.meta={...i.meta,requestId:c},l=Xn(c),s.add(c),Yn(c))throw r();a=await $n(u?e=>{n.destroyed||n.write(ln(e))}:void 0,async()=>await e(i))}catch(e){a={ok:!1,error:i(e)}}finally{--o,l&&s.delete(l.requestId),Qn(l)}n.destroyed||n.write(u?sn(a):`${JSON.stringify(a)}\n`)}})});return n.destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n}function Yv(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return t;let{internal:n,...r}=t;return r}function Xv(e){return Qv(e,`Failed to bind socket server`)}function Zv(e){return Qv(e,`Failed to bind HTTP server`)}function Qv(e,t){return new Promise((n,r)=>{e.once(`error`,r),e.listen(0,`127.0.0.1`,()=>{e.off(`error`,r);let i=e.address();if(typeof i==`object`&&i?.port){n(i.port);return}r(new a(`COMMAND_FAILED`,t))})})}async function $v(){let{resetAndroidSnapshotHelperSessions:e}=await xn();await e()}async function ey(e){let{stopAndroidSnapshotHelperSessionForDevice:t}=await xn();await t(e)}async function ty(e){if(process.platform!==`darwin`)return;let{restoreLegacyXctestDeviceSetRedirect:t}=await import(`../runner-owner-facade.js`);await t(e)}async function ny(e){let{getManagedAgentBrowserStatus:t}=await import(`../src6.js`).then(e=>e.i),n=await t({stateDir:e.stateDir});if(!n.installed)return;let{cleanupManagedAgentBrowserOrphans:r}=await import(`../src6.js`).then(e=>e.i);await r(n,`daemon-startup`,{openWebSessionNames:e.openWebSessionNames,...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}async function ry(e){let{createAgentBrowserWebProvider:t}=await import(`../src6.js`).then(e=>e.i);await(await t({session:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openWebSessionNames})).close()}const iy=Object.freeze({async stopSnapshotHelper(e){e.platform===`android`&&await ey(e)},async closeManagedBrowser(e){e.device.platform===`web`&&await ry({sessionName:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openSessionNames})},async cleanupSessionlessExecutionHost(e){if(!k(e))return;let{resolveRunnerAppBundleId:t,stopIosRunnerSession:n}=await import(`../runner-operations-facade.js`);await n(e.id);let r=await t(),{closeIosApp:i}=await import(`../app-lifecycle-facade.js`);await i(e,r).catch(t=>{C({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:r,error:t instanceof Error?t.message:String(t)}})})},retainExecutionHostAfterClose(e){return k(e.device)&&e.device.kind===`simulator`&&!e.shutdownRequested&&!e.hasScreenRecording&&!e.hasLease}});async function ay(e){let{setRunnerLeaseOwnerStateDir:t}=await import(`../runner-owner-facade.js`);t(e)}async function oy(e){let{setRunnerDeviceClaimAuthorityProbe:t}=await import(`../runner-owner-facade.js`);t(e)}const sy=Object.freeze({configureForDaemonLock:async e=>{await ay(e.stateDir),await oy(e.hasDeviceClaimAuthority),await ty(e.onDiagnostic)},clearDaemonLockConfiguration:async()=>{await ay(void 0),await oy(void 0)},recoverLegacyAppLogMarkers:async e=>{let{recoverLegacyAppLogMarkersAfterDaemonLock:t}=await import(`../platform-runtime-operation-host.js`);return await t(e)},cleanupManagedWebOrphans:async e=>{await ny(e)},resetAndroidSnapshotHelper:async()=>{await $v()}});async function cy(e){let{session:t,stderr:n,resource:r,teardown:i}=e;try{return await i(),!0}catch(e){return n.write(`Daemon ${r} teardown error (${t.name}): ${e instanceof Error?e.message:String(e)}\n`),!1}}async function ly(e){let{ref:t,sessionStore:n,stderr:r,finalizeApplicationLifecycle:i,afterSuccessfulTeardown:a}=e,o=n.resolveCurrent(t),s=o??t.session,c=Rp(o?n.getRuntimeHints(t.address):void 0),l=hv(s),u=await cy({session:s,stderr:r,resource:`app-log`,teardown:async()=>await yp({ref:t,sessionStore:n})}),d=n.resolveCurrent(t)??s,f=(async()=>{let e=await cy({session:s,stderr:r,resource:`session`,teardown:async()=>await Tp({appLog:`already-settled`,ref:t,sessionStore:n,platformCleanup:iy})}),a=!i||await cy({session:s,stderr:r,resource:`lifecycle`,teardown:async()=>await i(d,c)});return e&&a})(),p=await Promise.race([f,Gt(l).then(()=>(r.write(`Daemon session teardown timed out (${s.name}).\n`),!1))]),m=u&&p;n.finalizeRepairTeardown(t),m&&await a?.(s),n.retire(t)}async function uy(e,t){t.length!==0&&await L({logPath:e,command:`daemon-startup`,debug:!1},()=>{for(let e of t)C({level:`warn`,phase:e.phase,data:{resourcePath:e.resourcePath,...e.data}})})}async function dy(e,t){for(let{provider:n,error:r}of t??[])await fy(e,`provider_runtime_skipped`,{provider:n,code:r.code,message:r.message,hint:r.details?.hint})}async function fy(e,t,n){await L({logPath:e},()=>{C({level:`warn`,phase:t,data:n})})}async function py(e){try{let t=await e.registration.finish(e.outcome);t.state!==`removed`&&t.state!==`absent`&&await fy(e.logPath,`daemon_info_removal_declined`,{infoPath:e.infoPath,removed:!1,reason:t.state,...t.state===`replaced`?{registeredPid:t.identity.pid}:{}})}catch(t){await fy(e.logPath,`daemon_registration_finish_failed`,{error:i(t)})}}async function my(e){await fy(e.logPath,`daemon_metadata_lost`,{infoPath:e.infoPath,...e.loss})}function hy(e,t,n,r){return Kv({infoPath:t,stateDir:e,owner:r,onLoss:e=>void my({infoPath:t,logPath:n,loss:e}).catch(()=>{})})}async function gy(e={}){let n=e.env??process.env,r=e.stdout??process.stdout,i=e.stderr??process.stderr,o=e.exit??(e=>process.exit(e)),s=yn(n.AGENT_DEVICE_STATE_DIR),{baseDir:c,infoPath:l,logPath:u,sessionsDir:d}=s,f=vn(n.AGENT_DEVICE_DAEMON_SERVER_MODE),p=Kt(n.AGENT_DEVICE_RETAIN_ARTIFACTS),m;try{m=fr(n)}catch(e){return i.write(`Daemon error: ${t(e).message}\n`),o(1),null}let h=new at(d),g=hn({stateDir:c,sessionsDir:d,resolveSessionDir:e=>h.resolveSessionDir(e)}),_=Wm(),v=ad(),ee=od(),y=jc(),b=sd(),te=_n(),x=Li.randomBytes(24).toString(`hex`),S=Bt(),ne=Fi(),re=Ii(),w=await Pc(n),ie=[...w.runtimes],T=Pr({assertShutdownAllowed:m?()=>Ec(m,`device-shutdown`):void 0,providerRuntimes:ie,providerModules:w.platformModules,sessionsDir:d,ownedProcesses:g,resolveSessionArtifacts:e=>({outputPath:h.resolveAppLogPath(e),pidPath:h.resolveAppLogPidPath(e)})}),E=T.applicationLifecycle;if(!E)throw new a(`COMMAND_FAILED`,`Platform lifecycle gateway is not configured.`,{reason:`runtime-gateway-missing`});let D=ur(ie,{providerRuntimeRequiredIds:Mc});ht({isActive:e=>lr(e)}),yr({resolve:dr});let ae=Mr({providers:{appleRunnerProvider:D.appleRunnerProvider,appleRunnerScreenRecordingTransport:D.appleRunnerScreenRecordingTransport},defaultWebProvider:{stateDir:c,openWebSessionNames:()=>vp(h),ownedProcessRecords:g}}),O=al({leaseLifecycleProvider:D.leaseLifecycleProvider,providerRuntimeIds:D.providerRuntimeIds,recoverExpiredLease:D.recoverExpiredLease,stateDir:c,recoverableProviderIds:D.recoverableProviderIds});O.retryPending();let oe=new Vc({maxActiveSimulatorLeases:Uv(n.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:Uv(n.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:Uv(n.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:Uv(n.AGENT_DEVICE_LEASE_MAX_TTL_MS),onLeaseExpired:e=>{O.release(e)}}),se=D.cloudArtifactProvider,ce=D.providerAppCatalog,le=Nr(D.deviceInventorySource),ue=K_({logPath:u,token:x,sessionStore:h,leaseRegistry:oe,leaseLifecycleProvider:D.leaseLifecycleProvider,cloudArtifactProvider:se,providerAppCatalog:ce,deviceInventoryGateways:le,deviceRuntimeGateway:T,appLogAdmissionLedger:_,audioProbeAdmissionLedger:v,perfCaptureAdmissionLedger:ee,hostDiagnostics:y,screenRecordingAdmissionLedger:b,requestPlatformProviders:ae,androidObservation:Fr,platformResourceCleanup:iy,providerRuntimeIds:D.providerRuntimeIds,providerRuntimeRequiredIds:D.providerRuntimeRequiredIds,providerCredentials:Br(n,c),providerDeviceRuntimeScope:D.providerDeviceRuntimeScope,trackDownloadableArtifact:nr,daemonPolicy:m}),k=()=>{},de=async e=>{await L({logPath:u},()=>{C({level:`error`,phase:`daemon_fatal`,data:{error:e instanceof Error?e.message:String(e)}})})},fe=Vv(),pe=async e=>{let t=h.resolveCurrent(e)??e.session;try{await ly({ref:e,sessionStore:h,stderr:i,finalizeApplicationLifecycle:async(e,t)=>await Ap({gateway:T,scope:vi(),session:e,stateDir:c,runtimeHints:t}),afterSuccessfulTeardown:fe.releaseClaim})}finally{fe.finalize(t)}},me=async()=>{h.closeAdmission();let e=h.listRefs();await Promise.all(e.map(pe))},he=Dv({sessionStore:h,idleExpiryMs:Pm(n),executionLocks:Am(oe),settleSession:async e=>{let t=h.resolveCurrent(e)??e.session,n=e.address,r=Rp(h.getRuntimeHints(n));await Tp({appLog:`run`,ref:e,sessionStore:h,platformCleanup:iy}),await Ap({gateway:T,scope:vi(),session:t,stateDir:c,runtimeHints:r,daemonLeaving:!1})},settleBudgetMs:e=>hv(e),withinDiagnosticsScope:async e=>await L({logPath:u},e),onSessionExpired:()=>{ve.noteActivity()}}),ge=!1,_e=new Set,ve=Cv({sessionStore:h,getInFlightRequestCount:()=>_e.size,hasRetainedLeases:()=>oe.hasRetainedLeases(),onIdleReap:()=>{j()},env:n}),ye=async e=>{if(ge)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`Daemon is shutting down.`,details:{reason:`daemon_shutting_down`}}};ve.cancel();let t=ue(e);_e.add(t);try{return await t}finally{_e.delete(t),ve.noteActivity(),he.noteSessionsChanged()}},be=async()=>{let e=[],t,r,i=f!==`http`,a=f!==`socket`;if(i){let n=Jv(ye);e.push(n),t=await Xv(n)}if(a){let t=await hc({handleRequest:ye,leaseRegistry:oe,token:x,retainArtifacts:p,env:n,resolveRequestDiagnosticsPath:m?.requiredLeaseBackend?void 0:e=>pn(h.resolveSessionDir(e.session),e.requestId)});e.push(t),r=await Zv(t)}return{servers:e,socketPort:t,httpPort:r}},xe=(e,t)=>{we.publish({socketPort:e,httpPort:t,token:x,version:te,codeOrigin:ne,codeSignature:re,policyDigest:m?.digest}),e&&r.write(`AGENT_DEVICE_DAEMON_PORT=${e}\n`),t&&r.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${t}\n`)},Se=e=>{for(let t of e)try{t.close(()=>{})}catch{}},Ce=await Ni(s);if(Ce.status!==`acquired`)return await Promise.allSettled(ie.map(async e=>await e.shutdown())),i.write(`Daemon registration ${Ce.status}; exiting.\n`),o(Pi[Ce.status]),null;let we=Ce.owner,Te=[],Ee,De,A=[];try{await sy.configureForDaemonLock({stateDir:c,hasDeviceClaimAuthority:ei,onDiagnostic:e=>A.push(e)});let e=await sy.recoverLegacyAppLogMarkers(d);_.retainLegacyMarkers(e.retained);for(let t of e.recovered)A.push({phase:`app_log_legacy_marker_recovered`,resourcePath:t,data:{}});for(let t of e.retained)A.push({phase:`app_log_legacy_marker_retained`,resourcePath:t.markerPath,data:{reason:t.reason,...t.message===void 0?{}:{message:t.message}}});await hi({sessionsDir:d,gateway:T,scope:vi(),onDiagnostic:e=>A.push(e)}),await gn(g,{openWebSessionNames:vp(h),purposes:[`simctl-screen-recording`],termTimeoutMs:5e3}),await vy({stateDir:c,sessionStore:h,ownedProcessRecords:g}),E.recoverStartupResources({stateDir:c}).catch(e=>{C({level:`warn`,phase:`daemon_lifecycle_startup_recovery_failed`,data:{error:e instanceof Error?e.message:String(e)}})});let t=await be();Te=t.servers,Ee=t.socketPort,De=t.httpPort,xe(Ee,De),k=hy(c,l,u,S),await uy(u,A),await dy(u,w.skipped),await _y(u,_i(vi()),c),ve.noteActivity()}catch(e){let n=t(e);return i.write(`Daemon error: ${n.message}\n`),Se(Te),k(),await Promise.allSettled(ie.map(async e=>await e.shutdown())),await py({registration:we,infoPath:l,logPath:u}),await sy.clearDaemonLockConfiguration(),o(1),null}Si();let j=async(e={})=>{if(ve.cancel(),he.cancel(),ge)return;ge=!0,k(),e.cause&&await de(e.cause),await _v(Te),await Promise.allSettled(_e);try{await L({logPath:u},async()=>{await E.detachForDaemonShutdown()})}catch{}O.beginShutdown(),await me(),await L({logPath:u},async()=>{await Rv({leaseRegistry:oe,expiredProviderLeaseReleaser:O,timeoutMs:1e3})});try{await sy.resetAndroidSnapshotHelper()}catch(e){C({level:`warn`,phase:`daemon_shutdown_android_snapshot_helper_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}let t=await O.drain(2e3);C({level:t.pending.length===0?`info`:`warn`,phase:`daemon_shutdown_provider_release_drain`,data:{releasedLeaseIds:t.released.map(e=>e.leaseId),pendingLeaseIds:t.pending.map(e=>e.leaseId),releasedDeviceKeys:fe.claims.released.map(e=>e.deviceKey),orphanedDeviceKeys:fe.claims.orphaned.map(e=>e.deviceKey)}}),O.shutdown(),await T.shutdown(),await Promise.allSettled(ie.map(async e=>await e.shutdown())),await E.finalizeDaemonShutdown(),await Promise.race([wi().catch(()=>{}),Gt(1e3)]),await py({registration:we,infoPath:l,logPath:u,outcome:{providerReleases:t,claims:fe.claims}}),await sy.clearDaemonLockConfiguration(),o(e.exitCode??0)};return e.registerProcessHandlers!==!1&&(process.on(`SIGINT`,()=>{j()}),process.on(`SIGTERM`,()=>{j()}),process.on(`SIGHUP`,()=>{j()}),process.on(`uncaughtException`,e=>{let n=e instanceof a?e:t(e);i.write(`Daemon error: ${n.message}\n`),j({exitCode:1,cause:e})}),process.on(`unhandledRejection`,e=>{let n=e instanceof Error?e:Error(String(e)),r=n instanceof a?n:t(n);i.write(`Daemon error: ${r.message}\n`),j({exitCode:1,cause:n})})),{httpPort:De,shutdown:j,socketPort:Ee,token:x}}async function _y(e,t,n){await L({logPath:e},async()=>{try{let e=await Qr(t,n);e.examined>0&&C({phase:`device_claim_reconcile`,data:e})}catch(e){C({level:`warn`,phase:`device_claim_reconcile_failed`,data:{error:e instanceof Error?e.message:String(e)}})}})}async function vy(e){try{await sy.cleanupManagedWebOrphans({stateDir:e.stateDir,openWebSessionNames:vp(e.sessionStore),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){C({level:`warn`,phase:`web_agent_browser_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}gy().catch(e=>{let n=t(e);process.stderr.write(`Daemon error: ${n.message}\n`),process.exit(1)});export{bu as $,wp as A,Df as B,Rp as C,em as D,Wp as E,fp as F,Ld as G,wf as H,pp as I,Ad as J,zd as K,dp as L,bp as M,xp as N,Dp as O,_p as P,Au as Q,Yf as R,$p as S,nm as T,Hd as U,Cf as V,Vd as W,Sd as X,jd as Y,Cd as Z,Gp as _,tg as a,Il as at,tm as b,Yh as c,Vc as ct,Sh as d,xu as et,Jm as f,rm as g,cm as h,cg as i,Ll as it,yp as j,Ep as k,Jh as l,Qo as lt,mm as m,H_ as n,Xl as nt,$h as o,nl as ot,_m as p,Bd as q,sg as r,Vl as rt,eg as s,tl as st,V_ as t,Zl as tt,Qh as u,go as ut,Lp as v,Xp as w,Kp as x,zp as y,Ef as z};
|
|
1
|
+
import{r as e}from"../rolldown-runtime.js";import{$ as t,B as n,I as r,L as i,P as a,U as o,Y as s,a as c,at as l,b as u,f as d,g as f,it as p,k as m,l as h,s as g,t as _,z as v}from"../sdk-contracts.js";import{F as ee,H as y,I as te,L as ne,M as b,N as x,P as re,S as ie,U as S,b as C,j as w,ot as T,r as E,tt as ae,v as D,vt as oe,x as se,y as ce}from"../tv-remote.js";import{A as le,m as ue,v as de}from"../sdk-batch-runner.js";import{A as fe,B as pe,E as me,F as he,H as ge,I as _e,J as ve,K as O,L as ye,M as be,N as xe,P as Se,Q as Ce,S as we,U as Te,V as Ee,W as De,X as Oe,Y as ke,_ as Ae,_t as k,a as je,bt as Me,dt as Ne,f as Pe,ht as Fe,ot as Ie,q as Le,st as Re,w as ze,yt as Be,z as Ve}from"../back-mode.js";import{a as A,i as He,l as Ue,o as We,r as j,s as Ge,t as Ke}from"../diagnostics.js";import"../diagnostics2.js";import{E as M,N as qe,P as Je,S as Ye,T as Xe,_ as Ze,b as Qe,f as $e,g as et,h as N,i as tt,u as nt,w as rt}from"../sdk-device.js";import{$ as it,$n as at,Ar as ot,Dt as st,Er as ct,H as lt,Jt as ut,Kr as dt,Kt as ft,Lt as pt,Qn as mt,S as ht,U as gt,Xt as _t,b as vt,cn as yt,ct as bt,f as xt,hr as St,l as Ct,m as wt,o as Tt,on as Et,ot as Dt,pn as Ot,u as kt,vt as At,xt as jt,yt as Mt}from"../sdk-batch.js";import{a as Nt}from"../session.js";import{C as Pt,T as Ft,d as It,y as Lt,z as Rt}from"../file.js";import{n as zt}from"../app-log-files.js";import{l as Bt,v as Vt}from"../exec.js";import{i as Ht,n as Ut,t as Wt}from"../retry.js";import{A as Gt,B as Kt,D as qt,E as Jt,L as Yt,M as Xt,O as Zt,S as Qt,_ as $t,a as en,b as tn,c as nn,d as rn,f as an,g as on,l as sn,n as cn,o as ln,p as un,s as dn,t as fn,u as pn,v as mn,w as hn,y as gn}from"../daemon-resolution.js";import"../command.js";import{n as _n,r as vn}from"../process.js";import{a as yn}from"../version.js";import{r as bn}from"../runtime-transport-hints.js";import"../retry2.js";import{t as xn}from"../platform-runtime-android-mechanics.js";import{a as Sn,r as Cn}from"../archive.js";import{t as wn}from"../byte-limit-stream.js";import{c as Tn}from"../device-shell.js";import{t as En}from"../keyed-lock.js";import{r as Dn}from"../snapshot-occlusion.js";import{t as On}from"../snapshot-state.js";import{c as P,d as kn,l as An,s as jn,t as Mn,u as Nn}from"../daemon-registration-owner.js";import{t as Pn}from"../snapshot-chrome.js";import{_ as Fn,d as In,h as Ln,i as Rn,l as zn,m as Bn,n as Vn,o as Hn,p as Un,r as Wn,s as Gn,t as Kn,v as qn}from"../replay-script-selection.js";import{a as Jn,c as Yn,i as Xn,o as Zn,s as Qn,t as $n}from"../request-cancel.js";import{n as er,t as tr}from"../request.js";import{i as nr,r as rr,t as ir}from"../interactors.js";import{n as ar,t as or}from"../provider-device-admission.js";import{n as sr,r as cr}from"../daemon-policy-file.js";import{i as lr,n as ur,r as dr,t as fr}from"../platform-runtime.js";import{$ as pr}from"../perf-runtime.js";import{r as mr,t as hr}from"../provider-webdriver.js";import{i as gr}from"../provider-limrun-credentials.js";import{n as _r}from"../provider-credential-fingerprint.js";import{i as vr}from"../daemon-registration.js";import{n as yr,t as br}from"../device-claim-inspection.js";import{F as xr,I as Sr,M as Cr,N as wr,T as Tr,k as Er,n as Dr,r as Or,s as kr,t as Ar,x as jr}from"../platform-request-scope.js";import{t as Mr}from"../device-isolation.js";import{o as Nr}from"../device-inventory-context.js";import{C as Pr,D as Fr,E as Ir,a as Lr,g as Rr,h as zr,k as Br,t as Vr,v as Hr,w as Ur,x as Wr,y as Gr}from"../selector-pipeline-policy.js";import{i as Kr,o as qr,s as Jr}from"../durable-capture-resource.js";import{i as Yr,n as Xr,r as Zr,t as Qr}from"../request-runtime-binding.js";import{i as $r,o as ei}from"../code-signature.js";import{c as ti,l as ni}from"../png-worker-client.js";import F,{createHash as ri,randomUUID as ii}from"node:crypto";import I from"node:fs";import ai from"node:os";import L from"node:path";import oi from"node:fs/promises";import{pipeline as si}from"node:stream/promises";import ci from"node:net";import{pathToFileURL as li}from"node:url";import ui from"node:http";import{once as di}from"node:events";import{StringDecoder as fi}from"node:string_decoder";function pi(e,t={}){let n=[e.command];return e.command===`snapshot`?De(n,e):e.command===`open`?ye(n,e):e.command===`runtime`?Ee(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?pe(n,e):e.command===`screenshot`?ge(n,e):Ve(n,e),n.join(` `)}function mi(e){return e.targetEvidences?[mt(e.targetEvidences)]:e.targetEvidence?[at(e.targetEvidence)]:[]}const hi=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function gi(e){if(e!==e.trim()||!Se.test(e))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function _i(e){return typeof e?.recordAs==`string`||e?.textStdin===!0}function vi(e){return typeof e?.recordAs==`string`?yi(e.recordAs):`[REDACTED]`}function yi(e){return`\${${e}}`}function bi(e){let t=hi.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}function xi(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}function Si(e,t){if(t?.replayBackend&&!fe(t.replayBackend))throw new a(`INVALID_ARGS`,xe(t.replayBackend));return{...he(e),metadata:_e(e)}}const R={kind:`none`};function Ci(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function wi(e){return e.kind===`repair`?{...e,status:`armed`}:e}function Ti(e){return e.kind===`none`?void 0:e.target}function Ei(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function Di(e){return e.kind===`authoring`&&e.status===`aborted`}function Oi(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function ki(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function Ai(e){return{kind:`authoring`,status:`armed`,target:Ci(void 0,e)}}function ji(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function Mi(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function Ni(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:Ci(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function Pi(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function Fi(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function Ii(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function Li(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function Ri(e){return e.kind===`repair`?e.boundary:void 0}function zi(e){return e.kind===`repair`?e.sourcePath:void 0}function Bi(e){return e.kind===`repair`&&e.status!==`committed`}function Vi(e){let t=Ti(e);return t?.kind===`explicit`?t.path:void 0}function Hi(e){return Ti(e)?.force===!0}function z(e){return e?.scriptPublication??R}function Ui(e){let t=z(e);return t.kind===`authoring`&&t.status===`armed`}function Wi(e,t){e.scriptPublication=Ai({path:t.path===void 0?void 0:rn(t.path),force:t.force===!0})}function Gi(e){e.scriptPublication=ji(z(e))}function Ki(e){return Oi(z(e))}function qi(e,t){if(!t.saveScript||Di(z(e)))return;let n={path:typeof t.saveScript==`string`?rn(t.saveScript):void 0,force:t.force===!0},r=z(e);if(r.kind===`repair`){e.scriptPublication=Ni(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:Ci(r.target,n)};return}e.scriptPublication=Ai(n)}function Ji(e,t){let n=z(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:Ci(n.target,{path:t.explicitPath===void 0?void 0:rn(t.explicitPath),force:t.liveForce===!0})})}function Yi(e,t){e.scriptPublication=Mi(z(e),t)}function Xi(e,t){let n=z(e);n.kind===`authoring`&&(e.scriptPublication=Mi(n,t))}function Zi(e,t){return t===!0||Hi(z(e))}function Qi(e){return ki(z(e))}function B(e){return e?.scriptPublication??R}function $i(e,t){let n=B(e);e.scriptPublication=Ni(n,{requested:{path:typeof t.saveScript==`string`?rn(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function ea(e){e.scriptPublication=wi(B(e))}function ta(e){e.scriptPublication=Pi(B(e))}function na(e,t){e.scriptPublication=Fi(B(e),t)}function ra(e){e.scriptPublication=Li(B(e))}function ia(e,t){let n=B(e);return n.kind===`repair`&&n.closeReceipt===t}function aa(e){return B(e).kind===`repair`}function oa(e){return Bi(B(e))}function sa(e){return Ri(B(e))}function ca(e){return zi(B(e))}const la=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),ua=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),da=new Set([`cost`,`evidence`,`resolution`,`settle`]),fa=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),pa=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function ma(e,t,n){if(!e)return e;let r=Ma(e.selectorChain),i=e=>xa(e,t);return{...Sa(e,e=>Ea(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function ha(e,t){if(!e)return e;let n=ka(t);return Sa(e,e=>Aa(e,n),e=>ya(e,t))}function ga(e,t){if(!e)return e;let n=ka(t);return{...e,...e.label===void 0?{}:{label:Aa(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:Aa(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:Aa(e.scrollRegion.label,n)}}}:{}}}function _a(e,t){return!!(e.label!==void 0&&va(e.label,t)||e.ancestry.some(e=>e.label&&va(e.label,t))||e.scrollRegion?.label&&va(e.scrollRegion.label,t))}function va(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function ya(e,t){for(let n of t.keys())if(xa(e,n))return!0;return!1}function ba(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function xa(e,t){return Ot(e,t)}function Sa(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[la.has(e)?e:t(e),Ca(r,e,t,n)]))}function Ca(e,t,n,r){return typeof e==`string`&&ua.has(t)?e:t===`selectorChain`&&ja(e)?Ta(e,r):wa(e,n,r,da.has(t)?t:void 0)}function wa(e,t,n,r){if(typeof e==`string`)return r&&pa.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>wa(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?fa.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),wa(a,t,n,o?`${r}.${e}`:void 0)]}))}function Ta(e,t){return e.filter(e=>!t(e))}function Ea(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?Da(e,t,n):t.trim()?Da(r.map(e=>e.replaceAll(t,n)).join(n),t,n):n}function Da(e,t,n){let r=[];if(n)for(let t=e.indexOf(n);t!==-1;t=e.indexOf(n,t+n.length))r.push(t);let i=0;for(let a=e.indexOf(t);a!==-1;a=e.indexOf(t,a+1)){for(;i<r.length&&r[i]+n.length<a+t.length;)i+=1;if(i===r.length||r[i]>a)return n}return e}const Oa=/\$\{[A-Z_][A-Z0-9_]*\}/y;function ka(e){return[...e].sort(([e],[t])=>t.length-e.length)}function Aa(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){Oa.lastIndex=r;let t=Oa.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function ja(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Ma(e){return ja(e)?e:void 0}function Na(e,t){if(t.flags?.noRecord||_i(t.flags)&&t.flags.recordAs===void 0||Wa(e,t))return;t.flags&&qi(e,t.flags);let n=Fa(t),r=Ra(e,Ia(t,n));n&&La(e,n);let i={ts:Date.now(),command:r.command,positionals:r.positionals,runtime:r.runtime,flags:Ka(r.flags),result:r.result,...r.targetEvidence?{targetEvidence:r.targetEvidence}:{},...r.targetEvidences?{targetEvidences:r.targetEvidences}:{}};return e.actions.push(i),j({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),i}function Pa(e,t,n,r,i,a){!t||!e.resolveCurrent(t)||e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}function Fa(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return;let t=yi(gi(e.flags.recordAs));return{literal:xi({ts:0,command:e.command,positionals:e.positionals,flags:e.flags}),placeholder:t}}function Ia(e,t){if(!t)return e;let{literal:n,placeholder:r}=t;return{...e,positionals:Va(e.positionals,r),result:ma(e.result,n,r),targetEvidence:ba(e.targetEvidence,n,r)}}function La(e,t){t.literal.trim()&&(e.recordedFillLiterals??=new Map,!e.recordedFillLiterals.has(t.literal)&&e.recordedFillLiterals.set(t.literal,t.placeholder))}function Ra(e,t){let n=e.recordedFillLiterals;if(!n||n.size===0)return t;let r=ha(t.result,n),i=(t.targetEvidenceMode??`action`)===`landmark`?za(t.targetEvidence,n):Ba(t.targetEvidence,n),a=t.targetEvidences?{source:Ba(t.targetEvidences.source,n),destination:Ba(t.targetEvidences.destination,n)}:t.targetEvidences;return{...t,result:r,targetEvidence:i,targetEvidences:a}}function za(e,t){return e&&(_a(e,t)?void 0:e)}function Ba(e,t){return!e||!_a(e,t)?e:{...ga(e,t),verification:`unverifiable`}}function Va(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const Ha=new Set([`snapshot`,`get`,`is`,`find`]);function Ua(e){return e.internal?.replayPlanStep!==!0&&Ha.has(e.command)}function Wa(e,t){return!t.interactiveObservation||sa(e)===void 0?!1:t.flags?.record!==!0}const Ga=ze();function Ka(e){if(!e)return{};let t={};for(let n of Ga){let r=e[n];r!==void 0&&(t[n]=r)}return t}function qa(e){return L.join(e,`idle-expiry.json`)}function Ja(e){let t;try{t=I.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||!Number.isFinite(n.expiresAt))&&!(n.expiresAt<=Date.now())&&typeof n.owner==`string`&&!(!Ya(n.expiredAtMs)||!Ya(n.idleExpiryMs))&&(n.deviceKey===void 0||typeof n.deviceKey==`string`))return n}function Ya(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function Xa(e){let t=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(t.length!==1||t[0]!==0)throw new a(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new a(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let n=-1;for(let[t,r]of e.entries())ht({command:r.command,positionals:r.positionals,flags:r.flags})===`mutates-app`&&(n=t);if(!e.slice(n+1).some(no))throw new a(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function Za(e){for(let t of e){if(Qa(t)){$a(t);continue}let e=ro(t),n=e??(t.command===`wait`?t.positionals[0]:void 0);if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(t.command===`find`&&ht(t)===`mutates-app`)throw new a(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let r=e;if(!(!r||!yt(r)||t.targetEvidence))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${r}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function Qa(e){return eo(e)!==void 0}function $a(e){let t=eo(e);if(!t)return;let n=[t.source,t.destination];for(let t of n){if(t?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!t||!yt(t))&&!e.targetEvidences)throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function eo(e){return e.command===`gesture`?Ce(e.positionals):void 0}function to(e,t){if(e instanceof a){if(e.details?.reason===`script_target_exists`)return new a(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let t=e.details?.retriable===!0;return new a(e.code,e.message,{...e.details,retriable:t,hint:e.details?.hint??(t?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to publish the active session script${t?` to ${t}`:``}: ${n}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function no(e){if(e.command!==`wait`)return!1;let t=Et(e.positionals);return t?.kind!==`selector`||!yt(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function ro(e){if(e.command===`get`)return e.positionals[1];if(ke(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&io(t)&&io(n)?void 0:t}}function io(e){return e.trim().length>0&&Number.isFinite(Number(e))}function ao(e){let t=e.scriptPublication??R;return t.kind===`repair`?t.status===`committed`||!Ei(t):!1}function oo(e){return!Oi(e.scriptPublication??R)||ao(e)}var so=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=aa(e),r=t?.publication===`active`,i;try{if(oo(e))return{written:!1};let a=co(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=L.dirname(i);return I.existsSync(o)||I.mkdirSync(o,{recursive:!0}),fo({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Ii(e.scriptPublication??R)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return lo({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Vi(e.scriptPublication??R);if(t)return rn(t);let n=un(e.name),r=new Date(e.createdAt).toISOString().replaceAll(/[:.]/g,`-`);return L.join(this.sessionsDir,`${n}-${r}.ad`)}};function co(e,t){let n=po(e,{strictPortableRefs:t.activePublication});return t.activePublication&&Xa(n),{script:wo(e,n,t.appendCompleteSentinel),actionCount:n.length}}function lo(e){let{session:t,error:n,scriptPath:r,repairArmed:i,activePublication:o}=e;if(j({level:`warn`,phase:`session_script_write_failed`,data:{session:t.name,path:r,error:n instanceof Error?n.message:String(n)}}),i)return{written:!1,error:uo(n,r)};if(o)return{written:!1,error:to(n,r)};if(n instanceof a)throw n;return{written:!1}}function uo(e,t){if(e instanceof a)return e;let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to write the healed script${t?` to ${t}`:``}: ${n}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function fo(e){let{scriptPath:t,script:n,force:r}=e;try{Rt({destination:t,contents:n,publish:r?`replace`:`link-exclusive`})}catch(e){throw e.code===`EEXIST`?new a(`COMMAND_FAILED`,`A file already exists at ${t}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:t}):e}}function po(e,t={}){let n=sa(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=go(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&mo(n);let o=Co(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&Za(a),a}function mo(e){let t=e.command===`gesture`?Ce(e.positionals??[]):void 0;if(t){ho(t);return}if(!vo(e.command))return;let n=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function ho(e){let t=[e.source,e.destination].find(e=>e.startsWith(`@`));if(t)throw new a(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${t}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function go(e){let t=_o(e);if(!(!t||!vo(e.command)))return ve(e.command)||e.command===`hover`?{...e,positionals:[t]}:e.command===`longpress`?bo(e,t):e.command===`fill`?yo(e,t):xo(e,t)}function _o(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function vo(e){return ke(e)||e===`fill`||e===`get`}function yo(e,t){let n=xi(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function bo(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):So(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function xo(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function So(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function Co(e,t){if(!vo(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function wo(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${M(e.device)} device=${Le(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...mi(e)),r.push(To(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
|
|
2
|
+
`)}\n`}function To(e){return Eo([e.command],e)||pi(e)}function Eo(e,t){if(ve(t.command))return Do(e,t);if(t.command===`fill`)return Oo(e,t);if(t.command===`get`)return ko(e,t)}function Do(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(O(Oe(n))),Ao(e,t),Te(e,t),e.join(` `);if(t.positionals.length===1)return e.push(O(n)),Te(e,t),e.join(` `)}}function Oo(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(O(Oe(n))),Ao(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(O(r)),Te(e,t),e.join(` `)}function ko(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(O(n)),e.push(O(Oe(r))),r.startsWith(`@`)&&Ao(e,t),e.join(` `)}function Ao(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(O(n))}const jo=65536;function Mo(e){return ri(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function No(e,t){let n=Ro(e);if(n===void 0)return!1;try{let e=Io(t),r=Buffer.allocUnsafe(jo),i=0;do if(i=I.readSync(n,r,0,r.length,null),!e.push(r.subarray(0,i)))return!0;while(i>0);return e.end(),!0}finally{I.closeSync(n)}}async function Po(e){let t=await zo(e);if(t===void 0)return{lineCount:0,firstLineDigest:void 0};let n={lineCount:0,firstLineDigest:void 0};try{let e=Io(e=>{n.lineCount===0&&(n.firstLineDigest=Mo(e)),n.lineCount+=1}),r=Buffer.allocUnsafe(jo);for(;;){let{bytesRead:n}=await t.read(r,0,r.length,null);if(e.push(r.subarray(0,n)),n===0)break}return e.end(),n}finally{await t.close()}}function Fo(e){let t;return No(e,e=>(t=Mo(e),!1)),t}function Io(e){let t=new fi(`utf8`),n=``,r=!1;return{push(i){if(r)return!1;let a=`${n}${t.write(i)}`,o=0;for(let t=a.indexOf(`
|
|
3
|
+
`);t!==-1;t=a.indexOf(`
|
|
4
|
+
`,o)){if(Lo(a.slice(o,t),e)===!1)return r=!0,!1;o=t+1}return n=a.slice(o),!0},end(){r||Lo(`${n}${t.end()}`,e)}}}function Lo(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0)return t(n)}function Ro(e){try{return I.openSync(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function zo(e){try{return await I.promises.open(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}const Bo=5242880;function Vo(e=process.env){let t=e.AGENT_DEVICE_EVENT_LOG_MAX_BYTES?.trim();if(t===void 0||!/^\d+$/.test(t))return Bo;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Bo}function Ho(e){return`${e}.1`}function Uo(e){return`${e}.window.json`}function Wo(e){let t;for(let n=0;n<3;n+=1){let n=$o(e);try{let t=Go(e);if($o(e)===n)return t}catch(r){if(t=r,$o(e)===n)throw r}}throw t??Zo(e,`the window did not settle while reading`)}function Go(e){let t=Ho(e),n=ts(e);if(n===`unverifiable`)throw Zo(e,`window file is invalid`);if(n===void 0)return Ko(e,t);let r=n.at(-1);if(!r)throw Zo(e,`window file records no generation`);let i=is(e),a=qo(e,r),o=[],s=Jo({eventLogPath:e,rotatedPath:t,sidecar:n,activeStart:a,activeExists:i});return s!==void 0&&o.push({path:t,firstLineIndex:s}),i&&o.push({path:e,firstLineIndex:a}),{files:o,earliestCursor:o[0]?.firstLineIndex??a}}function Ko(e,t){if(Fo(t)!==void 0)throw Zo(e,`a rotated event log exists with no window record`);return{files:is(e)?[{path:e,firstLineIndex:0}]:[],earliestCursor:0}}function qo(e,t){let n=Fo(e);return n!==void 0&&n===t.firstLineDigest?t.firstLineIndex:t.firstLineIndex+t.lineCount}function Jo(e){let{eventLogPath:t,rotatedPath:n,sidecar:r,activeStart:i,activeExists:a}=e,o=Fo(n);if(o===void 0)return;let s=r.find(e=>e.firstLineDigest===o);if(!s)throw Zo(t,`the rotated event log matches no window record`);let c=Qo(n);if(c!==s.lineCount)throw Zo(t,`the rotated event log holds ${c} lines, the window recorded ${s.lineCount}`);if(a&&s.firstLineIndex+s.lineCount!==i)throw Zo(t,`retained event log generations are not contiguous`);return s.firstLineIndex}async function Yo(e,t){let n=as(e);if(!n||n.size<t)return!1;let r=ts(e);if(r===`unverifiable`)return await I.promises.rename(e,Ho(e)),!0;let i=await Po(e);if(i.firstLineDigest!==void 0){let t=r??[],n=t.at(-1),a=n&&n.firstLineDigest===i.firstLineDigest?n:{firstLineIndex:n?n.firstLineIndex+n.lineCount:0,lineCount:i.lineCount,firstLineDigest:i.firstLineDigest};await rs(e,(a===n?t:[...t,a]).slice(-2))}return await I.promises.rename(e,Ho(e)),!0}function Xo(e,t){if(!(e>=t))throw new a(`COMMAND_FAILED`,`events cursor ${e} precedes the retained event log window; events before cursor ${t} were rotated out.`,{reason:`EVENT_LOG_CURSOR_EXPIRED`,cursor:e,earliestCursor:t,hint:`Resume with cursor ${t}, the oldest retained event; earlier events are no longer available.`})}function Zo(e,t){return new a(`COMMAND_FAILED`,`Session event log window cannot be verified: ${t}.`,{reason:`EVENT_LOG_WINDOW_UNVERIFIED`,path:e,hint:`Cursor positions for this session cannot be resolved. Delete ${e}, ${Ho(e)}, and ${Uo(e)} to restart the timeline, or read the files directly.`})}function Qo(e){let t=0;return No(e,()=>{t+=1}),t}function $o(e){return[es(Uo(e)),es(e),es(Ho(e))].join(`|`)}function es(e){try{let t=I.lstatSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch{return`absent`}}function ts(e){let t;try{t=I.readFileSync(Uo(e),`utf8`)}catch(e){return e.code===`ENOENT`?void 0:`unverifiable`}try{let e=JSON.parse(t);if(!de(e)||e.version!==2)return`unverifiable`;let{generations:n}=e;if(!Array.isArray(n)||n.length===0)return`unverifiable`;let r=n.map(ns);return r.every(e=>e!==void 0)?r:`unverifiable`}catch{return`unverifiable`}}function ns(e){if(!de(e))return;let{firstLineIndex:t,lineCount:n,firstLineDigest:r}=e;if(!(!Number.isSafeInteger(t)||t<0)&&!(!Number.isSafeInteger(n)||n<0)&&typeof r==`string`&&r.length!==0)return{firstLineIndex:t,lineCount:n,firstLineDigest:r}}async function rs(e,t){let n=Uo(e),r=`${n}.${process.pid}.tmp`;await I.promises.writeFile(r,JSON.stringify({version:2,generations:t}),`utf8`),await I.promises.rename(r,n)}function is(e){return as(e)!==void 0}function as(e){try{let t=I.lstatSync(e);if(t.isSymbolicLink())throw new a(`COMMAND_FAILED`,`Session event log must not be a symbolic link: ${e}`);return t}catch(e){if(e.code===`ENOENT`)return;throw e}}const os=new Map,ss=new Set;function cs(e){return L.join(e,`events.ndjson`)}function ls(e){return e.command!==me.events}function us(e,t,n){let r=l({version:1,ts:n.ts??new Date().toISOString(),session:t,...n});fs(e,`${JSON.stringify(r)}\n`)}async function ds(e){await(e?os.get(e):Promise.all(os.values()))}function fs(e,t){let n=(os.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await ps(e),await Yo(e,Vo()),await I.promises.appendFile(e,t,`utf8`)}).catch(t=>{j({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{os.get(e)===n&&os.delete(e)});os.set(e,n)}async function ps(e){let t=L.dirname(e);if(!ss.has(t))try{await I.promises.mkdir(t,{recursive:!0}),ss.add(t)}catch(t){throw j({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function ms(e,t,n){us(e,t,{kind:`action.recorded`,requestId:A().requestId,command:n.command,summary:Ln(n),details:Bn(n)})}function hs(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??A().requestId,command:t.command,summary:`Started ${t.command}`}}function gs(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=qn(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??A().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??A().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function _s(e,t={}){let n=ys(t.cursor),r=bs(t.limit),i=Wo(e);Xo(n,i.earliestCursor);let a=vs(i.files,n,r),o=a.lines.flatMap(e=>{let t=xs(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:o,...a.nextCursor===void 0?{}:{nextCursor:String(a.nextCursor)}}}function vs(e,t,n){let r=[],i;for(let a of e){let e=a.firstLineIndex;if(No(a.path,a=>{if(e>=t+n)return i=t+n,!1;e>=t&&r.push(a),e+=1}),i!==void 0)break}return{lines:r,...i===void 0?{}:{nextCursor:i}}}function ys(e){if(e===void 0||e.trim()===``)return 0;let t=Number(e);if(Number.isInteger(t)&&t>=0)return t;throw new a(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function bs(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let t=typeof e==`string`?Number(e):e;if(Number.isInteger(t)&&t>=1&&t<=500)return t;throw new a(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function xs(e){try{let t=Ss(JSON.parse(e));return t?Cs(t):void 0}catch{return}}function Ss(e){if(de(e)&&e.version===1&&typeof e.ts==`string`&&typeof e.session==`string`&&ws(e.kind))return e}function Cs(e){let t=de(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...Ts(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function ws(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function Ts(e){return e===`ok`||e===`error`}const Es=36e5;var Ds=class{sessions=new Map;acceptingSessions=!0;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new so(e)}get(e){return this.sessions.get(e)?.current}closeAdmission(){this.acceptingSessions=!1}assertAdmissionOpen(e){if(!this.acceptingSessions)throw new a(`COMMAND_FAILED`,`Daemon is shutting down`,{reason:`daemon_shutting_down`,session:e})}assertPublishable(e){if(this.assertAdmissionOpen(e),this.sessions.has(e))throw new a(`COMMAND_FAILED`,`Session address is already occupied`,{reason:`session_address_occupied`,session:e})}publish(e,t){this.assertPublishable(e);let n={current:t};return this.sessions.set(e,n),this.clearIdleExpiryTombstone(e),this.captureRef(e,n)}resolveCurrent(e){let t=this.sessions.get(e.address);return t===e.lifetime?t.current:void 0}refresh(e){let t=this.sessions.get(e.address);return t===e.lifetime?this.captureRef(e.address,t):e}requireCurrent(e){let t=this.resolveCurrent(e);if(!t)throw new a(`COMMAND_FAILED`,`Session lifetime has ended`,{reason:`session_lifetime_ended`,session:e.address,hint:`Open a new session before retrying the command.`});return t}update(e,t){let n=this.requireCurrent(e),r=this.sessions.get(e.address),i=typeof t==`function`?t(n):t,a={...n,...i};return r.current=a,a}retire(e){return this.resolveCurrent(e)?(this.runtimeHints.delete(e.address),this.sessions.delete(e.address)):!1}captureRef(e,t){return Object.freeze({address:e,session:t.current,lifetime:t})}*values(){for(let e of this.sessions.values())yield e.current}toArray(){return Array.from(this.values())}lookup(e){let t=this.sessions.get(e);return t?this.captureRef(e,t):void 0}findByDevice(e){for(let[t,n]of this.sessions)if(n.current.device.id===e)return this.captureRef(t,n)}listRefs(){return Array.from(this.sessions,([e,t])=>this.captureRef(e,t))}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){t?this.runtimeHints.set(e,t):this.runtimeHints.delete(e)}clearRuntimeHints(e){return this.requireCurrent(e),this.runtimeHints.delete(e.address)}recordAction(e,t){let n=Na(this.requireCurrent(e),t);n&&ms(this.resolveEventLogPath(e.address),e.address,n)}recordEvent(e,t){us(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return _s(this.resolveEventLogPath(e),t)}async flushEvents(e){await ds(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.requireCurrent(e),r=this.scriptWriter.write(n,t);return r.written&&j({level:`info`,phase:`session_script_written`,data:{session:n.name,path:r.path}}),r}finalizeRepairTeardown(e){let t=this.resolveCurrent(e);if(!t)return;this.recordRepairFinalizeCloseIfCommitting(e);let n=this.writeSessionLog(e,{force:Zi(t,void 0)});oa(t)&&(!n.written&&n.error?this.writeRepairTombstone(e,Es,{code:String(n.error.code),message:n.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){let t=this.requireCurrent(e);Ei(t.scriptPublication??R)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:t.name,...y(`Closed: ${t.name}`)}})}writeRepairTombstone(e,t=Es,n){let r=this.resolveCurrent(e);if(r)try{let i=this.resolveSessionDir(e.address);I.mkdirSync(i,{recursive:!0});let a={owner:e.address,reapedAt:Date.now(),expiresAt:Date.now()+t,...ca(r)?{sourcePath:ca(r)}:{},...n?{commitFailure:n}:{}};I.writeFileSync(this.repairTombstonePath(e.address),`${JSON.stringify(a)}\n`)}catch(t){j({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.address,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return Nn(this.repairTombstonePath(e),e)}clearRepairTombstone(e){An(this.repairTombstonePath(e),e)}noteSessionActivity(e,t=Date.now()){let n=this.get(e);n&&(n.lastActivityAtMs=t)}writeIdleExpiryTombstone(e,t){try{I.mkdirSync(this.resolveSessionDir(e),{recursive:!0}),I.writeFileSync(qa(this.resolveSessionDir(e)),`${JSON.stringify(t)}\n`)}catch(t){j({level:`warn`,phase:`idle_expiry_tombstone_write_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}readIdleExpiryTombstone(e){if(!an(e))return;let t=Ja(qa(this.resolveSessionDir(e)));return t?.owner===e?t:void 0}clearIdleExpiryTombstone(e){try{I.rmSync(qa(this.resolveSessionDir(e)),{force:!0})}catch(t){j({level:`warn`,phase:`idle_expiry_tombstone_clear_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}repairTombstonePath(e){return kn(this.resolveSessionDir(e))}defaultTracePath(e){let t=un(e.name),n=new Date().toISOString().replaceAll(/[:.]/g,`-`);return L.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return dn(this.sessionsDir,e)}resolveDaemonStateDir(){return L.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return I.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return en(this.sessionsDir,e)}resolveAppLogPidPath(e){return ln(this.sessionsDir,e)}resolveEventLogPath(e){return cs(this.resolveSessionDir(e))}};function Os(e){switch(e){case`INVALID_ARGS`:return 400;case`UNAUTHORIZED`:return 401;case`SESSION_NOT_FOUND`:case`REPAIR_SESSION_EXPIRED`:return 404;default:return 500}}function V(e,t){e.statusCode=Os(t.code),e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function ks(e,t){if(e.headersSent){e.destroy(t);return}let n=s(t);e.statusCode=Os(n.code),e.end(n.message)}function As(e,t){return new a(`COMMAND_FAILED`,`${e.label} not found or expired: ${t}`,{reason:`RESOURCE_EXPIRED`,hint:e.expiredHint})}function js(e,t,n,r){let i=e.get(t);if(!i)throw As(r,t);if(i.tenantId&&i.tenantId!==n)throw new a(`UNAUTHORIZED`,`${r.label} ${r.plural?`belong`:`belongs`} to a different tenant`);return i}const Ms=9e5,Ns={label:`Artifact`,expiredHint:`Downloadable artifacts are removed after download or after ${Ms/6e4} minutes. Re-run the command that produced the artifact and download it again.`},Ps=new Map;function Fs(e){let t=F.randomUUID(),n=Date.now(),r=setTimeout(()=>{qs(t)},Ms);return r.unref(),Ps.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,artifactType:e.artifactType,fileName:e.fileName,...e.displayRotation===void 0?{}:{displayRotation:e.displayRotation},deleteAfterDownload:e.deleteAfterDownload!==!1,createdAt:n,timer:r}),t}async function Is(e,t){let{entry:n,stat:r}=zs(e,t),i=await Bs(e,n,r);if(!i)throw new a(`COMMAND_FAILED`,`Artifact path is not a regular file or directory: ${n.artifactPath}`);return i}async function Ls(e){let t=[];for(let[n,r]of Ps){if(!Ws(r,e))continue;let i;try{i=I.statSync(r.artifactPath)}catch{qs(n);continue}let a=await Rs(n,r,i);a&&t.push({id:n,...r.artifactType===void 0?{}:{artifactType:r.artifactType},filename:a.fileName??n,mimeType:a.mimeType,sizeBytes:a.sizeBytes,createdAt:new Date(r.createdAt).toISOString(),expiresAt:new Date(r.createdAt+Ms).toISOString(),...r.displayRotation===void 0?{}:{displayRotation:r.displayRotation}})}return t}async function Rs(e,t,n){try{return await Bs(e,t,n)}catch{return null}}function zs(e,t){let n=js(Ps,e,t,Ns),r;try{r=I.statSync(n.artifactPath)}catch{throw qs(e),new a(`COMMAND_FAILED`,`Artifact file is missing: ${n.artifactPath}`)}return{entry:n,stat:r}}async function Bs(e,t,n){if(n.isFile())return{artifactPath:t.artifactPath,fileName:Gs(t.fileName,e),mimeType:`application/octet-stream`,sizeBytes:n.size};if(!n.isDirectory())return null;let r=await Vs(e,t);return{artifactPath:r.archivePath,fileName:r.fileName,mimeType:`application/gzip`,sizeBytes:r.sizeBytes}}async function Vs(e,t){if(t.directoryArchive&&I.existsSync(t.directoryArchive.archivePath))return t.directoryArchive;if(t.directoryArchivePromise)return await t.directoryArchivePromise;let n=Hs(e,t);t.directoryArchivePromise=n;try{return await n}finally{t.directoryArchivePromise===n&&(t.directoryArchivePromise=void 0)}}async function Hs(e,t){Js(t);let n=Us(Gs(t.fileName,L.basename(t.artifactPath)||e)),r=I.mkdtempSync(L.join(ai.tmpdir(),`agent-device-download-${F.randomUUID()}-`)),i=L.join(r,n);try{await Bt(`tar`,[`czf`,i,`-C`,L.dirname(t.artifactPath),`--`,L.basename(t.artifactPath)],{env:{...process.env,COPYFILE_DISABLE:`1`}});let a={archivePath:i,tempDir:r,fileName:n,sizeBytes:I.statSync(i).size};if(Ps.get(e)!==t)throw I.rmSync(r,{recursive:!0,force:!0}),As(Ns,e);return t.directoryArchive=a,a}catch(e){throw I.rmSync(r,{recursive:!0,force:!0}),e instanceof a?e:new a(`COMMAND_FAILED`,`Failed to archive downloadable artifact: ${t.artifactPath}`,{artifactPath:t.artifactPath},e instanceof Error?e:void 0)}}function Us(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)?e:`${e}.tar.gz`}function Ws(e,t){return!e.tenantId||e.tenantId===t}function Gs(e,t){let n=e?.trim();return n&&!Ks(n)?n:t}function Ks(e){return e.includes(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.includes(`\r`)||e.includes(`
|
|
5
|
+
`)}function qs(e){let t=Ps.get(e);if(t&&(clearTimeout(t.timer),Ps.delete(e),Js(t),t.deleteAfterDownload))try{I.rmSync(t.artifactPath,{recursive:!0,force:!0})}catch{}}function Js(e){if(e.directoryArchive)try{I.rmSync(e.directoryArchive.tempDir,{recursive:!0,force:!0})}catch{}finally{e.directoryArchive=void 0}}const Ys=3e5,Xs={label:`Uploaded artifact`,expiredHint:`Uploaded artifacts expire ${Ys/6e4} minutes after upload. Upload the file again and retry with the new upload id.`},Zs=new Map;function Qs(e){let t=F.randomUUID(),n=setTimeout(()=>{ec(t)},Ys);return n.unref(),Zs.set(t,{artifactPath:e.artifactPath,tempDir:e.tempDir,tenantId:e.tenantId,timer:n}),t}function $s(e,t){let n=js(Zs,e,t,Xs);return clearTimeout(n.timer),n.artifactPath}function ec(e){let t=Zs.get(e);t&&(clearTimeout(t.timer),Zs.delete(e),I.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function tc(e){let t=L.join(e.tempDir,`extracted`),n=``,r=await nc(e.archivePath);await Cn({archivePath:e.archivePath,outputRoot:t,type:r,validateManifest:t=>{n=rc(t,e.platform,e.expectedRootName)}});let i=L.join(t,n);if(!I.existsSync(i))throw I.rmSync(t,{recursive:!0,force:!0}),new a(`INVALID_ARGS`,`Expected extracted bundle "${n}" not found in archive`);return i}async function nc(e){let t=await I.promises.open(e,`r`);try{let e=Buffer.alloc(2),{bytesRead:n}=await t.read(e,0,e.length,0);return n===e.length&&e[0]===31&&e[1]===139?`tgz`:`tar`}finally{await t.close()}}function rc(e,t,n){if(e.length===0)throw new a(`INVALID_ARGS`,`Uploaded app bundle archive is empty`);let r=new Set(e.map(e=>e.name.split(`/`)[0]).filter(e=>!!e)),i=n??ic([...r],t);if(!r.has(i))throw new a(`INVALID_ARGS`,`Uploaded archive must contain a top-level "${i}" bundle`);for(let t of e)if(t.name!==i&&!t.name.startsWith(`${i}/`))throw new a(`INVALID_ARGS`,`Archive entry must stay inside top-level "${i}" bundle: ${t.name}`);return i}function ic(e,t){if(t===`ios`){let t=e.filter(e=>e.toLowerCase().endsWith(`.app`));if(t.length===1)return t[0];throw t.length===0?new a(`INVALID_ARGS`,`iOS app bundle archives must contain a single top-level .app directory`):new a(`INVALID_ARGS`,`iOS app bundle archives must contain exactly one top-level .app directory, found: ${t.join(`, `)}`)}if(e.length===1)return e[0];throw new a(`INVALID_ARGS`,`Archive must contain a single top-level bundle, found: ${e.join(`, `)}`)}const ac=6e4;function oc(e){let t=e.trim(),n=L.basename(t);if(!n||n===`.`||n===`..`)throw new a(`INVALID_ARGS`,`Invalid artifact filename: ${e}`);return n}function sc(e){let t=dc(e);return I.mkdtempSync(L.join(ai.tmpdir(),`agent-device-artifact-${t}-`))}function cc(e){if(e===void 0)return;let t=String(e);if(!/^\d+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let n=Number(t);if(!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`Invalid content-length header`);if(n>2147483648)throw new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${Sn} bytes`)}function lc(e,t){return new Promise((n,r)=>{let i=!1,o,s=I.createWriteStream(t),c=e=>{if(!i){if(i=!0,o&&clearTimeout(o),e){uc(s,t).finally(()=>r(e));return}n()}},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{let t=new a(`COMMAND_FAILED`,`Artifact transfer timed out due to inactivity`,{timeoutMs:ac});`destroy`in e&&typeof e.destroy==`function`&&e.destroy(t),u.destroy(t),c(t)},ac)},u=wn({maxBytes:Sn,createLimitError:()=>new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${Sn} bytes`)});u.on(`data`,l),e.on(`aborted`,()=>{c(new a(`COMMAND_FAILED`,`Artifact transfer was interrupted`))}),l(),si(e,u,s).then(()=>c(),e=>c(e))})}async function uc(e,t){if(e.destroy(),!e.closed)try{await di(e,`close`)}catch{}await I.promises.rm(t,{force:!0}).catch(()=>{})}function dc(e){let t=e?.trim();if(!t)return`request`;let n=t.replaceAll(/[^a-zA-Z0-9._-]+/g,`-`).replaceAll(/^-+|-+$/g,``);return n.length>0?n.slice(0,48):`request`}function fc(e,t){let n=Array.isArray(e)?e[0]:e;if(!n)return;let r=n.match(/^bytes (\d+)-(\d+)\/(\d+)$/);r||mc();let i=Number(r[1]),a=Number(r[2]),o=Number(r[3]);return(!Number.isSafeInteger(i)||!Number.isSafeInteger(a)||!Number.isSafeInteger(o)||i<0||a<i||a>=o||o<1||o!==t)&&mc(),{start:i,end:a,size:o,span:a-i+1}}function pc(e){if(e===void 0)return;if(!/^\d+$/.test(e))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new a(`INVALID_ARGS`,`Invalid content-length header`);return t}function mc(){throw new a(`INVALID_ARGS`,`Invalid content-range header`)}async function hc(e){let t=await _c(e.entry),n=fc(e.req.headers[`content-range`],e.entry.sizeBytes);if(n&&n.start!==t||!n&&t>0)return{complete:!1,offset:t,appended:!1};let r=e.entry.sizeBytes-t,i=n?.span??r,o=pc(e.req.headers[`content-length`]);if(o!==void 0&&o>i)throw new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`);if(n&&o!==void 0&&o!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);let s=wn({maxBytes:i,createLimitError:()=>new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`)});try{if(await si(e.req,s,I.createWriteStream(e.entry.payloadPath,{flags:`a`})),n&&s.bytesSeen!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);if(o!==void 0&&s.bytesSeen!==o)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-length`)}catch(n){throw await vc(e.entry.payloadPath,t,n,e.invalidate),n}let c=await _c(e.entry);return{complete:c===e.entry.sizeBytes,offset:c,appended:c>t}}async function gc(e){let t=F.createHash(`sha256`);for await(let n of I.createReadStream(e))t.update(n);return t.digest(`hex`)}async function _c(e){let t=(await I.promises.stat(e.payloadPath).catch(e=>{if(e.code!==`ENOENT`)throw e}))?.size??0;if(t>e.sizeBytes)throw new a(`COMMAND_FAILED`,`Upload state is corrupt`,{reason:`UPLOAD_STATE_CORRUPT`});return t}async function vc(e,t,n,r){try{await I.promises.truncate(e,t)}catch(e){let t=new a(`COMMAND_FAILED`,`Upload rollback failed; the upload ticket was invalidated`,{reason:`UPLOAD_ROLLBACK_FAILED`,originalError:String(n)},e);throw await r(t),t}}const yc=3e5,bc={label:`Upload`,expiredHint:`Resumable uploads expire ${yc/6e4} minutes after the last received chunk. Start the upload again from the beginning.`},xc=new Map,Sc=new Map;function Cc(e){Ic(e);let t=Lc(e),n=Sc.get(t),r=(n?xc.get(n):void 0)??Ec(e,t);return{uploadId:r.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${r.id}`,e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`).toString(),headers:{...e.tokenHeaders,"content-type":e.contentType||`application/octet-stream`}}}}async function wc(e){let t=Fc(e.uploadId,e.tenantId);return await kc(t,`receive`,e.req,async()=>{let{appended:n,...r}=await hc({entry:t,req:e.req,invalidate:async()=>await Nc(t)});return n&&!t.closed&&Dc(t),r})}async function Tc(e,t){let n=Fc(e,t);return await kc(n,`finalize`,void 0,async()=>{let t=I.statSync(n.payloadPath).size;if(t!==n.sizeBytes)throw new a(`INVALID_ARGS`,`Upload is incomplete`,{uploadId:e,offset:t,sizeBytes:n.sizeBytes});try{let t=await gc(n.payloadPath);if(t!==n.sha256)throw new a(`INVALID_ARGS`,`Upload hash mismatch`,{uploadId:e,expectedSha256:n.sha256,actualSha256:t});let r=await Ac(n);return jc(n),{artifactPath:r,tempDir:n.tempDir}}catch(e){throw await Mc(n,e)}})}function Ec(e,t){let n=F.randomUUID(),r=sc(`upload`),i=L.join(r,`payload`);I.writeFileSync(i,``);let a={id:n,key:t,tempDir:r,payloadPath:i,fileName:oc(e.fileName),sizeBytes:e.sizeBytes,sha256:e.sha256.toLowerCase(),artifactType:e.artifactType,platform:e.platform,tenantId:e.tenantId,generation:0,tail:Promise.resolve(),closed:!1,finalized:!1};return xc.set(n,a),Sc.set(t,n),Dc(a),a}function Dc(e){e.timer&&clearTimeout(e.timer),e.generation+=1;let t=e.generation;e.timer=setTimeout(()=>Oc(e,t),yc),e.timer.unref()}function Oc(e,t){if(e.generation!==t||e.closed)return;Pc(e);let n=e.activeReceive;n?.once(`error`,()=>{}),n?.destroy(new a(`COMMAND_FAILED`,`Upload expired while receiving data`,{reason:`RESOURCE_EXPIRED`})),e.tail=e.tail.then(async()=>{e.finalized||await I.promises.rm(e.tempDir,{recursive:!0,force:!0})}).catch(()=>{})}async function kc(e,t,n,r){let i=e.tail.catch(()=>{}).then(async()=>{e.closed&&Fc(e.id,e.tenantId),t===`receive`&&(e.activeReceive=n);try{return await r()}finally{t===`receive`&&(e.activeReceive=void 0)}});return e.tail=i.then(()=>{},()=>{}),await i}async function Ac(e){if(e.artifactType===`file`){let t=L.join(e.tempDir,e.fileName);return await I.promises.rename(e.payloadPath,t),t}let t=await tc({archivePath:e.payloadPath,tempDir:e.tempDir,platform:e.platform===`android`?`android`:`ios`,expectedRootName:e.fileName});return await I.promises.rm(e.payloadPath,{force:!0}),t}function jc(e){e.finalized=!0,Pc(e)}async function Mc(e,t){Pc(e);try{return await I.promises.rm(e.tempDir,{recursive:!0,force:!0}),t}catch(e){return new a(`COMMAND_FAILED`,`Upload finalize cleanup failed`,{reason:`UPLOAD_FINALIZE_CLEANUP_FAILED`,originalError:String(t)},e)}}async function Nc(e){Pc(e),await I.promises.rm(e.tempDir,{recursive:!0,force:!0}).catch(()=>{})}function Pc(e){e.closed=!0,e.timer&&clearTimeout(e.timer),xc.delete(e.id),Sc.delete(e.key)}function Fc(e,t){return js(xc,e,t,bc)}function Ic(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new a(`INVALID_ARGS`,`Invalid upload sha256`);if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new a(`INVALID_ARGS`,`Invalid upload sizeBytes`);if(cc(String(e.sizeBytes)),oc(e.fileName),!e.uploadAttemptId.trim())throw new a(`INVALID_ARGS`,`uploadAttemptId is required`)}function Lc(e){return[e.tenantId??``,e.uploadAttemptId,e.sha256.toLowerCase(),String(e.sizeBytes),oc(e.fileName),e.artifactType,e.platform??``].join(`\0`)}async function Rc(e){let t=e.headers[`x-artifact-type`],n=e.headers[`x-artifact-filename`];if(!t||!n)throw new a(`INVALID_ARGS`,`Missing required headers: x-artifact-type and x-artifact-filename`);if(t!==`file`&&t!==`app-bundle`)throw new a(`INVALID_ARGS`,`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);cc(e.headers[`content-length`]);let r=oc(n),i=sc(`upload`);try{if(t===`file`){let t=L.join(i,r);return await lc(e,t),{artifactPath:t,tempDir:i}}let n=L.join(i,`artifact.tar`);await lc(e,n);let a=await tc({archivePath:n,tempDir:i,platform:`ios`,expectedRootName:r});return I.rmSync(n,{force:!0}),{artifactPath:a,tempDir:i}}catch(e){throw I.rmSync(i,{recursive:!0,force:!0}),e}}function zc(e){let{req:t,res:n,authorize:r,token:i}=e,a=Vc(t);return a!==null&&(Bc(a,t,n,r,i),!0)}async function Bc(e,t,n,r,i){switch(e.kind){case`preflight`:await Uc(t,n,r,i);return;case`direct`:await Wc(e.uploadId,t,n,r);return;case`finalize`:await Gc(t,n,r);return;case`upload`:await Hc(t,n,r);return}}function Vc(e){return e.method===`POST`&&e.url===`/upload/preflight`?{kind:`preflight`}:e.method===`PUT`&&e.url?.startsWith(`/upload/direct/`)?{kind:`direct`,uploadId:e.url.slice(15).replace(/\?.*$/,``)}:e.method===`POST`&&e.url===`/upload/finalize`?{kind:`finalize`}:e.method===`POST`&&e.url===`/upload`?{kind:`upload`}:null}async function Hc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[]}});if(!r)return;qc(t,await Rc(e),r.tenantId)}catch(e){V(t,s(e))}}async function Uc(e,t,n,r){try{let i=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`preflight`]}});if(!i)return;let a=Yc(await Jc(e,65536));Kc(t,{ok:!0,...Cc({baseUrl:nl(e),tokenHeaders:tl(r),...a,tenantId:i.tenantId})})}catch(e){V(t,s(e))}}async function Wc(e,t,n,r){try{let i=await r({req:t,res:n,daemonRequest:{command:`upload`,positionals:[`direct`,e]}});if(!i)return;let a=await wc({uploadId:e,req:t,tenantId:i.tenantId});if(a.complete){n.statusCode=200,n.end(`ok`);return}n.statusCode=308,a.offset>0&&n.setHeader(`range`,`bytes=0-${a.offset-1}`),n.setHeader(`x-upload-offset`,String(a.offset)),n.end()}catch(e){V(n,s(e))}}async function Gc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`finalize`]}});if(!r)return;qc(t,await Tc(Xc(await Jc(e,65536)).uploadId,r.tenantId),r.tenantId)}catch(e){V(t,s(e))}}function Kc(e,t){e.statusCode=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function qc(e,t,n){Kc(e,{ok:!0,uploadId:Qs({artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:n})})}async function Jc(e,t){let n=(await Qt(e,t,`Request body is too large.`)).toString(`utf8`);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`expected object`);return e}catch(e){throw new a(`INVALID_ARGS`,`Invalid JSON request body`,{},e)}}function Yc(e){return{sha256:Zc(e,`sha256`),uploadAttemptId:Zc(e,`uploadAttemptId`),fileName:Zc(e,`fileName`),sizeBytes:$c(e,`sizeBytes`),artifactType:el(e),platform:Qc(e,`platform`),contentType:Qc(e,`contentType`)}}function Xc(e){return{uploadId:Zc(e,`uploadId`)}}function Zc(e,t){let n=Qc(e,t)?.trim();if(!n)throw new a(`INVALID_ARGS`,`${t} is required`);return n}function Qc(e,t){let n=e[t];return typeof n==`string`?n:void 0}function $c(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`${t} must be an integer`);return n}function el(e){let t=Zc(e,`artifactType`);if(t===`file`||t===`app-bundle`)return t;throw new a(`INVALID_ARGS`,`artifactType must be "file" or "app-bundle"`)}function tl(e){return{authorization:`Bearer ${e}`,"x-agent-device-token":e}}function nl(e){let t=typeof e.headers.host==`string`?e.headers.host:``;if(!t)throw new a(`INVALID_ARGS`,`Missing host header`);let n=e.headers[`x-forwarded-proto`];return`${(Array.isArray(n)?n[0]:n)||`http`}://${t}`}function rl(e){try{return decodeURIComponent(e)}catch{return``}}function il(e){let{req:t,res:n,authorize:r,retainArtifacts:i}=e,a=ol(t);return a!==null&&(al(a,t,n,r,{retainArtifacts:i}),!0)}async function al(e,t,n,r,i){switch(e.kind){case`inventory`:await cl(t,n,r);return;case`download`:await sl(e.artifactId,t,n,r,i);return}}function ol(e){if(e.method!==`GET`)return null;let t=ul(e.url);return t===`/artifacts`||t===`/artifacts/`?{kind:`inventory`}:t.startsWith(`/artifacts/`)?{kind:`download`,artifactId:ll(t)}:null}async function sl(e,t,n,r,i){if(!e){n.statusCode=400,n.end(`Missing artifact id`);return}try{let a=await r({req:t,res:n,daemonRequest:{command:`download_artifact`,positionals:[e]}});if(!a)return;let o=await Is(e,a.tenantId),s=i.retainArtifacts===!0,c=I.createReadStream(o.artifactPath);n.statusCode=200,n.setHeader(`content-type`,o.mimeType),n.setHeader(`content-length`,String(o.sizeBytes)),o.fileName&&n.setHeader(`content-disposition`,`attachment; filename="${o.fileName.replace(/"/g,``)}"`),c.on(`error`,e=>{ks(n,e)});let l=!1,u=()=>{l||s||(l=!0,qs(e))},d=0;c.on(`data`,e=>{d+=e.length,d>=o.sizeBytes&&u()}),c.on(`end`,u),n.on(`finish`,u),n.on(`close`,()=>{n.writableFinished&&u()}),c.pipe(n)}catch(e){V(n,s(e))}}async function cl(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`list_artifacts`,positionals:[]}});if(!r)return;t.statusCode=200,t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({artifacts:await Ls(r.tenantId)}))}catch(e){V(t,s(e))}}function ll(e){let t=e.slice(11);return!t||t.includes(`/`)?``:rl(t)}function ul(e){let t=e||`/`,n=t.indexOf(`?`);return n>=0?t.slice(0,n)||`/`:t}function dl(e,t){return fl(e,t)?t:`${e}:${t}`}function fl(e,t){return t.startsWith(`${e}:`)}function pl(e,t){return!e.partitioned||fl(e.tenant,t)}const ml=[``,`sessions`,null,`requests`,null,`diagnostics`];function hl(e){let t=gl(e.req);return t!==null&&(_l(t,e),!0)}function gl(e){if(e.method!==`GET`)return null;let t=(e.url??``).split(`?`,1)[0].split(`/`);return t.length!==ml.length||!ml.every((e,n)=>e===null||t[n]===e)?null:{session:rl(t[2]??``),requestId:rl(t[4]??``)}}async function _l(e,t){let{req:n,res:r,authorize:i,resolveRecordPath:o}=t;try{if(!an(e.session)||!an(e.requestId)){V(r,s(new a(`INVALID_ARGS`,`Invalid session or request id in diagnostics route`)));return}let t=await i({req:n,res:r,daemonRequest:{command:`request_diagnostics`,positionals:[e.session,e.requestId]}});if(!t)return;if(t.sessionNamespace&&!pl(t.sessionNamespace,e.session)){V(r,s(new a(`UNAUTHORIZED`,`Session is outside this tenant`,{session:e.session})));return}let c=o(e),l=await vl(c);if(!l){V(r,s(new a(`SESSION_NOT_FOUND`,`No diagnostics record for request ${e.requestId} in session ${e.session}`,{hint:`The daemon keeps a request record only for the session it ran in; re-run the command against this daemon to produce a fresh one.`})));return}let u=I.createReadStream(c);r.statusCode=200,r.setHeader(`content-type`,`application/x-ndjson`),r.setHeader(`content-length`,String(l.size)),u.on(`error`,e=>{ks(r,e)}),u.pipe(r)}catch(e){V(r,s(e))}}async function vl(e){try{let t=await I.promises.stat(e);return t.isFile()?t:null}catch{return null}}function yl(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function bl(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const xl=`default`;function Sl(e){let t=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,n=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):Ie,r=Number.isInteger(e.maxLeaseTtlMs)?Math.max(n,Number(e.maxLeaseTtlMs)):6e5;return e=>{if(!Number.isInteger(e))return t;let i=Number(e);if(i<n||i>r)throw new a(`INVALID_ARGS`,`Lease ttlMs must be between ${n} and ${r}.`);return i}}function Cl(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function wl(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function Tl(e){let t=wl(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid lease id.`);return t}function El(e){let t=(e??``).trim().toLowerCase();if(!t)return`ios-simulator`;let n=_.find(e=>e===t);if(n)return n;throw new a(`INVALID_ARGS`,`Unsupported lease backend: ${e??``}`)}function Dl(e){if(e===void 0)return;let t=e.trim();if(!t||t.length>256||!/^[\u0020-\u007E]+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid device key. Use 1-256 printable characters.`);return t}function Ol(e){return Al(e,`client id`,128)}function kl(e){return Al(e,`lease provider`,64)}function Al(e,t,n){if(e===void 0)return;let r=e.trim();if(!r||r.length>n||!/^[a-zA-Z0-9._-]+$/.test(r))throw new a(`INVALID_ARGS`,`Invalid ${t}. Use 1-${String(n)} chars: letters, numbers, dot, underscore, hyphen.`);return r}function jl(e){let t=bl(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Ml(e){let t=Cl(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Nl(e){return{backend:El(e.leaseBackend),leaseProvider:kl(e.leaseProvider),deviceKey:Dl(e.deviceKey),clientId:Ol(e.clientId),tenantId:jl(e.tenantId),runId:Ml(e.runId),ttlMs:e.ttlMs,retainOnClose:e.retainOnClose}}function Pl(e){return!!(e.leaseProvider??e.deviceKey??e.clientId)}function Fl(e,t){return!t.tenantId||!t.runId?!1:[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)}function Il(e,t){let n=Rl(t);if(n.tenantId&&e.tenantId!==n.tenantId||n.runId&&e.runId!==n.runId||n.leaseBackend&&e.backend!==n.leaseBackend||n.leaseProvider&&e.leaseProvider!==n.leaseProvider||n.deviceKey&&e.deviceKey!==n.deviceKey||n.clientId&&e.clientId!==n.clientId)throw new a(`UNAUTHORIZED`,`Lease does not match tenant/run scope`,{reason:`LEASE_SCOPE_MISMATCH`})}function Ll(e){let t=El(e.leaseBackend),n=bl(e.tenantId);if(!n)throw new a(`INVALID_ARGS`,`tenant isolation requires tenant id.`);let r=Cl(e.runId);if(!r)throw new a(`INVALID_ARGS`,`tenant isolation requires run id.`);let i=wl(e.leaseId);if(!i)throw new a(`INVALID_ARGS`,`tenant isolation requires lease id.`);return{...e,tenantId:n,runId:r,leaseId:i,leaseBackend:t}}function Rl(e){let t=bl(e.tenantId),n=Cl(e.runId);if(e.tenantId&&!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(e.runId&&!n)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return{tenantId:t,runId:n,leaseBackend:e.leaseBackend?El(e.leaseBackend):void 0,leaseProvider:kl(e.leaseProvider),deviceKey:Dl(e.deviceKey),clientId:Ol(e.clientId)}}function zl(e,t){if(Pl(e)&&!Fl(e,t))throw new a(`UNAUTHORIZED`,`Lease owner scope is required`,{reason:`LEASE_SCOPE_REQUIRED`})}function Bl(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.backend===t.backend&&e.leaseProvider===t.leaseProvider&&e.deviceKey===t.deviceKey&&e.clientId===t.clientId}function H(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??xl,e.deviceKey])}function Vl(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??xl,e.deviceKey??`*`])}function Hl(e,t,n){return{leaseId:F.randomBytes(16).toString(`hex`),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},...e.retainOnClose?{retainOnClose:!0}:{},createdAt:n,heartbeatAt:n,expiresAt:n+t}}function Ul(e){return e.expiresAt-e.heartbeatAt}function Wl(e){return new a(`DEVICE_IN_USE`,`Device is already leased`,{reason:`DEVICE_LEASE_BUSY`,deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:`Retry after the lease expires or close the owning session.`})}function Gl(e){return k({leaseId:e.leaseId,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Kl(e){let t=Jl(e,`Human-control request body`),n=t.reason;if(n!==void 0&&(typeof n!=`string`||n.trim().length>512))throw new a(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let r=t.ttlMs;if(r!==void 0&&(typeof r!=`number`||!Number.isInteger(r)||r<1e3||r>864e5))throw new a(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...t.scope===void 0?{}:{scope:ql(t.scope)},...typeof n==`string`&&n.trim()?{reason:n.trim()}:{},...typeof r==`number`?{ttlMs:r}:{}}}function ql(e){let t=Jl(e,`Host human-control scope`);if(typeof t.backend!=`string`||!t.backend.trim()||typeof t.deviceKey!=`string`)throw new a(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(t.leaseProvider!==void 0&&typeof t.leaseProvider!=`string`)throw new a(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let n=kl(t.leaseProvider);return{backend:El(t.backend),deviceKey:Dl(t.deviceKey),...n?{leaseProvider:n}:{}}}function Jl(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`${t} must be an object.`);return e}function Yl(e){let t=typeof e==`string`?e.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(t))throw new a(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Xl(e){return{...e,scope:{...e.scope}}}function Zl(e){return new a(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:e.id,deviceKey:e.scope.deviceKey,pausedAt:new Date(e.createdAt).toISOString(),...e.expiresAt===void 0?{}:{expiresAt:new Date(e.expiresAt).toISOString()},...e.reason?{humanReason:e.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}function Ql(e){let t=iu(e.req);return t?($l(t,e),!0):!1}async function $l(e,t){let{req:n,res:r,expectedToken:i}=t;try{cu(n,i),await eu(e,t)}catch(e){V(r,s(e))}}async function eu(e,t){switch(e.kind){case`list`:U(t.res,{ok:!0,holds:t.registry.listHumanControlHolds({kind:`host`})});return;case`upsert`:await tu(e.holdId,t);return;case`remove`:nu(e.holdId,t);return;case`unsupported`:ru(t.res);return;case`invalid`:throw new a(`INVALID_ARGS`,`Invalid request URL.`)}}async function tu(e,t){let{req:n,res:r}=t,a=new AbortController,o=()=>{r.writableFinished||a.abort(i())};n.once(`aborted`,o),r.once(`close`,o),(n.aborted||r.destroyed)&&o();try{let i=await su(n);U(r,{ok:!0,hold:await t.registry.putHumanControlHold({kind:`host`},e,i,a.signal),state:`active`})}finally{n.off(`aborted`,o),r.off(`close`,o)}}function nu(e,t){let n=t.registry.removeHumanControlHold({kind:`host`},e);U(t.res,{ok:!0,released:!!n,...n?{hold:n}:{}})}function ru(e){e.statusCode=405,e.setHeader(`allow`,`GET, PUT, DELETE`),U(e,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`})}function iu(e){let t=ou(e.url);return t===null?{kind:`invalid`}:au(t,e.method)}function au(e,t){if(e===`/admin/human-control/holds`)return t===`GET`?{kind:`list`}:{kind:`unsupported`};if(!e.startsWith(`/admin/human-control/holds/`))return null;let n=e.slice(27);return!n||n.includes(`/`)?{kind:`unsupported`}:t===`PUT`?{kind:`upsert`,holdId:n}:t===`DELETE`?{kind:`remove`,holdId:n}:{kind:`unsupported`}}function ou(e){try{return new URL(e??`/`,`http://127.0.0.1`).pathname}catch{return null}}async function su(e){return Kl(await lu(e,`Human-control`))}function cu(e,t){let n=typeof e.headers.authorization==`string`?e.headers.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):``,i=(typeof e.headers[`x-agent-device-token`]==`string`?e.headers[`x-agent-device-token`]:``)||r;if(!i||!hn(i,t))throw new a(`UNAUTHORIZED`,`Invalid token`)}async function lu(e,t){let n=await Qt(e,16384,`${t} request body is too large.`);try{return JSON.parse(n.toString(`utf8`))}catch(e){throw new a(`INVALID_ARGS`,`${t} request body must be valid JSON.`,{},e)}}function U(e,t){e.statusCode||=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}const uu=Ct(xt),du=Au(uu);function fu(e){return W(e)?.route??`generic`}function pu(e){return W(e)?.sessionKind}function mu(e){return W(e)?.leaseAdmissionExempt===!0}function hu(e){return W(e)?.appLease===`allowed`}function gu(e){return W(e)?.selectorValidationExempt!==!0}function _u(e){return W(e)?.sessionExecutionLockExempt!==!0}function vu(e){return W(e)?.replayScopedAction===!0}function yu(e){return W(e)?.allowInvalidRecording!==!0}function bu(e){return W(e)?.saveScriptFlagOwner===!0}function xu(){return uu.filter(e=>e.saveScriptFlagOwner===!0).map(e=>e.command).sort()}function Su(e){return W(e)?.lockPolicySelectorOverride===!0}function Cu(e){return W(e)?.androidBlockingDialogGuard===!0}function wu(e){if(e.command===`human_control`||e.command===`lease_heartbeat`)return!1;let t=ht(e);return t===void 0?pu(e.command)!==`observability`&&vt(e.command)!==`observe`:t!==`observes-app`}function Tu(e){return W(e.command)?.preferExplicitDeviceOverExistingSession===!0}function Eu(e){let t=W(e.command)?.allowSessionlessDefaultDevice;return typeof t==`function`&&t(e)}function Du(e){return W(e.command)?.sessionlessLeaseAdmissionExemption?.(e)}function Ou(e){let t=W(e.command)?.refFrameEffect;return typeof t==`function`?t(e):t}function ku(e,t){return t.hasExistingSession?Tu(e)&&t.hasExplicitDeviceIdentity?`explicit-device`:`existing-session`:ju(e)?`skip`:t.hasDeviceSelectionInput?`explicit-device`:Eu(e)?`sessionless-default-device`:`skip`}function W(e){return du.descriptorsByCommand.get(e)}function Au(e){let t=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);t.set(n.command,n)}return{descriptorsByCommand:t}}function ju(e){let t=W(e.command);if(t?.route===`lease`)return!0;let n=t?.skipSessionlessProviderDevice;return typeof n==`function`&&n(e)}const Mu=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/,Nu=/^[1-9][0-9]{0,9}$/;function Pu(e){let t=e?.trim()??``,n=t.lastIndexOf(`@`),r=n<0?t:t.slice(0,n),i=n<0?void 0:t.slice(n+1);if(!Mu.test(r)||i!==void 0&&!Nu.test(i))throw new a(`INVALID_ARGS`,`A macos-app lease device key must be <bundleId> or <bundleId>@<pid>.`,{deviceKey:t});return i===void 0?{bundleId:r}:{bundleId:r,pid:Number(i)}}const Fu=new Set([`open`,`batch`]),Iu=[`out`,`saveScript`,`sessionSaveScript`,`baseline`,`launchConsole`,`launchArgs`,`launchUrl`,`bundleUrl`,`artifactsDir`,`stepsFile`,`searchPath`,`retainPaths`,`installSource`,`metroProjectRoot`,`metroRuntimeFile`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`],Lu=[`device`,`udid`,`serial`,`target`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function G(e,t,n={}){return new a(`UNAUTHORIZED`,t,{...n,reason:`MACOS_APP_LEASE_DENIED`,rule:e,retriable:!1,hint:`This lease is limited to one macOS app; retrying will not help. Use an allowed command on the leased app.`})}function Ru(e,t,n){if(e.backend!==`macos-app`)return;let r=Pu(e.deviceKey);if(Bu(r,t.command,t.positionals??[],zu(t.runtime,{...t.input,...t.flags})),(t.command===`open`||t.command===`batch`)&&t.flags?.platform!==`macos`)throw G(`device`,`A macos-app lease needs platform macos on ${t.command}.`);if(t.command===`batch`)for(let e of t.flags?.batchSteps??[]){let t=Array.isArray(e.positionals)?e.positionals.map(String):[];Bu(r,Tt(e.command),t,zu(e.runtime,{...e.input,...e.flags}))}if(n)qu(r,n);else if(!Fu.has(t.command))throw G(`session`,`A macos-app lease runs ${t.command} only in a session of ${r.bundleId}; open it first.`,{command:t.command,bundleId:r.bundleId})}function zu(e,t){return{...t,...e?.launchUrl?{launchUrl:e.launchUrl}:{},...e?.bundleUrl?{bundleUrl:e.bundleUrl}:{}}}function Bu(e,t,n,r){if(!hu(t))throw G(`command`,`A macos-app lease does not allow ${t}.`,{command:t});if(Wu(r),Uu(r),t===`screenshot`?Vu(n,r):Hu(r),t===`open`&&Gu(e,n),t===`close`&&n.length>0&&n[0]!==e.bundleId)throw G(`app`,`A macos-app lease only closes ${e.bundleId}.`,{bundleId:e.bundleId})}function Vu(e,t){if(t.screenshotFullscreen===!0)throw G(`capture`,`A macos-app lease captures only the app window.`);let{out:n,...r}=t;Hu(r);for(let t of[e[0],n])if(!(t===void 0||typeof t==`string`&&Kt(t,`screenshot`,`.png`)))throw G(`host-path`,`A macos-app lease does not write files on the host.`)}function Hu(e){let t=Iu.find(t=>e[t]!==void 0&&e[t]!==!1);if(t)throw G(`host-path`,`A macos-app lease does not accept ${t}, which names a host path or launch.`,{field:t})}function Uu(e){let t=Lu.find(t=>e[t]!==void 0&&e[t]!==``);if(t)throw G(`device`,`A macos-app lease does not accept the ${t} device selector.`,{field:t})}function Wu(e){if(e.surface!==void 0&&e.surface!==`app`)throw G(`surface`,`A macos-app lease is limited to the app surface, not ${String(e.surface)}.`,{surface:e.surface});if(e.platform!==void 0&&e.platform!==`macos`)throw G(`app`,`A macos-app lease only drives a macOS app.`,{platform:e.platform})}function Gu(e,t){if(t.length!==1||t[0]!==e.bundleId)throw G(`app`,`A macos-app lease only opens ${e.bundleId}.`,{bundleId:e.bundleId});Ku()}function Ku(){if(Nt(Ft)!==`native`)throw G(`backend`,`A macos-app lease needs the native macOS app backend (AGENT_DEVICE_MACOS_APP_BACKEND=native).`)}function qu(e,t){if(!et(t.device)||(t.surface??`app`)!==`app`||t.appBundleId!==e.bundleId)throw G(`app`,`This session is not the leased app ${e.bundleId}.`,{bundleId:e.bundleId})}const Ju=/bundleID="([^"]+)"/,Yu=async e=>{if(!Lt(e))return;let t=await Bt(`/usr/bin/lsappinfo`,[`info`,`-only`,`bundleid`,String(e)],{allowFailure:!0,timeoutMs:5e3});return Ju.exec(t.stdout)?.[1]};async function Xu(e,t=Yu){if(e.backend!==`macos-app`)return;let n=Pu(e.deviceKey);if(n.pid!==void 0&&await t(n.pid)!==n.bundleId)throw G(`process`,`The leased app process ${n.bundleId}@${n.pid} is no longer running.`,{bundleId:n.bundleId,pid:n.pid})}const Zu=[`sessionStateDir`,`runnerLogPath`,`requestLogPath`,`eventLogPath`,`device`,`id`,`kind`,`serial`,`device_udid`,`ios_simulator_device_set`],Qu=/(?<![\p{L}\p{N}_./])\/(?:Users|home|private|var|tmp|Volumes|Library|Applications|opt|System|usr|etc|Network|cores)(?:\/[\p{L}\p{N}_.@%+~-]+)*\/?/gu;function $u(){return{hostName:ai.hostname(),homeDirectory:ai.homedir()}}function ed(e,t,n=$u()){return t.ok?{ok:!0,data:td(e,t.data,n)}:{ok:!1,error:nd(t.error,n)}}function td(e,t,n){if(!t)return t;let{fallbackScreenshotPath:r,...i}=t;if(e!==`open`)return i;for(let e of Zu)delete i[e];let{snapshot:a,initialSnapshotError:o,warnings:s,...c}=i;return{...c,...a===void 0?{}:{snapshot:td(`snapshot`,a,n)},...o===void 0?{}:{initialSnapshotError:nd(o,n)},...s===void 0?{}:{warnings:rd(s,n)}}}function nd(e,t){let{logPath:n,diagnosticsRecord:r,...i}=e;return rd(i,t)}function rd(e,t){return typeof e==`string`?id(e,t):Array.isArray(e)?e.map(e=>rd(e,t)):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,rd(n,t)]))}function id(e,t){let n=e;if(t.homeDirectory.length>1){let e=t.homeDirectory.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);n=n.replaceAll(RegExp(`${e}[\\w.@%+~/-]*`,`g`),`<host-path>`)}for(let e of new Set([t.hostName,t.hostName.split(`.`)[0]]))e.length>=4&&(n=n.replaceAll(e,`<host>`));return n.replace(Qu,`<host-path>`)}function ad(e,t){if(!(t===void 0||!e.hasHeldMacOsAppLease(t)))throw G(`diagnostics`,`A macos-app lease does not serve request diagnostics.`)}const od=new Set([`tenantId`,`runId`,`clientId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`ttlMs`,`retainOnClose`]);function sd(e){return cd(e)||Ql(e)}function cd(e){let t=dd(e.req);return t?(ld(t,e).catch(t=>{V(e.res,s(t))}),!0):!1}async function ld(e,t){let{req:n,res:r,registry:i}=t;switch(cu(n,t.expectedToken),e.kind){case`list`:U(r,{ok:!0,leases:i.listActiveLeases().filter(ud)});return;case`put`:{let t=md(await lu(n,`Host lease`));U(r,{ok:!0,lease:i.putHostLease(e.leaseId,t)});return}case`remove`:{let t=Tl(e.leaseId),n=i.listActiveLeases().find(e=>e.leaseId===t),a=n?i.releaseLease(Gl(n)).released:!1;U(r,{ok:!0,released:a,...n&&a?{lease:n}:{}});return}case`unsupported`:r.statusCode=405,r.setHeader(`allow`,`GET, PUT, DELETE`),U(r,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`});return}}function ud(e){return e.backend===`macos-app`}function dd(e){let t=URL.parse(e.url??`/`,`http://127.0.0.1`)?.pathname??``;return t===`/admin/leases`?e.method===`GET`?{kind:`list`}:{kind:`unsupported`}:t.startsWith(`/admin/leases/`)?fd(t.slice(14),e.method):null}function fd(e,t){let n=pd[t??``];return!n||!e||e.includes(`/`)?{kind:`unsupported`}:{kind:n,leaseId:e}}const pd={PUT:`put`,DELETE:`remove`};function md(e){let t=hd(e);return Pu(vd(t,`deviceKey`)),{tenantId:vd(t,`tenantId`)??``,runId:vd(t,`runId`)??``,clientId:vd(t,`clientId`),leaseBackend:`macos-app`,leaseProvider:vd(t,`leaseProvider`),deviceKey:vd(t,`deviceKey`),ttlMs:gd(t),retainOnClose:_d(t)}}function hd(e){if(typeof e!=`object`||!e||Array.isArray(e))throw new a(`INVALID_ARGS`,`Host lease request body must be a JSON object.`);let t=e,n=Object.keys(t).filter(e=>!od.has(e));if(n.length>0)throw new a(`INVALID_ARGS`,`Unknown host lease field(s): ${n.join(`, `)}.`);if(t.leaseBackend!==`macos-app`)throw new a(`INVALID_ARGS`,`The host lease route allocates only macos-app leases.`);return t}function gd(e){if(e.ttlMs===void 0||Number.isInteger(e.ttlMs))return e.ttlMs;throw new a(`INVALID_ARGS`,`Host lease ttlMs must be an integer.`)}function _d(e){if(e.retainOnClose===void 0)return!0;if(typeof e.retainOnClose==`boolean`)return e.retainOnClose;throw new a(`INVALID_ARGS`,`Host lease retainOnClose must be a boolean.`)}function vd(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Host lease ${t} must be a string.`);return n}}function yd(e){let{hookConfigured:t,hookAttestedTenant:n,clientDeclaredTenant:r}=e;return n?{trusted:!0,tenantId:n,attested:!0}:t?{trusted:!1}:{trusted:!0,tenantId:r,attested:!1}}function bd(){return s(new a(`UNAUTHORIZED`,`Request tenant is not attested by the auth hook`))}function xd(e,t,n,r){let i=e.headers[Jt];return typeof i!=`string`||!i||i===r?!1:(t.statusCode=409,t.setHeader(`content-type`,`application/json`),t.setHeader(qt,`true`),t.end(JSON.stringify(Yt(n,`Daemon instance changed`,s(new a(`COMMAND_FAILED`,`Daemon instance changed`,{reason:`remote_instance_mismatch`}))))),!0)}function K(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,data:r}}}function q(e,t,n=200){e.statusCode=n,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function Sd(e,t){e.destroyed||e.writableEnded||e.write(on(t))}function Cd(e,t){e.destroyed||(e.write(mn(t)),e.end())}function wd(e){return e===`INVALID_ARGS`?-32602:-32e3}function Td(e){return e.code===`DEVICE_IN_USE`&&e.details?.reason===`human_control_active`?423:Os(e.code)}function Ed(e,t,n){if(n!==void 0&&n!==`public-only`)throw new a(`INVALID_ARGS`,`Invalid daemon HTTP network access marker`);if(!t&&n===void 0)return e;let r=e.meta?.installSource,i=e.meta?.uploadedArtifactId;if(r?.kind===`path`&&!(typeof i==`string`&&i.length>0))throw new a(`INVALID_ARGS`,`Invalid params: path install sources are disabled on the remote HTTP surface`);let{developerDir:o,providerCredentialFingerprint:s,...c}=e.meta??{};return{...e,...e.meta?{meta:c}:{},internal:{...e.internal,publicNetworkOnly:!0}}}async function Dd(e,t){if(!e)return{ok:!0};let n=await e(t);if(n===void 0||n===!0)return{ok:!0};let r=(e,n,r)=>{let i=s(r);return{ok:!1,statusCode:e,response:K(t.rpcRequest.id??null,n,i.message,i)}};if(n===!1||n.ok===!1){let e=n===!1?{}:n;return r(401,-32001,new a(p(e.code,`UNAUTHORIZED`),e.message??`Request rejected by auth hook`,e.details))}if(typeof n.tenantId==`string`&&n.tenantId.length>0){let e=bl(n.tenantId);return e?{ok:!0,tenantId:e}:r(500,-32e3,new a(`INVALID_ARGS`,`Auth hook returned invalid tenantId`))}return{ok:!0}}async function Od(e=process.env){let t=e.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=e.AGENT_DEVICE_HTTP_AUTH_EXPORT||`default`,r=L.isAbsolute(t)?t:L.resolve(t),i;try{i=await import(li(r).href)}catch(e){throw new a(`COMMAND_FAILED`,`Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module`,{hookPath:r,error:e instanceof Error?e.message:String(e)})}let o=i[n];if(typeof o!=`function`)throw new a(`INVALID_ARGS`,`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return o}function kd(e,t){let n=typeof t.authorization==`string`?t.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):void 0,i=typeof t[`x-agent-device-token`]==`string`?t[`x-agent-device-token`]:void 0;return(typeof e.token==`string`?e.token:void 0)??i??r??``}async function Ad(e){let{req:t,res:n,authHook:r,expectedToken:i,daemonRequest:a}=e,o=kd({},t.headers),s=bl(Nd(t.headers,Gt)),c=Pd(o,i);if(c)return V(n,c),null;let l=await Dd(r,{headers:t.headers,rpcRequest:{jsonrpc:`2.0`,id:null,method:`agent_device.command`},daemonRequest:{token:o,session:`default`,command:a.command,positionals:a.positionals,...s?{meta:{tenantId:s}}:{}}});if(!l.ok)return Md(n,l),null;let u=yd({hookConfigured:r!==null,hookAttestedTenant:l.tenantId,clientDeclaredTenant:s});if(!u.trusted)return V(n,bd()),null;let d=u.tenantId;return{tenantId:d,...d?{sessionNamespace:{tenant:d,partitioned:u.attested}}:{}}}async function jd(e){let{leaseRegistry:t,...n}=e,r=await Ad(n);if(!r||!t)return r;try{ad(t,r.tenantId)}catch(e){return V(n.res,s(e)),null}return r}function Md(e,t){e.statusCode=t.statusCode,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.response.error?.data?.message??t.response.error?.message??`Unauthorized`}))}function Nd(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Pd(e,t){return!t||hn(e,t)?null:s(new a(`UNAUTHORIZED`,`Invalid token`))}const Fd=new Set([`agent_device.command`,`agent-device.command`]),Id=new Set([`agent_device.install_from_source`,`agent-device.install_from_source`]),Ld=new Set([`agent_device.release_materialized_paths`,`agent-device.release_materialized_paths`]),Rd={"agent_device.lease.allocate":`lease_allocate`,"agent-device.lease.allocate":`lease_allocate`,"agent_device.lease.heartbeat":`lease_heartbeat`,"agent-device.lease.heartbeat":`lease_heartbeat`,"agent_device.lease.release":`lease_release`,"agent-device.lease.release":`lease_release`},zd=new Set([...Fd,...Id,...Ld,...Object.keys(Rd)]);function Bd(e,t){return{token:kd(e,t),session:e.session??`default`,command:e.command??``,positionals:e.positionals??[],input:e.input,flags:e.flags,runtime:e.runtime,meta:e.meta}}function J(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Vd(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function Hd(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function Ud(e,t){let n=typeof e[t]==`string`?e[t].trim():``;if(!n)throw new a(`INVALID_ARGS`,`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function Wd(e,t){let n=e[t],r=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isInteger(r))throw new a(`INVALID_ARGS`,`Invalid params: source.${t} must be an integer`);return r}function Gd(e){let t=Ud(e,`owner`),n=Ud(e,`repo`),r=e.artifactId!==void 0,i=e.runId!==void 0,o=e.artifactName!==void 0;if(r&&(i||o))throw new a(`INVALID_ARGS`,`Invalid params: source must specify either artifactId or artifactName, not both`);if(!r&&i&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source.artifactName is required when source.runId is specified`);if(!r&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source must specify artifactId or artifactName`);if(r)return{kind:`github-actions-artifact`,owner:t,repo:n,artifactId:Wd(e,`artifactId`)};let s;return i&&(s=Wd(e,`runId`)),{kind:`github-actions-artifact`,owner:t,repo:n,...i?{runId:s}:{},artifactName:Ud(e,`artifactName`)}}function Kd(e,t,n){return{token:kd(t,n),session:J(t,`session`)??`default`,command:e,positionals:[],flags:e===`lease_allocate`?Be(t):void 0,meta:{tenantId:J(t,`tenantId`)??J(t,`tenant`),runId:J(t,`runId`),leaseId:J(t,`leaseId`),leaseTtlMs:Vd(t,`ttlMs`),leaseRetainOnClose:Hd(t,`retainOnClose`),leaseBackend:J(t,`backend`),leaseProvider:J(t,`leaseProvider`)??J(t,`provider`),deviceKey:J(t,`deviceKey`),clientId:J(t,`clientId`),providerCredentialFingerprint:e===`lease_allocate`?J(t,`providerCredentialFingerprint`):void 0}}}function qd(e){let t=e.source;if(!t||typeof t!=`object`)throw new a(`INVALID_ARGS`,`Invalid params: source is required`);let n=t;if(n.kind===`url`){let e=typeof n.url==`string`?n.url.trim():``;if(!e)throw new a(`INVALID_ARGS`,`Invalid params: source.url is required for url sources`);let t=n.headers,r={};if(t!==void 0){if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`Invalid params: source.headers must be a string map`);for(let[e,n]of Object.entries(t)){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Invalid params: source.headers values must be strings`);r[e]=n}}return Object.keys(r).length>0?{kind:`url`,url:e,headers:r}:{kind:`url`,url:e}}if(n.kind===`path`)throw new a(`INVALID_ARGS`,`Invalid params: source.kind "path" names a file on the daemon host and is not accepted over HTTP`,{hint:`Use a "url" or "github-actions-artifact" source.`});if(n.kind===`github-actions-artifact`)return Gd(n);throw new a(`INVALID_ARGS`,`Invalid params: source.kind must be "url" or "github-actions-artifact"`)}function Jd(e,t){let n=J(e,`platform`);if(n!==`ios`&&n!==`android`)throw new a(`INVALID_ARGS`,`Invalid params: platform must be "ios" or "android"`);return{token:kd(e,t),session:J(e,`session`)??`default`,command:`install_source`,positionals:[],flags:{platform:n},meta:{requestId:J(e,`requestId`),installSource:qd(e),retainMaterializedPaths:Hd(e,`retainPaths`),materializedPathRetentionMs:Vd(e,`retentionMs`)}}}function Yd(e,t){let n=J(e,`materializationId`)?.trim();if(!n)throw new a(`INVALID_ARGS`,`Invalid params: materializationId is required`);return{token:kd(e,t),session:J(e,`session`)??`default`,command:`release_materialized_paths`,positionals:[],meta:{requestId:J(e,`requestId`),materializationId:n}}}function Xd(e){let t=e.indexOf(`: `);if(t===-1||!e.startsWith(`$`))return e;let n=e.slice(0,t).replace(/^\$\.?/,``),r=e.slice(t+2);return n?`${n}: ${r}`:r}function Zd(e){try{return c.parse(e)}catch(e){let t=e instanceof Error?Xd(e.message):`invalid command params`;throw new a(`INVALID_ARGS`,`Invalid params: ${t}`)}}function Qd(e,t,n){if(Fd.has(e))return Bd(Zd(t),n);if(Id.has(e))return Jd(t,n);if(Ld.has(e))return Yd(t,n);let r=Rd[e];if(r)return Kd(r,t,n);throw new a(`INVALID_ARGS`,`Method not found: ${e}`)}function $d(e){return Fd.has(e)}async function ef(e){let t=ii(),n=await Pt(),r=_.filter(e=>e!==`macos-app`||process.platform===`darwin`),i=await Od(e.env??process.env),{handleRequest:a,token:o,retainArtifacts:c=!1,resolveRequestDiagnosticsPath:l}=e;return ui.createServer((u,d)=>{if(u.method===`GET`&&u.url===`/health`){d.statusCode=200,d.setHeader(`content-type`,`application/json`),d.end(JSON.stringify(Xt(`agent-device-daemon`,yn(),{instanceId:t,hostArch:n,leaseBackends:r})));return}if(o&&e.leaseRegistry&&sd({req:u,res:d,expectedToken:o,registry:e.leaseRegistry})||zc({req:u,res:d,token:kd({},u.headers),authorize:async e=>await Ad({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})||il({req:u,res:d,retainArtifacts:c,authorize:async e=>await Ad({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})||l&&hl({req:u,res:d,resolveRecordPath:l,authorize:async t=>await jd({...t,authHook:i,expectedToken:o,leaseRegistry:e.leaseRegistry})}))return;if(u.method!==`POST`||u.url!==`/rpc`){d.statusCode=404,d.end(`Not found`);return}let f=``;u.setEncoding(`utf8`),u.on(`data`,e=>{f+=e,f.length>1048576&&u.destroy(Error(`request too large`))}),u.on(`error`,()=>{d.headersSent||q(d,K(null,-32700,`Parse error`),400)}),u.on(`end`,async()=>{let e;try{e=JSON.parse(f)}catch{q(d,K(null,-32700,`Parse error`),400);return}if(e.jsonrpc!==`2.0`||typeof e.method!=`string`){q(d,K(e.id??null,-32600,`Invalid Request`),400);return}if(!zd.has(e.method)){q(d,K(e.id??null,-32601,`Method not found: ${e.method}`),404);return}if(!e.params||typeof e.params!=`object`){q(d,K(e.id??null,-32602,`Invalid params`),400);return}let n,r,c=!1;try{let s=e.params,l=Qd(e.method,s,u.headers);if($d(e.method)&&(typeof l.command!=`string`||l.command.length===0)){q(d,K(e.id??null,-32602,`Invalid params: command is required`),400);return}n=Qn(l.meta?.requestId,e.id),l.meta={...l.meta,requestId:n},r=Zn(n);let f=l.meta?.tenantId??l.flags?.tenant,p=await Dd(i,{headers:u.headers,rpcRequest:e,daemonRequest:l});if(!p.ok){q(d,p.response,p.statusCode);return}let m=yd({hookConfigured:i!==null,hookAttestedTenant:p.tenantId,clientDeclaredTenant:f});if(!m.trusted){let t=bd();q(d,K(e.id??null,-32001,t.message,t),401);return}let h=Pd(l.token,o);if(h){q(d,K(e.id??null,-32e3,h.message,h),401);return}if(xd(u,d,e.id??null,t))return;l.meta={...l.meta,tenantId:m.tenantId,sessionIsolation:m.attested?`tenant`:l.meta?.sessionIsolation},l.flags?.tenant!==void 0&&(l.flags={...l.flags,tenant:m.tenantId}),m.attested&&l.flags?.sessionIsolation!==void 0&&(l.flags={...l.flags,sessionIsolation:`tenant`}),l=Ed(l,i!==null,u.headers[Zt]);let g=!1,_=()=>{c||d.writableFinished||g||(g=!0,Jn(n),j({level:`warn`,phase:`request_client_disconnected`,data:{requestId:n}}))};if(u.on(`aborted`,_),d.on(`close`,_),(u.aborted||d.destroyed)&&_(),gn(l)){d.statusCode=200,d.setHeader(`content-type`,`application/x-ndjson`);let t=await er(e=>Sd(d,e),async()=>await a(l));c=!0,Cd(d,t.ok?{jsonrpc:`2.0`,id:e.id??null,result:t}:K(e.id??null,-32e3,t.error.message,t.error));return}let v=await a(l);if(c=!0,v.ok){q(d,{jsonrpc:`2.0`,id:e.id??null,result:v});return}q(d,K(e.id??null,-32e3,v.error.message,v.error),Td(v.error))}catch(t){c=!0;let n=s(t),r=wd(n.code);if(d.headersSent){Cd(d,K(e.id??null,r,n.message,n));return}q(d,K(e.id??null,r,n.message,n),Os(n.code))}finally{$n(r)}})})}function tf(e,t){if(nf(e,t.command,t.flags??{}),t.command===`batch`)for(let n of t.flags?.batchSteps??[])nf(e,Tt(n.command),{...n.input,...n.flags})}function nf(e,t,n){if(lf(e,t),t===`close`&&n.shutdown===!0&&of(e,`device-shutdown`),e.deviceIds)for(let t of[n.udid,n.serial]){let n=typeof t==`string`?t.trim():``;if(!(!n||e.deviceIds.has(n)))throw uf(e,`device`,`Device ${n} is outside this daemon's policy.`,{deviceId:n})}}function rf(e,t){return!e.deviceIds||e.deviceIds.has(t.id)}function af(e,t){if(!rf(e,t))throw uf(e,`device`,`Device ${t.id} is outside this daemon's policy.`,{deviceId:t.id})}function of(e,t){if(e.deniedCapabilities.has(t))throw uf(e,`capability`,`This daemon's policy denies ${t}.`,{capability:t})}function sf(e,t){let n=e.requiredLeaseBackend;if(!(!n||t?.backend===n))throw uf(e,`lease`,`This daemon's policy requires a ${n} lease.`,{leaseBackend:n})}function cf(e,t){if(!t.deviceIds)return e;let n=e=>e.filter(e=>rf(t,e)),r=Object.freeze({discover:async(t,r)=>n(await e.localOnly.discover(t,r))}),i=async(t,i)=>{let a=await e.providerFirst.discoverWithSource(t,i),o=n(a.devices);return o.length>0||a.source===`local`?{...a,devices:o}:{devices:await r.discover(t,i),source:`local`}},a=Object.freeze({discover:async(e,t)=>(await i(e,t)).devices,discoverWithSource:i});return Object.freeze({...e,localOnly:r,providerFirst:a})}function lf(e,t){let n=e.commands;if(!n)return;let r=cr(t);if(r===void 0)return;let i=n.names.has(r);if(!(n.mode===`allow`?i:!i))throw uf(e,`command`,`This daemon's policy denies the ${r} command.`,{command:r})}function uf(e,t,n,r){return new a(`UNAUTHORIZED`,n,{...r,reason:`DAEMON_POLICY_DENIED`,rule:t,policyDigest:e.digest,retriable:!1,hint:`The daemon operator's policy denies this request; retrying will not help. Use an allowed command and device, or ask the operator to change the policy.`})}let df={resolve:async()=>{throw new a(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function ff(e){df=e}function pf(){return df}function mf(){return Object.freeze({toolchainCheck:async(e,t)=>{if(e===`android`){let{androidToolchainCheck:e}=await xn();return await e(process.env,process.platform)}if(e===`vega`){let{vegaToolchainCheck:e}=await import(`../platform-runtime.js`).then(e=>e.G);return await e(t)}if(e===`harmonyos`){let{harmonyToolchainCheck:e}=await import(`../platform-runtime.js`).then(e=>e.U);return await e()}if(e===`ios`||e===`macos`||e===`apple`){let{appleToolchainCheck:e}=await import(`../doctor-facade.js`);return await e()}},deviceChecks:async(e,t)=>{if(e.platform!==`android`)return[];let{androidDeviceChecks:n}=await xn();return await n(e,t)},ambientChecks:async e=>{let{webBrowserLifecycleCheck:t}=await import(`../src2.js`).then(e=>e.i);return[await t(e.stateDir)]},warmupCheck:async(e,t)=>{if(e.platform!==`apple`)return;let{appleRunnerWarmupCheck:n}=await import(`../doctor-facade.js`);return await n(e,t)}})}const hf=Object.freeze([...hr,`limrun`]);function gf(e){return Object.freeze(e.flatMap(e=>yf(e)?[{runtime:e,module:xf(e)}]:[]))}async function _f(e=process.env){let t=await vf(e);try{let[{loadProviderPlugins:n},{RESERVED_PLUGIN_PROVIDERS:r}]=await Promise.all([import(`../load.js`).then(e=>e.t),import(`../store.js`).then(e=>e.o)]),i=await n(e,r);return Object.freeze({...t,runtimes:Object.freeze([...t.runtimes,...i.map(({runtime:e})=>e)]),platformModules:Object.freeze([...t.platformModules,...i.map(({runtime:e,platformModule:t})=>({runtime:e,module:t}))])})}catch(e){throw await Promise.allSettled(t.runtimes.map(async e=>await e.shutdown())),e}}async function vf(e=process.env){let t=mr(e),n=[...gf(t)],i;try{i=gr(e)}catch(e){return Object.freeze({runtimes:t,platformModules:Object.freeze(n),skipped:[{provider:`limrun`,error:r(e)}]})}if(!i)return Object.freeze({runtimes:t,platformModules:Object.freeze(n)});let[a,o]=await Promise.all([import(`../src.js`).then(e=>e.t),import(`../limrun-runtime-dependencies.js`).then(e=>e.n)]),s=a.createLimrunRuntime(i,o.createLimrunRuntimeDependencies(),{includePlatformModule:!0});return Object.freeze({runtimes:Object.freeze([...t,s.runtime]),platformModules:Object.freeze([...n,{runtime:s.runtime,module:s.platformModule}])})}function yf(e){if(!(`owner`in e)||!(`loadRuntime`in e))return!1;let t=e.owner;return typeof e.loadRuntime==`function`&&bf(t)&&t.provider===e.provider}function bf(e){return typeof e==`object`&&!!e&&`kind`in e&&e.kind===`provider-runtime`&&`provider`in e&&typeof e.provider==`string`&&`instance`in e&&typeof e.instance==`string`}function xf(e){return Object.freeze({owner:e.owner,loadRuntime:async t=>await e.loadRuntime(t)})}function Sf(e){let t=e?.providerSessionId;return typeof t==`string`&&t.trim().length>0?t.trim():void 0}var Cf=class{records=new Map;now;retentionMs;constructor(e={}){this.now=e.now??(()=>Date.now()),this.retentionMs=Number.isInteger(e.retentionMs)?Math.max(0,Number(e.retentionMs)):3e5}record(e,t){let n=e.leaseProvider?.trim(),r=t.trim();if(!n||!r)return;this.prune();let i={provider:n,providerSessionId:r,leaseId:e.leaseId,tenantId:e.tenantId};this.records.set(this.key(n,r),i)}markLeaseReleased(e,t=this.now()){let n=e.leaseProvider?.trim();if(!n)return;this.prune();let r=t+this.retentionMs;for(let[t,i]of this.records)i.provider===n&&i.leaseId===e.leaseId&&this.records.set(t,{...i,retainedUntil:r})}resolve(e){let t=e.provider?.trim(),n=e.providerSessionId?.trim(),r=e.tenantId?.trim();if(!t||!n||!r)return;this.prune();let i=this.records.get(this.key(t,n));if(!(!i||i.tenantId!==r))return{...i}}prune(){let e=this.now();for(let[t,n]of this.records)n.retainedUntil!==void 0&&n.retainedUntil<=e&&this.records.delete(t)}key(e,t){return JSON.stringify([e,t])}},wf=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},Tf=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},Ef=class{holdsByDevice=new Map;mutations=new wf;inFlightWork=new Tf;leases=new Map;runBindings=new Map;deviceBindings=new Map;hostTtlMsByLeaseId=new Map;macOsAppTenantIds=new Set;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=Sl(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new Cf({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=Nl(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Hl(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}putHostLease(e,t){let n=Tl(e),r=Nl(t);this.cleanupExpiredLeases();let i=this.resolveLeaseTtlMs(r.ttlMs),o=this.leases.get(n);if(o){if(!Bl(o,r))throw new a(`INVALID_ARGS`,`Lease id already names a lease with another scope.`,{reason:`LEASE_SCOPE_MISMATCH`});return this.hostTtlMsByLeaseId.set(n,i),this.refreshLease(o,i)}if(this.assertHumanControlAdmission(r),this.assertDeviceAvailable(r),r.backend===`macos-app`&&this.macOsAppTenantIds.add(r.tenantId),this.runBindings.has(Vl(r)))throw new a(`DEVICE_IN_USE`,`This tenant run already holds a lease for the device.`,{reason:`DEVICE_LEASE_BUSY`});this.enforceCapacity(r.backend);let s={...Hl(r,i,this.now()),leaseId:n};return this.leases.set(s.leaseId,s),this.hostTtlMsByLeaseId.set(n,i),this.bindLease(s),{...s}}refreshExistingRunBinding(e,t){let n=Vl(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(e.retainOnClose?{...i,retainOnClose:!0}:i,t);if(i.deviceKey)throw Wl(i);return Il(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=Tl(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);zl(n,e),Il(n,e);let r=e.ttlMs===void 0?Ul(n):this.resolveLeaseTtlMs(e.ttlMs),i=this.hostTtlMsByLeaseId.get(t);return this.refreshLease(n,i===void 0?r:Math.min(r,i))}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=Tl(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return zl(n,e),Il(n,e),{...n}}assertLeaseAdmission(e){let t=Ll(e);this.cleanupExpiredLeases(),Il(this.getActiveLease(t.leaseId),t)}hasHeldMacOsAppLease(e){return this.macOsAppTenantIds.has(e)}findActiveLeaseBackend(e){let t=wl(e);if(t)return this.cleanupExpiredLeases(),this.leases.get(t)?.backend}hasRetainedLeases(){let e=this.now();return this.listActiveLeases().some(t=>t.retainOnClose===!0&&t.expiresAt>e)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?H(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>Xl(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,n,r){r?.throwIfAborted();let i=Yl(t),o=Kl(n);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=H(s),l=this.findHumanControlHold(i);if(l&&(this.assertHoldAuthority(e,l),H(l.hold.scope)!==c))throw new a(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:i,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(i,d),await this.activateHumanControlHold(c,d,o.ttlMs,r)}async activateHumanControlHold(e,t,n,r){let i=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,r),r?.throwIfAborted(),i.get(o)!==t)throw new a(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...n===void 0?{}:{expiresAt:s+n}},this.refreshHeldLease(e,s),Xl(t.hold)}catch(n){throw i.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=Yl(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=H(r.hold.scope);return this.deleteHumanControlHold(i,n),Xl(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=H(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Zl(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=H(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new a(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new a(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new a(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let n=this.requireHumanControlLease(e.leaseId);return{backend:n.backend,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let n=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==n.leaseId||H(n)!==H(t.hold.scope))throw new a(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=H(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,Ul(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=wl(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new a(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new a(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(Vl(e),e.leaseId);let t=H(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.hostTtlMsByLeaseId.delete(e.leaseId),this.runBindings.delete(Vl(e));let n=H(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=H({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw Wl(r)}};function Df(e){return Ne(e)}function Of(e,t){let n=Df(e),r=n.leaseId??t?.leaseId,i=n.tenantId??t?.tenantId,a=n.runId??t?.runId;if(!(!i||!a||!r))return le({tenantId:i,runId:a,leaseId:r,leaseBackend:n.leaseBackend??t?.backend,leaseProvider:n.leaseProvider??t?.leaseProvider,deviceKey:n.deviceKey??t?.deviceKey,clientId:n.clientId??t?.clientId,expiresAt:t?.expiresAt})}function kf(e,t){let n=Df(e),r=t?.lease??t?.deviceLease??void 0;return le({tenantId:n.tenantId??r?.tenantId,runId:n.runId??r?.runId,leaseId:n.leaseId??r?.leaseId,leaseTtlMs:n.leaseTtlMs,leaseBackend:n.leaseBackend??r?.leaseBackend,leaseProvider:n.leaseProvider??r?.leaseProvider,deviceKey:n.deviceKey??r?.deviceKey,clientId:n.clientId??r?.clientId})}function Af(e){let t=e.meta,n=le({leaseId:jf(t?.leaseId),clientId:jf(t?.clientId),tenantId:jf(t?.tenantId),runId:jf(t?.runId),leaseProvider:jf(t?.leaseProvider),deviceKey:jf(t?.deviceKey)});return Object.keys(n).length>0?n:void 0}function jf(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Mf(e){let t=yl(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,r=bl(n);if(n&&!r)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!r)throw new a(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let i=e.session||`default`;return fl(r,i)?{...e,meta:{...e.meta,tenantId:r,sessionIsolation:t}}:{...e,session:dl(r,i),meta:{...e.meta,tenantId:r,sessionIsolation:t}}}function Nf(e,t,n,r={}){if(Ff(e,t,n,r.daemonPolicy))return;let i=Df(e);zf(e,i);let o=n?.lease;if(r.daemonPolicy?.requiredLeaseBackend){let i=kf(e,n).leaseId?Pf(e,t,n):void 0;return sf(r.daemonPolicy,i),i}if(!(n===void 0&&!i.leaseId&&Lf(e,r.providerAppCatalog))){if(e.command===`human_control`&&!o&&!i.leaseId)throw new a(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(!(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!i.leaseId||!i.tenantId&&!i.runId)))return Pf(e,t,n)}}function Pf(e,t,n){Bf(Df(e),n?.lease);let r=kf(e,n);t.assertLeaseAdmission(Fe(r));let i=t.heartbeatLease(Fe(r));return Ru(i,e,n),wu(e)&&t.assertHumanControlAdmission(i),i}function Ff(e,t,n,r){return mu(e.command)?hu(e.command)?!0:!If(e,t,n,r):!1}function If(e,t,n,r){if(r?.requiredLeaseBackend)return!0;let i=kf(e,n);return i.leaseBackend===`macos-app`||i.leaseId!==void 0&&t.findActiveLeaseBackend(i.leaseId)===`macos-app`}function Lf(e,t){let n=Du(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function Rf(e){mu(e.command)||zf(e,Df(e))}function zf(e,t){if(e.command!==`open`)return;let n=Re(t);if(n.length!==0)throw new a(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:n})}function Bf(e,t){t&&(Vf(`leaseId`,e.leaseId,t.leaseId),Vf(`tenantId`,e.tenantId,t.tenantId),Vf(`runId`,e.runId,t.runId),Vf(`leaseProvider`,e.leaseProvider,t.leaseProvider),Vf(`clientId`,e.clientId,t.clientId),Vf(`deviceKey`,e.deviceKey,t.deviceKey))}function Vf(e,t,n){if(!(!t||!n||t===n))throw new a(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function Hf(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),j({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return j({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}async function Uf(e){let t=e.sessionStore.lookup(e.sessionName),n=t?.session,r=n?.lease;return!t||!n||!r||!e.leaseRegistry.consumeExpiredLease(r.leaseId)?!1:(j({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,deviceKey:r.deviceKey}}),await e.teardownSession(t).catch(e=>{j({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,error:e instanceof Error?e.message:String(e)}})}),await wr(n.deviceClaim).catch(e=>{j({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:n.name,deviceKey:n.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.retire(t),!0)}function Wf(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.lookup(t),a=i?.session,o=Nf(e.req,r,a,{providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy});if(!o)return e.req;let s={...e.req,internal:{...e.req.internal,admittedLease:o}};return i&&a?.lease&&n.update(i,e=>({lease:{...e.lease,leaseBackend:o.backend,expiresAt:o.expiresAt}})),s}function Gf(e){return Of(e.req,e.req.internal?.admittedLease)??e.existingLease}async function Kf(e){let t=e.session.lease;if(!t)return;let n=k({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n);if(r?.retainOnClose){j({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:!1,retained:!0}});return}let i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=Sf(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return j({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const qf=[`leaseId`,`tenantId`,`runId`,`backend`,`leaseProvider`],Jf=[`createdAt`,`heartbeatAt`,`expiresAt`];function Yf(e){let t=new Map,n=np(e.stateDir),r=new Set(n.keys()),i=e.retryDelayMs??1e3,a,o=new Map,s=!1,c=new Map,l=e=>{s&&c.set(e.leaseId,e)},u=()=>{if(!e.stateDir)return tp(n.size,Error(`daemon state directory is unavailable`)),!1;let t=ip(e.stateDir);try{if(n.size===0)I.rmSync(t,{force:!0});else{I.mkdirSync(e.stateDir,{recursive:!0,mode:448});let r={version:1,leases:[...n.values()]};Rt({destination:t,contents:`${JSON.stringify(r)}\n`,mode:384}),I.chmodSync(t,384)}r.clear();for(let e of n.keys())r.add(e);return!0}catch(e){return tp(n.size,e),!1}},d=()=>{a||!Zf(t,e.providerRuntimeIds)&&!Qf(n,e.recoverableProviderIds)||(a=setTimeout(()=>{a=void 0,h()},i),a.unref?.(),j({level:`warn`,phase:`provider_lease_expiry_retry_scheduled`,data:{pendingLiveLeaseCount:t.size,pendingRecoveryLeaseCount:n.size,retryDelayMs:i}}))},f=(e,r)=>{o.set(e,r);let i=()=>{o.get(e)===r&&o.delete(e),t.size===0&&n.size===0&&a?(clearTimeout(a),a=void 0):d()};return r.then(i,i),r},p=n=>{if(!$f(n,e.providerRuntimeIds))return;let r=`live:${n.leaseId}`,i=o.get(r);if(i)return i;let a=(async()=>{await Xf(e.leaseLifecycleProvider,n)&&(t.delete(n.leaseId),l(n))})();return f(r,a)},m=t=>{if(!ep(t,e.recoverableProviderIds)||!r.has(t.leaseId)&&!u())return;let i=`recovery:${t.leaseId}`,a=o.get(i);if(a)return a;let s=(async()=>{await Hf(e.recoverExpiredLease,t)&&(n.delete(t.leaseId),l(t),u())})();return f(i,s)},h=async()=>{let e=[...[...t.values()].map(p),...[...n.values()].map(m)].filter(e=>e!==void 0);if(e.length===0){d();return}await Promise.all(e)};return{beginShutdown:()=>{c.clear(),s=!0},release:async r=>{if(r.leaseProvider){if(ep(r,e.recoverableProviderIds)){n.set(r.leaseId,r),u()?await m(r):d();return}$f(r,e.providerRuntimeIds)&&e.leaseLifecycleProvider?.release&&(t.set(r.leaseId,r),await p(r),t.has(r.leaseId)&&d())}},retryPending:h,drain:async e=>{await Promise.race([h(),Ht(Math.max(0,e))]);let r={pending:[...t.values(),...n.values()],released:[...c.values()]};return s=!1,c.clear(),r},shutdown:()=>{a&&clearTimeout(a),a=void 0}}}async function Xf(e,t){return await Hf(e?.release?async t=>{await e.release?.(t)}:void 0,t)}function Zf(e,t){return[...e.values()].some(e=>$f(e,t))}function Qf(e,t){return[...e.values()].some(e=>ep(e,t))}function $f(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function ep(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function tp(e,t){j({level:`error`,phase:`provider_lease_expiry_record_write_failed`,data:{pendingLeaseCount:e,error:t instanceof Error?t.message:String(t)}})}function np(e){if(!e)return new Map;let t=ip(e);try{let e=JSON.parse(I.readFileSync(t,`utf8`));if(e.version!==1||!Array.isArray(e.leases))throw Error(`unsupported expiry release record`);return new Map(e.leases.filter(rp).map(e=>[e.leaseId,e]))}catch(e){return e.code===`ENOENT`||j({level:`warn`,phase:`provider_lease_expiry_record_read_failed`,data:{error:e instanceof Error?e.message:String(e)}}),new Map}}function rp(e){if(!e||typeof e!=`object`)return!1;let t=e;return qf.every(e=>typeof t[e]==`string`)&&Jf.every(e=>typeof t[e]==`number`)}function ip(e){return L.join(e,`expired-provider-leases.json`)}function ap(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.nodes)?e.nodes:[],r=n.filter(e=>e.hittable===!0&&e.interactionBlocked!==`covered`).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier})),i=Object.fromEntries([`visibility`,`viewport`,`snapshotQuality`,`targetActivation`,`observation`,`warnings`,`fallbackScreenshotPath`,`artifacts`,`refsGeneration`].filter(t=>e[t]!==void 0).map(t=>[t,e[t]]));return{nodeCount:n.length,refs:r,truncated:e.truncated,...i}}const op=[`width`,`height`,`logicalWidth`,`logicalHeight`,`pixelDensity`];function sp(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.overlayRefs)?e.overlayRefs:[],r=n.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{...cp(e),overlayCount:n.length,overlayRefs:r,...e.warnings===void 0?{}:{warnings:e.warnings},...e.artifacts===void 0?{}:{artifacts:e.artifacts}}}function cp(e){let t={};typeof e.path==`string`&&(t.path=e.path),D(e.displayRotation)&&(t.displayRotation=e.displayRotation);for(let n of op)typeof e[n]==`number`&&(t[n]=e[n]);return t}const lp=[`role`,`type`,`subrole`,`label`,`value`,`contentDescription`,`identifier`,`enabled`,`selected`,`checked`,`focused`,`heading`,`roleDescription`,`editable`,`password`,`hintShowing`,`placeholder`,`selectionStart`,`selectionEnd`,`hittable`];function up(e){let t={ref:e.ref};for(let n of lp){let r=e[n];r!==void 0&&(t[n]=r)}return t}function dp(e,t){if(t!==`digest`)return e;let n=e.node;if(!n||typeof n!=`object`)return e;if(typeof e.text==`string`){let{node:t,...n}=e;return n}return{...e,node:up(n)}}function fp(e,t){return t===`digest`?mp(pp(e)):e}function pp(e){let t=e.resolution;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=t;if(n.kind!==`disambiguated`)return e;let{alternatives:r,...i}=n;return{...e,resolution:i}}function mp(e){let t=e.settle;if(!t||typeof t!=`object`||Array.isArray(t))return e;let{diff:n,tail:r,...i}=t;if(!n||typeof n!=`object`||Array.isArray(n))return e;let a=n,o=a.summary,s=gp(a.lines);return{...e,settle:{...i,...s.length>0?{refs:s}:{},...hp(r),diff:{summary:o}}}}function hp(e){return!Array.isArray(e)||e.length===0?{}:{tail:e.slice(0,12)}}function gp(e){return Array.isArray(e)?e.flatMap(_p).slice(0,12):[]}function _p(e){let t=yp(e);return t?.kind===`added`?vp(t.ref):[]}function vp(e){return typeof e==`string`&&e.length>0?[{ref:e}]:[]}function yp(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const bp=[`headers`,`requestHeaders`,`responseHeaders`,`requestBody`,`responseBody`,`raw`];function xp(e,t){if(t!==`digest`)return e;let n=e.entries;return Array.isArray(n)?{...e,entries:n.map(Sp)}:e}function Sp(e){let t=yp(e);if(!t)return e;let n={};for(let[e,r]of Object.entries(t))bp.includes(e)||(n[e]=r);return n}const Cp={snapshot:ap,screenshot:sp,find:dp,get:dp,press:fp,click:fp,fill:fp,longpress:fp,hover:fp,network:xp},wp=[`platform`,`target`],Tp=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function Ep(e){return nt({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function Dp(e){return Ep(e)||Ap(e,wp)}function Op(e){return Dp(e)||Ap(e,Tp)}function kp(e){return typeof e==`string`&&e.trim().length>0}function Ap(e,t){return e?t.some(t=>kp(e[t])):!1}async function jp(e){let t=await Mp(e.req,e.existingSession);if(t)return{device:t,...e.req.session===void 0?{}:{requestedSession:e.req.session},...e.req.meta?.requestId===void 0?{}:{requestId:e.req.meta.requestId},...e.existingSession?{session:{name:e.existingSession.name,device:e.existingSession.device,...e.existingSession.appBundleId?{appBundleId:e.existingSession.appBundleId}:{},...e.existingSession.appName?{appName:e.existingSession.appName}:{},...e.existingSession.surface?{surface:e.existingSession.surface}:{}}}:{},...e.useDefaultWebProvider?{useDefaultWebProvider:!0}:{}}}async function Mp(e,t){switch(ku(e,{hasExistingSession:!!t,hasExplicitDeviceIdentity:Ep(e.flags),hasDeviceSelectionInput:Dp(e.flags)})){case`existing-session`:return t?.device;case`explicit-device`:case`sessionless-default-device`:try{return await Np(e)}catch{return}case`skip`:return}}async function Np(e){let t=e.command===`open`?zn(e.positionals?.[0]):void 0;return await In(e.flags??{},t)}var Pp=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const Fp=new Pp({state:`active`,scope:`all`,tree:void 0,generation:void 0});function Ip(e){return new Pp({state:`active`,...e})}function Lp(e){return Pp.expire(e)}const Rp=new WeakMap,zp=new WeakSet;function Bp(e){return e.refFrame??Fp}function Vp(e){return Bp(e).generation??e.snapshotGeneration}function Hp(e){return Bp(e).tree}function Up(e){Kp(e),Wp(e),e.refFrame=Lp(Bp(e)),e.snapshotScopeSource=void 0}function Wp(e){e.snapshot&&zp.add(e.snapshot)}function Gp(e){return zp.has(e)}function Kp(e){let t=qp(e)+1;return Rp.set(e,t),t}function qp(e){return Rp.get(e)??0}function Jp(e){Xp(e,`all`)}function Yp(e,t){Xp(e,t)}function Xp(e,t){e.refFrame=Ip({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function Zp(e){return Bp(e).state}function Qp(e){return Bp(e).scope}function $p(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:em({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:Qp(e.session),currentGeneration:Vp(e.session)}}function em(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(Zp(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==Vp(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=Qp(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const tm=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,nm=/^close app$/i,rm=`Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.`;function im(e){if(!e)throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);return e}async function am(e){let{session:t}=e;if(t.device.platform!==`android`||!t.screenRecording||xm(t))return{status:`absent`};let n=im(e.observation),r;try{r=await mm(t,n)}catch(e){let n=s(e);return j({level:`warn`,phase:`android_blocking_dialog_inspection_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`unknown`,reason:`inspection-failed`,warning:fm(n)}}let i=gm(r);if(!i?.rect)return{status:`absent`};try{let e=await hm(t,i,n);return e.ok?await vm(t,n)?t.appBundleId&&(await n.openApp(t.device,t.appBundleId),!await ym(t,t.appBundleId,n))?(j({level:`warn`,phase:`android_blocking_dialog_relaunch_unfocused`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),{status:`failed`,reason:`relaunch-failed`}):(j({level:`warn`,phase:`android_blocking_dialog_recovered`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:e.x,y:e.y}}),{status:`recovered`}):(j({level:`warn`,phase:`android_blocking_dialog_still_present`,data:{session:t.name,deviceId:t.device.id}}),{status:`failed`,reason:`dismiss-failed`}):(j({level:`warn`,phase:`android_blocking_dialog_tap_failed`,data:{session:t.name,deviceId:t.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:`failed`,reason:`tap-failed`})}catch(e){return j({level:`warn`,phase:`android_blocking_dialog_recovery_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`failed`,reason:`error`}}}async function om(e){let{session:t,command:n}=e;if(t.device.platform!==`android`||xm(t))return{status:`clear`};let r=im(e.observation),i=await r.readBlockingDialog(t.device);if(i.status!==`dialog`)return i.status===`unknown`&&j({level:`warn`,phase:`android_blocking_dialog_unobserved`,data:{session:t.name,deviceId:t.device.id,command:n,commandPhase:e.phase}}),{status:`clear`};let a=i.focus;if(cm(t,a)){if(await sm(t,r)){let r=`Recovered Android app ANR before ${n}: closed and relaunched ${t.appBundleId}.`;if(e.phase===`before-command`)return{status:`recovered`,warning:r};throw um({session:t,command:n,focus:a,message:`Android app ANR appeared after ${n}; ${t.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:`Retry the command. If the ANR returns, inspect app logs or restart the emulator.`})}throw um({session:t,command:n,focus:a,message:`Android app ANR blocked ${n}: ${dm(a)}. Automatic recovery failed.`,hint:rm})}throw um({session:t,command:n,focus:a,message:`Android system dialog is blocking ${n}: ${dm(a)}.`,hint:rm})}async function sm(e,t){try{return await lm(e,t)}catch(t){return j({level:`warn`,phase:`android_app_anr_recovery_failed`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}function cm(e,t){return!!(e.appBundleId&&t.package===e.appBundleId)}async function lm(e,t){if(!e.appBundleId)return!1;let n=gm(await mm(e,t),{requireDialogSignal:!1});if(!n?.rect)return!1;let r=await hm(e,n,t);if(!r.ok)return!1;await t.openApp(e.device,e.appBundleId);let i=await ym(e,e.appBundleId,t,{requireNoBlockingDialog:!0});return i&&j({level:`warn`,phase:`android_app_anr_recovered`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),i}function um(e){let{session:t,command:n,focus:r,message:i,hint:o}=e;return new a(`COMMAND_FAILED`,i,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:o})}function dm(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}function fm(e){let t=[`Inspection error: ${pm(e.message)}`];return e.hint&&t.push(`Hint: ${pm(e.hint)}`),[`Android blocking-dialog readiness could not be inspected; the command continued.`,...t].join(` `)}function pm(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}async function mm(e,t){return await t.readSnapshotNodes(e.device)}async function hm(e,t,n){if(!t.rect)return{ok:!1,exitCode:1,stdout:``,stderr:`button has no rect`};let{x:r,y:i}=u(t.rect);Up(e);let a=await n.tap(e.device,r,i);return a.exitCode===0?{ok:!0,x:r,y:i}:{ok:!1,exitCode:a.exitCode,stdout:a.stdout.trim(),stderr:a.stderr.trim()}}function gm(e,t={}){if(!(t.requireDialogSignal!==!1&&!wm(e)))return e.filter(_m).find(e=>Cm(e).some(e=>nm.test(e))&&e.rect)}function _m(e){return!Dn(e)}async function vm(e,t){for(let n=0;n<12;n+=1){if(!wm(await mm(e,t)))return!0;await Ht(500)}return!wm(await mm(e,t))}async function ym(e,t,n,r={}){for(let i=0;i<12;i+=1){if(await bm(e,t,n,r))return!0;await Ht(500)}return await bm(e,t,n,r)}async function bm(e,t,n,r){return await n.readAppFocus(e.device,t,r)}function xm(e){return!!e.lease?.leaseProvider||ar(e.device)}function Sm(e){return Cm(e).join(` `).trim()}function Cm(e){let t=[e.label,e.identifier];return typeof e.value==`string`&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim())}function wm(e){return e.filter(_m).some(e=>{let t=Sm(e);return t.length>0&&tm.test(t)})}function Tm(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=Em(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?Fr(r?.nodes??[]):void 0,routeComparable:i}}function Em(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function Dm(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function Om(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function km(e,t){return Wr({capture:e.capture,classify:n=>Ir({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:Pr,delaysMs:Ur},onTrustworthyCapture:()=>Om(e.session)})}function Am(e){let t=new Map,n=[],r=Pn(e);for(let i of e){let e=Vm(i,t,r);e&&n.push(e)}return n}function jm(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function Mm(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function Nm(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!Mm(r,i))return!1}return!0}function Pm(e,t){let n=Fm(e),r=Fm(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!Mm(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function Fm(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function Im(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!Mm(e,t))return!1}return!0}function Lm(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,Mm(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function Rm(e,t,n){let r=zm(Bm(e,n)),i=zm(Bm(t,n));for(let[e,t]of r){let n=i.get(e);if(!n||!Mm(t,n))return!0;i.delete(e)}return i.size>0}function zm(e){let t=new Map,n=new Map;for(let r of e){let e=t.get(r.content)??0;t.set(r.content,e+1),n.set(`${r.content}|#${e}`,r)}return n}function Bm(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function Vm(e,t,n){if(!e.rect||!Km(e.rect)||qm(e))return;let r=Gm(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=Um(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},content:Hm(e,a),x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!Wm(e,n)}}function Hm(e,t){return t??`${e.type??``}|${e.role??``}`}function Um(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function Wm(e,t){return ot(e)||e.ref!==void 0&&t.has(e.ref)}function Gm(e){let t=[e.identifier,e.label,e.value,e.type,e.role,...Ae(e),e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Km(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function qm(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Jm(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,androidFreshnessBaseline:o}=e;Br(r)&&Tm(t,r,o??t.snapshot),Ym(t,r,i,a)}function Ym(e,t,n=[],r){if(!oh(e.device)||!ah(t,n,r))return;let i=sh(e.device)?Am(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:jm(e.snapshot)}:{}}}function Xm(e,t){$e(e.device.platform)&&oh(e.device)&&t!==void 0&&t!==`observable`&&(e.postGestureStabilization={action:`open`,positionals:[],markedAt:Date.now()})}function Zm(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function Qm(e){return!!e?.postGestureStabilization}async function $m(e){if(Ze(e.device)&&e.session&&Qm(e.session))return await eh({...e,session:e.session});let t=Dm(e.session);if(t&&e.device.platform===`android`){let n=await km(e,t);return{snapshot:n.snapshot,...n.annotations}}}async function eh(e){return rh(await nh({session:e.session,capture:async()=>await th(e),readSnapshot:e=>e.snapshot}))}async function th(e){let t=Dm(e.session);return t&&e.device.platform===`android`?await km(e,t):await e.capture()}async function nh(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!oh(t.device)||!i)return{value:e.initial??await n()};try{return await Hr({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:sh(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:Am(t.nodes),backend:jm(t)}},signaturesStable:Nm,classifyBaselineEvidence:Pm,surfacesIdentical:Im,summarizeDivergence:Lm}})}finally{Zm(t)}}function rh(e){let{snapshot:t,annotations:n}=e.value;return e.postGestureOutcome&&(t.postGestureOutcome=e.postGestureOutcome),{snapshot:t,...n}}function ih(e){if(!e?.postGestureStabilization)return e;let{postGestureStabilization:t,...n}=e;return n}function ah(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function oh(e){return Ze(e)}function sh(e){return $e(e.platform)}function ch(e){if(typeof e.gestureClockOriginAtMs==`number`&&typeof e.gestureClockOriginUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`){let t=e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs);return Math.max(0,t-e.recordingStartedAt)}if(typeof e.runnerStartedAtUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`)return Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs);if(typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`){let t=e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs);return Math.max(0,t-e.recordingStartedAt)}return Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}function lh(e){return typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`?Math.max(0,e.gestureEndUptimeMs-e.gestureStartUptimeMs):typeof e.reportedDurationMs==`number`?Math.max(0,e.reportedDurationMs):Math.max(0,e.fallbackFinishedAtMs-e.fallbackStartedAtMs)}function uh(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return ch(e);let n=Math.min(Math.max(t*.15,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}function Y(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e!=`string`||e.trim().length===0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function dh(e,t,n){for(let r of[e,...t,n]){let e=Y(r);if(e!==void 0&&e>=1)return Math.floor(e)}return n}function fh(e,t,n,r,i){switch(t.kind){case`pan`:case`fling`:case`rotate`:case`transform`:{let e=gh(t.from),a=gh(t.to);if(!e||!a)return[];let o=(t.kind===`pan`||t.kind===`fling`)&&Y(t.pointerCount)!==2;return[ph(n,e.x,e.y,a.x,a.y,dh(r,[t.durationMs],250),{referenceFrame:i,classifyBackSwipe:o})]}case`pinch`:{let a=gh(t.from),o=Y(t.scale)??Y(e[1]);return!a||o===void 0||o<=0?[]:[{kind:`pinch`,tMs:n,x:a.x,y:a.y,...i,scale:o,durationMs:dh(r,[t.durationMs],280)}]}default:return[]}}function ph(e,t,n,r,i,a,o={}){let{referenceFrame:s,classifyBackSwipe:c=!0}=o,l=c?mh(t,n,r,i,s):`swipe`;return l===`back-swipe`?{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a,edge:hh(t,r,s)}:{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a}}function mh(e,t,n,r,i){if(!i||Math.abs(n-e)<=Math.abs(r-t)*1.25)return`swipe`;let a=i.referenceWidth*.08;return e<=a&&n>e||e>=i.referenceWidth-a&&n<e?`back-swipe`:`swipe`}function hh(e,t,n){if(n){let t=n.referenceWidth*.08;if(e<=t)return`left`;if(e>=n.referenceWidth-t)return`right`}return t>=e?`left`:`right`}function gh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=Y(t.x),r=Y(t.y);if(n!==void 0&&r!==void 0)return{x:n,y:r}}const _h={referenceWidth:1e3,referenceHeight:1e3};function vh(e,t,n,r,i={},a=Date.now(),o=Date.now()){let s=e.screenRecording?.handle;if(!s)return;let c=s.inspect(),l={...i,...r??{}},u=Y(l.effectiveDurationMs)??Y(l.durationMs),d={recordingStartedAt:c.startedAt,gestureClockOriginAtMs:c.gestureClockOriginAtMs,gestureClockOriginUptimeMs:c.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:c.runnerStartedAtUptimeMs,gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},f=lh({gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),reportedDurationMs:u,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}),p=N(e.device)&&Y(l.gestureStartUptimeMs)===void 0&&Ch(t,l)?uh({...d,gestureDurationMs:f}):ch(d),m=xh(t,n,l,p,f,Mh(e.snapshot,l));m.length!==0&&(s.appendGestureEvents(m),j({level:`debug`,phase:`record_touch_visualization_event`,data:{session:e.name,command:t,count:m.length,tMs:p,gestureDurationMs:f,kinds:m.map(e=>e.kind)}}))}function yh(e,t,n,r){if(t!==`scroll`)return r;let i=Gn(e.snapshot),a={...r??{}},o=Nh(a.direction)??Nh(n[0]);if(!o)return r;let s=Y(a.amount)??Y(n[1]),c=Y(a.pixels),l=Y(a.durationMs)??bh(e),u=Fh(a,[]),d=Y(a.referenceWidth),f=Y(a.referenceHeight),p=d!==void 0&&d>0&&f!==void 0&&f>0?{referenceWidth:d,referenceHeight:f}:i??_h;if(u&&(u.x1!==u.x2||u.y1!==u.y2))return{...a,x1:u.x1,y1:u.y1,x2:u.x2,y2:u.y2,contentDirection:o,...s===void 0?{}:{amount:s},...c===void 0?{}:{pixels:c},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l};let m=ae({direction:o,amount:s,pixels:c,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:m.x1,y1:m.y1,x2:m.x2,y2:m.y2,contentDirection:o,...s===void 0?{}:{amount:s},...m.pixels===void 0?{}:{pixels:m.pixels},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l}}function bh(e){return e.device.target===`desktop`||e.device.target===`tv`?250:300}function xh(e,t,n,r,i,a){let o=Sh[e];return o?.(t,n,r,i,a)??[]}const Sh={click:(e,t,n,r,i)=>wh(e,t,n,i),press:(e,t,n,r,i)=>wh(e,t,n,i),"react-native":(e,t,n,r,i)=>e[0]===`dismiss-overlay`?wh(e,t,n,i):[],fill:(e,t,n,r,i)=>Th(e,t,n,i),focus:(e,t,n,r,i)=>Th(e,t,n,i),longpress:Eh,scroll:kh,gesture:fh,swipe:Dh};function Ch(e,t){switch(e){case`click`:case`fill`:case`focus`:return!0;case`press`:{let e=X(Y(t.count),1)??1,n=t.doubleTap===!0,r=X(Y(t.holdMs),1);return e===1&&!n&&r===void 0}case`react-native`:return t.action===`dismiss-overlay`;default:return!1}}function wh(e,t,n,r){let i=Ph(t,e);if(!i)return[];let{x:a,y:o}=i,s=X(Y(t.count),1)??1,c=X(Y(t.intervalMs),0)??0,l=t.doubleTap===!0,u=X(Y(t.holdMs),1),d=[];for(let e=0;e<s;e+=1){let t=n+e*c;if(u!==void 0&&u>0){d.push(jh(t,a,o,u,r));continue}d.push(Ah(t,a,o,r)),l&&d.push(Ah(t+90,a,o,r))}return d}function Th(e,t,n,r){let i=Ph(t,e);if(!i)return[];let{x:a,y:o}=i;return[Ah(n,a,o,r)]}function Eh(e,t,n,r,i){let a=Ph(t,e);if(!a)return[];let{x:o,y:s}=a;return[jh(n,o,s,dh(r,[Y(t.durationMs),Y(e[2])],800),i)]}function Dh(e,t,n,r,i){let a=Fh(t,e);if(!a)return[];let{x1:o,y1:s,x2:c,y2:l}=a,u=dh(r,[Y(t.effectiveDurationMs),Y(t.durationMs)],250),d=X(Y(t.count),1)??1,f=X(Y(t.pauseMs),0)??0,p=t.pattern===`ping-pong`?`ping-pong`:`one-way`;return Array.from({length:d},(e,t)=>{let{startX:r,startY:a,endX:d,endY:m}=Oh(t,p,o,s,c,l);return ph(n+t*(u+f),r,a,d,m,u,{referenceFrame:i})})}function Oh(e,t,n,r,i,a){return t===`ping-pong`&&e%2==1?{startX:i,startY:a,endX:n,endY:r}:{startX:n,startY:r,endX:i,endY:a}}function kh(e,t,n,r,i){let a=Fh(t,e),o=Nh(t.contentDirection)??Nh(t.direction);if(!a||!o)return[];let{x1:s,y1:c,x2:l,y2:u}=a,d=dh(r,[],250),f=Y(t.amount)??Y(e[1]),p=Y(t.pixels);return[{kind:`scroll`,tMs:n,x:s,y:c,x2:l,y2:u,...i,durationMs:d,contentDirection:o,...f===void 0?{}:{amount:f},...p===void 0?{}:{pixels:p}}]}function Ah(e,t,n,r){return{kind:`tap`,tMs:e,x:t,y:n,...r}}function jh(e,t,n,r,i){return{kind:`longpress`,tMs:e,x:t,y:n,...i,durationMs:r}}function Mh(e,t){let n=Y(t.referenceWidth),r=Y(t.referenceHeight);return n!==void 0&&n>0&&r!==void 0&&r>0?{referenceWidth:n,referenceHeight:r}:Gn(e)}function Nh(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();switch(t){case`up`:case`down`:case`left`:case`right`:return t;default:return}}function X(e,t){if(e===void 0)return;let n=Math.floor(e);return n>=t?n:void 0}function Ph(e,t,n=0){let r=Y(e.x)??Y(t[n]),i=Y(e.y)??Y(t[n+1]);if(r!==void 0&&i!==void 0)return{x:r,y:i}}function Fh(e,t){let n=Ih(e.x1,e.x,t[0]),r=Ih(e.y1,e.y,t[1]),i=Ih(e.x2,t[2]),a=Ih(e.y2,t[3]);if(n!==void 0&&r!==void 0&&i!==void 0&&a!==void 0)return{x1:n,y1:r,x2:i,y2:a}}function Ih(...e){return e.map(Y).find(e=>e!==void 0)}var Lh=e({dispatchGenericCommand:()=>Rh});async function Rh(e){let{req:t,ref:n,logPath:r,sessionStore:i,contextFromFlags:a}=e,o=i.requireCurrent(n),s=t.command,c=await Wh(o,s,e.androidObservation);if(c.response)return c.response;let l=await Vh({sessionRef:n,req:t,session:o,sessionName:e.sessionName,logPath:r,sessionStore:i,contextFromFlags:a,platformServices:e.platformServices,command:s,flags:t.flags,createCommandSurface:e.createCommandSurface});if(`response`in l)return l.response;let u=await Uh(o,s,e.androidObservation);if(`response`in u)return u.response;let d=t.positionals??[],f=e.recordedRequest??{positionals:d,flags:t.flags??{}},p=Date.now(),m=i.requireCurrent(n),h={...a(t.flags,m.appBundleId,m.trace?.outPath),surface:m.surface};return Ou(t)===`may-invalidate`&&Up(m),await zh({req:t,ref:n,sessionStore:i,command:s,resolvedPositionals:d,recorded:f,data:await e.executePlatformCommand({session:m,sessionName:e.sessionName,logPath:r,command:s,request:t,positionals:d,out:t.flags?.out,dispatchContext:h}),actionStartedAt:p,readinessWarnings:[c.warning,u.status===`recovered`?u.warning:void 0],observeSettle:l.observe,androidObservation:e.androidObservation})}async function zh(e){let{req:t,ref:n,sessionStore:r,command:i}=e,a=await Uh(r.requireCurrent(n),i,e.androidObservation,`after-command`);if(`response`in a)return a.response;let o=Bh(e.data,e.readinessWarnings);if(Gh({ref:n,sessionStore:r,command:i,resolvedPositionals:e.resolvedPositionals,recorded:e.recorded,data:o,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),flags:t.flags??{},clientArtifactPaths:t.meta?.clientArtifactPaths}),Jm({session:r.requireCurrent(n),command:i,positionals:e.resolvedPositionals,flags:t.flags}),e.observeSettle){let t=await e.observeSettle();t&&(o={...o??{},settle:t})}return{ok:!0,data:o??{}}}function Bh(e,t){let n=t.filter(e=>typeof e==`string`&&e.length>0);if(n.length===0||e&&typeof e!=`object`)return e;let r=e&&typeof e.warning==`string`&&e.warning.length>0?[e.warning]:[];return{...e??{},warning:[...r,...n].join(` `)}}async function Vh(e){return!wt(e.command)||!Hh(e.flags)?{}:(await import(`../generic-settle.js`)).planGenericSettleObservation(e)}function Hh(e){return e?.settle===!0||e?.settleQuietMs!==void 0}async function Uh(e,t,n,r=`before-command`){if(e.device.platform!==`android`||!Cu(t)||ar(e.device))return{status:`clear`};try{return await om({session:e,command:t,phase:r,observation:n})}catch(e){return{response:{ok:!1,error:s(e)}}}}async function Wh(e,t,n){if(e.device.platform!==`android`||ar(e.device)||!e.screenRecording||t===`record`)return{};let r=await am({session:e,observation:n});return r.status===`failed`?{response:{ok:!1,error:{code:`COMMAND_FAILED`,message:`Android system dialog blocked the recording session`}}}:r.status===`unknown`?{warning:r.warning}:{}}function Gh(e){let{ref:t,sessionStore:n,command:r,resolvedPositionals:i,recorded:a,data:o,actionStartedAt:s,actionFinishedAt:c,flags:l,clientArtifactPaths:u}=e,d=n.requireCurrent(t);vh(d,r,i,yh(d,r,i,o),l,s,c),n.recordAction(t,{command:r,positionals:a.positionals,flags:a.flags,result:Fn({command:r,meta:{clientArtifactPaths:u}},o??{})})}function Kh(e){let t=e.now??Date.now,n=e.undurableCleanupTtlMs??3e5,r=new Map;return Object.freeze({blockUndurableCleanup(e,i){let a=qe(e);r.set(Je(a),{device:a,reason:i,expiresAt:t()+n})},clearUndurableCleanup(e){r.delete(Je(qe(e)))},assertStartAllowed(n){let i=Je(qe(n)),o=r.get(i);if(o){if(t()>o.expiresAt){r.delete(i),e.onUndurableCleanupExpired?.({device:o.device,reason:o.reason});return}throw new a(`COMMAND_FAILED`,`The existing ${e.displayName.toLowerCase()} resource has process-local unconfirmed ownership`,{reason:`cleanup-unconfirmed`,hint:`Do not start a replacement in this daemon process: ${o.reason}`})}}})}function qh(){return Kh({displayName:`audio probe`})}function Jh(){return Kh({displayName:`perf capture`})}function Yh(){return Kh({displayName:`screen recording`})}const Xh={humanControl:Z({load:()=>import(`../human-control.js`),run:$h}),lease:Z({load:()=>import(`../lease.js`),run:eg}),session:Z({load:()=>import(`../session2.js`),run:tg}),snapshot:Z({load:()=>import(`../snapshot3.js`),run:ng}),reactNative:Z({load:()=>import(`../react-native.js`),run:rg}),recordTrace:Z({load:()=>import(`../record-trace.js`),run:ig}),find:Z({load:()=>import(`../interaction.js`),run:ag}),interaction:Z({load:()=>import(`../interaction.js`),run:og}),generic:Z({load:async()=>Lh,run:async()=>null})};async function Zh(e){let t=fu(e.req.command);return await Xh[t].run(e)}async function Qh(){return await Xh.generic.loadModule()}async function $h({handleHumanControlCommand:e},t){return await e({req:t.req,registry:t.leaseRegistry})}async function eg({handleLeaseCommands:e},t){return cg(t.req.command,`lease`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,providerRuntimeIds:t.providerRuntimeIds,providerRuntimeRequiredIds:t.providerRuntimeRequiredIds,providerCredentials:t.providerCredentials,leaseLifecycleProvider:t.leaseLifecycleProvider,cloudArtifactProvider:t.cloudArtifactProvider}))}async function tg({handleSessionCommands:e},t){return cg(t.req.command,`session`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,leaseRegistry:t.leaseRegistry,leaseLifecycleProvider:t.leaseLifecycleProvider,providerAppCatalog:t.providerAppCatalog,invoke:t.invoke,invokeReplayAction:t.invokeReplayAction,androidAdbExecutor:t.providerScope.androidAdbExecutor,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:t.reconcileOrphanedDeviceClaim,appLogAdmissionLedger:t.appLogAdmissionLedger,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,perfCaptureAdmissionLedger:t.perfCaptureAdmissionLedger,screenRecordingAdmissionLedger:t.screenRecordingAdmissionLedger,hostDiagnostics:t.hostDiagnostics,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,platformResourceCleanup:t.platformResourceCleanup}))}async function ng({handleSnapshotCommands:e},t){return cg(t.req.command,`snapshot`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup}))}async function rg({handleReactNativeCommands:e},t){return cg(t.req.command,`react-native`,await e({req:t.req,createCommandSurface:t.createCommandSurface,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function ig({handleRecordTraceCommands:e},t){return cg(t.req.command,`record-trace`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,bindDevice:t.bindDevice,platformServices:t.platformServices,bindExactDevice:t.bindExactDevice,admissionLedger:t.screenRecordingAdmissionLedger,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled}))}async function ag({handleFindCommands:e},t){return cg(t.req.command,`find`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,invoke:t.invoke,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function og({handleInteractionCommands:e},t){return cg(t.req.command,`interaction`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,androidObservation:t.androidObservation}))}function Z(e){let t=sg(e.load);return{loadModule:t,run:async n=>await e.run(await t(),n)}}function sg(e){let t;return()=>(t??=e(),t)}function cg(e,t,n){if(n)return n;throw new a(`UNKNOWN`,`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`,{hint:`This is a daemon-internal routing bug in agent-device — please report it.`})}const lg=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function ug(e){return Object.fromEntries(lg.map(t=>[t,e?.[t]]))}function dg(e,t,n,r,i,a){return{requestId:i??A().requestId,appBundleId:n,runnerLeaseContext:Af({meta:a}),logPath:e,traceLogPath:r,...ug(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...oe(t),clickButton:je(t)}}function fg(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function pg(e,t,n={}){return e.session.screenRecording?gg(e.address,t):vg(e,t,n)}function mg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:pg(e,`device-in-use`,n)})}function hg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:_g(e.address,n)})}function gg(e,t){let n=Tn(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function _g(e,t){let n=Tn(e);return`${yg(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${bg(t)}Run agent-device session list to inspect active sessions.`}function vg(e,t,n){let r=e.address,i=Tn(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+xg(e,n):`${yg(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${bg(n)}`.trimEnd()}function yg(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function bg(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function xg(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function Sg(e,t){let{address:n,session:r}=e,i=Cg(r,t);if(i.length!==0)throw new a(`INVALID_ARGS`,`Session "${n}" is already bound to ${fg(r)}, but this request selected ${i.map(wg).join(`, `)}.`,{session:n,conflicts:i.map(wg),hint:pg(e,`selector-conflict`,{offersPlatformSession:i.some(e=>e.key===`platform`)})})}function Cg(e,t){if(!t)return[];let n=[],r=e.device,i=t.platform;if(i&&!rt(r,i)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(r.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!N(r)||t.udid!==r.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!Qe(r.platform)||t.serial!==r.id)&&n.push({key:`serial`,value:t.serial}),t.device&&!Ye(r,t.device)&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=r.simulatorSetPath?.trim();(!N(r)||r.kind!==`simulator`||e!==i)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=Mr(t.androidDeviceAllowlist);(r.platform!==`android`||!e.has(r.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function wg(e){return`${Tg(e.key)}=${e.value}`}function Tg(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const Eg=`default`,Dg=new Set(tt);function Og(e,t,n={}){let r=e.session||Eg;if(Pg(e))return r;let i=jg(e);return i.kind===`cwd`?Ig(e,t,i.id,n):r}function kg(e){return e.session||Eg}function Ag(e){let t=jg(e);return t.kind===`cwd`?t:void 0}function jg(e){if(e.meta?.sessionIsolation===`tenant`||e.flags?.sessionIsolation===`tenant`){let t=e.meta?.tenantId;if(!t)throw new a(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:t}}if(Pg(e)||(e.session||Eg)!==Eg)return{kind:`named-local`};let t=Jg(e.meta?.cwd);return t?{kind:`cwd`,id:qg(t)}:{kind:`global-default`}}function Mg(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function Ng(e,t){let n=Ag(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function Pg(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function Fg(e,t){return`cwd:${e}:${t}`}function Ig(e,t,n,r){let i=Hg(t,n),a=Ug(e);return a?Lg(e,t,n,a,i,r):Vg(n,i,r)}function Lg(e,t,n,r,i,a){let o=Fg(n,r);if(t.get(o))return o;let s=Bg(e.flags,r),c=i.map(e=>({ref:e,conflicts:Cg(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(Gg(a,l.map(e=>e.ref)),o):Rg(c)?.address??o}function Rg(e){return e.find(e=>!zg(e.conflicts))?.ref}function zg(e){return e.some(e=>e.key===`platform`)}function Bg(e,t){return{...e,platform:t}}function Vg(e,t,n){let[r]=t;return r&&t.length===1?r.address:(Gg(n,t),Fg(e,Eg))}function Hg(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function Ug(e){return Wg(e.flags?.platform)??Wg(e.meta?.lockPlatform)}function Wg(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return Dg.has(t)?t:void 0}function Gg(e,t){if(t.length>1&&e.attachesToSession===!0)throw Kg(t)}function Kg(e){let t=e.map(e=>e.address),n=e.map(e=>M(e.session.device)),r=n.map(e=>`--platform ${e}`).join(` or `);return new a(`AMBIGUOUS_MATCH`,`This workspace has ${e.length} implicit sessions (${t.join(`, `)}); select one explicitly.`,{sessions:t,platforms:n,hint:`Run agent-device session list to inspect them. Add ${r} to run in that platform's session, or pass --session <address> copied from that list.`})}function qg(e){return F.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function Jg(e){if(!e||e.trim().length===0)return;let t=Yg(e);return Xg(t)??t}function Yg(e){let t=L.resolve(e);try{return I.realpathSync.native(t)}catch{return t}}function Xg(e){let t=e;for(;;){if(I.existsSync(L.join(t,`.git`)))return t;let e=L.dirname(t);if(e===t)return;t=e}}const Zg=new Set([`udid`,`serial`,`device`]);function Qg(e){return Zg.has(e.key)}function $g(e,t){let n=e.meta?.lockPolicy;if(!n)return e;let r={...e.flags??{}},i=Su(e.command),o=i?[]:t?Cg(t.session,r):a_(r,e.meta?.lockPlatform),s=e.meta?.lockPlatform;if(o.length===0)return r_(i,t,r,s)&&(r.platform=s),{...e,flags:r};let c=o.filter(Qg);if(n===`strip`&&c.length===0)return i_(r,o,s,t?.session),{...e,flags:r};throw new a(`INVALID_ARGS`,t_(e,o,t),{session:t?.address??e.session,conflicts:o.map(wg),...e_(c,t?.session),hint:n_(e,t,c)})}function e_(e,t){return e.length===0?{}:{requestedDevice:Object.fromEntries(e.map(e=>[e.key,e.value])),...t?{boundDevice:{platform:t.device.platform,name:t.device.name,id:t.device.id}}:{}}}function t_(e,t,n){let r=t.map(wg).join(`, `);if(n)return`Session "${n.address}" is already bound to ${fg(n.session)}, but ${e.command} selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:``;return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}function n_(e,t,n){if(t)return pg(t,`selector-conflict`);let r=e.meta?.lockPlatform,i=e.session?` --session ${Tn(e.session)}`:``,a=r?`Run agent-device open <app>${i} --platform ${r} first if no session is active. `:`Run agent-device open <app>${i} first if no session is active. `;return n.length>0?`Remove ${n.map(wg).join(`, `)} and rerun to use the session-lock device, or drop --session so this command binds to the device you selected. `+a+`Run agent-device session list to inspect active sessions.`:`Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. `+a+`Run agent-device session list to inspect active sessions.`}function r_(e,t,n,r){return!r||t||n.platform!==void 0?!1:!e||!Op(n)}function i_(e,t,n,r){if(r){f_(e,t),e.platform=M(r.device);return}f_(e,t),n&&e.platform===void 0&&(e.platform=n)}function a_(e,t){let n=[],r=t;return e.platform!==void 0&&r&&Xe(e.platform,r)&&n.push({key:`platform`,value:e.platform}),r?(o_(n,e,r),c_(n,e,r),n):n}function o_(e,t,n){let r=t.target;r&&s_(r,n)&&e.push({key:`target`,value:r})}function s_(e,t){switch(t){case`android`:case`harmonyos`:case`ios`:return e===`desktop`;case`vega`:return e!==`tv`;case`macos`:case`linux`:case`web`:return e!==`desktop`;case`apple`:return!1;default:return p_(t)}}function c_(e,t,n){for(let r of l_(n,t)){let n=t[r];kp(n)&&e.push({key:r,value:n})}}function l_(e,t){if(u_(e))return[`udid`,`iosSimulatorDeviceSet`];switch(e){case`vega`:return[`udid`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];case`ios`:return[`serial`,`androidDeviceAllowlist`];case`apple`:return d_(t)?[`udid`,`serial`,`androidDeviceAllowlist`,`iosSimulatorDeviceSet`]:[`serial`,`androidDeviceAllowlist`];case`macos`:case`linux`:case`web`:return[`udid`,`serial`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];default:return p_(e)}}function u_(e){return e===`android`||e===`harmonyos`}function d_(e){return e.target===`desktop`||e.platform===`macos`}function f_(e,t){for(let n of t)delete e[n.key]}function p_(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function m_(e){if(e.command!==`replay`||e.flags?.replayFrom!==void 0)return;let t=e.flags?.replayScriptSource;if(t)return __(async()=>{let n=t.entry,r=Hn(t,n),i=be(n,e.flags?.replayBackend);return i===`ad`?g_(r,e.flags):await h_(i,r,n,e.flags)})}async function h_(e,t,n,r){let i=await(await import(`../replay-backend-registry.js`).then(e=>e.n)).getReplayBackend(e);return{flags:r??{},options:Vn(i.inspectSource(t,n).appTarget,r?.platform)}}function g_(e,t){let n=Si(e,t),r=Rn(n.actions);if(!r.appTarget)return;let i=Wn(t,n.actions),a=i.platform??n.metadata.platform;return{flags:a&&i.platform===void 0?{...i,platform:a}:i,options:a===`ios`?Kn(r.appTarget):void 0}}async function __(e){try{return await e()}catch{return}}function v_(e,t){return k_([D_(e),O_(t)])}async function y_(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i)return{keys:v_(n,i.device.id),deviceId:i.device.id};let a=new Set([D_(n)]),o=await C_(t);return o&&a.add(O_(o.id)),{keys:k_(a),deviceId:o?.id}}function b_(e){let{existingRef:t}=e;return{req:$g(e.req,t),existingRef:t}}function x_(e){if(!e.meta?.lockPolicy)return e;try{return $g(e)}catch{return e}}async function S_(e){return e.command===`open`?w_(e):e.command===`replay`?await T_(e):E_(e)}async function C_(e){let t=await S_(x_(e));if(t)try{return await In(t.flags,t.options)}catch{return}}function w_(e){let t=zn(e.positionals?.[0]);return t?{flags:e.flags??{},options:t}:void 0}async function T_(e){return await m_(e)??E_(e)}function E_(e){return Dp(e.flags)?{flags:e.flags??{},options:{}}:void 0}function D_(e){return`session:${e}`}function O_(e){return`device:${e}`}function k_(e){return Array.from(e).sort((e,t)=>{let n=A_(e)-A_(t);return n===0?e.localeCompare(t):n})}function A_(e){return+!e.startsWith(`session:`)}function j_(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[n]=we(`waitMs`);if(!n)throw new a(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return ue(t,`waitMs`,{min:n.min,max:n.max})}function M_(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function N_(e){return{...M_(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function P_(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return I_({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function F_(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function I_(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=Wt.fromTimeoutMs(a),s=()=>F_(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;tr({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await Ht(Math.min(250,o.remainingMs())),Yn(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};L_(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function L_(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}function R_(e){let{locks:t,initialKeys:n}=e,r=new Set(n),i=new Map,a=!1,o=async()=>{let e=[...i.values()];for(let t of e)t.release();await Promise.all(e.map(async e=>await e.completion)),i.clear()};return{run:async e=>{if(a)throw Error(`Request execution locks cannot run the same scope concurrently.`);a=!0;try{return await z_(t,n,e)}finally{try{await o()}finally{a=!1}}},retainDevice:async e=>{if(!a)throw Error(`A device execution lock can only be retained by a running request.`);let n=`device:${e}`;if(r.has(n))return;let o=i.get(n);o||(o=B_(t,n),i.set(n,o)),await o.acquired}}}async function z_(e,t,n){let[r,...i]=t;return r?await En(e,r,async()=>await z_(e,i,n)):await n()}function B_(e,t){let n=()=>{},r=()=>{},i=new Promise(e=>{n=e}),a=new Promise(e=>{r=e});return{acquired:i,completion:En(e,t,async()=>{n(),await a}),release:r}}function V_(e,t,n){let r=A();if(!t.ok){j({level:`error`,phase:`request_failed`,data:{code:t.error.code,message:t.error.message}});let e=He({force:!0});return{ok:!1,error:s(new a(p(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??(typeof t.error.details?.hint==`string`?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath,diagnosticsRecord:t.error.diagnosticsRecord,retriable:t.error.retriable??(typeof t.error.details?.retriable==`boolean`?t.error.details.retriable:void 0),supportedOn:t.error.supportedOn??(typeof t.error.details?.supportedOn==`string`?t.error.details.supportedOn:void 0)}),{diagnosticId:r.diagnosticId,logPath:e?.path,diagnosticsRecord:e?.ref})}}return j({level:`info`,phase:`request_success`}),He(),{ok:!0,data:H_(e,t.data,n)}}function H_(e,t,n){if(!t)return t;let r=U_(e,t);return r.length===0?t:{...t,artifacts:r.map(t=>{let r=t.path;return{field:t.field,...t.artifactType===void 0?{}:{artifactType:t.artifactType},artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,artifactType:t.artifactType,fileName:t.fileName,...D(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),fileName:t.fileName,localPath:t.localPath}})}}function U_(e,t){let n=Array.isArray(t.artifacts)?[...t.artifacts]:[];return e.command===`screenshot`&&!(e=>n.some(t=>t?.field===e))(`path`)&&typeof t.path==`string`&&n.push({field:`path`,artifactType:`screenshot`,path:t.path,localPath:e.meta?.clientArtifactPaths?.path,fileName:L.basename(e.meta?.clientArtifactPaths?.path??t.path),...D(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),n.filter(e=>!!(e&&typeof e.field==`string`&&typeof e.path==`string`&&(typeof e.localPath==`string`&&e.localPath.length>0||e.field===`fallbackScreenshotPath`&&e.artifactType===`screenshot`)))}async function W_(e,t,n){let r=e.requireCurrent(t);if(!G_(r))return;let i=r.screenRecording,a=i.handle,o=await n.appleSessionObservation.observeRunnerSession(r.device.id);if(e.resolveCurrent(t)?.screenRecording!==i)return;let s=a.inspect();if(!s.runnerSessionId){o?.alive&&a.setRunnerSessionId(o.sessionId);return}if(!o?.alive){a.invalidate(`iOS runner session exited during recording`);return}o.sessionId!==s.runnerSessionId&&a.invalidate(`iOS runner session restarted during recording`)}function G_(e){let t=e.screenRecording?.handle.inspect();return!t||!N(e.device)?!1:t.backend===`runner AVAssetWriter`&&t.showTouches!==!1}async function K_(e){let{leaseRegistry:t,req:n,task:r}=e,i=n.internal?.admittedLease;if(!i)return await r();let a=n.meta?.requestId,o=t.retainLeaseWork(i,()=>!Xn(a));try{return await(wu(n)?t.runDeviceMutation(i,r):r())}finally{o.release()}}const q_={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},J_=new Map;async function Y_(e){let t=await oi.mkdtemp(L.join(ai.tmpdir(),`agent-device-materialized-`));try{let n=await ev(e.installablePath,L.join(t,`installable`)),r=e.archivePath?await ev(e.archivePath,L.join(t,`archive`)):void 0,i=F.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{Q_(i)},a);return J_.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await oi.rm(t,{recursive:!0,force:!0}),e}}async function X_(e,t){await $_(e,js(J_,e,t,q_))}async function Z_(e){let t=Array.from(J_.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await $_(e,t)}))}async function Q_(e){let t=J_.get(e);if(t)try{await $_(e,t)}catch{}}async function $_(e,t){clearTimeout(t.timer),J_.delete(e),await oi.rm(t.rootPath,{recursive:!0,force:!0})}async function ev(e,t){let n=await oi.stat(e);await oi.mkdir(t,{recursive:!0});let r=L.join(t,L.basename(e));return n.isDirectory()?(await oi.cp(e,r,{recursive:!0}),r):(await oi.copyFile(e,r),r)}function tv(e){return e.device.platform===`web`}function nv(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function rv(e){let t=e.sessionStore.refresh(e.ref);if(!t.session.appLog)return;let{forceCleanupSessionAppLog:n}=await import(`../platform-request-scope.js`).then(e=>e.u);await n({...e,ref:t})}async function iv(e){let t=qr(e.sessionStore,e.ref);t.read()&&await Tr({binding:t,intent:`disposal`})}async function av(e,t){await t.stopSnapshotHelper(e.device)}async function ov(e){let{ref:t,sessionStore:n,platformCleanup:r}=e,i=n.resolveCurrent(t)??t.session,a=t.address;await r.closeManagedBrowser({device:i.device,sessionName:a,stateDir:n.resolveDaemonStateDir(),openSessionNames:()=>nv(n)})}async function sv(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function cv(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),n=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return j({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:n}}),new a(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${n.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function lv(e){let{ref:t,sessionStore:n}=e,r=n.resolveCurrent(t)??t.session,i=t.address;if(!e.platformCleanup)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let o=e.platformCleanup,s=[{step:`recording`,run:()=>uv({ref:t,sessionStore:n})},...e.appLog===`run`?[{step:`app_log`,run:()=>rv({ref:t,sessionStore:n})}]:[],{step:`audio_probe`,run:()=>dv({ref:t,sessionStore:n})},{step:`perf_capture`,run:()=>iv({ref:t,sessionStore:n})},{step:`platform_snapshot_helper`,run:()=>av(r,o)},{step:`web_browser`,run:()=>ov({ref:t,sessionStore:n,platformCleanup:o})}];s.push({step:`materialized_paths`,run:()=>Z_(i)});let c=cv({sessionName:i,phase:`session_teardown_cleanup_failed`,failures:await sv(s)});if(c)throw c}async function uv(e){let t=Jr(e.sessionStore,e.ref);t.read()&&await jr({binding:t,intent:`disposal`})}async function dv(e){let t=Kr(e.sessionStore,e.ref);t.read()&&await Er({binding:t,intent:`disposal`})}async function fv(e){let{inspectFacts:t,bind:n,session:r,stateDir:i,runtimeHints:a}=e,o={...gv(r,i),...e.daemonShutdown?{daemonShutdown:!0}:{}};if(!_v(r,a)){let e=lt;hv(await t(r.device),e.required,r),await(await n(r.device,e)).operations.finalizeApplicationClose(o);return}let s=gt;hv(await t(r.device),s.required,r);let c=await n(r.device,s);await c.operations.finalizeApplicationClose(o),await c.operations.clearRuntimeHints({appId:r.appBundleId,values:a})}async function pv(e){await fv({...e,bind:e.bindDevice})}async function mv(e){let{gateway:t,scope:n,session:r,stateDir:i,runtimeHints:a}=e,s;try{await fv({inspectFacts:async e=>await t.inspectFacts(e),bind:async(e,r)=>(s??=await t.bind({device:e,intent:{kind:`ordinary`},scope:n}),_t(s,r)),session:r,stateDir:i,runtimeHints:a,...e.daemonLeaving===!1?{}:{daemonShutdown:!0}})}catch(e){try{await s?.[Symbol.asyncDispose]()}catch(t){n.diagnostics.emit({level:`error`,phase:`daemon_lifecycle_binding_cleanup_failed`,data:{session:r.name,error:o(t),operationError:o(e)}})}throw e}await s?.[Symbol.asyncDispose]()}function hv(e,t,n){for(let r of t){let t=e.operations[r];if(!t?.available)throw new a(`UNSUPPORTED_OPERATION`,`Session lifecycle ${r} is not supported on this device.`,{reason:t?.reason,...t?.hint===void 0?{}:{hint:t.hint},deviceId:n.device.id})}}function gv(e,t){return{appBundleId:e.appBundleId,surface:e.surface??`app`,retainRunner:!1,stateDir:t}}function _v(e,t){return e.appBundleId!==void 0&&pr(t)}function vv(e){return N(e)&&e.kind===`simulator`}function yv(e){return e.platform===`android`&&e.kind===`emulator`}const bv=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function xv(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Sv(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function Cv(e){return pr(Sv(e))}function wv(e,t){if(e!==void 0){if(typeof e!=`string`)throw new a(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return bn(e)}}function Tv(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new a(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Ev(e){if(e!==void 0){if(typeof e!=`number`)throw new a(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Tv(e)}}function Dv(e,t,n){if(e===void 0)return n;if(!h(e))throw new a(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(n&&e!==n)throw new a(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${n}.`);return e}function Ov(e){if(h(e))return e}function kv(e,t){return{platform:t,metroHost:bn(e?.metroHost),metroPort:Tv(e?.metroPort),bundleUrl:bn(e?.bundleUrl),launchUrl:bn(e?.launchUrl)}}function Av(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function jv(e){if(yv(e))return`10.0.2.2`;if(vv(e))return`127.0.0.1`}function Mv(e,t){if(!e||bn(e.metroHost)||bn(e.bundleUrl)||e.metroPort===void 0)return e;let n=jv(t);return n?{...e,metroHost:n}:e}function Nv(e){let{runtime:t,sessionName:n,platform:r}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`open runtime must be an object.`);let i=t,o=Object.keys(i).find(e=>!bv.includes(e));if(o)throw new a(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${bv.join(`, `)}.`);return{platform:Dv(i.platform,n,r),metroHost:wv(i.metroHost,`metroHost`),metroPort:Ev(i.metroPort),bundleUrl:wv(i.bundleUrl,`bundleUrl`),launchUrl:wv(i.launchUrl,`launchUrl`)}}function Pv(e,t,n){if(n){if(xv(n)===0){e.setRuntimeHints(t,void 0);return}return e.setRuntimeHints(t,n),n}}function Fv(e,t,n,r){let i=e.getRuntimeHints(t);if(!i)return;let o=n?M(n):void 0,s=Ov(o)??r;if(i.platform&&n&&!s)throw new a(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(i.platform&&s&&i.platform!==s)throw new a(`INVALID_ARGS`,`Session runtime hints target ${i.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&i.platform!==s?{...i,platform:s}:i}function Iv(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Ov(M(i)):e.platform,o=n.getRuntimeHints(r),s=Nv({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Fv(n,r,i,a);return{runtime:i?Mv(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&xv(s)>0?s:void 0;return{runtime:i?Mv(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Lv(e){return Iv(e).runtime}function Rv(e){try{return{ok:!0,data:Iv(e)}}catch(e){let t=r(e);return g(t.code,t.message,t.details)}}async function zv(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Bv(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Sv(t)})}function Bv(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&Cv(e.previousRuntime)&&!Cv(e.runtime)}function Vv(e,t,n=`status`){let r=t.claim,i=M(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=$e(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${Tn(i)}`,`${a} ${Tn(e.id)}`,...n===`release`||yr(t.classification)?[`--stale`]:[]].join(` `)}function Hv(e,t){let n=t.claim,r=Vv(e,t,br(t.classification)?`release`:`status`),i=M(n?{platform:n.device.family,appleOs:n.device.appleOs}:e);return new a(`DEVICE_IN_USE`,n?`${i} device ${e.id} is owned by session "${n.session}" in workspace "${n.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:Gv(t.classification),classification:t.classification,deviceKey:t.deviceKey,...n?{owner:{session:n.session,workspace:n.workspace,stateDir:n.stateDir}}:{},recovery:{command:r},hint:br(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${r}`:`Inspect the owner with: ${r}`,retriable:!1})}function Uv(e,t){return Wv(Hv(e,t))}function Wv(e){let{hint:t,retriable:n,...r}=e.details??{};return g(e.code,e.message,r,{hint:t,retriable:n})}function Gv(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function Kv(e,t){if(t?.backend===`macos-app`)return`none`;switch(e.kind){case`local-family`:return`ordinary`;case`provider-runtime`:return`none`}}function qv(e){let t=[];async function n(n){if(e.policy!==`transient-exclusive`)return;let r=await Cr({device:n,command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim});if(r.status===`conflict`)throw Hv(n,r.conflict);r.status===`acquired`&&t.push(r.ownership)}return{admit:async(e,t)=>{switch(Kv(t)){case`none`:return;case`ordinary`:return await n(e)}},[Symbol.asyncDispose]:async()=>{for(let n of t.splice(0))try{await wr(n)}catch(t){j({level:`error`,phase:`transient_device_claim_release_failed`,data:{command:e.command,deviceKey:n.deviceKey,error:t instanceof Error?t.message:String(t)}})}}}}const Jv=new WeakMap,Yv=new WeakMap,Xv=async()=>{throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})};async function Zv(e){let{sessionStore:t,leaseRegistry:n}=e,r=ty(Mf(e.req)),i=r.command,a=Date.now(),o=_u(i),c=Og(r,t,{attachesToSession:pu(i)!==`inventory`}),l=A(),u=t.resolveSessionDir(c),d=nn({sessionDir:u,session:c,requestId:r.meta?.requestId??l.requestId}),f=d.path,p=pn(u);Ge({session:c,logPath:d.path,logRecord:d.ref}),j({level:`info`,phase:`request_start`,data:{publicSession:r.session,effectiveSession:c,command:r.command,tenant:r.meta?.tenantId,isolation:r.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:p}});let m=ls(r);m&&t.recordEvent(c,hs({req:r}));try{e.daemonPolicy&&tf(e.daemonPolicy,r),Rf(r);let s=r.command===`open`?j_(r):void 0,l=_u(i)?await y_({req:r,sessionName:c,sessionStore:t}):{keys:[],deviceId:void 0},u=P_({req:r,budgetMs:s,sessionName:c,sessionStore:t,deviceId:l.deviceId});await u?.waitForDeviceOutsideLocks();let d=R_({locks:ay(n),initialKeys:l.keys}),h=Yr(r),{claimAdmission:g,runtimeBindings:_}=Qv({command:i,dispatchLedger:h,workspace:r.meta?.cwd??process.cwd(),stateDir:t.resolveDaemonStateDir(),deviceRuntimeGateway:e.deviceRuntimeGateway,platformRequestScope:e.platformRequestScope,daemonPolicy:e.daemonPolicy,claimRecoveryGateway:e.claimRecoveryGateway}),v={req:r,command:i,sessionName:c,requestLogPath:f,runnerLogPath:p,startedAtMs:a,retainDeviceExecutionLock:async e=>await d.retainDevice(e),bindDevice:_?.bindDevice??Xv,inspectFacts:_?.inspectFacts??Xv,bindExactDevice:_?.bindExactDevice??Xv,platformServices:e.platformServices,dispatchLedger:h,throwIfCanceled:()=>Yn(r.meta?.requestId),runAdmitted:async i=>{Yn(r.meta?.requestId);try{await Uf({sessionName:c,sessionStore:t,leaseRegistry:n,teardownSession:async n=>await $v({ref:n,sessionStore:t,inspectFacts:v.inspectFacts,bindDevice:v.bindDevice,platformCleanup:ey(e.platformResourceCleanup)})}),r=Wf({req:r,sessionName:c,sessionStore:t,leaseRegistry:n,providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy}),v.req=r;let a=r.internal?.admittedLease;return a&&await Xu(a),await K_({leaseRegistry:n,req:r,task:i})}finally{o&&!Xn(r.meta?.requestId)&&t.noteSessionActivity(c)}},runLocked:async e=>(Yn(r.meta?.requestId),u?await u.runWhenDeviceIsUnheld({acquireLocks:d.run,task:async()=>await v.runAdmitted(e)}):await d.run(async()=>await v.runAdmitted(e))),[Symbol.asyncDispose]:async()=>{try{await _?.[Symbol.asyncDispose]()}finally{await g?.[Symbol.asyncDispose]()}}};return Yv.set(v,e=>(m&&t.recordEvent(c,gs({req:r,response:e,durationMs:Math.max(0,Date.now()-a)})),e)),v}catch(e){throw m&&t.recordEvent(c,gs({req:r,response:{ok:!1,error:s(e,{diagnosticId:A().diagnosticId,logPath:f})},durationMs:Math.max(0,Date.now()-a)})),e}}function Qv(e){let{deviceRuntimeGateway:t,platformRequestScope:n,daemonPolicy:r}=e;if(!t||!n)return{claimAdmission:void 0,runtimeBindings:void 0};let i=qv({policy:vt(e.command),command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:Or({scope:n,composeGateway:e.claimRecoveryGateway})});return{claimAdmission:i,runtimeBindings:Qr({gateway:t,scope:n,dispatchLedger:e.dispatchLedger,admitDeviceClaim:i.admit,admitDevice:r?e=>af(r,e):void 0})}}async function $v(e){let{ref:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformCleanup:a}=e,o=n.resolveCurrent(t)??t.session,s=t.address,c=Sv(n.getRuntimeHints(t.address)),l;try{await lv({appLog:`run`,ref:t,sessionStore:n,platformCleanup:a})}catch(e){l=e}try{await pv({inspectFacts:r,bindDevice:i,session:o,stateDir:n.resolveDaemonStateDir(),runtimeHints:c})}catch(e){if(l!==void 0)j({level:`error`,phase:`expired_session_lifecycle_cleanup_failed`,data:{session:s,error:e instanceof Error?e.message:String(e),primaryError:l instanceof Error?l.message:String(l)}});else throw e}if(l!==void 0)throw l}function ey(e){if(!e)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);return e}function ty(e){let t={...e.flags??{}};return kt(e.command,t)?{...e,flags:t}:e}async function ny(e){let{scope:t,sessionStore:n,trackDownloadableArtifact:r}=e,i=t.runnerLogPath;t.throwIfCanceled();let a=n.lookup(t.sessionName);a&&(await W_(n,a,t.platformServices),t.throwIfCanceled(),n.requireCurrent(a));let o=b_({req:t.req,existingRef:a?n.refresh(a):void 0}),s=o.req,c=o.existingRef,l=c?.session;Ge({traceLogPath:l?.trace?.outPath}),Yv.set(t,e=>{let i=V_(s,e,r);return ls(s)&&n.recordEvent(t.sessionName,gs({req:s,response:i,durationMs:Math.max(0,Date.now()-t.startedAtMs)})),i});let u=l?.screenRecording?.handle.inspect().invalidatedReason;if(u&&yu(t.command))return{type:`response`,response:{ok:!1,error:{code:`COMMAND_FAILED`,message:u}}};c&&!s.meta?.lockPolicy&&gu(t.command)&&Sg(c,s.flags);let d=(e,t,n)=>iy(i,e,t,n,s.meta);return{type:`scope`,scope:{req:s,sessionName:t.sessionName,logPath:i,existingSession:l,retainDeviceExecutionLock:t.retainDeviceExecutionLock,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,dispatchLedger:t.dispatchLedger,throwIfCanceled:t.throwIfCanceled,contextFromFlags:d,handlerContextFromFlags:(e,r,i)=>({...d(e,r,i),surface:(a?n.resolveCurrent(a):n.get(t.sessionName))?.surface})}}}function ry(e,t){let n=Yv.get(e);return Yv.delete(e),n?n(t):t}function iy(e,t,n,r,i){let a=A().requestId;return{...dg(e,t,n,r,a,i),requestId:a}}function ay(e){let t=Jv.get(e);return t||(t=new Map,Jv.set(e,t)),t}const oy=`--save-script is supported only by ${xu().join(`, `)}.`;function sy(e){if(e.flags?.saveScript===void 0||bu(e.command))return;j({level:`warn`,phase:`save_script_flag_rejected`,data:{command:e.command}});let t=A(),n=He({force:!0});return{ok:!1,error:s(new a(`INVALID_ARGS`,oy,{hint:`Arm publication on the session instead: open/close --save-script, replay --save-script, or session save-script to publish an armed recording without closing its session.`}),{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}const cy=`AGENT_DEVICE_SESSION_IDLE_TIMEOUT_MS`;function ly(e=process.env){let t=e[cy]?.trim();if(!t)return 0;let n=Number(t);return!Number.isFinite(n)||n<=0?0:Math.max(1,Math.floor(n))}function uy(e){return e.lastActivityAtMs??e.createdAt}function dy(e){return e.deviceClaim!==void 0&&e.lease===void 0&&e.screenRecording===void 0&&e.appLog===void 0&&e.audioProbe===void 0&&e.perfCapture===void 0&&e.trace===void 0}function fy(e,t,n=Date.now()){return t<=0?!1:n-uy(e)>=t}function py(e,t,n=Date.now()){return dy(e)&&fy(e,t,n)}function my(e,t){if(!(!dy(e)||t<=0))return uy(e)+t}function hy(e,t){return{owner:e,expiredAtMs:t.expiredAtMs,expiresAt:t.expiredAtMs+36e5,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{}}}function gy(e,t,n=Date.now()){let r=Math.max(0,n-t.expiredAtMs);return new a(`SESSION_NOT_FOUND`,`Session "${t.owner}" expired ${_y(r)} ago for idleness (window ${_y(t.idleExpiryMs)}). Run open again to start a new session.`,{reason:`SESSION_IDLE_EXPIRED`,session:e,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{},hint:t.deviceKey?`Run open again to claim ${t.deviceKey} and start a new session. Set ${cy}=0 to keep sessions open indefinitely.`:`Run open again to start a new session. Set ${cy}=0 to keep sessions open indefinitely.`})}function _y(e){let t=e/1e3;if(t<90)return`${Math.round(t)}s`;let n=t/60;return n<90?`${Math.round(n)}m`:`${Math.round(n/60)}h`}function vy(e,t,n){let r;for(let[i,a]of e)if(!(!a.device||Je(a.device)!==t)){if(!n(i)){e.delete(i);continue}r??=a}return r}function yy(e={}){let t=e.markerExists??I.existsSync,n=Kh({displayName:`app-log`,now:e.now,undurableCleanupTtlMs:e.undurableCleanupTtlMs,onUndurableCleanupExpired:e.onUndurableCleanupExpired}),r=new Map;return Object.freeze({...n,retainLegacyMarkers(e){for(let t of e)t.device&&r.set(t.markerPath,t)},assertStartAllowed(e){let i=Je(qe(e));if(vy(r,i,t))throw new a(`COMMAND_FAILED`,`A retained legacy app-log marker prevents replacement capture`,{reason:`cleanup-unconfirmed`,hint:`Inspect and remove the retained app-log.pid only after manually confirming its process is gone.`});n.assertStartAllowed(e)}})}function by(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:t.reason},t.hint?{hint:t.hint}:void 0)}async function xy(e){let t=await Cy(e.inspectFacts)(e.device);for(let n of e.required){let r=t.operations[n];if(!r.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(r):by(e.command,r)}}return{type:`admitted`,bind:wy(e.bindDevice)}}async function Sy(e){let t=await xy({...e,required:e.use.required});if(t.type===`response`)return t;let n=await t.bind(e.device,e.use);return e.readiness&&await Xr(n,e.platformServices),{type:`runtime`,runtime:n}}async function Q(e,t){let n=await Sy(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function Cy(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function wy(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Ty(e){let{flags:t,logPath:n,meta:r,session:i,snapshotScope:a}=e,{appBundleId:o,trace:s,surface:c}=i??{},l=e.context??dg(n??``,t,o,s?.outPath,r?.requestId,r);return{options:{appBundleId:o,...m(t,f),scope:a,includeRects:e.includeRects,surface:c},execution:$(l),...e.signal===void 0?{}:{signal:e.signal}}}function $(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function Ey(e){return zr(e,`focus requires x y`)}function Dy(e,t){return{point:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Oy(e){let t=Ey(e.positionals);return await Q({command:`focus`,device:e.device,use:At,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>ky(e,t,n))}async function ky(e,t,n){return await e.operations.focusPoint(Dy(t,n)),{x:t.x,y:t.y,...y(`Focused (${t.x}, ${t.y})`)}}function Ay(e){if(e===`down`)return`bottom`;if(e===`up`)return`top`}async function jy(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=await i(r),{analyzeScrollEdgeState:a}=await import(`../selection.js`),o=a(e,t,n);return r&&o.emptySnapshot?await jy({edge:t,target:n,captureNodes:i}):o}catch(e){throw Vy(t,r,e)}}async function My(e,t,n={}){let{analyzeScrollEdgeState:r}=await import(`../selection.js`);return r(e,t,n)}async function Ny(e,t){return(await My(e,t)).canScroll}async function Py(e,t){let{analyzeScrollEdgeState:n}=await import(`../selection.js`);return n(e,t).fingerprint??``}function Fy(e){if(e.length<4)return!1;let t=e.slice(-6);if(new Set(t).size>2)return!1;let n=t.at(-1);return n!==void 0&&t.slice(0,-1).includes(n)}function Iy(e,t,n){t&&(e.push(t),e.length>n&&e.shift())}async function Ly(e){let{edge:t,captureState:n,scroll:r,settleAfterPass:i=async()=>{}}=e,o=await n();o.scope&&(o=await n(o.scope));let s=0,c,l=[];for(Iy(l,o.fingerprint,6);o.canScroll;){if(s>=40)throw new a(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{reason:`scroll_edge_pass_limit`,edge:t,passes:s,hint:`The scoped scroll container still reports hidden content. Run scroll <dir> --until <selector> to stop on the element you are after, or snapshot -i to inspect the current state.`});if(c=await r(),s+=1,await i(),o=await n(o.scope),Iy(l,o.fingerprint,6),o.canScroll&&Fy(l))throw zy(t,s)}return{passes:s,result:c}}function Ry(e){let{direction:t,edge:n,passes:r,amount:i,pixels:a,honoredPixels:o,movement:s}=e;if(n&&r===0)return`Already at ${n}; no hidden content ${n===`bottom`?`below`:`above`} detected`;if(n)return`Scrolled to ${n} with ${r} ${t} passes`;let c=Ay(t);return s===`at-edge`&&c?`Scrolled ${t} and no hidden content ${c===`bottom`?`below`:`above`} was detected`:s===`unchanged`?`Scrolled ${t} and the visible content did not change`:a===void 0?i===void 0?`Scrolled ${t}`:o===void 0?`Scrolled ${t} by ${i}`:`Scrolled ${t} by ${i} of the viewport (${o}px)`:`Scrolled ${t} by ${o??a}px`}function zy(e,t){let n=`${t} ${t===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} moved nothing across ${n}: the container still reports hidden content but its contents never shifted`,{reason:`scroll_edge_no_progress`,edge:e,passes:t,hint:By({targetDirectly:`with scroll <dir> --until <selector>`})})}function By(e={}){let t=`The scroll is not reaching this container. If a field is focused, dismiss the keyboard first; if it is nested inside another scroller, ${e.targetDirectly===void 0?`target it directly`:`target it directly ${e.targetDirectly}`}.`;return e.rawDrag===!1?t:t+` Some lists ignore synthesized scrolls — a raw drag moves them: swipe x1 y1 x2 y2 started inside the list.`}function Vy(e,t,n){return t?new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},n):new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},n)}async function Hy(e){let{selector:t,direction:r,platform:i,capture:o,scroll:s}=e,c=e.passLimit??12,l=Ay(r),u=0,d,f=[],p=!1;try{for(;;){if((await Uy({captured:await o(),selector:t,direction:r,platform:i,edge:l,passes:u,passLimit:c,recentSignatures:f})).visible)return{passes:u,...d===void 0?{}:{result:d}};p=!0,d=await s(),p=!1,u+=1}}catch(e){throw u===0&&!p&&e instanceof a?n(e,`no`):e}}async function Uy(e){let{captured:t,selector:n,direction:r,platform:i,edge:a,passes:o,passLimit:s,recentSignatures:c}=e,l=Ky(t);if(l)throw Yy(r,n,l);let u=t.nodes??[];if(await Gy(u,n,i))return{visible:!0};if(a&&!await Ny(u,a))throw qy(r,n,`edge-reached`,o);if(o>=s)throw qy(r,n,`pass-limit`,o);if(a&&(Iy(c,await Py(u,a),6),Fy(c)))throw Jy(r,n,o);return{visible:!1}}function Wy(e,t,n){return n===0?`${t} was already visible; no ${e} scroll needed`:`Scrolled ${e} ${n} ${n===1?`pass`:`passes`} until ${t} was visible`}async function Gy(e,t,n){let r=await Lr(Vr.wait,e,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[],a=ct(e);return i.some(e=>St({predicate:`visible`,node:e,visibility:a,platform:n}).pass)}function Ky(e){let t=e.nodes;if(t===void 0)return{reason:`no-capture`,detail:`the capture returned no accessibility tree`};if(t.length===0)return{reason:`no-capture`,detail:`the capture returned an empty accessibility tree`};let n=Pe({backend:e.backend,nodes:t,...e.quality?{snapshotQuality:e.quality}:{}});if(n)return{reason:`sparse-tree`,detail:n.reason??`the capture backend reported a sparse tree`}}function qy(e,t,n,r){let i=`${r} ${r===1?`pass`:`passes`}`;return n===`edge-reached`?new a(`COMMAND_FAILED`,`scroll ${e} reached the end of the scrollable content after ${i} without ${t} becoming visible`,{reason:`scroll_until_edge_reached`,selector:t,direction:e,passes:r,hint:`The content ends here, so no further ${e} scroll can reveal it. Run snapshot -i to see what is on screen, scroll the opposite direction, or check the selector — the element may be on another screen.`}):new a(`COMMAND_FAILED`,`scroll ${e} spent its ${r}-pass budget without ${t} becoming visible`,{reason:`scroll_until_pass_limit`,selector:t,direction:e,passes:r,hint:`Raise the step with an amount (scroll ${e} 0.8 --until <selector>), or run snapshot -i to confirm the selector matches something on this screen.`})}function Jy(e,t,n){let r=`${n} ${n===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} moved nothing across ${r}: the on-screen content never shifted`,{reason:`scroll_until_no_progress`,selector:t,direction:e,passes:n,hint:By()})}function Yy(e,t,n){return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} could not read the screen: ${n.detail}`,{reason:`scroll_until_capture_unreadable`,selector:t,direction:e,captureRefusal:n.reason,hint:n.reason===`no-capture`?`Run snapshot -i to see whether the app is producing an accessibility tree at all, and retry once it does.`:`The accessibility tree came back sparse, so its refs and selectors are not trustworthy. Run screenshot, inspect the image, and navigate by coordinates until snapshot -i reports a full tree.`})}const Xy={intervalMs:200,budgetMs:1500};function Zy(e){return Ze(e.device)?e.flags?.postGestureStabilization===!1?{kind:`declined`,reason:`caller-declined-observation`}:e.flags?.settle===!0?{kind:`declined`,reason:`settle-observer-owns-outcome`}:$y(e.session):{kind:`declined`,reason:`non-swipe-platform`}}function Qy(e){if(!e||e.nodes.length===0)return;let t=Am(e.nodes);if(t.length!==0)return{signature:t,presentationKey:e.presentationKey,comparisonKey:jm(e),nodes:e.nodes}}function $y(e){let t=Qy(e.snapshot);return t?Zp(e)===`active`?Qm(e)?{kind:`unobservable`,reason:`prior-gesture-unsettled`}:{kind:`observe`,baseline:t}:{kind:`unobservable`,reason:`stored-surface-not-current`}:{kind:`unobservable`,reason:`stored-surface-unusable`}}async function eb(e){let{direction:t,baseline:n,swipe:r}=e,i=await nb(n,e);switch(i.kind){case`moved`:return await lb({...i,direction:t,baseline:n,swipe:r});case`blind`:return gb(t,i.reason,{swipe:r});case`settled`:return await ub({...i,direction:t,baseline:n,swipe:r})}}function tb(e,t){if(e.presentationKey!==t.presentationKey)return`baseline-presentation-drift`;if(e.comparisonKey!==t.comparisonKey)return`capture-lineage-drift`}async function nb(e,t){let n,r,i=await Gr({capture:async()=>{let n=await ab(e,t.capture);return n.kind===`changed`&&(r??=await ib(e,t.direction,t.swipe)),n},schedule:{intervalMs:t.pollMs??Xy.intervalMs,budgetMs:t.budgetMs??Xy.budgetMs},verdict:e=>{if(e.kind===`blind`)return{kind:`done`,result:{kind:`blind`,reason:e.reason}};let t=rb(e,{previous:n,changeNeedsRest:r===!0});return n=e.observed.signature,t?{kind:`done`,result:t}:{kind:`continue`}},...t.clock?{clock:t.clock}:{}}),a=i.polls.length;if(i.kind===`failed`)throw i.error;if(i.kind!==`done`)return ob(t,a,i.waitedMs);let o=Date.now()-i.waitedMs;return i.result.kind===`blind`?i.result:{...i.result,attempts:a,startedAt:o}}function rb(e,t){let n=sb(t.previous,e.observed.signature);if(e.kind===`changed`)return!t.changeNeedsRest||n?{kind:`moved`,observed:e.observed}:void 0;if(n)return{kind:`settled`,observed:e.observed,evidence:e.evidence}}async function ib(e,t,n){let r=Ay(t);if(!r)return!1;let i=await My(e.nodes,r,{point:n.midpoint}),a=i.containerRect!==void 0&&!i.canScroll;return a&&j({level:`debug`,phase:`scroll_movement_edge_rest_required`,data:{direction:t,containerRect:i.containerRect}}),a}async function ab(e,t){let n=await cb(t);if(!n)return{kind:`blind`,reason:`capture-unreadable`};let r=tb(e,n);if(r)return{kind:`blind`,reason:r};let i=Pm(e.signature,n.signature);return i===`changed`?{kind:`changed`,observed:n}:{kind:`unchanged`,observed:n,evidence:i}}function ob(e,t,n){return j({level:`warn`,phase:`scroll_movement_budget_expired`,data:{direction:e.direction,attempts:t,durationMs:n,...e.swipe.pixels===void 0?{}:{requestedPixels:e.swipe.pixels}}}),{kind:`blind`,reason:`surface-unsettled`}}function sb(e,t){return e!==void 0&&Nm(e,t)}async function cb(e){let t;try{t=await e()}catch{return}let n=On(t,void 0);return{signature:Am(n.nodes),presentationKey:n.presentationKey,comparisonKey:jm(n),nodes:n.nodes}}async function lb(e){let{direction:t,baseline:n,swipe:r,observed:i}=e,a=Ay(t),o=a?(await My(i.nodes,a)).containerRect:void 0;return o&&!Rm(n.signature,i.signature,o)?gb(t,`change-outside-container`,{swipe:r,containerRect:o}):_b(t,`moved`,r,e.attempts,e.startedAt)}async function ub(e){let{direction:t,baseline:n,observed:r,evidence:i,swipe:a}=e,o=db(n,r,i);return o?gb(t,o.reason,{swipe:a,divergence:o.divergence}):await fb(e)}function db(e,t,n){if(n===`ambiguous`)return{reason:`no-comparable-content`};if(!Im(e.signature,t.signature))return{reason:`surface-divergence`,divergence:Lm(e.signature,t.signature)}}async function fb(e){let{direction:t,observed:n,swipe:r}=e,i=Ay(t);if(!i)return _b(t,`unchanged`,r,e.attempts,e.startedAt);let a=await My(n.nodes,i),o=a.containerRect;if(!o)return gb(t,`no-scroll-container`,{swipe:r});if(r.midpoint&&!pb(o,r.midpoint))return gb(t,`container-outside-swipe`,{swipe:r,containerRect:o});if(a.canScroll)throw mb(t,i,r,o);return _b(t,`at-edge`,r,e.attempts,e.startedAt)}function pb(e,t){return dt(e,t.x,t.y)}function mb(e,t,r,i){let o=new a(`COMMAND_FAILED`,`scroll ${e} moved nothing: the container still reports hidden content ${t===`bottom`?`below`:`above`} and its contents never shifted`,{reason:`scroll_no_progress`,direction:e,hiddenContentAt:t,containerRect:i,...r.pixels===void 0?{}:{requestedPixels:r.pixels},hint:By({targetDirectly:`with scroll ${e} --until <selector>`,rawDrag:r.midpoint!==void 0})});return n(o,`unknown`)}function hb(e,t){j({level:`debug`,phase:`scroll_movement_not_applicable`,data:{direction:e,reason:t}})}function gb(e,t,n){return j({level:`info`,phase:`scroll_movement_unobserved`,data:{direction:e,reason:t,...n.swipe.pixels===void 0?{}:{requestedPixels:n.swipe.pixels},...n.divergence??{},...n.containerRect===void 0?{}:{containerRect:n.containerRect}}}),`unobserved`}function _b(e,t,n,r,i){return j({level:t===`moved`?`debug`:`info`,phase:`scroll_movement_observed`,data:{direction:e,movement:t,attempts:r,durationMs:Date.now()-i,...n.pixels===void 0?{}:{requestedPixels:n.pixels}}}),t}function vb(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:T(e)}}function yb(e,t,n){if(e!==void 0&&!Number.isFinite(e))throw new a(`INVALID_ARGS`,`scroll amount must be a number`);te(n),w({amount:e,pixels:t})}async function bb(e){let t=e.positionals[0],n=e.positionals[1]?Number(e.positionals[1]):void 0,r=e.context.pixels,i=e.context.durationMs,o=e.context.until;if(!t)throw new a(`INVALID_ARGS`,`scroll requires direction`);yb(n,r,i);let s=vb(t),c={...s.edge===void 0?{}:{edge:s.edge},...o===void 0?{}:{until:o}};b(c);let l=ne({amount:n,pixels:r,durationMs:i},s.edge),u=pt(c),d={command:`scroll`,device:e.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice};switch(u.kind){case`direction`:{let t=Zy({device:e.device,flags:e.flags,session:e.session});return await Q({...d,use:u.use},async(e,n)=>await Sb(e,s,l,n,t))}case`edge`:{let e=u.edge;return await Q({...d,unavailableResponse:t=>xb(`scroll ${e}, which verifies hidden content before scrolling,`,t.hint),use:u.use},async(t,n)=>await Eb(t,e,s,l,n))}case`until`:{let t=u.until;return await Q({...d,unavailableResponse:e=>xb(`scroll --until, which checks whether the selector became visible,`,e.hint),use:u.use},async(n,r)=>await Db(n,e.device,t,s,l,r))}}}function xb(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} requires snapshot support`,void 0,t===void 0?void 0:{hint:t})}async function Sb(e,t,n,r,i){let a=await kb(e,t,n,r)??{};return jb(t,n,1,a,await Cb(e,t.direction,r,i,a))}async function Cb(e,t,n,r,i){if(r.kind===`declined`){hb(t,r.reason);return}let a=e.operations.captureSnapshot;if(!a){hb(t,`owner-without-capture`);return}return r.kind===`unobservable`?gb(t,r.reason,{swipe:Tb(i)}):await eb({direction:t,baseline:r.baseline,swipe:Tb(i),capture:async()=>await a(wb(n))})}function wb(e,t){return{options:{...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...t},execution:$(e)}}function Tb(e){let t=ee(e),n=re(e);return{...t===void 0?{}:{midpoint:t},...n===void 0?{}:{pixels:n}}}async function Eb(e,t,n,r,i){let a,o=await Ly({edge:t,captureState:async n=>{let r=await Ob(e,t,n,i);return a=r.scope??a,r},scroll:async()=>await kb(e,n,r,i),settleAfterPass:async()=>{await Ab(async()=>(await e.operations.captureSnapshot(wb(i,{scope:a}))).nodes??[],t)}});return jb(n,r,o.passes,o.result??{})}async function Db(e,t,n,r,i,a){let o=await Hy({selector:n,direction:r.direction,platform:M(t),capture:async()=>await e.operations.captureSnapshot(wb(a)),scroll:async()=>await kb(e,r,i,a)});return S({direction:r.direction,until:n,passes:o.passes,...i.amount===void 0?{}:{amount:i.amount},...i.pixels===void 0?{}:{pixels:i.pixels},...o.result??{}},Wy(r.direction,n,o.passes))}async function Ob(e,t,n,r){return await jy({edge:t,scope:n,captureNodes:async t=>(await e.operations.captureSnapshot(wb(r,{scope:t}))).nodes??[]})}async function kb(e,t,n,r){return await e.operations.scrollDirection(Mb(t.direction,n,r))}async function Ab(e,t,n=1200,r=120){let i,a=Date.now()+n;for(;Date.now()<a;){let n=await Py(await e(),t);if(n===i)return;i=n,await new Promise(e=>setTimeout(e,r))}}function jb(e,t,n,r,i){let a=x(r),o=re(r);return S({direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...a===void 0?{}:{durationMs:a},...r,...i===void 0?{}:{movement:i}},Ry({direction:e.direction,edge:e.edge,passes:n,amount:t.amount,pixels:t.pixels,honoredPixels:o,...i===void 0?{}:{movement:i}}))}function Mb(e,t,n){return{direction:e,options:t,...n.appBundleId===void 0?{}:{target:{appBundleId:n.appBundleId}},execution:$(n)}}async function Nb(e){let t=Me(e.positionals),n=await Sy({command:`viewport`,device:e.device,use:ut,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return n.type===`response`?{ok:!1,response:n.response}:{ok:!0,execute:async()=>(await n.runtime.operations.setViewport(t),{...t,message:`Viewport set: ${t.width}x${t.height}`})}}function Pb(e,t){return{mode:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Fb(e){return await Q({command:`back`,device:e.device,use:bt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},Ib)}async function Ib(e,t){return await e.operations.back(Pb(t.backMode,t)),{action:`back`,mode:t.backMode??`in-app`,...y(`Back`)}}const Lb={home:{use:jt,message:`Home`},"app-switcher":{use:Dt,message:`Opened app switcher`},"action-button":{use:it,message:`Pressed Action Button`}};function Rb(e){return Object.hasOwn(Lb,e)}function zb(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$(e)}}async function Bb(e,t){let n=Lb[e];return await Q({command:e,device:t.device,use:n.use,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice},async(t,r)=>{let[i]=n.use.required;return await t.operations[i](zb(r)),{action:e,...y(n.message)}})}function Vb(e){return ce(e[0])}function Hb(e,t){return{rotation:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Ub(e){let t=Vb(e.positionals);return await Q({command:`orientation`,device:e.device,use:st,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>Wb(e,t,n))}async function Wb(e,t,n){let r=(await e.operations.setOrientation(Hb(t,n)))?.orientation;return r?{action:`orientation`,orientation:r,...y(`Rotated to ${r}`)}:{action:`orientation`,orientation:t,confirmed:!1,warning:`Requested ${t}; the device owner reported no resulting orientation, so the rotation is unconfirmed.`,...y(`Rotation requested: ${t} (unconfirmed)`)}}function Gb(e){return ie(e[0])}async function Kb(e){let t=e.keyframes===void 0?{pose:Gb(e.positionals)}:C({pose:e.positionals[0],keyframes:se(e.keyframes)});return await Q({command:`fold`,device:e.device,use:Mt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},e=>qb(e,t))}async function qb(e,t){let n=await e.operations.setFoldPose(t),r=n.screen;return{action:`fold`,pose:n.pose,hingeAngleDegrees:n.hingeAngleDegrees,...r?{screen:r}:{},...y(r?`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°, ${r.display} native panel ${r.widthPt}x${r.heightPt}pt, not snapshot coordinates); refs from before the pose change are stale`:`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°); refs from before the pose change are stale`)}}function Jb(e){if(e.length!==1)throw new a(`INVALID_ARGS`,`tv-remote requires exactly one button`);return E(e[0])}function Yb(e,t,n){return{button:e,durationMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:$(n)}}async function Xb(e){let t=Jb(e.positionals),n=e.durationMs===void 0?void 0:Rr(e.durationMs,`durationMs`,0,1e4);return await Q({command:`tv-remote`,device:e.device,use:ft,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,r)=>Zb(e,t,n,r))}async function Zb(e,t,n,r){return await e.operations.tvRemote(Yb(t,n,r)),{action:`tv-remote`,button:t,...n===void 0?{}:{durationMs:n},...y(`Pressed TV remote ${t}`)}}async function Qb(e){if(Rb(e.req.command))return await Bb(e.req.command,{device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});switch(e.req.command){case`screenshot`:{let{resolveScreenshotGenericExecution:t}=await import(`../screenshot-runtime.js`).then(e=>e.r);return await t(e)}case`focus`:return await Oy({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`scroll`:return await bb({device:e.session.device,positionals:e.req.positionals??[],context:e.context,session:e.session,flags:e.req.flags,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`viewport`:return await Nb({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`back`:return await Fb({device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`orientation`:return await Ub({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`fold`:return await Kb({keyframes:e.req.flags?.keyframes,device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`tv-remote`:return await Xb({device:e.session.device,positionals:e.req.positionals??[],durationMs:e.req.flags?.durationMs,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});default:return{ok:!1,response:g(`COMMAND_FAILED`,`${e.req.command} has no runtime execution on the generic route`,{reason:`generic-route-runtime-missing`})}}}async function $b(e,t,n){let i=ht(e);try{let e=await n();if(!e||e.ok)return e;let r=ex(i,e.error.details,t);return r===e.error.details?e:{...e,error:{...e.error,details:r}}}catch(e){let n=r(e),a=ex(i,n.details,t);throw a===n.details?e:(n.details=a,n)}}function ex(e,t,n){return n.dispatchedSteps>0?v(t,n.dispatchedSteps):e===void 0?t:e===`observes-app`?t?.dispatched===`no`?t:{...t,dispatched:`no`}:t?.dispatched===void 0?{...t,dispatched:`unknown`}:t}function tx(e){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,dispatched:`no`}}}}function nx(e){return n(r(e),`no`)}const rx=new Proxy({},{get(){return async()=>{throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`)}}});function ix(){return new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`)}const ax=Object.freeze({stopSnapshotHelper:async()=>{throw ix()},closeManagedBrowser:async()=>{throw ix()},cleanupSessionlessExecutionHost:async()=>{throw ix()},retainExecutionHostAfterClose:()=>{throw ix()}});function ox(e){let{logPath:t,token:n,requestPlatformProviders:r=cx,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,appLogAdmissionLedger:s=yy(),audioProbeAdmissionLedger:c=qh(),perfCaptureAdmissionLedger:l=Jh(),screenRecordingAdmissionLedger:u=Yh(),hostDiagnostics:d,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,leaseLifecycleProvider:h,cloudArtifactProvider:g,providerAppCatalog:_,androidObservation:v=rx,createCommandSurface:ee,platformResourceCleanup:y=ax,providerDeviceRuntimeScope:te,trackDownloadableArtifact:ne,daemonPolicy:b}=e,{sessionStore:x,leaseRegistry:re}=e,ie=b?cf(e.deviceInventoryGateways,b):e.deviceInventoryGateways;async function S(e){let n=Date.now(),r=!!(e.meta?.debug||e.flags?.verbose);return await Ue({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{let t=await Vt(sx(e),async()=>await C(e));return t.ok?Mx(e,t,n):{ok:!1,error:yx(e,jx(Ox(e,Dx(e,t.error,x),x)))}})}async function C(e){if(!hn(e.token,n))return ux();_x(e);let t=px(e);if(t)return t;let r=hx(e);if(r)return r;let s=sy(e);if(s)return s;let c,l,u=Dr(e);try{l=await Nr({...ie,requestScope:u},async()=>await Un(async()=>(c=await Zv({req:e,sessionStore:x,leaseRegistry:re,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:u,platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),await T(c))))}catch(e){l=Tx(e)}return w(e,c,await Ex(c,l))}function w(e,t,n){let r=t?x.lookup(t.sessionName)?.session:void 0;return If(t?.req??e,re,r,b)?ed(e.command,n):n}async function T(e,t){let n=async()=>{let n=await ny({scope:e,sessionStore:x,trackDownloadableArtifact:ne});if(n.type===`response`)return n.response;let i=n.scope,a=async e=>{let n=async()=>await E({lockedScope:i,providerScope:e,allowReplayActions:t===void 0});return te?await te(n):await n()};if(t)return await a(t);let o=lx(i);if(!r.hasConfiguredResolvers&&!o)return await a({});let s=await jp({req:i.req,existingSession:i.existingSession,useDefaultWebProvider:o});return s?await r.run(s,a):await a({})};return t?await e.runAdmitted(n):await e.runLocked(n)}async function E(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e;return await $b(t.req,t.dispatchLedger,async()=>await ae({lockedScope:t,providerScope:n,allowReplayActions:r}))}async function ae(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e,{dispatchLedger:i}=t,a=Dr(t.req);return await Zh({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:x,leaseRegistry:re,leaseLifecycleProvider:h,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,cloudArtifactProvider:g,providerAppCatalog:_,invoke:Zr(S,i),invokeReplayAction:r?Zr(D(t,n),i):void 0,providerScope:n,androidObservation:v,createCommandSurface:ee,platformResourceCleanup:y,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:Or({scope:a,composeGateway:o}),appLogAdmissionLedger:s,audioProbeAdmissionLedger:c,perfCaptureAdmissionLedger:l,screenRecordingAdmissionLedger:u,hostDiagnostics:d,requestScope:a,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,contextFromFlags:t.handlerContextFromFlags})||await Sx({lockedScope:t,logPath:t.logPath,sessionStore:x,androidObservation:v,createCommandSurface:ee})}function D(e,t){return async r=>{if(!wx(r,e))return await S(r);if(!hn(r.token,n))return ux();_x(r);let s,c;try{let n=Cx(r,e);s=await Zv({req:n,sessionStore:x,leaseRegistry:re,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:Dr(n),platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),c=s.sessionName===e.sessionName?await T(s,t):await T(s)}catch(e){c=Tx(e)}return xx(r,await Ex(s,c))}}return S}function sx(e){let t=e.meta?.developerDir;return typeof t==`string`?{DEVELOPER_DIR:t}:void 0}const cx=Object.freeze({hasConfiguredResolvers:!1,run:async(e,t)=>await t({})});function lx(e){return e.existingSession!==void 0&&tv(e.existingSession)||e.req.flags?.platform===`web`}function ux(){return{ok:!1,error:s(new a(`UNAUTHORIZED`,`Invalid token`))}}function dx(){return g(`INVALID_ARGS`,`--record and --no-record are mutually exclusive; pass at most one.`)}const fx=[[`recordAs`,`--record-as`,`string`],[`textStdin`,`--text-stdin`,`boolean`]];function px(e){if(e.flags?.record&&e.flags?.noRecord)return dx();if(e.command===`fill`)return mx(e);let t=fx.find(([t])=>e.flags?.[t]!==void 0);if(t)return g(`INVALID_ARGS`,`${t[1]} is supported only by fill.`)}function mx(e){let t=fx.find(([t,,n])=>{let r=e.flags?.[t];return r!==void 0&&typeof r!==n});if(t)return g(`INVALID_ARGS`,`${t[1]} must be a ${t[2]}.`)}function hx(e){if(e.flags?.snapshotCustomActions===!0&&e.flags?.snapshotRaw===!0)return g(`INVALID_ARGS`,`--actions and --raw are mutually exclusive: custom actions are only readable through the private-AX snapshot path, which a raw capture does not use.`)}function gx(e){if(!(e.command!==`fill`||!_i(e.flags)))return xi({ts:0,command:`fill`,positionals:e.positionals??[],flags:e.flags})}function _x(e){let t=gx(e);t!==void 0&&We(t)}const vx=new Set([`message`,`hint`,`cause`,`details`]);function yx(e,t){let n=gx(e);if(!n)return t;let r=vi(e.flags),i=e=>Ea(e,n,r);return Object.fromEntries(Object.entries(t).map(([e,t])=>[e,vx.has(e)?bx(t,i):t]))}function bx(e,t){return typeof e==`string`?t(e):Array.isArray(e)?e.map(e=>bx(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[t(e),bx(n,t)]))}function xx(e,t){return t.ok?t:{...t,error:yx(e,t.error)}}async function Sx(e){let{lockedScope:t,logPath:n,sessionStore:r,androidObservation:i,createCommandSurface:a}=e,o=r.lookup(t.sessionName);if(!o)return d();let s=r.requireCurrent(o),c=await Qb({req:t.req,session:s,context:t.contextFromFlags(t.req.flags,s.appBundleId,s.trace?.outPath),inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,createCommandSurface:a});if(!c.ok)return tx(c.response);let{dispatchGenericCommand:l}=await Qh();return await l({req:t.req,ref:o,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags,platformServices:t.platformServices,executePlatformCommand:c.execute,androidObservation:i,createCommandSurface:a,...c.recorded?{recordedRequest:c.recorded}:{}})}function Cx(e,t){if(e.command!==`open`)return e;let n=e.internal?.retainDeviceExecutionLock;return{...e,internal:{...e.internal,retainDeviceExecutionLock:async e=>{await t.retainDeviceExecutionLock(e),await n?.(e)}}}}function wx(e,t){return e.session===t.sessionName&&vu(e.command)}function Tx(e){j({level:`error`,phase:`request_failed`,data:{error:e instanceof Error?e.message:String(e)}});let t=A(),n=He({force:!0});return{ok:!1,error:s(e,{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}async function Ex(e,t){if(!e)return t;let n=t;try{await e[Symbol.asyncDispose]()}catch(e){t.ok?n=Tx(e):(j({level:`error`,phase:`request_binding_cleanup_failed`,data:{primaryCode:t.error.code,cleanupError:e instanceof Error?e.message:String(e)}}),He({force:!0}))}return ry(e,n)}function Dx(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=kx(e,n);if(r===void 0)return t;let i=n.readRepairTombstone(r);if(!i)return t;let o=i.sourcePath?`re-run: replay ${i.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return i.commitFailure?s(new a(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${e.session}" completed, but committing its healed script failed at teardown: ${i.commitFailure.message}. ${o}.`)):s(new a(`REPAIR_SESSION_EXPIRED`,`The --save-script repair session "${e.session}" was reaped before it was finalized (idle-reap); ${o}.`))}function Ox(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=Ax(e,n);return r?s(gy(r.owner,r)):t}function kx(e,t){try{return Og(Mf(e),t,{attachesToSession:!1})}catch{return}}function Ax(e,t){let n=kx(e,t);if(n!==void 0)try{return t.readIdleExpiryTombstone(n)}catch{return}}function jx(e){let n=e.retriable??t(e.code);return n===void 0?e:{...e,retriable:n}}function Mx(e,t,n){let r=Nx(e,t);if(!e.meta?.includeCost)return r;let i=Fx(t.data,n);return{ok:!0,data:{...r.data??{},cost:i}}}function Nx(e,t){let n=e.meta?.responseLevel??`default`;if(n==="default")return t;let r=Cp[e.command];return r?{ok:!0,data:r(t.data??{},n)}:t}const Px=[`ios_runner_command_send`,`ios_runner_readiness_preflight`];function Fx(e,t){let n={wallClockMs:Date.now()-t,runnerRoundTrips:Ke(Px)},r=e?.nodes;return Array.isArray(r)&&(n.nodeCount=r.length),n}function Ix(e){let t=5e3;return e.screenRecording&&(t+=11e3),tv(e)&&(t+=3e4),t}function Lx(e){e.destroyConnections?.();let t=`closeAllConnections`in e?e.closeAllConnections:void 0;if(typeof t==`function`){t.call(e);return}let n=`closeIdleConnections`in e?e.closeIdleConnections:void 0;typeof n==`function`&&n.call(e)}async function Rx(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{Lx(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function zx(e=process.env){let t=e.AGENT_DEVICE_DAEMON_IDLE_TIMEOUT_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Bx(e){return e.toArray().some(e=>!Vx(e))}function Vx(e){return oa(e)}function Hx(e){return e.toArray().some(e=>!!e.screenRecording)}function Ux(e){return e.inFlightRequestCount>0||Bx(e.sessionStore)?!1:!Hx(e.sessionStore)}function Wx(e){let t=zx(e.env),n,r=()=>Ux({sessionStore:e.sessionStore,inFlightRequestCount:e.getInFlightRequestCount()}),i=()=>{n&&=(clearTimeout(n),void 0)},a=()=>{i(),!(t<=0)&&(n=setTimeout(()=>{if(n=void 0,r()){if(e.hasRetainedLeases()){a();return}j({level:`info`,phase:`daemon_idle_reap`,data:{idleMs:t}}),e.onIdleReap()}},t),n.unref?.())};return{noteActivity:()=>{r()?a():i()},cancel:i,idleMs:t}}const Gx=`claim-clear-failed`,Kx=Object.freeze({deleted:!0,absent:!0,"ownership-changed":!0,unattributable:!1}),qx=2147483647;function Jx(e){let{sessionStore:t,idleExpiryMs:n}=e,r=e.now??Date.now,i,a=!1,o=!1,s=new Set,c=new Map,l=()=>{i&&=(clearTimeout(i),void 0)},u=()=>{o=!0,l()},d=()=>{let e,r=new Set;for(let i of t.listRefs()){r.add(i.address);let t=my(i.session,n);if(t===void 0)continue;let a=c.get(i.address),o=a===void 0?t:Math.max(t,a);(e===void 0||o<e)&&(e=o)}for(let e of c.keys())r.has(e)||c.delete(e);return e},f=()=>{if(l(),o||n<=0||a)return;let e=r(),t=d();if(t===void 0)return;let s=Math.max(0,t-e),c=s>qx;i=setTimeout(()=>{i=void 0,c?f():p()},Math.min(s,qx)),i.unref?.()},p=async()=>{a=!0;let t=async()=>{try{await Yx({...e,now:r,retryNotBeforeMs:c,settling:s,closing:()=>o,notifyExpired:e.onSessionExpired})}catch(e){j({level:`warn`,phase:`session_idle_expiry_sweep_failed`,data:{idleExpiryMs:n,error:e instanceof Error?e.message:String(e)}})}};try{await(e.withinDiagnosticsScope?e.withinDiagnosticsScope(t):t())}finally{a=!1,f()}};return{noteSessionsChanged:f,cancel:u,idleExpiryMs:n}}async function Yx(e){for(let t of e.sessionStore.listRefs())if(dy(t.session)){if(e.closing())return;await Xx({...e,ref:t})}}async function Xx(e){let{address:t}=e.ref;if(e.settling.has(t)){e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs);return}let n=v_(t,e.ref.session.device.id),r=$x({...e,lockKeys:n}),i=e.settleBudgetMs?.(e.ref.session);if(i===void 0)return void await r;let a=Qx(i);try{if(await Promise.race([r,a.promise])!==Zx)return}finally{a.cancel()}j({level:`warn`,phase:`session_idle_expiry_settle_timeout`,data:{session:t,idleExpiryMs:e.idleExpiryMs,settleBudgetMs:i,...e.ref.session.deviceClaim?{deviceKey:e.ref.session.deviceClaim.deviceKey}:{}}}),e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}const Zx=Symbol(`session-idle-settle-budget-elapsed`);function Qx(e){let t;return{promise:new Promise(n=>{t=setTimeout(()=>n(Zx),e),t.unref?.()}),cancel:()=>clearTimeout(t)}}async function $x(e){let{address:t,session:n}=e.ref;e.settling.add(t);let r;try{r=await z_(e.executionLocks,e.lockKeys,async()=>{if(e.closing())return eS;let t=e.sessionStore.resolveCurrent(e.ref);if(!t||t.device.id!==n.device.id)return eS;let r=e.now();return py(t,e.idleExpiryMs,r)?{outcome:await nS({ref:e.sessionStore.refresh(e.ref),idleExpiryMs:e.idleExpiryMs,expiredAtMs:r,sessionStore:e.sessionStore,settleSession:e.settleSession}),retry:!0}:eS}),r.retry?tS(e,t,r.outcome):e.retryNotBeforeMs.delete(t)}catch(n){j({level:`warn`,phase:`session_idle_expiry_settle_failed`,data:{session:t,idleExpiryMs:e.idleExpiryMs,error:n instanceof Error?n.message:String(n)}}),tS(e,t,void 0);return}finally{e.settling.delete(t)}return r.outcome&&e.notifyExpired?.(r.outcome),r.outcome}const eS=Object.freeze({outcome:void 0,retry:!1});function tS(e,t,n){if(n){e.retryNotBeforeMs.delete(t);return}e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}async function nS(e){let{ref:t,idleExpiryMs:n,expiredAtMs:r}=e,{address:i,session:a}=t,o=a.deviceClaim?.deviceKey,s={session:i,idleExpiryMs:n,...o?{deviceKey:o}:{}};if(!await rS(e,s))return;let c=await iS(i,a.deviceClaim);if(c===Gx||!Kx[c]){j({level:`warn`,phase:`session_idle_expiry_device_claim_unconfirmed`,data:s});return}if(e.sessionStore.finalizeRepairTeardown(t),!e.sessionStore.retire(t)){j({level:`info`,phase:`session_idle_expiry_superseded`,data:s});return}e.sessionStore.writeIdleExpiryTombstone(i,hy(i,{expiredAtMs:r,idleExpiryMs:n,deviceKey:o}));let l=r-uy(a);return j({level:`info`,phase:`session_idle_expired`,data:{...s,idleForMs:l,claim:c}}),{sessionName:i,idleExpiryMs:n,idleForMs:l,claim:c,...o?{deviceKey:o}:{}}}async function rS(e,t){try{return await e.settleSession(e.ref),!0}catch(e){return j({level:`warn`,phase:`session_idle_expiry_cleanup_failed`,data:{...t,error:e instanceof Error?e.message:String(e)}}),!1}}async function iS(e,t){if(!t)return`absent`;try{return await wr(t)}catch(n){return j({level:`warn`,phase:`session_idle_expiry_device_claim_clear_failed`,data:{session:e,deviceKey:t.deviceKey,error:n instanceof Error?n.message:String(n)}}),Gx}}async function aS(e){let{leaseRegistry:t,expiredProviderLeaseReleaser:n,timeoutMs:r}=e;await Promise.all(t.listActiveLeases().map(async e=>{try{let i=await oS(n.release(e),r);t.releaseLease(Gl(e)),i||j({level:`warn`,phase:`daemon_shutdown_lease_release_timed_out`,data:{leaseId:e.leaseId,timeoutMs:r}})}catch(t){j({level:`warn`,phase:`daemon_shutdown_lease_release_failed`,data:{leaseId:e.leaseId,error:t instanceof Error?t.message:String(t)}})}}))}async function oS(e,t){return await new Promise((n,r)=>{let i=setTimeout(()=>n(!1),t);e.then(()=>{clearTimeout(i),n(!0)},e=>{clearTimeout(i),r(e)})})}const sS=`clear-unrecorded`;function cS(){let e={released:[],orphaned:[],superseded:[],unattributable:[]},t=new Map;return{claims:e,releaseClaim:async e=>{if(e.deviceClaim)try{t.set(e.name,await wr(e.deviceClaim))}catch(n){t.set(e.name,sS),j({level:`warn`,phase:`daemon_shutdown_device_claim_release_failed`,data:{session:e.name,deviceKey:e.deviceClaim.deviceKey,error:n instanceof Error?n.message:String(n)}})}},finalize:n=>{let r=n.deviceClaim;if(!r)return;let i={deviceKey:r.deviceKey,session:n.name,platform:M(n.device),deviceId:n.device.id},a=t.get(n.name);switch(a){case`deleted`:case`absent`:e.released.push(i);return;case`ownership-changed`:e.superseded.push(i);return;case`unattributable`:e.unattributable.push(i);return;case sS:case void 0:e.orphaned.push(i);return;default:lS(a)}}}}function lS(e){throw Error(`Undeclared device-claim outcome: ${String(e)}`)}function uS(e){if(e===void 0)return;let t=Number(e);if(Number.isInteger(t))return t}const dS=Object.freeze({match:!1,replaced:!0,absent:!0,unreadable:!1,ownerless:!1,unproven:!1});function fS(e){let t=vr(e.infoPath,e.owner);if(dS[t.state]&&!(t.state===`absent`&&mS(e.stateDir)))return t.state===`replaced`?{state:`replaced`,registeredPid:t.identity.pid}:{state:`absent`}}function pS(e){let t,n=()=>{t&&=(clearInterval(t),void 0)};return t=setInterval(()=>{if(mS(e.stateDir)){n();return}let t=fS(e);t&&(n(),e.onLoss(t))},15e3),t.unref?.(),n}function mS(e){try{return zt(e)===void 0}catch{return!1}}function hS(e){let t=new Set,n=ci.createServer(n=>{t.add(n),n.on(`close`,()=>t.delete(n));let r=``,a=0,o=new Set,c=!1,l=()=>{if(!(c||a===0)){c=!0;for(let e of o)Jn(e);j({level:`warn`,phase:`request_client_disconnected`,data:{inFlightRequests:a}})}};n.setEncoding(`utf8`),n.on(`close`,l),n.on(`error`,l),n.on(`data`,async t=>{let c=tn(r,t);r=c.buffer;for(let t of c.lines){let r;a+=1;let c,l,u=!1;try{let a=gS(t);if(u=gn(a),c=Qn(a.meta?.requestId,`socket`),a.meta={...a.meta,requestId:c},l=Zn(c),o.add(c),Xn(c))throw i();r=await er(u?e=>{n.destroyed||n.write(on(e))}:void 0,async()=>await e(a))}catch(e){r={ok:!1,error:s(e)}}finally{--a,l&&o.delete(l.requestId),$n(l)}n.destroyed||n.write(u?$t(r):`${JSON.stringify(r)}\n`)}})});return n.destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n}function gS(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return t;let{internal:n,...r}=t;return r}function _S(e){return yS(e,`Failed to bind socket server`)}function vS(e){return yS(e,`Failed to bind HTTP server`)}function yS(e,t){return new Promise((n,r)=>{e.once(`error`,r),e.listen(0,`127.0.0.1`,()=>{e.off(`error`,r);let i=e.address();if(typeof i==`object`&&i?.port){n(i.port);return}r(new a(`COMMAND_FAILED`,t))})})}async function bS(){let{resetAndroidSnapshotHelperSessions:e}=await xn();await e()}async function xS(e){let{stopAndroidSnapshotHelperSessionForDevice:t}=await xn();await t(e)}async function SS(e){if(process.platform!==`darwin`)return;let{restoreLegacyXctestDeviceSetRedirect:t}=await import(`../runner-owner-facade.js`);await t(e)}async function CS(e){let{getManagedAgentBrowserStatus:t}=await import(`../src2.js`).then(e=>e.i),n=await t({stateDir:e.stateDir});if(!n.installed)return;let{cleanupManagedAgentBrowserOrphans:r}=await import(`../src2.js`).then(e=>e.i);await r(n,`daemon-startup`,{openWebSessionNames:e.openWebSessionNames,...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}async function wS(e){let{createAgentBrowserWebProvider:t}=await import(`../src2.js`).then(e=>e.i);await(await t({session:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openWebSessionNames})).close()}const TS=Object.freeze({async stopSnapshotHelper(e){e.platform===`android`&&await xS(e)},async closeManagedBrowser(e){e.device.platform===`web`&&await wS({sessionName:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openSessionNames})},async cleanupSessionlessExecutionHost(e){if(!N(e))return;let{resolveRunnerAppBundleId:t,stopIosRunnerSession:n}=await import(`../runner-operations-facade.js`);await n(e.id);let r=await t(),{closeIosApp:i}=await import(`../app-lifecycle-facade.js`);await i(e,r).catch(t=>{j({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:r,error:t instanceof Error?t.message:String(t)}})})},retainExecutionHostAfterClose(e){return N(e.device)&&e.device.kind===`simulator`&&!e.shutdownRequested&&!e.hasScreenRecording&&!e.hasLease}});async function ES(e){let{setRunnerLeaseOwnerStateDir:t}=await import(`../runner-owner-facade.js`);t(e)}async function DS(e){let{setRunnerDeviceClaimAuthorityProbe:t}=await import(`../runner-owner-facade.js`);t(e)}const OS=Object.freeze({configureForDaemonLock:async e=>{await ES(e.stateDir),await DS(e.hasDeviceClaimAuthority),await SS(e.onDiagnostic)},clearDaemonLockConfiguration:async()=>{await ES(void 0),await DS(void 0)},recoverLegacyAppLogMarkers:async e=>{let{recoverLegacyAppLogMarkersAfterDaemonLock:t}=await import(`../platform-runtime-operation-host.js`);return await t(e)},cleanupManagedWebOrphans:async e=>{await CS(e)},resetAndroidSnapshotHelper:async()=>{await bS()}});async function kS(e){let{session:t,stderr:n,resource:r,teardown:i}=e;try{return await i(),!0}catch(e){return n.write(`Daemon ${r} teardown error (${t.name}): ${e instanceof Error?e.message:String(e)}\n`),!1}}async function AS(e){let{ref:t,sessionStore:n,stderr:r,finalizeApplicationLifecycle:i,afterSuccessfulTeardown:a}=e,o=n.resolveCurrent(t),s=o??t.session,c=Sv(o?n.getRuntimeHints(t.address):void 0),l=Ix(s),u=await kS({session:s,stderr:r,resource:`app-log`,teardown:async()=>await rv({ref:t,sessionStore:n})}),d=n.resolveCurrent(t)??s,f=(async()=>{let e=await kS({session:s,stderr:r,resource:`session`,teardown:async()=>await lv({appLog:`already-settled`,ref:t,sessionStore:n,platformCleanup:TS})}),a=!i||await kS({session:s,stderr:r,resource:`lifecycle`,teardown:async()=>await i(d,c)});return e&&a})(),p=await Promise.race([f,Ht(l).then(()=>(r.write(`Daemon session teardown timed out (${s.name}).\n`),!1))]),m=u&&p;n.finalizeRepairTeardown(t),m&&await a?.(s),n.retire(t)}async function jS(e,t){t.length!==0&&await P({logPath:e,command:`daemon-startup`,debug:!1},()=>{for(let e of t)j({level:`warn`,phase:e.phase,data:{resourcePath:e.resourcePath,...e.data}})})}async function MS(e,t){for(let{provider:n,error:r}of t??[])await NS(e,`provider_runtime_skipped`,{provider:n,code:r.code,message:r.message,hint:r.details?.hint})}async function NS(e,t,n){await P({logPath:e},()=>{j({level:`warn`,phase:t,data:n})})}async function PS(e){try{let t=await e.registration.finish(e.outcome);t.state!==`removed`&&t.state!==`absent`&&await NS(e.logPath,`daemon_info_removal_declined`,{infoPath:e.infoPath,removed:!1,reason:t.state,...t.state===`replaced`?{registeredPid:t.identity.pid}:{}})}catch(t){await NS(e.logPath,`daemon_registration_finish_failed`,{error:s(t)})}}async function FS(e){await NS(e.logPath,`daemon_metadata_lost`,{infoPath:e.infoPath,...e.loss})}function IS(e,t,n,r){return pS({infoPath:t,stateDir:e,owner:r,onLoss:e=>void FS({infoPath:t,logPath:n,loss:e}).catch(()=>{})})}async function LS(e){let t=e.env??process.env,n=e.stdout??process.stdout,i=e.stderr??process.stderr,o=e.exit??(e=>process.exit(e)),s=fn(t.AGENT_DEVICE_STATE_DIR),{baseDir:c,infoPath:l,logPath:u,sessionsDir:d}=s,f=cn(t.AGENT_DEVICE_DAEMON_SERVER_MODE),p=Ut(t.AGENT_DEVICE_RETAIN_ARTIFACTS),m;try{m=sr(t)}catch(e){return i.write(`Daemon error: ${r(e).message}\n`),o(1),null}let h=new Ds(d),g=_n({stateDir:c,sessionsDir:d,resolveSessionDir:e=>h.resolveSessionDir(e)}),_=yy(),v=qh(),ee=Jh(),y=mf(),te=Yh(),ne=yn(),b=F.randomBytes(24).toString(`hex`),x=It(),re=$r(),ie=ei(),S=await _f(t),C=[...S.runtimes],w=dr({assertShutdownAllowed:m?()=>of(m,`device-shutdown`):void 0,providerRuntimes:C,providerModules:S.platformModules,sessionsDir:d,ownedProcesses:g,resolveSessionArtifacts:e=>({outputPath:h.resolveAppLogPath(e),pidPath:h.resolveAppLogPidPath(e)})}),T=w.applicationLifecycle;if(!T)throw new a(`COMMAND_FAILED`,`Platform lifecycle gateway is not configured.`,{reason:`runtime-gateway-missing`});let E=rr(C,{providerRuntimeRequiredIds:hf});or({isActive:e=>nr(e)}),ff({resolve:ir});let ae=lr({providers:{appleRunnerProvider:E.appleRunnerProvider,appleRunnerScreenRecordingTransport:E.appleRunnerScreenRecordingTransport},defaultWebProvider:{stateDir:c,openWebSessionNames:()=>nv(h),ownedProcessRecords:g}}),D=Yf({leaseLifecycleProvider:E.leaseLifecycleProvider,providerRuntimeIds:E.providerRuntimeIds,recoverExpiredLease:E.recoverExpiredLease,stateDir:c,recoverableProviderIds:E.recoverableProviderIds});D.retryPending();let oe=new Ef({maxActiveSimulatorLeases:uS(t.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:uS(t.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:uS(t.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:uS(t.AGENT_DEVICE_LEASE_MAX_TTL_MS),onLeaseExpired:e=>{D.release(e)}}),se=E.cloudArtifactProvider,ce=E.providerAppCatalog,le=ur(E.deviceInventorySource),{createDaemonPlatformServices:ue}=await import(`../platform-runtime-daemon-services.js`),{createClaimRecoveryGateway:de}=await import(`../platform-runtime-claim-recovery.js`),fe=ox({logPath:u,token:b,sessionStore:h,leaseRegistry:oe,leaseLifecycleProvider:E.leaseLifecycleProvider,cloudArtifactProvider:se,providerAppCatalog:ce,deviceInventoryGateways:le,deviceRuntimeGateway:w,platformServices:ue(),claimRecoveryGateway:de,appLogAdmissionLedger:_,audioProbeAdmissionLedger:v,perfCaptureAdmissionLedger:ee,hostDiagnostics:y,screenRecordingAdmissionLedger:te,requestPlatformProviders:ae,androidObservation:fr,platformResourceCleanup:TS,providerRuntimeIds:E.providerRuntimeIds,providerRuntimeRequiredIds:E.providerRuntimeRequiredIds,providerCredentials:_r(t,c),providerDeviceRuntimeScope:E.providerDeviceRuntimeScope,trackDownloadableArtifact:Fs,daemonPolicy:m,createCommandSurface:e.createCommandSurface}),pe=()=>{},me=async e=>{await P({logPath:u},()=>{j({level:`error`,phase:`daemon_fatal`,data:{error:e instanceof Error?e.message:String(e)}})})},he=cS(),ge=async e=>{let t=h.resolveCurrent(e)??e.session;try{await AS({ref:e,sessionStore:h,stderr:i,finalizeApplicationLifecycle:async(e,t)=>await mv({gateway:w,scope:Ar(),session:e,stateDir:c,runtimeHints:t}),afterSuccessfulTeardown:he.releaseClaim})}finally{he.finalize(t)}},_e=async()=>{h.closeAdmission();let e=h.listRefs();await Promise.all(e.map(ge))},ve=Jx({sessionStore:h,idleExpiryMs:ly(t),executionLocks:ay(oe),settleSession:async e=>{let t=h.resolveCurrent(e)??e.session,n=e.address,r=Sv(h.getRuntimeHints(n));await lv({appLog:`run`,ref:e,sessionStore:h,platformCleanup:TS}),await mv({gateway:w,scope:Ar(),session:t,stateDir:c,runtimeHints:r,daemonLeaving:!1})},settleBudgetMs:e=>Ix(e),withinDiagnosticsScope:async e=>await P({logPath:u},e),onSessionExpired:()=>{be.noteActivity()}}),O=!1,ye=new Set,be=Wx({sessionStore:h,getInFlightRequestCount:()=>ye.size,hasRetainedLeases:()=>oe.hasRetainedLeases(),onIdleReap:()=>{k()},env:t}),xe=async e=>{if(O)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`Daemon is shutting down.`,details:{reason:`daemon_shutting_down`}}};be.cancel();let t=fe(e);ye.add(t);try{return await t}finally{ye.delete(t),be.noteActivity(),ve.noteSessionsChanged()}},Se=async()=>{let e=[],n,r,i=f!==`http`,a=f!==`socket`;if(i){let t=hS(xe);e.push(t),n=await _S(t)}if(a){let n=await ef({handleRequest:xe,leaseRegistry:oe,token:b,retainArtifacts:p,env:t,resolveRequestDiagnosticsPath:m?.requiredLeaseBackend?void 0:e=>sn(h.resolveSessionDir(e.session),e.requestId)});e.push(n),r=await vS(n)}return{servers:e,socketPort:n,httpPort:r}},Ce=(e,t)=>{Ee.publish({socketPort:e,httpPort:t,token:b,version:ne,codeOrigin:re,codeSignature:ie,policyDigest:m?.digest}),e&&n.write(`AGENT_DEVICE_DAEMON_PORT=${e}\n`),t&&n.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${t}\n`)},we=e=>{for(let t of e)try{t.close(()=>{})}catch{}},Te=await jn(s);if(Te.status!==`acquired`)return await Promise.allSettled(C.map(async e=>await e.shutdown())),i.write(`Daemon registration ${Te.status}; exiting.\n`),o(Mn[Te.status]),null;let Ee=Te.owner,De=[],Oe,ke,Ae=[];try{await OS.configureForDaemonLock({stateDir:c,hasDeviceClaimAuthority:xr,onDiagnostic:e=>Ae.push(e)});let e=await OS.recoverLegacyAppLogMarkers(d);_.retainLegacyMarkers(e.retained);for(let t of e.recovered)Ae.push({phase:`app_log_legacy_marker_recovered`,resourcePath:t,data:{}});for(let t of e.retained)Ae.push({phase:`app_log_legacy_marker_retained`,resourcePath:t.markerPath,data:{reason:t.reason,...t.message===void 0?{}:{message:t.message}}});await kr({sessionsDir:d,gateway:w,scope:Ar(),onDiagnostic:e=>Ae.push(e)}),await vn(g,{openWebSessionNames:nv(h),purposes:[`simctl-screen-recording`],termTimeoutMs:5e3}),await zS({stateDir:c,sessionStore:h,ownedProcessRecords:g}),T.recoverStartupResources({stateDir:c}).catch(e=>{j({level:`warn`,phase:`daemon_lifecycle_startup_recovery_failed`,data:{error:e instanceof Error?e.message:String(e)}})});let t=await Se();De=t.servers,Oe=t.socketPort,ke=t.httpPort,Ce(Oe,ke),pe=IS(c,l,u,x),await jS(u,Ae),await MS(u,S.skipped),await RS(u,Or({scope:Ar(),composeGateway:de}),c),be.noteActivity()}catch(e){let t=r(e);return i.write(`Daemon error: ${t.message}\n`),we(De),pe(),await Promise.allSettled(C.map(async e=>await e.shutdown())),await PS({registration:Ee,infoPath:l,logPath:u}),await OS.clearDaemonLockConfiguration(),o(1),null}ti();let k=async(e={})=>{if(be.cancel(),ve.cancel(),O)return;O=!0,pe(),e.cause&&await me(e.cause),await Rx(De),await Promise.allSettled(ye);try{await P({logPath:u},async()=>{await T.detachForDaemonShutdown()})}catch{}D.beginShutdown(),await _e(),await P({logPath:u},async()=>{await aS({leaseRegistry:oe,expiredProviderLeaseReleaser:D,timeoutMs:1e3})});try{await OS.resetAndroidSnapshotHelper()}catch(e){j({level:`warn`,phase:`daemon_shutdown_android_snapshot_helper_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}let t=await D.drain(2e3);j({level:t.pending.length===0?`info`:`warn`,phase:`daemon_shutdown_provider_release_drain`,data:{releasedLeaseIds:t.released.map(e=>e.leaseId),pendingLeaseIds:t.pending.map(e=>e.leaseId),releasedDeviceKeys:he.claims.released.map(e=>e.deviceKey),orphanedDeviceKeys:he.claims.orphaned.map(e=>e.deviceKey)}}),D.shutdown(),await w.shutdown(),await Promise.allSettled(C.map(async e=>await e.shutdown())),await T.finalizeDaemonShutdown(),await Promise.race([ni().catch(()=>{}),Ht(1e3)]),await PS({registration:Ee,infoPath:l,logPath:u,outcome:{providerReleases:t,claims:he.claims}}),await OS.clearDaemonLockConfiguration(),o(e.exitCode??0)};return e.registerProcessHandlers!==!1&&(process.on(`SIGINT`,()=>{k()}),process.on(`SIGTERM`,()=>{k()}),process.on(`SIGHUP`,()=>{k()}),process.on(`uncaughtException`,e=>{let t=e instanceof a?e:r(e);i.write(`Daemon error: ${t.message}\n`),k({exitCode:1,cause:e})}),process.on(`unhandledRejection`,e=>{let t=e instanceof Error?e:Error(String(e)),n=t instanceof a?t:r(t);i.write(`Daemon error: ${n.message}\n`),k({exitCode:1,cause:t})})),{httpPort:ke,shutdown:k,socketPort:Oe,token:b}}async function RS(e,t,n){await P({logPath:e},async()=>{try{let e=await Sr(t,n);e.examined>0&&j({phase:`device_claim_reconcile`,data:e})}catch(e){j({level:`warn`,phase:`device_claim_reconcile_failed`,data:{error:e instanceof Error?e.message:String(e)}})}})}async function zS(e){try{await OS.cleanupManagedWebOrphans({stateDir:e.stateDir,openWebSessionNames:nv(e.sessionStore),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){j({level:`warn`,phase:`web_agent_browser_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}LS({createCommandSurface:async e=>(await import(`../runtime-command-surface.js`)).createCommandSurfaceAgentDevice(e)}).catch(e=>{let t=r(e);process.stderr.write(`Daemon error: ${t.message}\n`),process.exit(1)});export{Jp as $,bi as $t,Z_ as A,ra as At,mg as B,Wi as Bt,uv as C,El as Ct,av as D,Ua as Dt,iv as E,$s as Et,kg as F,ta as Ft,Jm as G,Yi as Gt,dg as H,Ui as Ht,jg as I,na as It,ih as J,R as Jt,Xm as K,Xi as Kt,Mg as L,sa as Lt,N_ as M,ia as Mt,Pg as N,aa as Nt,tv as O,Pa as Ot,Ng as P,oa as Pt,am as Q,_i as Qt,Sg as R,ea as Rt,dv as S,Gl as St,rv as T,Ls as Tt,vh as U,Ki as Ut,hg as V,Zi as Vt,Qm as W,Qi as Wt,Dm as X,Vi as Xt,Om as Y,Hi as Yt,om as Z,xi as Zt,Sv as _,Ef as _t,$ as a,qp as at,Ov as b,Ou as bt,by as c,Zp as ct,kv as d,Ep as dt,vi as en,Yp as et,xv as f,Kf as ft,Lv as g,Af as gt,Av as h,kf as ht,Ty as i,$p as it,Y_ as j,$i as jt,X_ as k,ma as kt,Kv as l,Hp as lt,zv as m,Df as mt,nx as n,Gp as nt,xy as o,Bp as ot,Cv as p,Gf as pt,$m as q,Ji as qt,ky as r,Wp as rt,Sy as s,Vp as st,tx as t,gi as tn,Up as tt,Uv as u,Dp as ut,Pv as v,Sf as vt,cv as w,ec as wt,Rv as x,Kl as xt,Bv as y,pf as yt,Cg as z,Gi as zt};
|