agent-device 0.20.10 → 0.21.1
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/README.md +2 -2
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.apk → agent-device-android-ime-helper-0.21.1.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.manifest.json → agent-device-android-ime-helper-0.21.1.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.10.manifest.json → agent-device-android-snapshot-helper-0.21.1.manifest.json} +6 -6
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
- package/apple/snapshot-bridge/LICENSE.idb +23 -0
- package/apple/snapshot-bridge/README.md +106 -0
- package/apple/snapshot-bridge/SnapshotBridge.m +286 -0
- package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
- package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +34 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +411 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +677 -83
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +35 -92
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1058 -213
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +296 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +309 -149
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +24 -17
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +124 -199
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +211 -78
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +30 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +254 -24
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +465 -494
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +168 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +802 -247
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +185 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +83 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +156 -34
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +5 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -318
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +56 -23
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +56 -27
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +30 -24
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +126 -80
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +47 -86
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +32 -79
- package/dist/apple/snapshot-presentation/Package.swift +21 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
- package/dist/src/adapter.js +1 -0
- package/dist/src/adb-executor.js +2 -0
- package/dist/src/adb-failure.js +1 -0
- package/dist/src/adb-host.js +1 -0
- package/dist/src/adb.js +1 -0
- package/dist/src/agent-browser-lifecycle.js +1 -0
- package/dist/src/agent-browser-process-record.js +1 -0
- package/dist/src/agent-browser-provider.js +1 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.d.ts +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-contract.js +1 -0
- package/dist/src/alert-runtime.js +1 -0
- package/dist/src/android-adb.d.ts +27 -19
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -0
- package/dist/src/android-system-chrome.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/api.js +11 -0
- package/dist/src/app-catalog.js +1 -0
- package/dist/src/app-deployment-resolution.js +2 -0
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory-contract.js +1 -0
- package/dist/src/app-inventory.js +1 -0
- package/dist/src/app-launch.js +2 -0
- package/dist/src/app-lifecycle-facade.js +1 -0
- package/dist/src/app-lifecycle.js +3 -6
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-lifecycle3.js +1 -0
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime.js +1 -4
- package/dist/src/app-log-runtime2.js +4 -0
- package/dist/src/app-parsers.js +4 -0
- package/dist/src/app-resolution-cache.js +1 -0
- package/dist/src/app-resolution-facade.js +1 -0
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +1 -2
- package/dist/src/apple-runner-platform.js +1 -0
- package/dist/src/application-lifecycle-interaction.js +1 -0
- package/dist/src/application-lifecycle-runtime.js +1 -0
- package/dist/src/apps-simctl.js +1 -0
- package/dist/src/archive.js +4 -0
- package/dist/src/artifact-download.js +1 -0
- package/dist/src/artifacts.d.ts +6 -2
- package/dist/src/artifacts.js +1 -1
- package/dist/src/async-lifecycle.js +1 -0
- package/dist/src/audio-probe-result.js +1 -0
- package/dist/src/audio-probe-runtime.js +1 -0
- package/dist/src/audio-probe-support.js +1 -0
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/{url.js → base-url.js} +1 -1
- package/dist/src/boot-diagnostics.js +2 -2
- package/dist/src/byte-limit-stream.js +1 -1
- package/dist/src/capabilities.js +1 -0
- package/dist/src/capture.js +1 -0
- package/dist/src/catalog.js +1 -0
- package/dist/src/cli-command-aliases.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +74 -51
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +4 -6
- package/dist/src/click-button.js +1 -0
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +280 -242
- package/dist/src/clipboard.js +1 -0
- package/dist/src/code-signature-cache.js +1 -0
- package/dist/src/code-signature.js +1 -0
- package/dist/src/color.js +1 -0
- package/dist/src/command-metadata.js +1 -1
- 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/command.js +1 -0
- package/dist/src/compatibility-policy.js +1 -0
- package/dist/src/config.js +1 -1
- package/dist/src/config2.js +1 -0
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -0
- package/dist/src/daemon-process.js +1 -0
- package/dist/src/daemon-registration.js +1 -0
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +2 -2
- package/dist/src/debug-symbols-facade.js +5 -0
- package/dist/src/deploy-result-target.js +1 -0
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -0
- package/dist/src/device-input-state.d.ts +190 -3
- package/dist/src/device-inventory-context.js +1 -0
- package/dist/src/device-isolation.js +1 -0
- package/dist/src/device-release.js +1 -0
- package/dist/src/device-rotation.js +1 -0
- package/dist/src/device-selection-resolver.js +1 -0
- package/dist/src/device-session.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +3 -2
- package/dist/src/diagnostics.js +3 -0
- package/dist/src/diagnostics2.js +1 -0
- package/dist/src/dispatch-resolve.js +1 -0
- package/dist/src/doctor-facade.js +1 -0
- package/dist/src/doctor-output.js +1 -0
- package/dist/src/doctor.js +1 -0
- package/dist/src/doctor2.js +1 -0
- package/dist/src/doctor3.js +1 -0
- package/dist/src/durable-resource.js +1 -0
- package/dist/src/entities.js +1 -1
- package/dist/src/error.js +2 -0
- package/dist/src/exec.js +1 -0
- package/dist/src/file.js +1 -0
- 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-admission.js +1 -0
- package/dist/src/gesture-plan-types.js +1 -0
- package/dist/src/gesture-plan.js +1 -0
- package/dist/src/gesture-runtime.js +1 -0
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/host-file.js +1 -0
- package/dist/src/human-control-contract.js +1 -0
- package/dist/src/human-control.js +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -4
- package/dist/src/input-actions2.js +2 -1
- package/dist/src/install-artifact-facade.js +1 -0
- package/dist/src/install-source-network-transport.js +1 -0
- package/dist/src/install-source.d.ts +3 -10
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -0
- package/dist/src/interaction-ref-policy.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -0
- package/dist/src/interactor-types.js +1 -0
- package/dist/src/interactor.js +6 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +1 -2
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +2 -4
- package/dist/src/internal/png-worker.d.ts +4 -4
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.d.ts +4 -0
- package/dist/src/internal/run-script-http-child.js +1 -0
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/inventory.js +4 -4
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/inventory6.js +1 -1
- package/dist/src/ios-client.js +16 -0
- package/dist/src/ios-snapshot-acquisition.js +1 -0
- package/dist/src/ios-snapshot-adapter.js +1 -0
- package/dist/src/ios-snapshot-planning.js +1 -0
- package/dist/src/ios-snapshot-runtime.js +1 -0
- package/dist/src/ios-system-surface.js +1 -0
- package/dist/src/json.js +1 -0
- package/dist/src/keyboard-actions.js +1 -0
- package/dist/src/launch-console.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-scope.js +1 -0
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +1610 -7
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -0
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/macos-facade.js +1 -0
- package/dist/src/managed-device-scope.js +1 -0
- package/dist/src/mechanics.js +19 -0
- package/dist/src/metro.d.ts +4 -2
- 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/multitouch-support.js +1 -0
- package/dist/src/numeric.js +1 -0
- package/dist/src/observability.js +1 -1
- package/dist/src/observation.js +2 -0
- package/dist/src/open-target-resolution.js +1 -0
- package/dist/src/output-path.js +1 -1
- package/dist/src/owner-identity.js +3 -1
- package/dist/src/parameterized-recorded-fill.js +1 -0
- package/dist/src/parser.js +1 -1
- package/dist/src/perf-facade.js +2 -0
- package/dist/src/perf-process-identity.js +1 -0
- package/dist/src/perf-runtime-operation-builder.js +1 -0
- package/dist/src/perf-runtime-plan.js +1 -0
- package/dist/src/perf-runtime.js +1 -0
- package/dist/src/perf.js +1 -4
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/physical-device-facade.js +1 -0
- package/dist/src/platform-request-scope.js +1 -0
- package/dist/src/platform-runtime-android-adb-host.js +1 -0
- package/dist/src/platform-runtime-android-mechanics.js +1 -0
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -0
- 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-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -0
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/plist.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/prepare-kind.js +1 -0
- package/dist/src/process-exit.js +1 -1
- package/dist/src/process.js +1 -0
- package/dist/src/provider-device-runtime.js +1 -0
- package/dist/src/provider-session-ownership.js +2 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/proxy.js +2 -2
- package/dist/src/react-native-overlay.js +1 -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/rect-center.js +1 -0
- package/dist/src/register-builtins.js +1 -0
- package/dist/src/registry.js +40 -28
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +2 -0
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +8 -7
- package/dist/src/request-admission.js +1 -0
- package/dist/src/request-cancel.js +1 -0
- package/dist/src/request-cancellation.js +1 -0
- package/dist/src/request-progress-protocol.js +1 -0
- package/dist/src/request-providers.js +1 -0
- package/dist/src/request-runtime-binding.js +1 -0
- package/dist/src/request.js +1 -0
- package/dist/src/result-serialization.js +1 -0
- package/dist/src/retry.js +1 -0
- package/dist/src/rolldown-runtime.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -0
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -0
- package/dist/src/runner-owner-facade.js +1 -0
- package/dist/src/runner-owner-state.js +1 -0
- package/dist/src/runner-presentation.js +1 -0
- package/dist/src/runner.js +1 -0
- package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -3
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/scoped-provider.js +1 -1
- package/dist/src/screen-recording-completion.js +1 -0
- package/dist/src/screen-recording-live-handle.js +1 -0
- package/dist/src/screen-recording-options.js +1 -0
- package/dist/src/screen-recording-resource-recovery.js +1 -0
- package/dist/src/screen-recording-runtime.js +1 -0
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-result.js +1 -6
- package/dist/src/screenshot-runtime.js +1 -0
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot2.js +1 -0
- package/dist/src/screenshot3.js +5 -0
- package/dist/src/script.js +1 -0
- package/dist/src/scroll-command.js +1 -0
- package/dist/src/scroll-gesture.js +1 -0
- package/dist/src/scroll-indicator.js +1 -0
- package/dist/src/sdk-batch-runner.d.ts +23 -6
- package/dist/src/sdk-batch-runner.js +2 -3
- package/dist/src/sdk-batch.js +2 -0
- package/dist/src/sdk-contracts.d.ts +170 -41
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.d.ts +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +524 -140
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -0
- package/dist/src/server.js +4 -4
- package/dist/src/session-allocation.js +1 -0
- package/dist/src/session-artifact-paths.js +1 -0
- package/dist/src/session-observation.js +1 -0
- package/dist/src/session-paths.js +1 -0
- package/dist/src/session-repair-tombstone.js +1 -0
- package/dist/src/session-routing.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -0
- package/dist/src/session-snapshot.js +1 -0
- package/dist/src/session-store.js +4 -0
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session2.js +5 -27
- package/dist/src/settings.js +1 -0
- package/dist/src/shared.js +2 -2
- package/dist/src/simctl-facade.js +1 -0
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-facade.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -0
- package/dist/src/snapshot-diagnostics.js +1 -0
- package/dist/src/snapshot-process.js +1 -0
- package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -0
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-scope.js +1 -1
- package/dist/src/snapshot-state.js +1 -0
- package/dist/src/snapshot.js +1 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -0
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +1 -2
- package/dist/src/src4.js +1 -1
- package/dist/src/src5.js +1 -0
- package/dist/src/src6.js +1 -0
- package/dist/src/src7.js +2 -0
- package/dist/src/src8.js +115 -0
- package/dist/src/startup-recovery-fence.js +1 -0
- package/dist/src/status-markers.js +1 -0
- package/dist/src/string-enum.js +1 -1
- package/dist/src/success-text.js +1 -0
- package/dist/src/surface-snapshot.js +1 -0
- package/dist/src/surface-snapshot2.js +1 -0
- package/dist/src/takeover.js +5 -0
- package/dist/src/tool-provider-facade.js +1 -0
- package/dist/src/tool-provider.js +4 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/toolchain-probe.js +2 -0
- package/dist/src/touch-reference-frame.js +1 -0
- package/dist/src/touch-runtime.js +1 -0
- package/dist/src/transport.js +3 -0
- package/dist/src/tree.js +1 -0
- package/dist/src/ttl-memo.js +1 -0
- package/dist/src/tv-remote.js +1 -0
- package/dist/src/type-text-runtime.js +1 -0
- package/dist/src/undici.js +99 -0
- package/dist/src/update-check.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/web.js +2 -1
- package/dist/src/web2.js +1 -0
- package/dist/src/webdriver-ios-snapshot.js +1 -0
- package/dist/src/webdriver-source.js +1 -0
- package/dist/src/window-state.js +1 -0
- package/linux/atspi-dump.py +54 -9
- package/package.json +58 -35
- package/server.json +9 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
- package/dist/src/appearance.js +0 -1
- package/dist/src/apps.js +0 -5
- package/dist/src/audio-probe.js +0 -1
- package/dist/src/cli-grammar.js +0 -1
- package/dist/src/command-catalog.js +0 -1
- package/dist/src/debug-symbols.js +0 -5
- package/dist/src/device-input-state.js +0 -2
- package/dist/src/device-ready.js +0 -1
- package/dist/src/dispatch.js +0 -1
- package/dist/src/handler-utils.js +0 -1
- package/dist/src/helper-package-install.js +0 -1
- package/dist/src/host-process.js +0 -3
- package/dist/src/ime-lifecycle.js +0 -2
- package/dist/src/ime-recovery-marker.js +0 -1
- package/dist/src/input-actions3.js +0 -1
- package/dist/src/install-artifact.js +0 -1
- package/dist/src/install-artifact2.js +0 -1
- package/dist/src/interaction-common.js +0 -1
- package/dist/src/interaction-runtime.js +0 -1
- package/dist/src/interaction-snapshot.js +0 -1
- package/dist/src/manifest.js +0 -1
- package/dist/src/method-scope.js +0 -1
- package/dist/src/png-resize.js +0 -1
- package/dist/src/process-lock.js +0 -1
- package/dist/src/runner-lease.js +0 -1
- package/dist/src/runner-sequence.js +0 -1
- package/dist/src/script-source-bundle.js +0 -16
- package/dist/src/sdk-android-adb.d.ts +0 -245
- package/dist/src/sdk-android-adb.js +0 -4
- package/dist/src/sdk.js +0 -1
- package/dist/src/setting-state.js +0 -1
- package/dist/src/shell-quote.js +0 -1
- package/dist/src/snapshot-session.js +0 -1
- package/dist/src/timing-safe-equal.js +0 -1
- package/dist/src/unsupported-interactor.js +0 -1
- package/dist/src/verdict.js +0 -1
- /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
package/dist/src/session2.js
CHANGED
|
@@ -1,27 +1,5 @@
|
|
|
1
|
-
import{E as e,_ as t,c as n,d as r,j as i,p as a,t as o,v as s,w as c,y as l}from"./sdk-contracts.js";import{l as u,p as d,u as f}from"./location-coordinates.js";import{A as p,An as m,Ar as h,Ct as g,D as _,E as v,F as y,I as b,In as x,J as ee,Jr as S,L as C,Lr as te,Mt as w,Nn as T,O as ne,On as re,P as ie,Pr as ae,Q as oe,R as se,Tt as ce,Vt as le,Yt as ue,Z as de,Zt as fe,_t as pe,an as me,bt as he,cn as ge,et as _e,f as ve,in as ye,j as be,jn as xe,k as Se,n as Ce,on as we,qr as Te,sn as Ee,t as De,vt as Oe,w as ke,xt as Ae,yt as je,z as Me}from"./sdk-batch-runner.js";import{_ as E,c as D,g as Ne,h as Pe,l as O,p as Fe,s as k,u as Ie,y as Le}from"./sdk-device.js";import{$t as Re,At as ze,Bt as Be,Ft as Ve,G as He,It as Ue,J as We,K as Ge,Kt as Ke,L as qe,Lt as Je,Mt as Ye,Rt as Xe,Tt as Ze,Ut as Qe,Vt as $e,Wt as et,a as tt,at as nt,bn as A,d as rt,en as it,f as at,i as ot,k as st,kt as ct,ln as lt,o as ut,q as dt,r as ft,rn as pt,t as mt,un as ht,wt as gt,yn as j,zt as _t}from"./script-source-bundle.js";import{C as vt,O as yt,w as bt}from"./interaction.js";import{$ as xt,A as St,B as Ct,E as wt,F as Tt,G as Et,H as Dt,J as Ot,K as kt,R as At,T as jt,U as Mt,V as Nt,W as Pt,X as Ft,Y as It,Z as Lt,ct as Rt,et as zt,nt as Bt,ot as Vt,q as Ht,rt as Ut,st as Wt,tt as Gt,x as M,z as Kt}from"./screenshot-result.js";import{a as qt,n as Jt,o as Yt,r as Xt,s as Zt,t as Qt}from"./session-target-evidence.js";import{n as N,t as $t}from"./command-catalog.js";import{a as en,c as tn,d as nn,f as rn,m as an,p as on,r as sn,s as cn,t as ln,u as un}from"./observability.js";import{t as dn}from"./verdict.js";import{c as fn,f as pn,o as mn}from"./device.js";import{A as P,M as hn,N as gn,S as _n,_ as vn,o as yn}from"./sdk-android-adb.js";import{n as bn,r as xn}from"./output-path.js";import{n as Sn}from"./version.js";import{t as Cn}from"./timeouts.js";import{t as wn}from"./project-runtime.js";import{r as Tn}from"./boot-diagnostics.js";import{i as En,o as Dn,r as On,t as kn}from"./ime-lifecycle.js";import{t as An}from"./keyed-lock.js";import{A as jn,D as Mn,M as Nn,N as Pn,P as Fn,j as In,u as Ln}from"./runner-disposal.js";import{i as Rn,o as zn,r as Bn}from"./interactors.js";import{i as Vn}from"./lease-context.js";import{o as F,s as Hn}from"./simctl.js";import{f as Un,l as Wn,n as Gn,r as Kn,t as qn,u as Jn}from"./verified-file.js";import{a as I,c as Yn,f as Xn,l as Zn,o as Qn,p as L,r as $n,s as er,t as tr}from"./dispatch.js";import{n as nr}from"./provider.js";import{n as rr,s as ir}from"./agent-browser-tool.js";import{r as ar}from"./png-resize.js";import{a as or,c as sr,f as cr,i as lr,l as ur,n as R,o as dr,r as fr,s as pr,u as mr}from"./src4.js";import{o as hr,t as gr}from"./runner-client.js";import{a as _r,c as vr,d as yr,f as br,g as xr,h as Sr,i as Cr,l as wr,m as Tr,n as Er,r as Dr,s as Or,t as kr,u as Ar,v as jr}from"./perf.js";import{$ as Mr,A as Nr,B as Pr,Bt as Fr,D as Ir,E as Lr,Et as Rr,F as zr,Ft as Br,G as Vr,H as Hr,I as Ur,It as Wr,J as Gr,K as Kr,L as qr,Lt as Jr,M as Yr,N as Xr,Nt as Zr,O as Qr,P as $r,Pt as ei,R as ti,Rt as ni,T as ri,U as ii,Ut as ai,V as oi,Vt as si,W as ci,X as li,Y as ui,Z as di,_ as fi,a as pi,at as mi,b as hi,bt as z,c as gi,d as _i,et as vi,f as yi,g as bi,gt as xi,h as Si,i as Ci,it as wi,j as Ti,jt as Ei,k as Di,kt as Oi,l as ki,m as Ai,mt as ji,n as Mi,nt as Ni,o as Pi,p as Fi,q as Ii,r as Li,rt as Ri,s as zi,st as Bi,tt as Vi,u as Hi,v as Ui,wt as Wi,xt as Gi,y as Ki,z as qi,zt as Ji}from"./internal/daemon.js";import{n as Yi}from"./hdc.js";import{t as Xi}from"./device-ready.js";import{t as B}from"./handler-utils.js";import{t as Zi}from"./record-runtime.js";import{a as V,i as Qi,r as $i,t as ea}from"./snapshot-runtime.js";import{i as ta,n as na,o as ra,r as ia}from"./platform-runtime-open-target.js";import{t as aa}from"./app-log-files.js";import H from"node:path";import{createHash as oa}from"node:crypto";import U,{promises as W}from"node:fs";import sa from"node:os";import{access as ca}from"node:fs/promises";import{setTimeout as la}from"node:timers/promises";import ua from"node:vm";function da(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function fa(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:da(n)}}function pa(e){let t=fa(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:ai(n,e.meta?.tenantId)},cleanup:()=>{si(n)}}}function G(e,t,n){return t||Zr(n)?null:I(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function ma(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function K(e){let t=Zr(e.flags)||!e.session?await L(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await ha(e.session.device);return e.ensureReady!==!1&&await Xi(t),t}async function ha(e){if(zn(e)||!D(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(hr(e.id)?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await L(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await L({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function ga(e,t){return t?wi(t,e).length===0:!1}async function _a(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r),o,s,c;try{o=pa(n);let e=xa(n),l=await ya(a,n.flags),u=await Qi(t.inspectFacts)(l),d=V(`install_from_source`,u.operations.ensureReady)??V(`install_from_source`,u.operations.materializeAppSource)??V(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await $i(t.bindDevice)(l,Oe);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Sa({artifact:s,retention:e,req:n,session:a,sessionName:r}),a&&z(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Ca(l,s,p,c),h=A(m,`Installed: ${ht(m)}`);return B(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(t){return c&&await $r(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:e(t)}}finally{await s?.cleanup(),o?.cleanup()}}async function va(n){let{req:r}=n;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await $r(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(t){return{ok:!1,error:e(t)}}}async function ya(e,n){let r=ba(n?.platform);if(e&&r&&e.device.platform!==r)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await K({session:e,flags:n,ensureReady:!1})}function ba(e){return e===`ios`||e===`android`?e:void 0}function xa(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Sa(e){if(e.retention.enabled)return await Ur({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Ca(e,t,n,r){return D(e)?wa(t,n,r):Ta(t,n,r)}function wa(e,n,r){let i=n.bundleId??e.bundleId;if(!i)throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Da(r),bundleId:i,...Ea(n,e),launchTarget:n.launchTarget??i}}function Ta(e,n,r){let i=n.packageName??n.launchTarget??e.packageName;if(!i)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Da(r),packageName:i,...Ea(n,e),launchTarget:n.launchTarget??i}}function Ea(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Da(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Oa(e){let t=await Aa(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):I(`UNSUPPORTED_OPERATION`,`${e.command} is not supported on this device`,void 0,r.hint?{hint:r.hint}:void 0)}}return{type:`admitted`,bind:ja(e.bindDevice)}}async function ka(e){let t=await Oa({...e,required:e.use.required});return t.type===`response`?t:{type:`runtime`,runtime:await t.bind(e.device,e.use)}}function Aa(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function ja(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}async function Ma(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Na(t);if(!a.ok)return a.response;let o=G(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await ka({device:await K({session:n,flags:t.flags,ensureReady:!1}),inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:be});if(s.type===`response`)return s.response;if(s.runtime.owner.kind!==`provider-runtime`||s.runtime.owner.provider!==a.options.provider)return I(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let c=await s.runtime.operations.configureProviderPortReverse(a.options);return c?{ok:!0,data:{action:`port-reverse`,...c}}:I(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Na(e){let t=Pa(e);if(!t.ok)return t;let n=Fa(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Pa(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:I(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:I(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Fa(e){let t=Ia(e.flags?.devicePort),n=Ia(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:I(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Ia(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function La(e){return await ka({...e,command:`runtime clear`,use:ne})}async function Ra(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Ma({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!za(i))return I(`INVALID_ARGS`,`runtime requires set, show, clear, or port-reverse`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Ba({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Va(n,o):Ua({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function za(e){return e===`set`||e===`show`||e===`clear`}async function Ba(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(pi(i)&&r?.appBundleId){let e=await La({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;z(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:ki(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Va(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Ha(e){return e?E(e.device):void 0}function Ua(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Ha(i),s=yi(t.flags?.platform??a?.platform??o);if(!s)return I(`INVALID_ARGS`,`runtime set only supports iOS and Android sessions. Pass --platform ios|android or open an iOS/Android session first.`);if(o!==void 0&&o!==s)return I(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=zi(a,Li(t.flags,s));return Ci(c)===0?I(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}function Wa(e){return I(`INVALID_ARGS`,e)}function Ga(e,n,r,i){try{return ia({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return I(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}async function Ka(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await ra({target:n,platform:i.platform,surface:r});return a?Wa(a):null}async function qa(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await ra({target:n,platform:r});return i?Wa(i):null}function Ja(e){let t=Fi(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:pi(n),clearRemovedRuntimeHints:_i({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Ya(e){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!ee(a??``),execution:{requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:Vn(n)}});let{appBundleId:d,appName:f}=await Xa({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new t(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Pi({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:f,runtime:c.runtime}}}async function Xa(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}async function Za(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:I(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:I(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:I(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function Qa(t){let{req:n,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=t;if(!o.ok||n.flags?.foreground!==!0)return o;try{let e=await ea({req:{...n,command:`snapshot`,positionals:[],flags:{...n.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});return e.ok?{ok:!0,data:{...o.data,snapshot:e.data}}:$a(o.data,e.error)}catch(t){return $a(o.data,e(t))}}function $a(e,t){return{ok:!0,data:{...e,warnings:[...eo(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function eo(e){return!e||!Array.isArray(e.warnings)?[]:e.warnings.filter(e=>typeof e==`string`)}const to=`open-command-roundtrip`;function no(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m}=e,h={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m};return o&&(h.appName=o),s&&(h.appBundleId=s),l&&(h.startup=l),u&&(h.timing=u),f&&p(f)>0&&(h.runtime=f),d&&(h.platform=E(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,Fe(d.platform)&&(h.serial=d.id)),d&&D(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...j(`Opened: ${o??s??t}`)}}function ro(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}function io(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:Vn(e)}}function ao(e){return e.internal?.resolvedSessionScope??vi(e)}function oo(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){It(t,{});return}Lt(n)&&(Ot(t),i.warnings=[...Array.isArray(i.warnings)?i.warnings.filter(e=>typeof e==`string`):[],`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`])}function so(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function co(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:to,appTarget:t,appBundleId:n}}async function lo(e){let{req:t,sessionName:n,sessionStore:r,logPath:i,device:a,openTarget:o,openPositionals:s,appName:c,surface:u,appBundleId:d,runtimeHints:f,lifecycle:p,applyRuntimeHints:m,existingSession:h,deviceClaim:g}=e,_=t.flags?.relaunch===!0,v=d,y=Date.now(),b=await uo({req:t,sessionName:n,sessionStore:r,device:a,surface:u,sessionAppBundleId:v,appName:c,existingSession:h});if(b.type===`response`)return b.response;let x=b.session??h,ee=Date.now(),S=await p.operations.openApplication({target:o,positionals:s,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:v,surface:u,hasExistingSession:h!==void 0,relaunch:_,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:so(a,t),stateDir:r.resolveDaemonStateDir(),runtimeHints:ki(f),applyRuntimeHints:m,execution:io(t,i,h?.trace?.outPath)});v=S.appBundleId??v;let C={...S.timing},te=o?co(ee,o,v):void 0;if(Nn(t.meta?.requestId)){let e=l();return I(e.code,e.message,e.details)}h&&Oi({session:h,command:`open`,positionals:[],flags:void 0});let w=ro({existingSession:x,sessionName:h?.name??Vi(t),sessionScope:h?.sessionScope??ao(t),device:a,surface:u,appBundleId:v,appName:c});w.lease=Br({req:t,existingLease:h?.lease}),g&&(w.deviceClaim=g),t.runtime!==void 0&&Hi(r,n,f);let T=r.ensureSessionDir(n),ne=jt(T,t.meta?.requestId??hn().requestId);C.totalDurationMs=Math.max(0,Date.now()-y),P({level:`info`,phase:`open_timing`,durationMs:C.totalDurationMs,data:C});let re=no({sessionName:w.name,sessionStateDir:T,runnerLogPath:wt(T),requestLogPath:ne,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:v,surface:u,startup:te,timing:C,device:a,runtime:f,runtimeHintCount:Ci,sessionReused:h!==void 0});return oo({session:w,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:re}),r.set(n,w),r.recordAction(w,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:re}),{ok:!0,data:re}}async function uo(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=fo(e);r.set(n,o);let s=await a(o);return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function fo(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=ro({existingSession:o,sessionName:o?.name??Vi(t),sessionScope:o?.sessionScope??ao(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=Br({req:t,existingLease:o?.lease}),s}function po(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return Mr(t,i)?I(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):mo(i,n)}function mo(e,t){return I(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:t.id,deviceName:t.name,hint:mi(e,`device-in-use`)})}async function ho(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;return Ji(r)?await Jr({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o}):{status:`not-required`}}async function go(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f}=e,p=po({req:t,device:a,sessionStore:i});if(p)return p;let m=await ho({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(m.status===`conflict`)return Mi(a,m.conflict);let h=m.status===`acquired`?m.ownership:void 0,g={mayHaveStarted:!1};try{let e=await Ya({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await _o(h,g),e.response;g.mayHaveStarted=!0;let f=t.positionals??[],p=s??e.details.appBundleId,m=await lo({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:p,openPositionals:f.length>0?f:p?[p]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:h});return m.ok||await _o(h,g),m}catch(e){throw await _o(h,g),e}}async function _o(e,t){if(e){if(t.mayHaveStarted){P({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await ni(e)}}const vo=new Map;async function yo(e){let t=Me({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Oa({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ie)};case`open-apply-runtime-hints`:{let t=await r(e.device,b);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,C);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,y);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function bo(e){let t=Ja(e);if(t.type===`response`)return t;let n=await yo({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function xo(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Za({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return I(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Ga(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return Wa(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let u=await Ka({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await ha(i.device);await o.internal?.retainDeviceExecutionLock?.(d.id);let f=await bo({req:o,sessionStore:r,sessionName:t,device:d,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(f.type===`response`)return f.response;let{admission:p,runtimeHintPlan:m}=f;z(i);let h=await Ya({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:p.runtime,runtimeHintPlan:m,clearRuntimeHints:p.clearRuntimeHints,foreground:!1});return h.type===`response`?h.response:await lo({req:o,sessionName:t,sessionStore:r,logPath:n,device:d,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:h.details.appBundleId,appName:h.details.appName,runtimeHints:h.details.runtime,lifecycle:p.runtime,applyRuntimeHints:p.applyRuntimeHints,surface:l,existingSession:i})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return Wa(`open --relaunch requires an app argument.`);let l=await qa({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await L(o.flags??{},di(c));await o.internal?.retainDeviceExecutionLock?.(u.id);let d=Ga(u,o.flags?.surface,c);if(typeof d!=`string`)return d;let f=await Ka({shouldRelaunch:s,openTarget:c,surface:d,device:u});if(f)return f;let p=await bo({req:o,sessionStore:r,sessionName:t,device:u,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(p.type===`response`)return p.response;let{admission:m,runtimeHintPlan:h}=p;return await An(vo,u.id,async()=>await go({req:o,sessionName:t,logPath:n,sessionStore:r,device:u,surface:d,openTarget:c,lifecycle:m.runtime,runtimeHintPlan:h,applyRuntimeHints:m.applyRuntimeHints,clearRuntimeHints:m.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}))}function So(e,t,n){if(!Dt(t))return{kind:`not-armed`};let r=t.actions.length;B(e,t,n,`close`,{session:t.name,...j(`Closed: ${t.name}`)});let i=xt(t),a=e.writeSessionLog(t,{force:Ft(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(Kt(t),{kind:`aborted`})}function Co(t,n){let r=e(n),i=Rt(t.scriptPublication??Vt);return{ok:!1,error:{...r,details:{...r.details,session:t.name,...i?{savedScript:i}:{}},retriable:!0}}}function wo(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||B(r,n,t,`close`,{session:n.name,...j(`Closed: ${n.name}`)});try{let e=r.writeSessionLog(n,{force:Ft(n,t.flags?.force)});e.written&&Gt(n,e.path);return}catch(e){return To(e)}}function To(n){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return n instanceof t?new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n.message}`,{...n.details,...r},n.cause):new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e(n).message}`,r)}async function Eo(e){let t=e.clearRuntimeHints?p:Se,n=await Oa({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,Se)};let r=await n.bind(e.device,p);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Do(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=Oo(t,n),m=a.getRuntimeHints(r);await ko(n,a,f);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&pi(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:ki(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>zr(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}function Oo(e,t){return Ai(t.device)&&!e.flags?.shutdown&&!t.screenRecording&&!t.lease&&!t.device.simulatorSetPath}async function ko(e,t,n){let r=t.get(e.name)??e;r.screenRecording&&await n(`recording`,()=>Si({session:r,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>Ki({session:e,sessionName:e.name,sessionStore:t})),await n(`audio_probe`,async()=>{await Xr(e,`session-close`)}),await n(`apple_perf`,()=>hi(e)),await n(`android_native_perf`,()=>fi(e)),await n(`android_snapshot_helper`,()=>Ui(e))}function Ao(e,t){return bi({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function jo(e){return e instanceof t?e:new t(`COMMAND_FAILED`,`The platform close failed: ${e instanceof Error?e.message:String(e)}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}function Mo(e){return JSON.stringify(e.positionals??[])}async function No(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=Dt(n),s=Mo(t);if(o&&!Nt(n,s)){let e=await Fo({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Co(n,jo(e))};Et(n,s)}let c=So(i,n,t);return c.kind===`failed`?{response:Co(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function Po(t){try{return{providerData:await ei(t)}}catch(n){let r=e(n);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:t.session.name},retriable:!0}}}}}async function Fo(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Vo(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:io(t,r,n.trace?.outPath)});return}catch(e){return e}}function Io(e,n){if(!e.flags?.saveScript||Lt(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new t(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new t(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function Lo(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await Uo({req:t,logPath:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(Io(t,s),t.internal?.closeAppOnly===!0&&!t.positionals?.[0])return I(`INVALID_ARGS`,`App-only close requires an app target`);let c=await Eo({device:s.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!s.appBundleId&&pi(i.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(c.type===`response`)return c.response;if(z(s),t.internal?.closeAppOnly===!0)return await Bo({req:t,session:s,logPath:r,lifecycle:c.runtime});let l=await No({req:t,session:s,logPath:r,sessionStore:i,lifecycle:c.runtime});if(`response`in l)return l.response;let u=await Ro({req:t,session:s,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,lifecycle:c.runtime,clearRuntimeHints:c.clearRuntimeHints,repairArmed:l.repairArmed});return u.kind===`response`?u.response:zo({session:s,repair:l,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:u.shutdownResult,providerData:u.providerData})}async function Ro(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Do({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Fo,finalizeOrdinaryCloseScript:wo}),m=await Po({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Ao(r,u),g=d??h;if(g?n.deviceClaim&&P({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await ni(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function zo(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:A({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...j(c),...o,...s}}}async function Bo(e){let{req:t,session:n,logPath:r,lifecycle:i}=e,a=t.positionals?.[0];if(!a)return I(`INVALID_ARGS`,`App-only close requires an app target`);let o=await Fo({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...j(`Closed: ${a}`)}}}function Vo(e,t){return Ho(e)||t.device.platform===`web`}function Ho(e){return(e.positionals?.length??0)>0}async function Uo(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return I(`SESSION_NOT_FOUND`,`No active session`);let a=await Eo({device:await K({session:void 0,flags:t.flags,ensureReady:!1}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:io(t,n)}),{ok:!0,data:{app:t.positionals[0],...j(`Closed: ${t.positionals[0]}`)}})}function Wo(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Go(e,n){let r=n?.subject??`Payload`,i=e.trim();if(!i)throw new t(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!U.statSync(a).isFile())throw new t(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof t)throw e;let n=e.code;if(n===`EACCES`||n===`EPERM`)throw new t(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new t(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(Wo(i))return{kind:`inline`,text:i};throw new t(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Ko(e){let n=Go(e,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await qo(n.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function qo(e){try{return await W.readFile(e,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new t(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new t(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new t(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new t(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function Jo(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=G(n,a,o);if(s)return s;let c=es(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?ai(l,t.meta?.tenantId):M.expandHome(c.appPathInput);if(!U.existsSync(s))return I(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await K({session:a,flags:o,ensureReady:!1}),d=V(n,(await Qi(e.inspectFacts)(u)).operations.deployApp);if(d)return d;let f=await $i(e.bindDevice)(u,pe);a&&z(a);let p=await f.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),m=Xo(u,c.app,s,p),h=A(m,`Installed: ${m.appName??lt(m)}`),g=$o(a,m);return g&&g!==a&&i.set(r,g),B(i,g,t,n,h),{ok:!0,data:h}}finally{l&&si(l)}}async function Yo(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=G(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return I(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Ko(ts(c,t.meta?.cwd)),u=await K({session:i,flags:a,ensureReady:!1}),d=await Qi(e.inspectFacts)(u),f=V(`push`,d.operations.ensureReady)??V(`push`,d.operations.sendPushNotification);if(f)return f;let p=await $i(e.bindDevice)(u,je);await p.operations.ensureReady({}),i&&z(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=D(u)?A({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):A({platform:E(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return B(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function Xo(e,t,n,r){return D(e)?Zo(t,n,r):Qo(e,t,n,r)}function Zo(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Qo(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function $o(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function es(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:I(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:I(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function ts(e,t){let n=Go(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>M.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function ns(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Jo({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await _a({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await Yo({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function rs(e,t,n){return await Ce(e,t,n)}function is(e,t){return e.operations.ensureReady(t)}function as(e,t,n){return e.operations.listApps({device:t,filter:n})}const os=new Set([N.install,N.reinstall,N.installFromSource,N.push]),ss=new Map([[N.installFromSource,$t.installSource]]);function cs(e,t){let n=ls(e);if(n)return t!==void 0&&n.required.every(e=>ds(t,e))}function ls(e){let t=us(e);if(!t)return;let n=ve.find(e=>e.name===t)?.platformExecution;if(!(n?.kind!==`device-runtime`||!(`use`in n)))return n.use}function us(e){if(os.has(e))return ss.get(e)??e}function ds(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function fs(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return ps(t,r);case`devices`:return await hs(t);case`capabilities`:return await xs({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`apps`:return await Ds({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts});default:return null}}function ps(e,t){let n=vi(e);return{ok:!0,data:{sessions:t.toArray().filter(e=>Ni(e,n)).map(e=>ms(e,t))}}}function ms(e,t){let n=t.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:n,runnerLogPath:wt(n),platform:E(e.device),...k(e.device.platform)&&e.device.appleOs?{appleOs:e.device.appleOs}:{},target:e.device.target??`mobile`,surface:e.surface??`app`,device:e.device.name,id:e.device.id,device_id:e.device.id,createdAt:e.createdAt,...k(e.device.platform)&&!O(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}}async function hs(e){try{return{ok:!0,data:{devices:(await gs(e)).map(Ms)}}}catch(e){let t=s(e);return I(t.code,t.message,t.details)}}async function gs(e){let t=e.flags?.platform;return bs(await Wn(_s(e,t)),e.flags?.platform,e.flags?.target)}function _s(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:vs(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:ys(n?.androidDeviceAllowlist)}}function vs(e,t,n){return Le({simulatorSetPath:Hn(e),platform:t,target:n})}function ys(e){let t=F(e);return t?Array.from(t).sort():void 0}function bs(e,t,n){let r=t?e.filter(e=>Ns(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function xs(e){let t=await js({...e,ensureReady:!1,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Ss(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Os(n,e.inspectFacts),[a,o,s]=e.bindDevice?await Promise.all([e.bindDevice(n,v).then(e=>e.facts.appLogInspect.available),e.bindDevice(n,de).then(e=>e.facts.networkDump.available),e.bindDevice(n,_e).then(e=>e.facts.screenRecordingStart.available)]):[!1,!1,!1];return{ok:!0,data:{device:Ms(n),availableCommands:Zn().filter(e=>{if(e===`appstate`&&r)return!0;let t=cs(e,i);if(t!==void 0)return t;let c=Es(e,i);return c===void 0?e===`logs`?a:e===`network`?o:e===`record`?s:Yn(e,n):c})}}}function Ss(e,t,n){return!t||!D(e)&&!O(e)||!ga(n,t)?!1:Cs(t)||ws(e,t)}function Cs(e){return!!(e.appName||e.appBundleId)}function ws(e,t){return!!(O(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}const Ts=Object.freeze({apps:[`ensureReady`,`listApps`],appstate:[`ensureReady`,`appState`],shutdown:[`shutdownTarget`],open:[`resolveOpenTarget`,`prepareApplicationOpen`,`openApplication`],close:[`closeApplication`,`finalizeApplicationClose`],prepare:[`prepareAppleRunner`],runtime:[`clearRuntimeHints`]});function Es(e,t){let n=Ts[e];if(n)return t?n.every(e=>t.operations[e].available):!1}async function Ds(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await js({req:t,sessionName:n,sessionStore:r,ensureReady:!1,androidAvdSelection:`include-stopped`});if(`response`in o)return o.response;let{device:s}=o,c=pn(t.flags?.appsFilter),l=F(t.flags?.androidDeviceAllowlist),u=await ks({device:s,inspectFacts:a,bindDevice:i});if(`response`in u)return u.response;let d=u.runtime;return As(await as(d,await is(d,{serial:t.flags?.serial,androidSerialAllowlist:l?[...l].sort():void 0}),c))}async function Os(e,t){if(t)try{return await t(e)}catch{return}}async function ks(e){if(!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await e.inspectFacts(e.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:I(`UNSUPPORTED_OPERATION`,`apps is not supported on this device`,void 0,r.hint?{hint:r.hint}:void 0)};if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Ae)}}function As(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function js(e){let{req:t,sessionName:n,sessionStore:r,ensureReady:i,androidAvdSelection:a}=e,o=r.get(n),s=t.flags??{},c=G(t.command,o,s);return c?{response:c}:{device:await K({session:o,flags:s,ensureReady:i,androidAvdSelection:a})}}function Ms({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...k(r.platform)&&n?{appleOs:n}:{}}}function Ns(e,t){return Ne(e,t)}const Ps=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,Fs=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function Is(e){return t=>I(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function Ls(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function Rs(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function zs(e){return e.available?null:I(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Bs(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Vs(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&ma(a))return I(`SESSION_NOT_FOUND`,o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`);let s=G(`appstate`,i,a);if(s)return s;let c=k(i?.device.platform)&&ga(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return I(`SESSION_NOT_FOUND`,Ps);if(u&&!c)return I(`SESSION_NOT_FOUND`,Fs);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?O(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:I(`COMMAND_FAILED`,`No foreground app is tracked for this ${O(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:E(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...D(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await K({session:i,flags:a,ensureReady:!1});if(D(d))return I(`SESSION_NOT_FOUND`,Ps);if(O(d))return I(`SESSION_NOT_FOUND`,Fs);let f=await ka({command:`appstate`,device:d,use:he,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>I(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:Us(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:E(d),package:m.package,activity:m.activity}}}async function Hs(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let i=r.get(n),a=t.flags??{},o=G(t.command,i,a);if(o)return o;let c=F(a.androidDeviceAllowlist),l=c?[...c].sort():void 0,u=g({headless:a.headless===!0}),d;try{d=await K({session:i,flags:a,ensureReady:!1,androidAvdSelection:`include-stopped`})}catch(e){let t=s(e);if(u.kind===`boot-target-headless`&&!Bs(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return I(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(a.target&&(d.target??`mobile`)!==a.target)return I(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await Oa({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:Is(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:a.serial,androidSerialAllowlist:l};return d=u.kind===`boot-target-headless`?await(await f.bind(d,u.use)).operations.bootTargetHeadless(p):await(await f.bind(d,u.use)).operations.bootTarget(p),{ok:!0,data:{platform:E(d),target:d.target??`mobile`,device:d.name,id:d.id,kind:d.kind,booted:!0,...k(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=G(t.command,i,a);if(o)return o;let s=await K({ensureReady:!1,flags:a,session:i,androidAvdSelection:`include-stopped`}),c=zs((await Ls(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return I(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await Rs(e.bindDevice)(s,ce)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...k(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:I(l.error?.code??`COMMAND_FAILED`,Ws(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Vs({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Us(e){let t=F(e);return t?[...t].sort():void 0}function Ws(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Gs(e){let t=Gn(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=U.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{U.closeSync(t)}}function Ks(e,t){aa(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=qn(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function qs(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=Kn(e);try{U.fsyncSync(r)}finally{U.closeSync(r)}let i=0;for(let e of U.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{U.unlinkSync(H.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Js(e){return Lr.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Ys(e){if(!w(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const Xs=[`probe`],Zs=[`start`,`status`,`stop`],Qs=`audio probe requires ${Zs.join(`, `)}`;async function $s(t){let n=ec(t);if(!n.ok)return n;let r=await Ys(n.session.device);if(r)return await nc(t,n,r);let i=nr();if(!i.probeAudio)return I(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);try{return{ok:!0,data:await i.probeAudio({action:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function ec(e){let t=tc(e);if(!t.ok)return t;let n=rc(e.req);if(!n.ok)return n;let r=ic(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function tc(e){let t=e.sessionStore.get(e.sessionName);return t?Yn(`audio`,t.device)?{ok:!0,session:t}:I(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):I(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function nc(t,n,r){try{return{ok:!0,data:await Yr({session:n.session,sessionName:t.sessionName,sessionStore:t.sessionStore,backend:r,probeAction:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function rc(e){if(!ac(e.positionals?.[0]))return I(`INVALID_ARGS`,`audio requires probe`);let t=oc(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:I(`INVALID_ARGS`,Qs)}function ic(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return I(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=sc(e.positionals?.[2],{defaultValue:1e4,min:100,max:12e4,message:`audio probe duration must be an integer in range 100..120000 ms`});if(n instanceof Error)return I(`INVALID_ARGS`,n.message);let r=sc(e.positionals?.[3],{defaultValue:1e3,min:100,max:1e4,message:`audio probe bucket must be an integer in range 100..10000 ms`});return r instanceof Error?I(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function ac(e){let t=(e??`probe`).toLowerCase();return Xs.includes(t)?`probe`:void 0}function oc(e){let t=(e??`status`).toLowerCase();return Zs.includes(t)?t:void 0}function sc(e,t){if(e===void 0)return t.defaultValue;let n=Number.parseInt(e,10);return!Number.isInteger(n)||String(n)!==e||n<t.min||n>t.max?Error(t.message):n}async function cc(t){let n=lc(t.req,t.area);if(!n.ok)return n;let{session:r}=t;if(r.device.platform!==`android`)return I(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return I(`COMMAND_FAILED`,`No Android app package is associated with this session.`,{hint:`Run open <app> first so perf can resolve the package and process identity.`});try{return{ok:!0,data:n.area===`cpu`?await vc(t,r,r.appBundleId,n):await yc(t,r,r.appBundleId,n)}}catch(t){return{ok:!1,error:e(t)}}}function lc(e,t){let n=_c(e,t);return t===`cpu`?uc(e,n):dc(e,n)}function uc(e,t){let n=fc(e,1),r=fc(e,2),i=fc(e,3);return an(n)?pc(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:I(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):I(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):I(`INVALID_ARGS`,tn)}function dc(e,t){let n=fc(e,1),r=fc(e,2);return mc(n)?rn(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:I(`INVALID_ARGS`,`perf trace requires --kind perfetto`):I(`INVALID_ARGS`,en):I(`INVALID_ARGS`,`perf trace action must be start or stop`)}function fc(e,t){return(e.positionals?.[t]??``).toLowerCase()}function pc(e){return e===`start`||e===`stop`||e===`report`}function mc(e){return e===`start`||e===`stop`}function hc(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),wc(t)}function gc(e,t,n){return t?M.expandHome(t,e.req.meta?.cwd):Cc(e.sessionStore,e.sessionName,n)}function _c(e,t){return typeof e.flags?.out==`string`&&e.flags.out.length>0?e.flags.out:(e.positionals??[])[t===`cpu`?5:4]||void 0}async function vc(e,t,n,r){if(r.action===`start`){xc(t);let i=gc(e,r.outPath,`cpu.perf.data`);return hc(e,await vr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Tc(t,`cpu-profile`,r.kind);if(r.action===`report`){await bc(i);let n=gc(e,r.outPath,`cpu-report.json`);return await Ar(t.device,i,n,{adb:e.androidAdbExecutor})}let a=Sc(e,r.outPath,i);return hc(e,await wr(t.device,i,a,{adb:e.androidAdbExecutor}))}async function yc(e,t,n,r){if(r.action===`start`){xc(t);let i=gc(e,r.outPath,`app.perfetto-trace`);return hc(e,await yr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Tc(t,`trace`,r.kind),a=Sc(e,r.outPath,i);return hc(e,await br(t.device,i,a,{adb:e.androidAdbExecutor}))}function bc(e){if(e.state===`running`)throw new t(`COMMAND_FAILED`,`Stop the Android Simpleperf CPU profile before generating a report.`,{hint:`Run perf cpu profile stop --kind simpleperf, then retry perf cpu profile report --kind simpleperf.`})}function xc(e){let n=e.nativePerf?.android;if(n?.state===`running`)throw new t(`COMMAND_FAILED`,`Android ${n.kind} ${n.type} is already running for this session.`,{hint:n.type===`cpu-profile`?`Run perf cpu profile stop --kind simpleperf before starting another Android native perf capture.`:`Run perf trace stop --kind perfetto before starting another Android native perf capture.`})}function Sc(e,t,n){return t?gc(e,t,n.outPath):n.outPath}function Cc(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return H.join(e.ensureSessionDir(t),`${r}-${n}`)}function wc(e){return{action:e.action,platform:`android`,type:e.type,kind:e.kind,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,durationMs:e.durationMs,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,summary:e.summary,message:e.message}}function Tc(e,n,r){let i=e.nativePerf?.android;if(i?.type===n&&i.kind===r)return i;throw new t(`COMMAND_FAILED`,`No Android ${r} ${n} is active for this session.`,{hint:n===`cpu-profile`?`Run perf cpu profile start --kind simpleperf first, then stop or report in the same session.`:`Run perf trace start --kind perfetto first, then stop in the same session.`})}async function Ec(t,n){let r=Dc(t.req);if(!r.ok)return r;if(n.device.platform===`android`)return I(`UNSUPPORTED_OPERATION`,`Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.`);if(!k(n.device.platform))return I(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return I(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await Mc(t,n,r):r.action===`stop`?await Nc(t,n,r):await Rc(t,n,r)}catch(t){return{ok:!1,error:e(t)}}}function Dc(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Oc(t):n===`trace`?kc(t):I(`INVALID_ARGS`,sn)}function Oc(e){if(e[1]?.toLowerCase()!==`profile`)return I(`INVALID_ARGS`,`perf cpu requires profile`);let t=Ac(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=jc(e[3]);return n.ok?{ok:!0,area:`cpu`,mode:`cpu-profile`,action:t.value,kind:`xctrace`,template:e[4]||void 0,outPath:e[5]||void 0,tracePath:e[6]||void 0}:n}function kc(e){let t=Ac(e[1],`perf trace`,!1);if(!t.ok)return t;let n=jc(e[2]);return n.ok?{ok:!0,area:`trace`,mode:`trace`,action:t.value,kind:`xctrace`,template:e[3]||void 0,outPath:e[4]||void 0,tracePath:e[5]||void 0}:n}function Ac(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:I(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function jc(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:I(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function Mc(e,t,n){if(t.applePerf?.active)return I(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??Hc(n.mode),i=Vc(e,n),a=await qr({device:t.device,appBundleId:t.appBundleId,mode:n.mode,template:r,outPath:i});t.applePerf={...t.applePerf??{},active:a},e.sessionStore.set(e.sessionName,t);let o=Uc(`started`,a);return Bc(e,t,o),{ok:!0,data:o}}async function Nc(e,t,n){let r=t.applePerf?.active;if(!r)return I(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?M.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await ti(r,i)}catch(n){throw Fc(n)&&Pc(e,t),n}Ic(e,t,a);let o=Uc(`stopped`,a);return Bc(e,t,o),{ok:!0,data:o}}function Pc(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function Fc(e){return s(e).details?.captureCleanedUp===!0}function Ic(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...Lc(n)},e.sessionStore.set(e.sessionName,t)}function Lc(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function Rc(e,t,n){if(n.mode!==`cpu-profile`)return I(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return I(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=Vc(e,n),i=zc(t,n);if(!i.ok)return i;let a={perf:`reported`,...await qi({tracePath:M.expandHome(i.value,e.req.meta?.cwd),outPath:r,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return Bc(e,t,a),{ok:!0,data:a}}function zc(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:I(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function Bc(e,t,n){B(e.sessionStore,t,e.req,`perf`,n)}function Vc(e,t){if(t.outPath)return M.expandHome(t.outPath,e.req.meta?.cwd);let n=e.sessionStore.ensureSessionDir(e.sessionName),r=new Date().toISOString().replace(/[:.]/g,`-`),i=t.action===`report`?`json`:`trace`;return`${n}/perf-${t.mode}-${r}.${i}`}function Hc(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function Uc(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}const Wc=`hdc-shell-proc-status`;function Gc(e){let t=e.trim().split(/\s+/)[0];if(!t||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return n>0?n:void 0}function Kc(e){let t=Yc(e,`VmRSS`);if(t===void 0)return;let n=Yc(e,`VmHWM`);return{totalRssKb:t,...n===void 0?{}:{peakRssKb:n}}}async function qc(e,n){let r=await Jc(e,n),i=Kc((await Yi(e,[`shell`,`cat`,`/proc/${r}/status`],{timeoutMs:15e3})).stdout);if(!i)throw new t(`COMMAND_FAILED`,`Could not read resident memory for ${n}`,{hint:`Verify the app is still running, then retry perf memory sample.`,details:{bundleName:n,pid:r}});return{...i,measuredAt:new Date().toISOString(),method:Wc,pid:r}}async function Jc(e,n){let r=await Yi(e,[`shell`,`pidof`,n],{allowFailure:!0,timeoutMs:15e3}),i=r.exitCode===0?Gc(r.stdout):void 0;if(i!==void 0)return i;throw new t(`COMMAND_FAILED`,`Could not find a running process for ${n}`,{hint:`Open the app in this session, then retry perf memory sample.`,details:{bundleName:n}})}function Yc(e,t){let n=e.match(RegExp(`^${t}:\\s+(\\d+)\\s+kB$`,`m`));if(!n?.[1])return;let r=Number.parseInt(n[1],10);return Number.isFinite(r)?r:void 0}Bn();async function Xc(e,t={}){let n=$c(e);return nl(e)?e.appBundleId?(await tl(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:rl(e)},n):n}async function Zc(e,t){let n=el(e);return nl(e)?t.action===`sample`?(n.metrics={memory:await sl(e,t)},n):(n.artifact=await ll(e,t),n.support=hl(n.artifact.support)??ml(e),n):t.action===`snapshot`?(n.artifact=fl(e,ul(e,t.kind)),n.support=hl(n.artifact.support)??ml(e),n):(n.metrics={memory:{available:!1,reason:`Not implemented for this platform in this release.`}},n)}function Qc(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function $c(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:Qc()},sampling:{fps:ol(e)}}}function el(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:il(e),snapshot:al(e)}}}async function tl(e,t,n,r){if(t.device.platform===`harmonyos`)return;let i=t.device.platform===`android`?await gl(Tr(t.device,n,{adb:r.androidAdb})):await gl(Kr(t.device,n));e.metrics.fps=vl(_l(i),t)}function nl(e){return Rn(e.device.platform)?.perf?.supportsObservations(e.device)??!1}function rl(e){return e.device.platform===`android`?`No Android app package is associated with this session. Run open <app> first.`:e.device.platform===`harmonyos`?`No HarmonyOS app bundle is associated with this session. Run open <app> first.`:`No Apple app bundle ID is associated with this session. Run open <app> first.`}function il(e){return e.device.platform===`android`?{method:Cr,description:Dr,unit:`kB`,topConsumerLimit:5}:e.device.platform===`harmonyos`?{method:Wc,description:`Resident memory snapshot from HarmonyOS /proc/<pid>/status. Values are reported in kilobytes.`,unit:`kB`,topConsumerLimit:1}:ii(e.device)}function al(e){return e.device.platform===`android`?{method:Er,description:kr,defaultKind:`android-hprof`,artifactOnly:!0}:e.device.platform===`harmonyos`?{method:`unsupported`,description:`HarmonyOS memory snapshot capture is not available through HDC.`,artifactOnly:!0}:{method:oi,description:Pr,defaultKind:`memgraph`,artifactOnly:!0}}function ol(e){return e.device.platform===`android`?{method:xr,description:Sr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:e.device.platform===`harmonyos`?Qc():Hr(e.device)}async function sl(e,t){return e.appBundleId?_l(e.device.platform===`android`?await gl(Or(e.device,e.appBundleId,{adb:t.androidAdb})):e.device.platform===`harmonyos`?await gl(qc(e.device,e.appBundleId)):await gl(cl(e))):{available:!1,reason:rl(e)}}async function cl(e){if(!e.appBundleId)throw new t(`INVALID_ARGS`,rl(e));return await Ii(e.device,e.appBundleId)}async function ll(e,n){if(!e.appBundleId)throw new t(`INVALID_ARGS`,rl(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=ul(e,n.kind),i=dl(n,r);return e.device.platform===`android`?r===`android-hprof`?await _r(e.device,e.appBundleId,i,{adb:n.androidAdb}):fl(e,r):e.device.platform===`harmonyos`||r!==`memgraph`?fl(e,r):await Vr(e.device,e.appBundleId,i)}function ul(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function dl(e,t){if(e.out)return M.expandHome(e.out,e.cwd);let n=t===`android-hprof`?`hprof`:t===`memgraph`?`memgraph`:`artifact`,r=new Date().toISOString().replace(/[:.]/g,`-`),i=e.sessionStore.ensureSessionDir(e.sessionName);return H.join(i,`artifacts`,`memory-${t}-${r}.${n}`)}function fl(e,t){let n=ml(e),r=pl(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function pl(e,t){return e.device.platform===`android`?{reason:`Android perf memory snapshot supports android-hprof, not ${t}.`,hint:`Use perf memory snapshot --kind android-hprof for Android Java heap artifacts.`}:k(e.device.platform)?{reason:`Apple perf memory snapshot supports memgraph, not ${t}.`,hint:`Use perf memory snapshot --kind memgraph for supported Apple app sessions.`}:{reason:`Memory snapshot artifacts are not supported on ${e.device.platform}.`,hint:`Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS.`}}function ml(e){return e.device.platform===`android`?{platform:e.device.platform,defaultKind:`android-hprof`,androidHprof:!0,memgraph:!1,heapprofd:!1,heapprofdDecision:`Deferred until Android Perfetto/heapprofd plumbing is available in the perf trace slice.`}:k(e.device.platform)?{...ci(e.device),androidHprof:!1,heapprofd:!1,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}:{platform:e.device.platform,defaultKind:`memgraph`,androidHprof:!1,memgraph:!1,heapprofd:!1,reason:`Memory snapshot artifacts are available only on Android, iOS simulator, and macOS.`,hint:`Use perf memory sample where supported, or switch to a platform with memory artifact support.`,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}}function hl(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function gl(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function _l(t){if(t.status===`fulfilled`)return{available:!0,...t.value};let n=e(t.reason);return{available:!1,reason:n.message,error:n}}function vl(e,t){if(e.available!==!0)return e;let n=yl(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function yl(e,t){let n=bl(t.windowStartedAt),r=bl(t.windowEndedAt)??bl(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(e=>e.ts>=n&&e.ts<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:xl(e)})).slice(-12)}function bl(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function xl(e){let t=e.result;if(t)for(let e of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}}const Sl=`adb-shell-dumpsys-cpuinfo`;async function Cl(e,t,n={}){let r=yn(e,n.adb);try{return wl((await r([`shell`,`dumpsys`,`cpuinfo`],{timeoutMs:15e3})).stdout,t,new Date().toISOString())}catch(e){throw Dl(t,e)}}function wl(e,t,n){let r=new Set,i=0;for(let n of Te(e)){let e=Tl(n,t);e&&(i+=e.percent,r.add(e.processName))}return{usagePercent:jr(i),measuredAt:n,method:Sl,matchedProcesses:[...r]}}function Tl(e,t){let n=e.match(/^([0-9]+(?:\.[0-9]+)?)%\s+\d+\/([^\s]+):\s/),r=Number(n?.[1]),i=n?.[2];if(!(!i||!Number.isFinite(r)||!El(i,t)))return{percent:r,processName:i}}function El(e,t){return e===t||e.startsWith(`${t}:`)}function Dl(e,n){return n instanceof t?new t(n.code,n.message,{...n.details??{},metric:`cpu`,package:e},n):new t(`COMMAND_FAILED`,`Failed to sample Android cpu for ${e}`,{metric:`cpu`,package:e},n)}async function Ol(e,t){let n=await Xc(e,t),r=await Zc(e,{...t,action:`sample`}),i=await kl(e,t.androidAdb);return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:Ml(e.actions),cpu:i,fps:n.metrics.fps,memory:r.metrics?.memory??{available:!1,reason:`Not implemented for this platform in this release.`}},sampling:{startup:{method:to,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},cpu:jl(e),fps:n.sampling.fps,memory:r.sampling.memory},warnings:[`perf metrics, bare perf, and perf sample are deprecated compatibility forms and will be removed in the next major release. Use perf frames, perf memory sample, or a native CPU profile.`]}}async function kl(t,n){if(t.device.platform!==`android`)return Al();if(!t.appBundleId)return{available:!1,reason:`No Android app package is associated with this session. Run open <app> first.`};try{return{available:!0,...await Cl(t.device,t.appBundleId,{adb:n})}}catch(t){let n=e(t);return{available:!1,reason:n.message,error:n}}}function Al(){return{available:!1,reason:`Point CPU sampling is unavailable. Use a native CPU profile for CPU evidence.`}}function jl(e){return e.device.platform===`android`?{method:Sl,description:`Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.`,unit:`percent`,deprecated:!0}:{method:`deprecated`,description:`Use a native CPU profile instead of a point-in-time percentage.`}}function Ml(e){let t=Nl(e),n=t.at(-1);return n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:to,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:to}}function Nl(e){let t=[];for(let n of e){let e=Pl(n);e&&t.push(e)}return t.slice(-20)}function Pl(e){if(e.command!==`open`)return;let t=e.result?.startup;if(!t||typeof t!=`object`)return;let n=t,r=Fl(n.durationMs),i=Il(n.measuredAt);if(!(r===void 0||!i||n.method!==`open-command-roundtrip`))return{durationMs:r,measuredAt:i,method:to,appTarget:Ll(n.appTarget),appBundleId:Ll(n.appBundleId)}}function Fl(e){if(!(typeof e!=`number`||!Number.isFinite(e)))return Math.max(0,Math.round(e))}function Il(e){if(!(typeof e!=`string`||e.trim().length===0))return e}function Ll(e){return typeof e==`string`&&e.length>0?e:void 0}const Rl=[`dump`,`log`],zl=`network requires ${Rl.join(` or `)}`,Bl=`network include mode must be one of: ${o.join(`, `)}`,Vl=2048;async function Hl(t){let n=t.sessionStore.get(t.sessionName);if(!n)return I(`SESSION_NOT_FOUND`,`network requires an active session`);try{let e=Ul(t.bindDevice),r=(await e(n.device,de)).facts.networkDump;if(!r.available)return Jl(r.hint);let i=Wl(t.req);if(!i.ok)return i;let a=oe({action:i.action,include:i.include}),o=await e(n.device,a.use),s=n.appLog?.handle.inspect();return Yl(await o.operations.networkDump({sessionId:t.sessionName,appBundleId:n.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:Vl,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(t){return{ok:!1,error:e(t)}}}function Ul(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function Wl(e){let t=Gl(e);if(!t.ok)return t;let n=Kl(e);if(!n.ok)return n;let r=ql(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function Gl(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return Rl.includes(t)?{ok:!0,action:t}:I(`INVALID_ARGS`,zl)}function Kl(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?I(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ql(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return I(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return o.includes(r)?{ok:!0,include:r}:I(`INVALID_ARGS`,Bl)}function Jl(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function Yl(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:Vl,maxScanLines:e.entries.length},notes:e.notes}}}function Xl(e,t){let n=Di(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Zl(e.appLogFailure)]:Ql(n.state)}}function Zl(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Ql(e){if(e===`failed`)return[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`];if(e===`ended`)return[`The app log stream process ended. Run logs clear --restart before the next capture window.`]}function $l(e,t){return Gr([...e,...t.notes??[]])}async function eu(e){let{req:t}=e;return t.command===`perf`?nu(e):t.command===`logs`?hu(e):t.command===`events`?await tu(e):t.command===`network`?await Hl(e):t.command===`audio`?await $s(e):null}async function tu(t){let{req:n,sessionName:r,sessionStore:i}=t;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(t){return{ok:!1,error:e(t)}}}async function nu(t){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=t,o=i.get(r);if(!o)return I(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=ru(n);if(!s.ok)return s;if(s.native)return o.device.platform===`android`?await cc({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s.area}):await Ec(t,o);try{return{ok:!0,data:await iu(t,o,s)}}catch(t){return{ok:!1,error:e(t)}}}function ru(n){let r=au(n.positionals?.[0]);if(r instanceof t)return{ok:!1,error:e(r)};if(r===`cpu`||r===`trace`)return{ok:!0,native:!0,area:r};let i=ou(n.positionals?.[1]);if(!i)return I(`INVALID_ARGS`,ln);let a=su(n.flags?.kind);return a instanceof t?{ok:!1,error:e(a)}:(cu(r,i)??du(n,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:mu(n.flags?.out)}}async function iu(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await Zc(t,{action:uu(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`metrics`?await Ol(t,{androidAdb:a,sessionName:r,sessionStore:i}):await Xc(t,{androidAdb:a})}function au(e){if(e==null)return`metrics`;let n=e.toString().toLowerCase();return nn(n)?n:new t(`INVALID_ARGS`,sn)}function ou(e){let t=(e??`sample`).toString().toLowerCase();return un(t)?t:void 0}function su(e){if(e!==void 0)return typeof e!=`string`||!rn(e)?new t(`INVALID_ARGS`,en):e}function cu(e,t){if(e===`metrics`)return t===`sample`?void 0:I(`INVALID_ARGS`,`perf metrics only supports sample`);if(e===`memory`)return lu(t)?void 0:I(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return I(`INVALID_ARGS`,`perf frames only supports sample`)}function lu(e){return e===`sample`||e===`snapshot`}function uu(e){if(lu(e))return e;throw new t(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function du(e,t,n,r){return fu(e.flags?.out,t,n)??pu(r,t,n)}function fu(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return I(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function pu(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return I(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!on(e))return I(`INVALID_ARGS`,cn)}}function mu(e){return typeof e==`string`&&e.length>0?e:void 0}async function hu(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r);if(!a)return I(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let e=Du({...t,session:a}),r=(await e.bindDevice(a.device,v)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=vu(_({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await gu(e,i)}catch(t){return{ok:!1,error:e(t)}}}async function gu(e,t){switch(t.kind){case`path`:return yu(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return bu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await _u(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Tu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),xu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Su(e)}}async function _u(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await wu(e,t.appBundleId,n.owner,n.operations.appLogStart):await Cu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function vu(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):I(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function yu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Gs(a),s=Xl(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??`Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>`,notes:s.notes}}}async function bu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Xl(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:$l(t.notes,o)}}}function xu(e,t,n){let r=n.resolveAppLogPath(t);return Ks(r,e),{ok:!0,data:{path:r,marked:!0}}}function Su(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return I(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=qs(r.resolveAppLogPath(n));return Ir({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Cu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await Qr({session:i,sessionName:a,sessionStore:o,resourcePath:Ti.resolvePath(o.resolveSessionDir(a))});let s=qs(o.resolveAppLogPath(a)),c=await Eu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function wu(e,t,n,r){let{session:i}=e;return i.appLog?I(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Eu(e,t,r,n)}async function Tu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return I(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await Qr({session:t,sessionName:n,sessionStore:r,resourcePath:Ti.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Eu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=Ti.resolvePath(o.resolveSessionDir(a));try{let l=Js({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await ri({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:Nr({session:i,sessionName:a,sessionStore:o,error:e})}}}function Du(e){if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new t(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Ou(e){return JSON.stringify(ku(e))}function ku(e){if(Array.isArray(e))return e.map(ku);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,ku(t[e])]))}function Au(e){let t=Ou(ju(e));return oa(`sha256`).update(t,`utf8`).digest(`hex`)}function ju(e){let{actions:t,actionLines:n,actionSourcePaths:r,metadata:i}=e;return{platform:i.platform??null,target:i.target??null,steps:t.map((e,t)=>Mu(e,n[t]??null,r?.[t]??null))}}function Mu(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function Nu(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=Pu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Pu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Fu({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Iu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Lu(n,r)];for(let e of s){let t=e();if(t)return t}}function Fu(e){let{from:t,actionCount:n,pendingRecordAndHeal:r}=e,i=t===n+1&&r!==void 0&&r.expectedFrom===t;return Number.isInteger(t)&&t>=1&&(t<=n||i)?void 0:`replay --from ${t} is out of range for a ${n}-step plan.`}function Iu(e){let{from:t,pendingRecordAndHeal:n,sessionActionsLength:r}=e;if(!(n?.expectedFrom!==t||r!==n.actionsCountAtDivergence))return`replay --from ${t} continues a record-and-heal-shaped repair, but no corrective action was recorded in this repair segment; press the correct control via a blessed @ref from the divergence's screen.refs (recorded, no --no-record) — or, if your corrective action was a read (get/is/find/snapshot), re-run it with --record so it lands in the heal — before resuming with --from ${t}.`}function Lu(e,t){if(e!==t)return`replay --plan-digest does not match the current plan digest; the script, its includes, or its platform-conditioned expansion changed since the divergence report was generated. Run a fresh full replay to get a new digest.`}function Ru(e,n){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new t(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=Qe(e),a=et(e),o=Au({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??Ke(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>Nu(e,s,o)}}function zu(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function Bu(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&we(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Vu(e,t){if(!(!e||!t)&&!(e.documentOrder===t.documentOrder&&e.sibling===t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function Hu(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Vu(i,a);return{matchCount:n,observed:r,mismatches:[...r?xe(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function Uu(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...xe(e,r),...m(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function Wu(e,t,n,r,i,a){if(n.targetEvidences)return Gu(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return q(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return q(e,n,r,i,a);if(s.kind===`post-resolution`){let c=zu({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return q(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return qu(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=Bu({recorded:o,token:s.token});if(c.kind===`skip`)return q(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,Ku(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?qu(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function Gu(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return q(e,n,r,i,a);let d=Bu({recorded:o[c],token:u.token});if(d.kind===`skip`)return q(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,Ku(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return qu(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function Ku(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function q(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function qu(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=Ju(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=Yu(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function Ju(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function Yu(e,t,n){return n.status===`guard-mismatch`?Hu(e,n.evidence,t):Uu(e,n.evidence)}async function Xu(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Ve(e.varSources),o=[],s=[],c=ed(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!$u(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(td(u,n.length,r,e))}let d=$e(r,a,Qu(e,u)),f=Ue(a),p=t.diagnosticsMarker(),m=await Wu(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:Zu(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function Zu(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Qu(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function $u(e){return!!(e&&e.command!==`replay`)}function ed(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if($u(n))return n.command===`close`?t:void 0}}function td(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function nd(e){let{sessionStore:t,sessionName:n}=e,r=()=>t.get(n);return{view(){let e=r();if(e)return{repairBoundary:kt(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){let i=r();i&&(Ct(i,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:rd(e.sourcePath),firstArm:e.firstArm}),t.set(n,i))},demoteForRerunIfArmed(){let e=r();!e||kt(e)===void 0||Ht(e)},markCompleteIfArmed(){let e=r();!e||kt(e)===void 0||(Pt(e),t.set(n,e))},markSessionHeldIfArmed(e){if(e.ok||!Mt(r()))return e;let t=id(e);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){t.clearRepairTombstone(n)},clearCorrectiveWatermarkIfExpected(e){let i=r();!i||i.pendingRecordAndHeal?.expectedFrom!==e||(sd(i),t.set(n,i))},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){let i=r();i&&(od({session:i,...e}),t.set(n,i))}}}}function rd(e){let t=H.dirname(e),n=H.basename(e,H.extname(e));return H.join(t,`${n}.healed.ad`)}function id(e){let t=e.error.details?.divergence;if(!(!te(t)||!ad(t.resume)))return t.resume}function ad(e){return!te(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function od(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=cd({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function sd(e){e.pendingRecordAndHeal=void 0}function cd(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if(!(n!==`caution`&&n!==`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function ld(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e[e.length-1],n=t!==void 0&&/^\d+$/.test(t)?t:null,r=we(`positional`,n===null?e.slice():e.slice(0,-1));return r.kind!==`expression`||r.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:r.expression,selectorTimeout:n}}function ud(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),pt(e.command)){let n=dd(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=we(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=ld([...e.positionals]);n&&t.push(n)}return Gr(t).filter(e=>e.trim().length>0)}function dd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&fd(n)?t.slice(0,-1):t}function fd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function pd(e){let t=md({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function md(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=hd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function hd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function gd(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!_d(n))return`manual`;let i=vd(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function _d(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&yd(e.scrollRegion)}function vd(e,t){let n=dt(t),r=xd(e.ancestry,n,t),i=e.scrollRegion;return i&&yd(i)?r&&bd(i,n,t):r}function yd(e){return e.id!==void 0||e.label!==void 0}function bd(e,t,n){return n.some(n=>Yt(Jt(n,t),e))}function xd(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Ge(n,t,e.length);return!r.broken&&T(r.chain,e)})}const Sd=new WeakMap;function Cd(e){return{store:t=>wd(e,t),finalize:(t,n)=>Td({...e,evidence:t,projection:n})}}function wd(e,t){let{sessionStore:n,sessionName:r}=e,i=n.get(r);if(!i)throw Error(`Internal observation session is no longer available.`);xi(i,t),n.set(r,i);let a=i.snapshotGeneration;if(a===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let o={};return Sd.set(o,{sessionName:r,session:i,sessionCreatedAt:i.createdAt,snapshot:t,snapshotGeneration:a,runtimeRevision:Gi(i),refFrame:Dd(i)}),{evidence:o,refsGeneration:a}}function Td(e){let t=Sd.get(e.evidence);Sd.delete(e.evidence);let n=kd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Ed(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Ad(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(ji(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Ed(e,t){let n=e.sessionStore.get(e.sessionName);return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Gi(n)===t.runtimeRevision&&Od(Dd(n),t.refFrame)}function Dd(e){return{state:e.refFrameState,scope:e.refFrameScope,tree:e.refFrameTree,generation:e.refFrameGeneration}}function Od(e,t){return e.state===t.state&&e.scope===t.scope&&e.tree===t.tree&&e.generation===t.generation}function kd(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Ad(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function jd(e){let{sessionStore:t,sessionName:n,divergence:r,responseLevel:a}=e,o,s,c=ct({divergence:r,level:a,writeOverflowArtifact:e=>{let r=i(e),a=Pd(t,n,r);return`artifactPath`in a&&(o=r,s=a.artifactPath),a}}),l=(o??c).screen;if(l.state!==`available`||l.refs.length===0)return e.evidence&&Cd({sessionStore:t,sessionName:n,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:l.state===`available`?l.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return Nd(s),Md(c,`missing-evidence`);let u=Cd({sessionStore:t,sessionName:n,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:l.refsGeneration,refs:l.refs.map(e=>e.ref)});return u.published===!0?c:(Nd(s),Md(c,u.reason))}function Md(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function Nd(e){if(e)try{U.unlinkSync(e)}catch{}}function Pd(e,t,n){try{let r=H.join(e.ensureSessionDir(t),`replay-divergence`);U.mkdirSync(r,{recursive:!0});let i=`${Date.now()}-step${n.step.index}.json`,a=H.join(r,i);return U.writeFileSync(a,`${JSON.stringify(n,null,2)}\n`),{artifactPath:a}}catch{return{artifactUnavailable:!0}}}const Fd={id:0,"role-label":1,label:2,other:3};function Id(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Ld(n.basis)<Ld(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Ld(e.basis)-Ld(t.basis)||e.nodeIndex-t.nodeIndex)}function Ld(e){return Fd[e]}async function Rd(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,resumeStamper:l,logPath:u,responseLevel:d,scrubVars:f=[],planActions:p,planDigest:m,signal:h}=e,g=ze(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await Vd({session:o,sessionName:s,sessionStore:c,logPath:u,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},y=Gd(v,g),b=v.state===`available`&&o?Xd({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=gd({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:zd(v)}),ee=pd({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return jd({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Re(n)),cause:_,screen:y,suggestions:b.slice(0,5),suggestionCount:b.length,resume:ee,repairHint:x},responseLevel:d,evidence:v.state===`available`?v.evidence:void 0,...h?{signal:h}:{}})}function zd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Bd=[300,500,800,1200,2e3,3e3,4e3];async function Vd(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=Ud(a),c=Date.now()+12e3,l=await Hd({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Bd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await Cn(Math.min(e,a)),l=await Hd({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s})}return l.observation}async function Hd(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,flags:a}=e;try{let e=(await Wi({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(dn(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let o=Cd({sessionStore:r,sessionName:n}).store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:o.refsGeneration,evidence:o.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:le(e)}}}function Ud(e){return{snapshotInteractiveOnly:Wd(e)}}function Wd(e){return Zd(e.command)?Qd(e).requiresRect:!0}function Gd(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=Yd(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function Kd(e){return!!gt(e,Ze(e.type??`Element`))||e.hittable===!0}function qd(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function Jd(e,t){let n=st(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&Kd(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>qd(e,t)),...o.filter(e=>!qd(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function Yd(e,t,n){let{nodes:r,truncated:i}=Jd(e,n);return{refs:r.map(e=>{let n=Ze(e.type??`Element`),r=gt(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function Xd(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!Zd(t.command))return[];let a=ud(t);return a.length===0?[]:$d({candidates:a,nodes:r,session:n,action:t,matching:Qd(t),sanitize:i})}function Zd(e){return pt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function Qd(e){let t=pt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function $d(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=ef({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Id(s).map(e=>e.suggestion)}function ef(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=ge(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:tf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function tf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=ye(t,r.device.platform,{action:i.command===`fill`?`fill`:pt(i.command)?`click`:`get`,nodes:n}),c=Ze(t.type??`Element`),l=gt(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function nf(e){return{...e,hint:e.hint??of(e.details,`hint`),diagnosticId:e.diagnosticId??of(e.details,`diagnosticId`),logPath:e.logPath??of(e.details,`logPath`)}}function rf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return af({error:t,actionLabel:Re(n),action:n.command,positionals:St(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function af(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Ye(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Ye(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...cf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function of(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const sf=[`reason`,`retriable`,`supportedOn`];function cf(e){if(!e)return{};let t={};for(let n of sf)e[n]!==void 0&&(t[n]=e[n]);return t}async function lf(e){return await uf({...e,snapshotDiagnostics:d(e.snapshotDiagnosticSamples)})}async function uf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionName:d,sessionStore:f,resumeStamper:p,logPath:m,planActions:h,planDigest:g}=e;if(t.ok)return t;let _=df(t.error.details?.replaySource),v=nf(t.error),y=await Rd({error:v,action:n,index:r,sourcePath:_?.path??a,sourceLine:_?.line??o,session:f.get(d),sessionName:d,sessionStore:f,resumeStamper:p,logPath:m,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:h,planDigest:g,signal:In(u.meta?.requestId)});return rf({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function df(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(!(n===void 0&&r===void 0))return{path:n,line:r}}function ff(e,t){if(e)try{U.appendFileSync(e,`${JSON.stringify(i(t))}\n`)}catch(t){P({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function pf(n){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=n,p=Date.now();ff(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:St(o)??[]});let m;try{m=await hf({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(n){if(!(n instanceof t))throw n;m={ok:!1,error:e(n)}}let h=Date.now();return ff(d,{type:`replay_action_stop`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:m.ok,durationMs:h-p,resultTiming:m.ok?_f(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),mf(m,u??s,c)}function mf(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function hf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=vf(t.flags,r.flags),s=i.command===`fill`?Tt(At(i)):void 0;return s&&(o.recordAs=s),await a(gf({token:t.token,session:n,flags:o,runtime:r.runtime,meta:t.meta,internal:{...t.internal,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:t.internal?.resolvedSessionScope??vi(t)}:{}}},r))}function gf(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:bt(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:yt(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function _f(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function vf(e,t){return De(e,{...t??{}})}function yf(e){return Ef(e.ok?xf(e.data):bf(e.error.details?.artifactPaths))}function bf(e){return Array.isArray(e)?e.filter(Tf):[]}function xf(e){return e?[wf(e.path),wf(e.outPath),...Sf(e.artifacts)].filter(Tf):[]}function Sf(e){return Array.isArray(e)?e.map(Cf).filter(Tf):[]}function Cf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return wf(t.localPath)??wf(t.path)}function wf(e){return typeof e==`string`?e:void 0}function Tf(e){return typeof e==`string`}function Ef(e){return[...new Set(e.filter(Df))]}function Df(e){try{return U.statSync(e).isFile()}catch{return!1}}function Of(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=kf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=dt(r),u=re(t),d=We(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Xt(r,e)===t.sibling),p=d.filter(e=>Yt(Jt(e,l),t.scrollRegion)),m=qt(p)[t.viewportOrder]?.ref,h=Zt({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Mf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function kf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Af(n,t,i,a):jf(n,t,r,a,o)}function Af(e,t,n,i){let o=e=>e!==null&&(!i||!!e.rect),s=a(t),c=s?r(e,s):null;if(o(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?He(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function jf(e,t,n,r,i){let a=Ee(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return a.kind===`resolved`?{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref}:{matchedNodes:[...a.matchedNodes],winnerRef:``}}function Mf(e){let{classification:t,matchCount:n,winnerNode:r,identitySet:i,byIndex:a,recorded:o}=e;switch(t.reason){case`selector-miss`:return{kind:`selector-miss`,matchCount:0,observedNode:void 0,candidateNodes:[],mismatches:[],causeCode:`SELECTOR_MISS`,causeMessage:`The recorded target no longer matches any current element.`};case`identity-set-empty`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Nf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`The recorded selector/ref still matches, but nothing in the current tree carries the recorded identity.`};case`unique-but-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Nf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Exactly one current element carries the recorded identity, but the resolved target is a different element.`};case`signal-isolated-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Nf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`A disambiguation signal (sibling or viewport position) isolated a different element than the resolved target.`};case`no-signal-isolation`:return{kind:`identity-unverifiable`,matchCount:n,observedNode:r,candidateNodes:i.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`${i.length} current elements carry the recorded identity and neither disambiguation signal isolated one.`}}}function Nf(e,t,n){let r=Qt(t),i=Ge(t,n,Math.max(e.ancestry.length,1)).chain;return[...xe(e,r),...m(e.ancestry,i)].slice(0,5)}function Pf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=vt(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=we(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!pt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(If(r)&&If(n[1])))return r}function Ff(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function If(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Lf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionName:l,sessionStore:u,resumeStamper:d,responseLevel:f,scrubVars:p,planActions:m,planDigest:h}=e,g=ze(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:qf(re(n),g),...t.observed?{observed:qf(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>Jf(e,g))},v=gd({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=pd({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b=jd({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(Re(r)),cause:{code:t.causeCode,message:g(t.causeMessage),...t.causeHint?{hint:g(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:y,repairHint:v,targetBinding:_},responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return rf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:p})}function Rf(e,t,n){let r=ze(e.scrubVars);return Lf(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:Gd(n,r),publicationEvidence:Hf(n),repairCapture:zd(n)})}async function zf(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await Vd({session:t,sessionName:n,sessionStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function Bf(e,t){return Rf(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await zf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function Vf(e,t,n){return Rf(e,t,await zf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function Hf(e){return e.state===`available`?e.evidence:void 0}function Uf(e){let{action:t,resolvedAction:n,sessionName:r,sessionStore:i,targetRole:a}=e,o=i.get(r);return o?ke(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:fe(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Pf(n,a),platform:o.device.platform}:{kind:`inactive`}}function Wf(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=Qd(r),s=Of({recorded:t,token:n,nodes:i,platform:a,refLabel:Ff(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Qt(s.winnerNode),structural:x(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Qt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function Gf(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function Kf(e){return!e.ok&&e.error.details?.reason===qe}function qf(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function Jf(e,t){let n=Ze(e.type??`Element`),r=gt(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function Yf(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function Xf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.role==`string`)return{...typeof t.id==`string`?{id:t.id}:{},role:t.role,...typeof t.label==`string`?{label:t.label}:{}}}function Zf(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function Qf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(!(typeof t.documentOrder!=`number`||typeof t.sibling!=`number`))return{documentOrder:t.documentOrder,sibling:t.sibling}}function $f(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:Xf(e?.observed),expectedStructural:Qf(e?.expectedStructural),observedStructural:Qf(e?.observedStructural)}}function ep(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:Xf(e?.observed),observedAncestry:Zf(e?.observedAncestry)}}function tp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function np(e,t,n){let r=tp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&Gf(e)?{status:`guard-mismatch`,evidence:$f(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&Kf(e)?{status:`landmark-mismatch`,evidence:ep(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function rp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionName:t.sessionName,sessionStore:t.sessionStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,tp(ip(e),yf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return Uf({action:e,resolvedAction:n,sessionName:t.sessionName,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.sessionStore.get(t.sessionName),a=i?await Vd({session:i,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get(t.sessionName);return Wf({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await pf({req:Yf(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke});o=l,yf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:np(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await Bf(c(e,n,r,i),{session:t.sessionStore.get(t.sessionName),sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Rf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await Vf(c(e,n,i,a),r,{session:t.sessionStore.get(t.sessionName),sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=ip(o),u=await ap(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>op(e),onStep:i,diagnosticsMarker:()=>cp(t.sessionStore,t.sessionName),diagnosticsSince:e=>lp(t.sessionStore,t.sessionName,e)},readLastResponse:()=>o}}function ip(e){return e&&!e.ok?e:I(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function ap(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return sp(i)?c(i):c(await lf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionName:e.sessionName,sessionStore:e.sessionStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function op(e){let t=e.positionals??[],n=me(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function sp(e){if(e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence,n=t&&typeof t==`object`?t.kind:void 0;return typeof n==`string`&&n!==`action-failure`}function cp(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function lp(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function up(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:dp(t,i)};return pp(o,`AD_PLATFORM`,a.platform??r.platform),pp(o,`AD_TARGET`,a.target??r.target),pp(o,`AD_DEVICE`,a.device),pp(o,`AD_DEVICE_ID`,fp(a)),mp(o,`AD_SHARD_INDEX`,a.shardIndex),mp(o,`AD_SHARD_COUNT`,a.shardCount),pp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function dp(e,t){let n=e.meta?.cwd??process.cwd();return H.relative(n,t)||t}function fp(e){return typeof e.serial==`string`?e.serial:e.udid}function pp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function mp(e,t,n){typeof n==`number`&&(e[t]=String(n))}const hp=3e4,gp=1e3;function _p(n){let{scriptPath:r,env:i}=n,a=U.readFileSync(r,`utf8`),o=Object.create(null);try{ua.runInNewContext(a,vp(i,o),{filename:r,timeout:hp})}catch(n){let i=e(n);throw new t(i.code,`Maestro runScript failed: ${i.message}`,S({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),n instanceof Error?n:void 0)}return Sp(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Cp(t)]))}function vp(e,t){return{...e,output:t,json:yp,http:{post:(e,t)=>xp(`POST`,e,t)}}}function yp(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,bp)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,gp)},n instanceof Error?n:void 0)}}function bp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function xp(e,n,r){let i=_n(process.execPath,[`-e`,`
|
|
2
|
-
const fs = require('node:fs');
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
console.error('global fetch is required for Maestro runScript http helpers');
|
|
6
|
-
process.exit(1);
|
|
7
|
-
}
|
|
8
|
-
fetch(input.url, {
|
|
9
|
-
method: input.method,
|
|
10
|
-
headers: input.headers,
|
|
11
|
-
body: input.body,
|
|
12
|
-
}).then(async response => {
|
|
13
|
-
process.stdout.write(JSON.stringify({
|
|
14
|
-
status: response.status,
|
|
15
|
-
body: await response.text(),
|
|
16
|
-
headers: Object.fromEntries(response.headers.entries()),
|
|
17
|
-
}));
|
|
18
|
-
}).catch(error => {
|
|
19
|
-
console.error(error && error.stack ? error.stack : String(error));
|
|
20
|
-
process.exit(1);
|
|
21
|
-
});
|
|
22
|
-
`],{stdin:JSON.stringify({method:e,url:n,headers:r?.headers??{},body:r?.body??``}),timeoutMs:hp,allowFailure:!0});if(i.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${wp(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:i.stdout.slice(0,gp),stderr:i.stderr.slice(0,gp)},r instanceof Error?r:void 0)}}function Sp(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function Cp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function wp(e){let t=e.trim();return t.length>0?t.slice(0,gp):`request process exited without stderr`}async function Tp(e){return await Ep(`tap`,async t=>{let n=H.join(t,`before.png`),r=H.join(t,`after.png`),i=await Op(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Op(e,r)))return await Dp(n,r,e.signal,`tap`)}})})}async function Ep(e,t){let n=await W.mkdtemp(H.join(sa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await W.rm(n,{recursive:!0,force:!0})}catch{}}}async function Dp(e,t,n,r){try{let[i,a]=await Promise.all([W.readFile(e),W.readFile(t)]);J(n);let o=await ar(i,a,`Maestro screenshot`);return J(n),kp(o,r)}catch(e){jp(e,n),P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Op(e,t){try{return await W.rm(t,{force:!0}),J(e.signal),await e.capture(t),J(e.signal),!0}catch(t){return jp(t,e.signal),!1}}function kp(e,t){if(e.status!==`compared`)return Ap(t,e.status,e),!1;let n=e.differencePercent<=R.animationDifferencePercent;return Ap(t,n?`stable`:`changed`,e),n}function Ap(e,t,n){P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function jp(e,t){if(t?.aborted||c(e))throw l()}function J(e){if(e?.aborted)throw l()}async function Mp(e){Pp(e.timeoutMs),J(e.signal);let t=e.now()+e.timeoutMs;return await Ep(`animation`,async n=>{let r=H.join(n,`first.png`),i=H.join(n,`second.png`);for(;;){if(J(e.signal),await Np(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Np(e,t,n){let r=[await Op(e,t),await Op(e,n)];return!r[0]||!r[1]?!1:await Dp(t,n,e.signal,`animation`)===!0}function Pp(e){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Fp=R.observationPollMs;async function Ip(e,t){for(;;){Y(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!Qp(n)||(Y(e.context.signal),!await Xp(e.dependencies,t,Fp,e.context.signal)))throw n}}}function Lp(e){return Rp({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function Rp(e){let t=Bi(e.snapshot),r=e.platform===`ios`?Rr(e.snapshot.nodes):void 0;return Up(lr(r?{...e.snapshot,nodes:n(r.nodes)}:e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,interaction:r?{snapshot:e.snapshot,sourceIndexes:r.sourceIndexes}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function zp(e){Zp(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Y(e.context.signal);let r=await Ip(e,n),i=Rp({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,dr(e.condition,i))return i;if(e.dependencies.now()>=n)break;await Xp(e.dependencies,n,Fp,e.context.signal)}return Y(e.context.signal),tm(t)}async function Bp(e){Zp(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Y(e.context.signal);let i=r??await Ip(e,t);if(r=void 0,n=Rp({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===R.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Y(e.context.signal),tm(n)}async function Vp(e){Zp(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Ip(e,t),r=$p(n);for(;;){Y(e.context.signal),await Xp(e.dependencies,t,Fp,e.context.signal);let i=await Ip(e,t),a=$p(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function Hp(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function Up(e,t,n,r,i,a,o){if(!e.ok){let t=Hp(r);return{generation:n,matched:e.evidence.matched,visible:e.evidence.visible,candidateCount:e.evidence.candidateCount,...e.evidence.ref?{ref:e.evidence.ref}:{},...t?{viewport:t}:{}}}let s=Gp({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=Hp(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:Wp(e.rect,c)}:{},candidateCount:e.evidence.candidateCount,rect:e.rect,...e.evidence.ref?{ref:e.evidence.ref}:{},...c?{viewport:c}:{},...s?{dispatchSelector:s}:{},...i.includeSurfaceSignature?{surfaceSignature:$p(t)}:{}}}function Wp(e,t){return!h(e)||!h(t)?0:ae(t,e)?100:Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))*100/(e.width*e.height)}function Gp(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!Kp(t,n,r)||i!==1))return qp(t.selector)}function Kp(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function qp(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!Jp(n)||typeof r!=`string`)return;let i=mr(r)?.trim();return i?{key:n,value:i}:void 0}function Jp(e){return e===`id`||e===`label`||e===`text`}async function Yp(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?l():e}Y(n)}async function Xp(e,t,n,r){let i=t-e.now();return i<=0?!1:(await Yp(e,Math.min(n,i),r),!0)}function Y(e){if(e?.aborted)throw l()}function Zp(e,n){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function Qp(e){return e instanceof t&&e.details?.retriable===!0}function $p(e){return oa(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,bounds:em(e.rect)})))).digest(`hex`)}function em(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function tm(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function nm(e){return rm(e)?im(e):mm(e)?hm(e):cm(e)}function rm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function im(e){switch(e.kind){case`launchApp`:return am(e);case`stopApp`:return om(e);case`openLink`:return sm(e)}}function am(e){return{command:`open`,positionals:e.appId?[e.appId]:[],flags:{...e.relaunch?{relaunch:!0}:{},...e.clearState?{clearAppState:!0}:{},...e.launchArgs.length>0?{launchArgs:e.launchArgs}:{}}}}function om(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function sm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function cm(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return lm(e);case`clickPoint`:return um(e);case`swipe`:return dm(e);case`scroll`:return fm(e);case`pressKey`:return pm(e)}}function lm(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function um(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function dm(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},internal:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function fm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function pm(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function mm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function hm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0}}}}async function gm(e,t){let n=nm(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=_m(i,n.flags??{}),c=S({...a,...n.internal,...t.kind===`snapshot`?{observationOnly:!0}:{}}),l=await e.invoke(S({...o,command:n.command,positionals:n.positionals,input:n.input,flags:s,internal:Object.keys(c).length>0?c:void 0}));if(!l.ok)throw Cm(l);return l.data}function _m(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=S({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function vm(e){return e?e.kind===`scalar`?[String(e.value)]:e.kind===`list`?e.values.map(String):Object.entries(e.values).flatMap(([e,t])=>[e,String(t)]):[]}function ym(e,t){return{generation:t.generation,matched:t.matched&&t.visible,candidateCount:t.candidateCount,evidence:{kind:`selector`,selector:e,visible:t.visible,candidateCount:t.candidateCount,...t.ref?{ref:t.ref}:{}}}}function bm(e){if(!e)return[];let t=[];if(typeof e.path==`string`&&t.push(e.path),Array.isArray(e.artifactPaths)&&t.push(...e.artifactPaths.filter(e=>typeof e==`string`)),Array.isArray(e.artifacts))for(let n of e.artifacts)typeof n.localPath==`string`?t.push(n.localPath):typeof n.path==`string`&&t.push(n.path);return[...new Set(t)]}function xm(e,n,r){if(H.isAbsolute(e))return e;let i=n.source?.path??r;if(!i)throw new t(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return H.resolve(H.dirname(i),e)}function Sm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Cm(e){let n=e.error,r=S({...n.details??{},hint:n.hint??wm(n.details,`hint`),diagnosticId:n.diagnosticId??wm(n.details,`diagnosticId`),logPath:n.logPath??wm(n.details,`logPath`),retriable:n.retriable??Tm(n.details,`retriable`),supportedOn:n.supportedOn??wm(n.details,`supportedOn`)});return new t(n.code,n.message,Object.keys(r).length?r:void 0)}function wm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Tm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Em(e){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await gm(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new t(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=i;return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await Vp({timeoutMs:R.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot}}}}async function Dm(e){let{input:t,context:n,snapshots:r,options:i}=e,a=i.dependencies.now()+t.timeoutMs,o=e.allowObservationReuse===!1?void 0:r.reuseObservation(n);for(;;){let e=i.dependencies.now(),s=o!==void 0;o??=await Ip({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=Lp({query:t,context:n,snapshot:o,platform:i.platform});if(Nm(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await Xp(i.dependencies,a,Fp,n.signal)}}}async function Om(e,t,n,r,i,a){let o=async()=>await jm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Tp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await gm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await km(e,t,n,r,i,a.click,o)});return}await km(e,t,n,r,i,a.click)}async function km(e,t,n,r,i,a,o){let s=async()=>await jm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:$p(await t.capture(i))),l=async()=>await Vp({timeoutMs:R.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await Am({baselineSignature:c,screenshotBaseline:o,dispatch:s,settle:l,onRetry:()=>{n.tapRetries+=1}});t.prime(i.generation,e.snapshot)}catch(e){throw t.requireStability(i.generation),e}}async function Am(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<R.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function jm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Pm(e,o,n.point,i);return}catch(n){if(!Fm(n))throw n;let o=await Dm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Mm(o))throw n;t.invalidate(r.generation),await Im(e,nt(o.rect),i);return}}t.invalidate(r.generation),await Im(e,n.point,i)}function Mm(e){return e.matched&&e.visible&&e.rect!==void 0}function Nm(e,t){return Mm(e)?!t||e.dispatchSelector!==void 0:!1}async function Pm(e,t,n,r){P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await gm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Fm(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function Im(e,n,r){if(!n)throw new t(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await gm(e,{kind:`clickPoint`,point:n,options:r})}function Lm(e){let n=Em(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),gm(e,t)),o=async(e,t,r=`none`)=>{n.invalidate(t.generation);try{return await e()}finally{r===`deferred`&&n.requireStability(t.generation)}},s=async(e,t,n=`none`)=>await o(()=>a(e),t,n),c=async(t,r)=>{gn(t),await s({kind:`typeText`,text:t},r);let i=await Vp({timeoutMs:R.settleTimeoutMs,context:r,snapshot:n.capture,dependencies:e.dependencies});n.prime(r.generation,i.snapshot)};return{operations:{platform:i,resolveTarget:async(t,r)=>await Dm({input:t,context:r,snapshots:n,options:e}),observe:async(t,r)=>await zp({condition:t.condition,timeoutMs:t.timeoutMs,context:r,snapshot:n.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async n=>{let r=await e.dependencies.resolveGestureViewport(n);if(!r)throw new t(`COMMAND_FAILED`,`Unable to resolve Maestro gesture viewport.`);return r},launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...vm(e.arguments),...vm(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;await s({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`stopApp`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await s({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(t,i)=>await Om(e,n,r,t.target,i,{click:{count:t.repeat,intervalMs:t.delay},retryIfNoChange:t.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>Im(e,t.target.point,S({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>Im(e,t.target.point,{holdMs:R.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??R.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(t,r)=>{let a=await Bp({selector:t.selector,direction:t.direction,timeoutMs:t.timeoutMs,context:r,snapshot:n.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=or(o,t.selector,t.direction,t.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:t.direction,durationMs:t.durationMs},r),(await Vp({timeoutMs:Math.min(R.settleTimeoutMs,a),context:r,snapshot:n.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==R.scrollUntilVisiblePercentage)throw cr(`Maestro scrollUntilVisible target did not become visible.`,{selector:t.selector,timeoutMs:t.timeoutMs});return{observation:n.bindObservation(ym(t.selector,a))}},pressKey:async(e,t)=>{await s({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await s({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await s({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await Mp({timeoutMs:t.timeoutMs??R.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:bm(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:_p({scriptPath:xm(t.file,n,e.sourcePath),env:{...n.env,...t.env?Sm(t.env):{}}})})},snapshots:n,readMetrics:()=>({...n.readMetrics(),...r})}}function Rm(e){let{operations:t,snapshots:n,readMetrics:r}=Lm(e);return fr(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{t&&await n.settlePending(e)},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function zm(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),Bm(()=>Um(r,e)),Bm(()=>Wm(n,t,e))},actionCompleted:e=>{let r=Vm(i,e.stepIndex);Bm(()=>Gm(n,t,Hm(r,e),!0))},actionFailed:e=>{let r=Vm(i,e.stepIndex);Bm(()=>Gm(n,t,Hm(r,e),!1))}}}function Bm(e){try{e()}catch{}}function Vm(e,t){let n=e.get(t);return e.delete(t),n}function Hm(e,t){return S({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function Um(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function Wm(e,t,n){ff(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function Gm(e,n,r,i){let a=Km(r);ff(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof t?{errorCode:r.error.code}:{}})}function Km(e){let t=`data`in e?e.data:void 0,n=qm(t?.timing)?t.timing:void 0;return S({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function qm(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Jm(e,t){return pr(e,t)}function Ym(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:$m(e.action),positionals:eh(e.action,e.value),flags:t.flags??{}}}}async function Xm(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,logPath:o}=e,s=In(r.meta?.requestId),c=Ym(t,r),l=nf(e.error),u=[...t.redactions],d=ze(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(i),m=p?await Vd({session:p,sessionName:i,sessionStore:a,logPath:o,action:c.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},h=p&&m.state===`available`&&!t.isControl?Zm({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,Qm(t.value)].filter(Boolean).join(` `),_=jd({sessionStore:a,sessionName:i,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:d(t.source.path??n),line:t.source.line}},action:d(g),cause:{code:f.code,message:f.message,...f.hint?{hint:f.hint}:{}},screen:Gd(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:gd({kind:`action-failure`,targetEvidence:void 0,capture:zd(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return af({error:f,actionLabel:g,action:t.action,positionals:[...c.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:_,scrubVars:u})}function Zm(e){let t={createdAt:Date.now(),nodes:e.nodes};return Id(Jm(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>tf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function Qm(e){return!e||e===`<text>`?e??``:it(e)}function $m(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function eh(e,t){return!t||e===`inputText`?[]:[t]}function th(e){let{outcome:t,startedAt:n,sessionName:r,sessionStore:i,snapshotStart:a}=e,o=rh(i,r,a),s=t.replayed;return{ok:!0,data:{replayed:s,healed:0,session:r,sessionActive:i.get(r)!==void 0,artifactPaths:t.artifactPaths,...t.warnings?{warnings:t.warnings}:{},...o?{snapshotDiagnostics:o}:{},message:ah(s,Date.now()-n)}}}async function nh(t){let{failure:n}=t.outcome,r=e(t.outcome.error);return n?await Xm({error:r,failure:n,replayPath:t.replayPath,req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,snapshotDiagnostics:rh(t.sessionStore,t.sessionName,t.state.snapshotStart)}):I(r.code,r.message,{...r.details??{},...ih(n)})}function rh(e,t,n){return d(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function ih(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function ah(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function oh(e){let{req:t}=e,n=t.flags?.replayScriptSource;if(!n)return I(`INVALID_ARGS`,mt);if(t.flags?.saveScript!==void 0)return I(`INVALID_ARGS`,`Maestro YAML does not support --save-script; ADR 0012 repair recording applies only to .ad scripts.`);let r=Date.now(),i={snapshotStart:0};try{return await sh({...e,bundle:n,startedAt:r,state:i})}catch(t){return await nh({...e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function sh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,onStep:a,invoke:o,state:s}=e,c=await ch(e),l=mh({req:t,invoke:o,logPath:e.logPath,sessionName:n,sessionStore:r,device:c.device,platform:c.platform,runtimeHints:c.runtimeHints,sourcePath:c.filePath});s.snapshotStart=r.get(n)?.snapshotDiagnostics?.samples.length??0;let u=await sr(c.flow,l,{defaults:c.defaults,env:c.env,platform:c.platform,target:c.target,runtimeHints:c.runtimeHints,signal:c.signal,from:t.flags?.replayFrom,planDigest:t.flags?.replayPlanDigest,readSource:t=>ft(e.bundle,t),observer:zm({filePath:c.filePath,tracePath:i,onStep:a})});return u.ok?th({outcome:u,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:s.snapshotStart}):await nh({...e,replayPath:e.bundle.entry,state:s,outcome:u})}async function ch(e){let{req:t,bundle:n,sessionName:r,sessionStore:i}=e,a=n.entry,o=ur(ft(n,a),a),s=i.get(r);s&&Ri(s,t.flags);let c=await lh({req:t,sessionStore:i,sessionName:r,session:s,flow:o});return{filePath:a,flow:o,...c,defaults:fh({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:ph(t),signal:In(t.meta?.requestId)}}async function lh(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await L(t.flags??{},ui(a.appTarget,o))),c=yh(t,s),l=gi({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await uh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:bh(t,s),runtimeHints:l,flow:a})}async function uh(e){if(e.device||!dh(e.runtimeHints))return e;let t=await L(e.req.flags??{},ui(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:bh(e.req,t),runtimeHints:gi({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function dh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function fh(e){return{...up({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function ph(e){return{...Je(Be(e.flags?.replayShellEnv)),...Xe(_t(e.flags?.replayEnv))}}function mh(e){let{req:n,invoke:r,logPath:i,sessionName:a,sessionStore:o,device:s,platform:c,runtimeHints:l,sourcePath:u}=e,{command:d,positionals:f,input:p,flags:m,...h}=n;return Rm({baseReq:S({...h,flags:hh(s,c,n.flags),runtime:l}),invoke:r,platform:c,sourcePath:u,dependencies:{now:Date.now,sleep:async(e,t)=>{await la(e,void 0,{signal:t})},resolveGestureViewport:async()=>{let e=o.get(a);if(!e)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);return await $n(e.device,Ei(i,n.flags,e.appBundleId,e.trace?.outPath))}}})}function hh(e,t,n){if(!e)return gh(t,n);let r={platform:t,target:e.target,noRecord:!0};return t===`android`?{...r,serial:e.id}:{...r,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}}}function gh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?_h(n,t):vh(n,t)}function _h(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function vh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function yh(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new t(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function bh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function xh(e){let{resolved:t,req:n,keepSession:r,coordinator:i,maestroParams:a}=e;if(ut(t,n.flags?.replayBackend)===`maestro`)return r?I(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):i.view()?.repairBoundary===void 0?await oh(a):I(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Sh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Ch(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=wh(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(n),_=Th({req:t,coordinator:s,manifest:l,preEntrySession:g});return _.ok?{ok:!0,value:{replayReq:u,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h,preEntrySession:g,entryIndex:_.value,varSources:Dh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Ch(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return I(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function wh(e,t){let n=Ru(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Eh({...e,flags:li(e.flags,n.actions)},n.metadata)}}function Th(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:I(`INVALID_ARGS`,a.message)}}function Eh(e,t){return!t.platform&&!t.target?e:{...e,flags:Oh(e.flags,t)}}function Dh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:up({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:Je(Be(t.flags?.replayShellEnv)),cliEnv:Xe(_t(t.flags?.replayEnv))}}function Oh(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function kh(e){let{req:t,entryIndex:n,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}=e,s=Ah({entryIndex:n,sessionStore:r,sessionName:i,coordinator:o});return s?{ok:!1,response:s}:(Nh({req:t,coordinator:o}),Mh({req:t,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}))}function Ah(e){let t=Ph(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return Qn()}function jh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?I(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):Fh({saveScript:t,liveForce:n,persistedForce:Wt(r)||void 0,sourcePath:i,existingSaveScriptPath:Rt(r)})}function Mh(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i,coordinator:a}=e,o=n.get(r),{saveScript:s,force:c}=t.flags??{},l=jh({saveScript:s,force:c,preRunState:o?.scriptPublication??Vt,sourcePath:i});return l?{ok:!1,response:l}:(a.demoteForRerunIfArmed(),{ok:!0,armSaveScript:Ih({saveScript:s,force:c,coordinator:a,sourcePath:i})})}function Nh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Ph(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return I(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function Fh(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Ut(t):a??rd(i);if(!(n||r&&o===a)&&U.existsSync(o))return I(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function Ih(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function Lh(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,onStep:o,invoke:c}=e,l=t.flags?.replayScriptSource;if(!l)return I(`INVALID_ARGS`,mt);let u=Date.now(),d=t.flags?.replayKeepSession===!0,f=``,p=new Set,m=nd({sessionStore:i,sessionName:n});try{if(f=l.entry,ot(f)&&t.flags?.replayBackend!==`maestro`)return I(`INVALID_ARGS`,tt(`replay`,f));let s=await xh({resolved:f,req:t,keepSession:d,coordinator:m,maestroParams:e});if(s)return s;let h=Sh({req:t,sessionName:n,sessionStore:i,tracePath:a,resolved:f,script:ft(l,f),coordinator:m});if(!h.ok)return h.response;let{replayReq:g,actions:_,actionLines:v,actionSourcePaths:y,planDigest:b,entryIndex:x,varSources:ee,actionTracePath:S}=h.value,C=kh({req:t,entryIndex:x,sessionStore:i,sessionName:n,sourcePath:f,coordinator:m});if(!C.ok)return C.response;let{runtime:te,readLastResponse:w}=rp({ctx:{replayReq:g,sessionName:n,sessionStore:i,logPath:r,resolved:f,actions:_,actionLines:v,actionSourcePaths:y,planDigest:b,actionTracePath:S,responseLevel:t.meta?.responseLevel,invoke:c,signal:In(t.meta?.requestId),coordinator:m},req:t,artifactPaths:p,onStep:o,armSaveScript:C.armSaveScript}),T=await Xu({actions:_,entryIndex:x,keepSession:d,actionLines:v,actionSourcePaths:y,resolvedPath:f,varSources:ee},te);return T.status===`failed`?w()??I(`COMMAND_FAILED`,`replay step failed with no recorded response`):Rh({startedAt:u,sessionName:n,sessionStore:i,replayed:T.replayed,artifactPaths:T.artifactPaths,snapshotDiagnosticSamples:T.snapshotDiagnosticSamples,armSaveScript:C.armSaveScript,coordinator:m,keepSession:d})}catch(e){let t=s(e);return I(t.code,t.message,p.size>0?{artifactPaths:[...p]}:void 0)}}function Rh(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(n),f=Bh({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(f)return f;let p=d([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...p?{snapshotDiagnostics:p}:{},message:zh(i,Date.now()-t)}}}function zh(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function Bh(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return I(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function Vh(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=H.resolve(n??`.`,t??`.agent-device/test-artifacts`);return H.join(i,r)}function Hh(e,t){let n=t?H.relative(t,e):H.basename(e);return Yh((n.length===0||n.startsWith(`..`)?H.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`))||`test`}function Uh(e,t){U.mkdirSync(t,{recursive:!0}),Kh(e,t)}function Wh(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=[...new Set(t.artifactPaths)];t.status===`failed`&&typeof t.error.logPath==`string`&&c.push(t.error.logPath);let l=Gh(c,o),u=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?u.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(u.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&u.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&u.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&u.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&u.push(`timeoutMode: cooperative`)),l.length>0&&u.push(`copiedArtifacts: ${l.map(e=>H.basename(e)).join(`, `)}`);let d=H.join(o,`result.txt`),f=`${u.join(`
|
|
23
|
-
`)}\n`;U.writeFileSync(d,f),s||U.writeFileSync(H.join(o,`failure.txt`),f)}function Gh(e,t){let n=[],r=new Map;for(let i of e){if(!Jh(i))continue;let e=qh(H.basename(i),r),a=H.join(t,e);H.resolve(i)!==H.resolve(a)&&U.copyFileSync(i,a),n.push(a)}return n}function Kh(e,t){let n=H.join(t,`replay.ad`);if(U.copyFileSync(e,n),H.extname(e).toLowerCase()===`.ad`)return;let r=H.join(t,H.basename(e));H.resolve(r)!==H.resolve(n)&&U.copyFileSync(e,r)}function qh(e,t){let n=H.extname(e),r=n?e.slice(0,-n.length):e,i=t.get(e)??0;return t.set(e,i+1),i===0?e:`${r}-${i+1}${n}`}function Jh(e){try{return U.statSync(e).isFile()}catch{return!1}}function Yh(e){let t=0,n=e.length;for(;t<n&&e[t]===`-`;)t+=1;for(;n>t&&e[n-1]===`-`;)--n;return e.slice(t,n)}function Xh(e){let{platformFilter:n,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}ng(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0)throw new t(`INVALID_ARGS`,`No replay tests matched${n?` for --platform ${n}`:``}.`);return a}function Zh(e,t,n,r,i=0){let a=Yh(H.basename(n,H.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function Qh(e){return Yh((e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`))||`suite`}function $h(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,H.basename(r),`attempt`,a+1].join(`:`)}function eg(e,t){return typeof e==`number`?e:t}function tg(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function ng(e,t){return e===`apple`?k(t):t===e}function rg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const ig=2e3;async function ag(t){let{filePath:n,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=t,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,ee=Date.now(),S=dg({artifactsDir:l,artifactPaths:v,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),C=f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:S,appendTimingEvent:e=>X(S,e),shard:u,onStep:d}).catch(t=>rg({error:e(t)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([C,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(fg(o,[...v]))},o)})]):await C,X(S,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-ee,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await og(C)||(x=lg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:ig}}),sg({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let t=await cg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:S,emitDiagnostic:h});x?.status===`passed`&&t&&(x=ug(x,`Replay test finalization failed: ${t.error.message}`));let n=Date.now();try{X(S,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),X(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(t){let i=e(t);X(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-n,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}})}}return x??rg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}async function og(e){return await Promise.race([e.then(()=>!0),la(ig).then(()=>!1)])}async function sg(t){let{replayPromise:n,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=t;try{await n}finally{try{await r(i)}catch(t){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:e(t).message}})}}}async function cg(t){let{finalizeAttempt:n,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=t;if(!n)return;let c=Date.now();X(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await n({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>X(o,e)});return X(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(t){let n=e(t);return X(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:n.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:n.message}}),rg({error:n})}}function lg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function ug(e,t){return{...e,warnings:[...e.warnings,t]}}function dg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=H.join(t,`replay-timing.ndjson`);return U.mkdirSync(H.dirname(l),{recursive:!0}),U.writeFileSync(l,``),n.add(l),X(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function X(e,t){e&&U.appendFileSync(e,`${JSON.stringify(t)}\n`)}function fg(e,t=[]){return rg({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function pg(e){let t=mg(e),n=await hg(e,t);return{result:xg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function mg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:H.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Hh(t.path,n)),maxAttempts:r+1}}async function hg(e,t){_g(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await gg(e,t,r);if(vg(n,i),yg(e,i.outcome,r))break;bg(e,t,i)}return n}async function gg(e,t,n){let{entry:r,sessionName:i,suiteInvocationId:a,caseIndex:o,suiteIndex:s,suiteTotal:c,requestId:l,timeoutMs:u,shard:d}=e,f=n+1,p=Date.now(),m=Zh(i,a,r.path,o,n),h=H.join(t.testArtifactsDir,`attempt-${f}`);Uh(r.path,h);let g=$h({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Z(d)},v=await ag({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return Wh({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function _g(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:Zh(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Z(c)})}function vg(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function yg(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function bg(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Z(e.shard)})}function xg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Sg(e,t,n,r):Cg(e,t,n,r)}function Sg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Z(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,replayed:c.replayed,healed:c.healed,...c.warnings.length>0?{warnings:[...c.warnings]}:{},...c.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...wg(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Cg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...Z(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...c?.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...wg(s)}}function wg(e){return Z(e)}function Z(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Tg(e,t,n,r){if(!e||t.length===0)return;let i=await r(e.count);return{mode:e.kind,shardCount:e.count,total:n+(e.kind===`all`?t.length*e.count:t.length),shards:i.map((n,r)=>({shardIndex:r,shardCount:e.count,device:n,entries:e.kind===`all`?t:t.filter((t,n)=>n%e.count===r)}))}}async function Eg(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),s=await Dg(t,u,d);jg(s,a);let p=s.shardPlan?Mg({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await Ng({shards:s.shardPlan.shards,sessionName:f,suiteInvocationId:s.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:s.suiteArtifactsDir,suiteTotal:s.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await Lg({discoveryEntries:s.entries,sessionName:f,suiteInvocationId:s.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:s.suiteArtifactsDir,suiteTotal:s.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:Bg(s.total,p,Date.now()-e)}}catch(e){let t=s(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Dg(e,t,n){let r=Og(e,t),i=kg(r),a=r.length-i.length,o=Qh(e.requestId),s=await Tg(e.shard?{kind:e.shard.mode,count:e.shard.count}:void 0,i,a,n);return{entries:r,runnable:i,shardPlan:s,suiteInvocationId:o,suiteArtifactsDir:Ag(e,o),total:s?.total??r.length}}function Og(e,t){return Xh({platformFilter:e.platformFilter,discoverSources:t})}function kg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Ag(e,t){return Vh({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function jg(e,t){t({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function Mg(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function Ng(e){return(await Promise.allSettled(e.shards.map(async t=>await Fg({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Pg(r,e.sessionName,t.reason)]:[]})}function Pg(t,n,r){let i=e(r);return{file:t.entries[0]?.entry.path??`shard-${t.shardIndex+1}`,session:Ig(n,t),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:t.shardIndex,shardCount:t.shardCount,deviceId:t.device.id,deviceName:t.device.name}}async function Fg(e){let{shard:t,sessionName:n}=e;return await Rg({...e,entries:t.entries,sessionName:Ig(n,t),shard:t})}function Ig(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Lg(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await pg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:tg(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:eg(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),zg(t,o,p))break}return g}async function Rg(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await pg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:tg(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:eg(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),zg(b,o,m))break}return _}function zg(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Bg(e,t,n){let r=t.filter(e=>e.status===`passed`).length,i=t.filter(e=>e.status===`failed`),a=i.length,o=t.filter(e=>e.status===`skipped`).length,s=r+a,c=u(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:s,passed:r,failed:a,skipped:o,notRun:Math.max(0,e-s-o),durationMs:n,failures:i,tests:t,...c?{snapshotDiagnostics:c}:{}}}function Vg(e,t){return()=>e.map(e=>Hg(e,t))}function Hg(e,t){let n=e.entry,r=ft(e,n),i=ut(n,t)===`maestro`,a=et(r);return{path:n,manifest:{...i?{title:ur(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function Ug(e){return async t=>(await Kg(e,t)).map(Wg)}function Wg(e){if(e.platform===`web`||!Ie(e))throw new t(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function Gg(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}async function Kg(e,n){let r=Xg(e),i=Jg(await Wn(qg(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${Yg(n)}, but only ${i.length} matched`);return i.slice(0,n)}function qg(e){let t=F(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:Le({simulatorSetPath:Hn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Jg(e,t,n){return t.length>0?Zg(e,t,n):e.filter(e=>Qg(e,n)).sort(t_)}function Yg(e){return`${e} device${e===1?``:`s`}`}function Xg(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Zg(e,n,r){return n.map(n=>{let i=e_(n),a=e.find(e=>$g(e,r)&&(e.id===n||e_(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function Qg(e,t){return!$g(e,t)||!Ie(e)?!1:e.booted!==!1}function $g(e,t){return!(!Ne(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function e_(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function t_(e,t){return e.id.localeCompare(t.id)}function n_(e){let n=r_(e?.shardAll,`--shard-all`),r=r_(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function r_(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}const i_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function a_(e){let t=o_(e);return t?s_(t.details)||c_(t.code,t.message):!1}function o_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function s_(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?Tn(t):!1}function c_(e,t){let n=`${e}\n${t}`.toLowerCase();return i_.some(e=>n.includes(e))}function l_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:f_(e.error.details?.artifactPaths),infrastructure:a_(e),...p_(e.error.details?.snapshotDiagnostics)};let t=e.data;return{status:`passed`,replayed:typeof t?.replayed==`number`?t.replayed:0,healed:typeof t?.healed==`number`?t.healed:0,warnings:d_(t?.warnings),artifactPaths:f_(t?.artifactPaths),...p_(t?.snapshotDiagnostics)}}function u_(e){if(!e||e.ok)return;let t=l_(e);return t.status===`failed`?t:void 0}function d_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function f_(e){return[...new Set(d_(e))]}function p_(e){let t=f(e);return t?{snapshotDiagnostics:t}:{}}const m_=1e3,h_=3e3;function g_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await __(e)}}async function __(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get(n);if(!o||o.screenRecording)return;let s=xn(o.device.platform),c=i?H.join(i,`recording${s}`):bn(o.device.platform);y_(a,{type:`video_recording_start`,session:n,videoPath:c}),P({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.throwIfCanceled();let l=await Zi({req:{token:t.token,session:n,command:`record`,positionals:[`start`,c],flags:{},meta:t.meta},sessionName:n,sessionStore:r,bindDevice:e.bindDevice,bindExactDevice:e.bindExactDevice,admissionLedger:e.screenRecordingAdmissionLedger,requestScope:e.requestScope,retainDeviceExecutionLock:e.retainDeviceExecutionLock,throwIfCanceled:e.throwIfCanceled});if(!l.ok)return y_(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await Cn(m_),y_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:m_}),P({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:m_}}),l}async function v_(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get(n)?.screenRecording)return;y_(a,{type:`video_tail_start`,session:n,requestedDurationMs:h_});let o=Date.now();await Cn(h_);let s=Date.now(),c=await Zi({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:r,bindDevice:e.bindDevice,bindExactDevice:e.bindExactDevice,admissionLedger:e.screenRecordingAdmissionLedger,requestScope:e.requestScope,retainDeviceExecutionLock:e.retainDeviceExecutionLock,throwIfCanceled:e.throwIfCanceled});return yf(c).forEach(e=>i.add(e)),y_(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),P({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function y_(e,t){e({...t,ts:new Date().toISOString()})}const b_=[{keys:[`replayKeepSession`],requested:e=>e.replayKeepSession===!0,message:`test does not support --keep-session; suite attempts own their cleanup. Run one native .ad script directly with replay --keep-session.`},{keys:[`replayFrom`,`replayPlanDigest`],requested:e=>e.replayFrom!==void 0||e.replayPlanDigest!==void 0,message:`test does not support --from/--plan-digest; resume is replay-only. Run the failing script directly with replay --from.`},{keys:[`saveScript`,`force`],requested:e=>!!e.saveScript||e.force===!0,message:`test does not support --save-script/--force; the agent-supervised repair loop is replay-only. Repair the failing script directly with replay --save-script.`}],x_=({attemptId:e,parentAttemptId:t})=>{Fn(e);let n=S_(e,t);return{cancel:()=>Pn(e),release:()=>{n(),jn(e)}}};function S_(e,t){if(!t||t===e)return()=>{};let n=In(t);if(!n)return()=>{};let r=()=>{Pn(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function C_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=w_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:Gg({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function w_(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function T_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e,c=E_(e);if(t.flags?.recordVideo===!0&&c===void 0)return I(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of b_)if(e.requested(l))return I(`INVALID_ARGS`,e.message);let u,d;try{u=O_(t,n),d=D_(t)}catch(e){let t=s(e);return I(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Eg({request:u,emitProgress:Mn,isCanceled:()=>Nn(t.meta?.requestId),emitDiagnostic:P,bindAttemptCancellation:x_,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&yf(e).forEach(e=>d.add(e)),e),v=C_({parentFlags:t.flags,platform:a,target:s,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=c?{req:t,sessionName:n,sessionStore:i,artifactsDir:u,appendTimingEvent:m,...c}:void 0,b=y?g_(y):void 0;return l_(await Lh({req:{...t,command:`replay`,session:n,positionals:[e],flags:v,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||b?{internal:{...t.internal??{},...b?{openLifecycle:b}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:p,onStep:g,invoke:async e=>{let t=y?await __(y):void 0;return t&&!t.ok?t:_(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:r,appendTimingEvent:a})=>{if(c)return u_(await v_({req:t,sessionName:e,sessionStore:i,artifactsDir:r,appendTimingEvent:a,artifactPaths:n,...c}))},discoverSources:Vg(d,t.flags?.replayBackend),resolveShardTargets:Ug(t.flags),cleanupSession:async n=>{i.get(n)&&await Lo({req:{token:t.token,session:n,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice})}});return p.status===`completed`?{ok:!0,data:p.data}:I(p.error.code,p.error.message)}function E_(e){if(!(!e.bindDevice||!e.bindExactDevice||!e.screenRecordingAdmissionLedger||!e.requestScope||!e.retainDeviceExecutionLock||!e.throwIfCanceled))return{bindDevice:e.bindDevice,bindExactDevice:e.bindExactDevice,screenRecordingAdmissionLedger:e.screenRecordingAdmissionLedger,requestScope:e.requestScope,retainDeviceExecutionLock:e.retainDeviceExecutionLock,throwIfCanceled:e.throwIfCanceled}}function D_(e){let n=e.flags?.replayScriptSources;if(!n)throw new t(`INVALID_ARGS`,mt);return n}function O_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=A_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:M.expandHome(i,r),failFast:n.failFast===!0,retries:k_(n.retries),timeoutMs:k_(n.timeoutMs),shard:n_(n)}}function k_(e){return typeof e==`number`?e:void 0}function A_(e){return typeof e==`string`?e:void 0}async function j_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,invoke:a}=e;return t.command===`replay`?await Lh({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:a}):t.command===`test`?await T_(e):null}function M_(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command!==$t.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return I_(new t(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return I_(new t(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=F_(a);if(o)return I_(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return I_(new t(`INVALID_ARGS`,`session save-script path cannot be empty.`));Bt(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:Ft(a,n.flags?.force),publication:`active`});return c.written?(zt(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...j(`Published script: ${c.path}`)}}):I_(c.error??new t(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function N_(e){if(Dt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Lt(e)?void 0:`not-armed`}const P_={repair:()=>new t(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new t(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new t(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new t(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function F_(e){let t=N_(e);return t?P_[t]():void 0}function I_(t){return{ok:!1,error:e(t)}}function L_(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function R_(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function z_(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function B_(e,...t){for(let n of t)Q(e,n)}function Q(e,t){e.push(t),Mn({type:`command`,status:`progress`,message:V_(t)})}function V_(e){return[at(e),...rt(e)].join(`
|
|
24
|
-
`)}const H_=2e3;async function U_(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=yn(n,a);i&&Q(e,await Y_(o,n.id,r)),Q(e,await W_(o,n))}async function W_(e,t){try{let n=await En(e),r=On(t);return n===await G_()&&!r?await K_(e,t,n):q_(t,n,r)}catch(e){return J_(e)}}async function G_(){try{return(await Dn()).manifest.serviceComponent}catch{return}}async function K_(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,kn.previousIme],{allowFailure:!0,timeoutMs:H_})).stdout.trim(),i=r&&r!==`null`?r:void 0;return{id:`android-test-ime`,status:`fail`,summary:`Android test IME helper is the active input method on ${t.id}, but no active session owns it -- likely left over from a crashed session.`,hint:`A stuck test IME leaves the real keyboard unavailable on this device until restored.`,command:i?`adb -s ${t.id} shell ime set ${i}`:`adb -s ${t.id} shell ime list -s`,evidence:{currentIme:n,previousIme:i}}}function q_(e,t,n){return{id:`android-test-ime`,status:`pass`,summary:n?`Android test IME helper is active for this session on ${e.id}.`:`Android test IME helper is not active on ${e.id}; the device's normal IME is in use.`,evidence:{currentIme:t}}}function J_(t){let n=e(t);return{id:`android-test-ime`,status:`warn`,summary:`Could not inspect the Android test IME helper state.`,hint:n.message,evidence:{code:n.code}}}async function Y_(t,n,r){try{let e=await t([`reverse`,`--list`],{allowFailure:!0,timeoutMs:H_}),i=`tcp:${r} tcp:${r}`,a=e.stdout.includes(i);return{id:`android-reverse`,status:a?`pass`:`warn`,summary:a?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:a?void 0:`adb -s ${n} reverse tcp:${r} tcp:${r}`,evidence:{stdout:e.stdout.trim()}}}catch(t){let n=e(t);return{id:`android-reverse`,status:`warn`,summary:`Could not inspect Android adb reverse mappings.`,hint:n.message,evidence:{code:n.code}}}}async function X_(t,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let e=o?Z_(i,await o(`all`))?.id:void 0;if(!e){Q(t,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${E(r)}.`,evidence:{requested:i,platform:E(r)}});return}Q(t,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${e}`,evidence:{requested:i,resolved:e,sessionApp:a?.appBundleId}})}catch(n){let i=e(n);Q(t,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${E(r)} --all`,evidence:{code:i.code,message:i.message}})}}function Z_(e,n){let r=e.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new t(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new t(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Q_(t,n,r){let i=ev(n,r);try{let e=await nv(i),n=tv(e.devices,i);return Q(t,{id:`device`,status:n.length===0?`fail`:`pass`,summary:ov(n,i,e.failures),hint:n.length===0?lv(e.failures):void 0,command:n.length===0?mv(i):void 0,evidence:hv(n,e.failures)}),n.length>0&&rv(t,e.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=e(n);return Q(t,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function $_(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];Q(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:E(e),id:e.id,name:e.name}))}})}function ev(e,t){let n=e.flags??{};return Xn({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function tv(e,t){return e.filter(e=>Pe(e,t,{includeExplicitSelectors:!0}))}async function nv(e){if(e.platform)return{devices:await Wn(e),failures:[]};let t=[],n=[];for(let r of mn)try{t.push(...await Wn({...e,platform:r}))}catch(e){n.push(av(r,e))}return{devices:t,failures:n}}function rv(e,t){for(let n of t)Q(e,iv(n))}function iv(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${fv(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${fv(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function av(t,n){let r=e(n);return{platform:t,message:r.message,hint:r.hint,code:r.code}}function ov(e,t,n){if(e.length===0)return n.length>0?`No ${sv(t)} devices found; ${cv(n)}.`:`No ${sv(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${sv(t)} ${pv(e.length,`device`)} available; ${r} booted`,a=uv(e,t);return a?`${i} (${a}).`:`${i}.`}function sv(e){let t=e.platform?fv(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function cv(e){return e.slice(0,2).map(e=>`${fv(e.platform)} inventory failed: ${e.message}`).join(`; `)}function lv(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function uv(e,t){if(t.platform||t.target)return;let n=fn(e),r=dv();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function dv(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function fv(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function pv(e,t){return e===1?t:`${t}s`}function mv(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function hv(e,t){let n=new Map;for(let t of e){let e=E(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const gv=1500;async function _v(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await vv(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?yv(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function vv(e,t,n){try{return await(n.resolveProcessInfo??bv)(e,t)}catch{return}}function yv(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function bv(e,t){if(!xv(e))return;let n=await Sv(t);if(n!==void 0)return{pid:n,cwd:await Cv(n)}}function xv(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Sv(e){let t=await vn(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:gv});if(t.exitCode===0)return t.stdout.split(`
|
|
25
|
-
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Cv(e){let t=await vn(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:gv});if(t.exitCode===0)return t.stdout.split(`
|
|
26
|
-
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const wv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Tv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Ev(e,t){let n=wn(e.meta?.cwd);return{targetApp:jv(e.flags?.targetApp)??t?.appBundleId,metroHost:jv(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Mv(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:kv(e,n)}}function Dv(e,t={}){let n=Av(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Ov(e,t,n,r={}){let i=n?e.toArray().filter(e=>e.name!==n.name&&e.device.platform===n.device.platform&&e.device.id===n.device.id).map(e=>e.name):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${E(n.device)}`:void 0,evidence:{session:n.name,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(n.name)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function kv(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Av(e){let t={...Object.fromEntries([...wv,...Tv].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function jv(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Mv(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}const Nv=3e3;async function Pv(e,t){if(t===`android`){Q(e,await Vv());return}if(t===`vega`){Q(e,await Iv());return}if(t===`harmonyos`){Q(e,await Fv());return}(t===`ios`||t===`macos`||t===`apple`)&&Q(e,await Kv())}async function Fv(){let e=await Qv(`hdc`,[`-v`]);return e?{id:`toolchain`,status:`pass`,summary:`HarmonyOS toolchain: ${e}.`,evidence:{hdcVersion:e}}:{id:`toolchain`,status:`info`,summary:`HarmonyOS toolchain: hdc not found or version check failed.`,hint:`Install HarmonyOS Command Line Tools, then add sdk/default/openharmony/toolchains to PATH or set HDC_SDK_PATH.`,command:`hdc -v`,evidence:{hdcVersion:null}}}async function Iv(){let{resolveVegaToolProvider:e}=await import(`./tool-provider3.js`).then(e=>e.n),t=e();if(!await t.isAvailable())return{id:`toolchain`,status:`info`,summary:`Vega toolchain: Vega CLI not found.`,hint:`Install Vega Developer Tools or ensure ~/vega/bin/vega is executable.`,command:`vega --version`};let n=await t.version({allowFailure:!0,timeoutMs:Nv}),r=await Lv(),i=$v(n.stdout),a=r.devices.some(e=>e.platform===`vega`&&e.kind===`emulator`&&e.target===`tv`&&e.booted===!0);return{id:`toolchain`,status:n.exitCode===0?`pass`:`info`,summary:i?`Vega toolchain: ${i}; ${a?`VVD running`:`no running VVD`}.`:`Vega toolchain: CLI found but version check failed.`,hint:a?void 0:`Start the Vega Virtual Device and retry doctor.`,evidence:{vegaVersion:i??null,deviceList:Bv(r)}}}async function Lv(){try{return{devices:await Jn({platform:`vega`,target:`tv`}),listedSerials:[]}}catch(e){if(Un(e))throw e;return{devices:[],listedSerials:Rv(e)}}}function Rv(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)return[];let n=e.details?.listedSerials;return zv(n)?n:[]}function zv(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Bv(e){return(e.devices.length>0?e.devices.map(e=>e.id):e.listedSerials).join(`, `)||null}async function Vv(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await Zv(e),n=await Qv(`adb`,[`version`]);return n?Hv({license:t,sdkRoot:e,versionLine:n}):Gv(e,t)}function Hv(e){return{id:`toolchain`,status:Uv(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${Wv(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function Uv(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function Wv(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function Gv(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function Kv(){let e=await Qv(`xcodebuild`,[`-version`]);return e?qv({selectedPath:await Qv(`xcode-select`,[`-p`]),versionLine:e}):Xv()}function qv(e){return{id:`toolchain`,status:Jv(e),summary:Yv(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function Jv(e){return e.versionLine?`pass`:`info`}function Yv(e){return e.versionLine?e.selectedPath?`Apple toolchain: ${e.versionLine}; xcode-select ${e.selectedPath}.`:`Apple toolchain: ${e.versionLine}; xcode-select path unavailable.`:`Apple toolchain: xcodebuild version check failed.`}function Xv(){return{id:`toolchain`,status:`info`,summary:`Apple toolchain: xcodebuild version check failed.`,hint:`Install/select Xcode and complete first launch/license setup if xcodebuild reports it.`,command:`xcodebuild -version`}}async function Zv(e){if(!e)return`unknown`;try{return await ca(H.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function Qv(e,t){try{let n=await vn(e,t,{allowFailure:!0,timeoutMs:Nv});return n.exitCode===0?$v(n.stdout):void 0}catch{return}}function $v(e){return e.split(`
|
|
27
|
-
`).map(e=>e.trim()).find(Boolean)}async function ey(e,t){Q(e,await ty(t))}async function ty(e){let t=rr({stateDir:e});if(!t.installed)return{id:`web-agent-browser-processes`,status:`info`,summary:`Managed web backend is not installed; no agent-device-owned browser processes counted.`,evidence:{stateDir:e,installed:!1}};try{let n=await ir(t);return{id:`web-agent-browser-processes`,status:n.count>0?`info`:`pass`,summary:n.count>0?`${n.count} live agent-device-owned Chrome process${n.count===1?``:`es`} detected.`:`No live agent-device-owned Chrome processes detected.`,evidence:{stateDir:e,installed:!0,count:n.count,pids:n.pids,matchReasons:n.processes.map(e=>e.reason)}}}catch(t){return{id:`web-agent-browser-processes`,status:`info`,summary:`Could not inspect live agent-device-owned Chrome processes.`,hint:`Run doctor again from a shell with permission to inspect local processes.`,evidence:{stateDir:e,error:t instanceof Error?t.message:String(t)}}}}async function ny(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=r.get(n),c=Ev(t,s),l=ay(r,n),u=[];if(B_(u,{id:`agent-device`,status:`pass`,summary:`agent-device ${Sn()} using ${l}`,evidence:{version:Sn(),stateDir:l}},...Dv(t,{required:c.remote}),...Ov(r,n,s,{remote:c.remote})),c.remote)return uy(u,c);let d=await Q_(u,t,s);await Pv(u,s?.device.platform??d?.platform);let f=await oy({androidAdbExecutor:i,checks:u,inventory:d,options:c,session:s,stateDir:l,inspectFacts:a,bindDevice:o,req:t});return await iy(u,f??ry(d)),uy(u,c,{device:f,includeMetro:!0,inventory:d})}function ry(e){let t=(e?.devices??[]).filter(e=>D(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function iy(e,t){if(!(!t||!D(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||zn(t))){if(Mn({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await Ln(t)){Q(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}gr(t,{}),Mn({type:`command`,status:`progress`,message:`Warming iOS runner build cache in the background (${t.name})...`}),Q(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner build started in the background; the first open gets faster once it completes`,hint:"Run `agent-device prepare ios-runner` to wait for a fully warmed runner instead."})}}function ay(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function oy(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o,inspectFacts:s,bindDevice:c,req:l}=e,u=i?.device??$_(t,n,r.targetApp);return u&&await sy(t,{androidAdbExecutor:a,device:u,options:r,session:i,inspectFacts:s,bindDevice:c,req:l}),r.shouldProbeMetro&&Q(t,await _v(r.metroHost,r.metroPort,r.kind)),await ey(t,o),u}async function sy(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a,inspectFacts:o,bindDevice:s,req:c}=t,l;try{l=await cy({device:r,req:c,targetApp:i.targetApp,inspectFacts:o,bindDevice:s})}catch(e){l=async()=>{throw e}}await X_(e,{device:r,session:a,targetApp:i.targetApp,listInstalledApps:l}),await U_(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}async function cy(e){if(e.device.platform!==`harmonyos`)return ly(e)}async function ly(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Ae),u=F(n.flags?.androidDeviceAllowlist),d=await is(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await as(l,d,e)}function uy(e,t,n={}){let r=L_(e);return{ok:!0,data:{status:r,summary:R_(r),kind:t.kind,platform:n.device?E(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:z_(e)}}}async function dy(e){return await ka({...e,command:`prepare`,use:se})}async function fy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return I(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=G(N.prepare,o,s);if(c)return c;let l=await K({session:o,flags:s,ensureReady:!1}),u=await dy({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let d=Date.now(),f=await u.runtime.operations.prepareAppleRunner({timeoutMs:py(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:Vn(t)}});return{ok:!0,data:my(a,l,Math.max(0,Date.now()-d),f)}}function py(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:ue}function my(e,t,n,r){return{action:e,platform:E(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:hy(n,r),message:`Prepared Apple runner: ${t.name}`}}function hy(e,t){let n=gy(t.buildMs),r=_y(t.connectMs),i=_y(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function gy(e){return e===void 0?void 0:_y(e)}function _y(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function vy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,command:a,positionals:o,recordPositionals:s,deriveNextSession:c}=e,l=i.get(n),u=t.flags??{},d=G(a,l,u);if(d)return d;let f=await K({session:l,flags:u,ensureReady:!0}),p=er(a,f);if(p)return p;l&&Wr(t)===`may-invalidate`&&z(l);let m=await tr(f,a,o,t.flags?.out,{...Ei(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;B(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function yy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=G(N.clipboard,a,o);if(s)return s;let c=(t.positionals?.[0]??``).toLowerCase();if(c!==`read`&&c!==`write`)return I(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let l=await K({session:a,flags:o,ensureReady:!0}),u=er(N.clipboard,l);if(u)return u;let d=await tr(l,N.clipboard,t.positionals??[],t.flags?.out,{...Ei(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return B(i,a,t,t.command,d??{}),{ok:!0,data:{platform:E(l),...d??{}}}}const by=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await fs({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),xy=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Hs({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),$=async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o})=>await eu({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o}),Sy=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:a,invokeReplayAction:o,bindDevice:s,inspectFacts:c,bindExactDevice:l,screenRecordingAdmissionLedger:u,requestScope:d,retainDeviceExecutionLock:f,throwIfCanceled:p})=>await j_({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:o??a,bindDevice:s,inspectFacts:c,bindExactDevice:l,screenRecordingAdmissionLedger:u,requestScope:d,retainDeviceExecutionLock:f,throwIfCanceled:p});async function Cy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.positionals?.[0]?.trim().toLowerCase();return!a&&(o===`dismiss`||o===`enter`||o===`return`)&&(t.flags??{}).platform===`ios`?I(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await vy({req:t,sessionName:n,logPath:r,sessionStore:i,command:N.keyboard,positionals:t.positionals??[]})}async function wy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;return await vy({req:t,sessionName:n,logPath:r,sessionStore:i,command:N.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await ta(e.device,n,e.appBundleId,na)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}const Ty={session_list:by,devices:by,capabilities:by,apps:by,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,inspectFacts:i,bindDevice:a})=>await ny({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,inspectFacts:i,bindDevice:a}),boot:xy,shutdown:xy,appstate:xy,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>M_({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Ra({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await yy({req:e,sessionName:t,logPath:n,sessionStore:r}),keyboard:Cy,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await fy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:ns,reinstall:ns,install_source:ns,release_materialized_paths:async({req:e})=>await va({req:e}),push:ns,"trigger-app-event":wy,open:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,reconcileOrphanedDeviceClaim:o})=>{let s=await xo({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,reconcileOrphanedDeviceClaim:o});return!s.ok||e.flags?.foreground!==!0?s:await Qa({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:Qi(i),bindDevice:$i(a),openResponse:s})},replay:Sy,test:Sy,batch:async({req:e,sessionName:t,invoke:n})=>await rs(e,t,n),close:async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a,inspectFacts:o,bindDevice:s})=>await Lo({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a,inspectFacts:o,bindDevice:s})};async function Ey(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Fr,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l,inspectFacts:u,bindDevice:d,bindExactDevice:f,appLogAdmissionLedger:p,screenRecordingAdmissionLedger:m,requestScope:h,retainDeviceExecutionLock:g,throwIfCanceled:_,reconcileOrphanedDeviceClaim:v}=e,y=Ty[t.command];return y?await y({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l,inspectFacts:u,bindDevice:d,bindExactDevice:f,appLogAdmissionLedger:p,screenRecordingAdmissionLedger:m,requestScope:h,retainDeviceExecutionLock:g,throwIfCanceled:_,reconcileOrphanedDeviceClaim:v}):null}export{Ey as handleSessionCommands};
|
|
1
|
+
import{A as e,C as t,M as n,T as r,d as i,g as a,m as o,t as s,w as c,z as l}from"./sdk-contracts.js";import"./capture.js";import{D as u,n as d,r as f,t as p}from"./sdk-batch-runner.js";import{a as m,n as h,t as g}from"./snapshot-diagnostics.js";import{f as _}from"./android-input-ownership.js";import{B as v,F as y,I as b,L as x,M as ee,N as S,P as C,R as w,j as te,z as T}from"./registry.js";import{_ as E,b as D,c as O,d as ne,g as re,l as k,m as ie,u as A,v as j}from"./sdk-device.js";import{$t as ae,A as oe,At as se,Bn as ce,Br as le,F as ue,Fn as de,Fr as fe,G as pe,H as me,Hr as he,I as ge,J as _e,K as ve,L as ye,Ln as be,M as xe,N as Se,P as Ce,R as we,Rn as Te,Rr as Ee,Rt as De,Sr as Oe,U as ke,Un as Ae,W as je,X as Me,Y as Ne,_ as Pe,bt as Fe,d as Ie,dn as Le,dt as Re,er as ze,fn as Be,it as Ve,k as He,mn as Ue,nr as We,nt as Ge,pn as Ke,q as qe,tn as Je,tr as Ye,tt as Xe,u as Ze,un as Qe,ut as $e,w as et,xr as tt,xt as nt,yt as rt,z as it}from"./sdk-batch.js";import{l as at}from"./scroll-gesture.js";import{a as ot,b as st,f as ct,g as lt,n as ut,p as dt,r as ft,w as pt,y as mt}from"./script.js";import{_ as ht,a as gt,c as _t,d as vt,f as yt,g as bt,h as xt,l as St,m as Ct,p as wt,t as Tt,u as Et}from"./session-store.js";import{a as Dt,c as Ot,n as kt,o as At,r as jt,t as Mt}from"./session-target-evidence.js";import{A as Nt,_ as Pt,d as Ft,g as It,h as Lt,j as Rt,k as zt,l as Bt,m as Vt,o as Ht,p as Ut,s as Wt,u as Gt}from"./parameterized-recorded-fill.js";import{E as Kt,S as qt,T as Jt,a as Yt,l as Xt,w as Zt}from"./runtime.js";import{$ as Qt,A as $t,B as en,C as tn,D as nn,F as rn,G as an,H as on,I as sn,J as cn,K as ln,L as un,M as dn,N as fn,Q as pn,R as mn,S as hn,T as gn,U as _n,V as vn,W as yn,X as bn,Y as xn,Z as Sn,_ as Cn,_t as wn,at as Tn,b as En,bt as Dn,c as On,ct as kn,d as An,et as jn,f as Mn,g as Nn,h as Pn,it as Fn,j as In,k as Ln,l as Rn,lt as zn,m as Bn,n as Vn,nt as Hn,o as Un,p as Wn,q as Gn,r as Kn,t as qn,tt as M,u as Jn,ut as Yn,v as Xn,vt as Zn,w as Qn,x as $n,y as er,z as tr}from"./device-claim-rule.js";import{n as nr,t as rr}from"./catalog.js";import{g as ir,i as ar}from"./observability.js";import{n as N,r as or}from"./success-text.js";import{d as sr,i as cr,u as lr}from"./app-inventory-contract.js";import{n as ur}from"./app-inventory.js";import{r as dr,t as fr}from"./device.js";import{a as pr,o as mr,r as P}from"./diagnostics.js";import{a as hr,i as gr,r as _r}from"./verified-file.js";import{c as vr,p as yr}from"./exec.js";import{t as br}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as xr,r as Sr}from"./output-path.js";import"./command.js";import{a as Cr,i as wr,n as Tr,t as Er}from"./replay-divergence.js";import"./retry.js";import{r as Dr}from"./version.js";import{t as Or}from"./session-paths.js";import{i as kr,r as Ar}from"./session-artifact-paths.js";import{t as jr}from"./project-runtime.js";import{r as Mr}from"./rect-center.js";import{o as Nr}from"./android-system-chrome.js";import{t as Pr}from"./keyed-lock.js";import{n as Fr,t as Ir}from"./deploy-result-target.js";import{t as Lr}from"./keyboard-actions.js";import{a as Rr,i as zr,n as Br,o as Vr,r as F}from"./request-cancel.js";import{t as Hr}from"./request.js";import{i as Ur,s as Wr}from"./provider-session-ownership.js";import{r as Gr}from"./provider-device-runtime.js";import{i as Kr,s as qr,t as Jr}from"./device-claim-inspection.js";import{t as Yr}from"./audio-probe-result.js";import{_ as Xr,a as Zr,b as Qr,c as $r,d as ei,f as ti,g as ni,h as ri,i as ii,l as ai,m as oi,n as si,o as ci,r as li,s as ui,t as di,u as fi,v as pi,x as mi}from"./perf-runtime-plan.js";import{i as hi,n as gi}from"./lease-context.js";import{m as _i}from"./screenshot-runtime.js";import{n as I,r as vi}from"./device-isolation.js";import{a as yi,n as bi,r as xi}from"./device-inventory-context.js";import{n as Si,r as Ci,t as wi}from"./dispatch-resolve.js";import{a as Ti,i as L}from"./request-runtime-binding.js";import{D as Ei,O as Di,S as Oi,T as R,_ as ki,b as Ai,h as z,i as ji,m as Mi,n as Ni,p as Pi,s as Fi}from"./session-snapshot.js";import{t as Ii}from"./touch-reference-frame.js";import{a as Li,i as Ri,n as zi,o as Bi}from"./session-routing.js";import{d as B}from"./src8.js";import{i as Vi,n as V,r as Hi}from"./compatibility-policy.js";import{o as Ui,t as Wi}from"./snapshot-quality-verdict.js";import{a as Gi,i as H,n as Ki,r as qi,t as Ji}from"./session-runtime-admission.js";import{t as Yi}from"./semantic-index.js";import{n as Xi,r as Zi}from"./device-selection-resolver.js";import{n as Qi,r as $i}from"./doctor-output.js";import{t as ea}from"./record-runtime.js";import{n as ta}from"./gesture-runtime.js";import{i as na,n as ra,r as ia}from"./platform-runtime-open-target.js";import{t as aa}from"./snapshot-runtime.js";import{t as oa}from"./app-log-files.js";import U from"node:path";import W,{promises as sa}from"node:fs";import{createHash as ca}from"node:crypto";import la from"node:os";import{fileURLToPath as ua}from"node:url";import{setTimeout as da}from"node:timers/promises";import fa from"node:vm";function G(e,t){return B({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function pa(e){return B({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function ma(e,t){let n=ya(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},pa(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:ha(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ha(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function ga(e,t,n,r){let i=ya(await r.resolveTarget({selector:e,...t},G(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw jn(`Maestro target did not resolve to a visible element.`,{selector:e,candidateCount:i.candidateCount});return{kind:`selector`,selector:e,query:{selector:e,...t},...i,rect:i.rect}}function _a(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function va(e){if(!e||typeof e!=`object`)return!1;let t=e;return[`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`&&Number.isFinite(t[e]))}function ya(e,t){return ba(e,t),xa(e),Sa(e),Ca(e),e}function ba(e,n){if(e.generation!==n)throw new t(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${n}.`)}function xa(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Sa(e){if(e.rect!==void 0&&!va(e.rect)||e.viewport!==void 0&&!va(e.viewport))throw new t(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Ca(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new t(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function wa(e,t,n,r,i,a={}){let o=Ta(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Aa(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function Ta(e,t,n,r,i){let a=n===`up`||n===`down`,o=en(e,cn(e,r),i),s=o.visibility,c=Sn({visibility:s,matches:e.nodes.filter(e=>fe(e)),platform:r}),l=le(s.viewportRects)??Da(c);if(!l||!Ee(l))return;let u=c.flatMap(e=>{if(!Ee(e.rect))return[];let t=Oa(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=Ea(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(ka)[0]?.viewport}function Ea(e,t){return fe(e)?e:Oe(e,t)}function Da(e){let t;for(let n of e)Ee(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Oa(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width)-n,a=Math.min(e.y+e.height,t.y+t.height)-r;return i>0&&a>0?{x:n,y:r,width:i,height:a}:void 0}function ka(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Aa(e,t){let n=K(e,.5,.5),r=V.scrollUntilVisibleSwipe.nearEdgeFraction,i=V.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:K(e,.5,i)};case`down`:return{start:n,end:K(e,.5,r)};case`left`:return{start:n,end:K(e,i,.5)};case`right`:return{start:n,end:K(e,r,.5)}}}async function ja(e,n,r){let i=M(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new t(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(G(n,n.command)):void 0;return{authored:e,gesture:Na(await Ma(e.start,n,r,a),await Ma(e.end,n,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let t=await r.resolveGestureViewport(G(n,n.command)),{start:a,end:o}=Pa(t,e.direction,r.platform);return{authored:e,gesture:Na(a,o,i),viewport:t}}let a=await ga(e.from,{purpose:`swipe`,timeoutMs:`optional`in n.command&&n.command.optional===!0?V.command.optionalTargetLookupTimeoutMs:V.command.targetLookupTimeoutMs},n,r),o=a.viewport??await r.resolveGestureViewport(G(n,n.command)),{start:s,end:c}=Fa(a,e.direction,o);return{authored:e,gesture:Na(s,c,i),target:a,viewport:o}}async function Ma(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(G(t,t.command));return{x:i.x+Math.trunc(i.width*e.x/100),y:i.y+Math.trunc(i.height*e.y/100)}}function Na(e,t,n){return{from:e,to:t,durationMs:n??V.command.swipeDurationMs}}function Pa(e,t,n){if(t===`left`||t===`right`){let n=at(t,{referenceWidth:e.width,referenceHeight:e.height});return{start:{x:e.x+n.x1,y:e.y+n.y1},end:{x:e.x+n.x2,y:e.y+n.y2}}}let r=V.screenSwipe,i=K(e,r.centerFraction,r.nearEdgeFraction),a=K(e,r.centerFraction,r.farEdgeFraction),o=K(e,r.centerFraction,r.downStartFraction),s=K(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function K(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Fa(e,t,n){let r=Mr(e.rect),i=n.x+Math.trunc(n.width*V.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*V.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*V.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*V.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const Ia={launchApp:Va,stopApp:Va,clearState:Va,openLink:Va,tapOn:Ua,doubleTapOn:Ua,longPressOn:Ua,swipe:Ja,inputText:Ya,eraseText:Ya,scroll:Xa,scrollUntilVisible:Xa,hideKeyboard:Xa,pressKey:Xa,back:Xa,waitForAnimationToEnd:Xa,takeScreenshot:$a,runScript:$a,assertVisible:eo,assertNotVisible:eo,assertTrue:eo,extendedWaitUntil:eo},La={launchApp:!0,stopApp:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ra(e){return La[e.kind]}async function za(e,t){let n=e.command;return await Ba(n,e,t,G(e,n))}function Ba(e,t,n,r){let i=Ia[e.kind];return i(e,t,n,r)}async function Va(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,Ha(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`clearState`:return await q(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function Ha(e,t){return B({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function Ua(e,t,n,r){switch(e.kind){case`tapOn`:return await Wa(e,t,n,r);case`doubleTapOn`:{let i=await co(e.target,{purpose:`doubleTap`,timeoutMs:Ka(e)},t,n),a=M(e.delay,`doubleTapOn.delay`)??V.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?_a(i.resolution):void 0)}case`longPressOn`:{let i=await co(e.target,{purpose:`longPress`,timeoutMs:Ka(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?_a(i.resolution):void 0)}}}async function Wa(e,t,n,r){let i=await Ga(e,t,n);return await q(n.tapOn,qa(e,i),r,`invalidate`,i.resolution?_a(i.resolution):void 0)}async function Ga(e,t,n){let r={purpose:`tap`,timeoutMs:Ka(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await co(e.target,r,t,n)}function Ka(e){return e.optional===!0?V.command.optionalTargetLookupTimeoutMs:V.command.targetLookupTimeoutMs}function qa(e,t){let n=M(e.repeat,`tapOn.repeat`),r=M(e.delay,`tapOn.delay`),i=n===void 0?r:r??V.command.repeatDelayMs;return B({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Ja(e,t,n,r){let i=await ja(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?_a(i.target):void 0)}async function Ya(e,t,n,r){switch(e.kind){case`inputText`:return await q(n.inputText,B({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await q(n.eraseText,B({charactersToErase:M(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function Xa(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,Za(e),r,`invalidate`);case`hideKeyboard`:return await q(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await q(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await q(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await q(n.waitForAnimationToEnd,Qa(e),r,`preserve`)}}function Za(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:M(e.timeout,`scrollUntilVisible.timeout`)??V.command.scrollUntilVisibleTimeoutMs,durationMs:Vi(V.command.scrollUntilVisibleSpeed)}}function Qa(e){return B({timeoutMs:M(e.timeout,`waitForAnimationToEnd.timeout`)})}async function $a(e,t,n,r){switch(e.kind){case`takeScreenshot`:return no(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await q(n.runScript,B({file:e.file,env:e.env}),r,`preserve`)}}async function eo(e){throw new t(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}async function q(e,t,n,r,i){let a=to(n,r);return no(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function to(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function no(e,t,n,r){let i=e?.observation;return ro(i,r),{...io(n??i),...ao(e?.outputEnv),...oo(t,e?.artifactPaths),...so(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function ro(e,n){if(!(!e||n===void 0||e.generation===n))throw new t(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${n}.`)}function io(e){return e?{observation:e}:{}}function ao(e){return e?{outputEnv:{...e}}:{}}function oo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function so(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function co(e,t,n,r){if(e.space===`target`){let i=await ga(e.selector,t,n,r);return{authored:e,point:Mr(i.rect),resolution:i}}return{authored:e,point:await Ma(e,n,r)}}function lo(e,t,n,r={}){let i=n===`ios`&&r.presentation?fo(r.presentation):void 0,a=i?po(e,t,i):on(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:_o(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?an(s,t.selector.index):yn(s,t.selector.index)?.node,l=_o(t,o,s,c);if(!c)return mo(t,o,s,l);let u=i?yn(i.visibleForSource(c),void 0):null,d=ln(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!uo(t.selector)&&i?ho(d,s,u):0,evidence:l}:mo(t,o,s,l)}const uo=bn;function fo(e){let t=tt(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>pn(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function po(e,t,n){let r=cn(e,`ios`),i=xn(e,{},{orderUnindexed:e=>Gn(e,r)}),a=vn(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:_n(o,t.selector,`ios`,i.visibility,r)}}function mo(e,t,n,r){return t.length>0&&n.length===0?{ok:!1,message:`Maestro selector matched ${t.length} element(s), but none were visible.`,evidence:r}:{ok:!1,message:`Maestro selector did not match${e.selector.index===void 0?``:` index ${e.selector.index}`}.`,evidence:r}}function ho(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&go(n.rect,e)?1:0:t.length}function go(e,t){let n=Mr(e),r=Mr(t);return n.x===r.x&&n.y===r.y}function _o(e,t,n,r){return B({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:Hi,retryTapMaxAttempts:V.command.retryTapMaxAttempts,longPressDurationMs:V.command.longPressDurationMs,eraseTextMaxCharacters:V.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:V.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:V.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:V.command.waitForAnimationToEndDifferencePercent,observationPollMs:V.observation.pollIntervalMs};function vo(e,t={}){return{execute:async n=>{let r=G(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ra(n.command)&&!i,visualStabilityBarrier:i});let a=await za(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await ma(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function yo(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function bo(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:yo(n)}}function xo(e){let t=bo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Wr(n,e.meta?.tenantId)},cleanup:()=>{Ur(n)}}}function Y(e,t,n){return t||zn(n)?null:L(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function So(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function X(e){return Yn(e.flags)||!e.session?await Si(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Co(e.session.device)}async function Co(e){if(Gr(e)||!k(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await ki.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Si(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Si({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function wo(e,t){return t?Fn(t,e).length===0:!1}async function To(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=xo(t);let n=ko(t),l=await Do(a,t.flags),u=await qi(e.inspectFacts)(l),d=H(`install_from_source`,u.operations.ensureReady)??H(`install_from_source`,u.operations.materializeAppSource)??H(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Ki(e.bindDevice)(l,Ne);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Ao({artifact:s,retention:n,req:t,session:a,sessionName:r}),a&&R(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=jo(l,s,p,c),h=or(m,`Installed: ${Fr(m)}`);return _t(i,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Ln(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:n(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function Eo(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Ln(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:n(e)}}}async function Do(e,n){let r=Oo(n?.platform);if(e&&r&&e.device.platform!==r)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await X({session:e,flags:n})}function Oo(e){return e===`ios`||e===`android`?e:void 0}function ko(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Ao(e){if(e.retention.enabled)return await In({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function jo(e,t,n,r){return k(e)?Mo(t,n,r):No(t,n,r)}function Mo(e,n,r){let i=n.bundleId??e.bundleId;if(!i)throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Fo(r),bundleId:i,...Po(n,e),launchTarget:n.launchTarget??i}}function No(e,n,r){let i=n.packageName??n.launchTarget??e.packageName;if(!i)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Fo(r),packageName:i,...Po(n,e),launchTarget:n.launchTarget??i}}function Po(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Fo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Io(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Lo(t);if(!a.ok)return a.response;let o=Y(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await X({session:n,flags:t.flags}),c=await z({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:it});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return L(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:L(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Lo(e){let t=Ro(e);if(!t.ok)return t;let n=zo(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Ro(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:L(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:L(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function zo(e){let t=Bo(e.flags?.devicePort),n=Bo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:L(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Bo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Vo(e){return await z({...e,command:`runtime clear`,use:ge})}async function Ho(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Io({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Uo({...e,session:r.get(n)});if(!Wo(i))return L(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Go({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Ko(n,o):Jo({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Uo(e){if(!e.session)return L(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ta({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Oi(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function Wo(e){return e===`set`||e===`show`||e===`clear`}async function Go(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(An(i)&&r?.appBundleId){let e=await Vo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;R(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Pn(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Ko(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function qo(e){return e?j(e.device):void 0}function Jo(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=qo(i),s=Xn(t.flags?.platform??a?.platform??o);if(!s)return L(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(o!==void 0&&o!==s)return L(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Wn(a,Rn(t.flags,s));return Jn(c)===0?L(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const Yo=/^[A-Za-z0-9_.:-]{1,64}$/,Xo=8192,Zo=4096;function Qo(e){let n=e[0]?.trim(),r=e[1]?.trim();if(!n)throw new t(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Yo.test(n))throw new t(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new t(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:es(r,n)}}function $o(e,n,r){let i=j(e),a=ts(e);if(!a)throw new t(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>Zo)throw new t(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:Zo});return s}function es(e,n){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>Xo)throw new t(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${Xo} bytes`);return r}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function ts(e){return((k(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:A(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function ns(e,t,n,r){let{eventName:i,payload:a}=Qo([...r]),o=$o(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Pi(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...N(`Triggered app event: ${i}`)}}async function rs(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await z({command:`trigger-app-event`,device:t,use:Xe,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>ns(s,t,e,n)}}function is(e){let n=(e[0]??`status`).toLowerCase();if(!Lr(n))throw new t(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new t(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return as(n)}function as(e){return e===`get`?`status`:e===`return`?`enter`:e}const os={"ime-probe":`android`},ss={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},cs={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ls(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Pi(e)}}async function us(e,t){let n=await z(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ds(e,t){return e.operations.keyboardStatus(ls(t)).then(e=>({platform:os[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function fs(e,t){let n=await e.operations.keyboardDismiss(ls(t)),r=ss[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...N(hs(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...N(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function ps(e,t){let n=await e.operations.keyboardEnter(ls(t)),r=cs[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...N(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...N(`Keyboard enter pressed`)}}async function ms(e){let t=is(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await us({command:`keyboard status`,device:n,use:nt,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ds(e,t)):t===`dismiss`?await us({command:`keyboard dismiss`,device:n,use:rt,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>fs(e,t)):await us({command:`keyboard enter`,device:n,use:Fe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ps(e,t))}function hs(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function gs(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=Y(i,l,u);if(d)return d;let f=await X({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&_i(t)===`may-invalidate`&&R(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;_t(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function _s(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return L(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function vs(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await gs({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Oi(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function ys(e){return _s(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await vs({...e,command:nr.keyboard,resolveRuntime:e=>ms(e)})}async function bs(e){return await vs({...e,command:nr.triggerAppEvent,resolveRuntime:e=>rs(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await ia(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function xs(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Ss(e,n){let r=n?.subject??`Payload`,i=e.trim();if(!i)throw new t(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!W.statSync(a).isFile())throw new t(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof t)throw e;let n=e.code;if(n===`EACCES`||n===`EPERM`)throw new t(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new t(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(xs(i))return{kind:`inline`,text:i};throw new t(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Cs(e){let n=Ss(e,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await ws(n.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(n){throw n instanceof t?n:new t(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function ws(e){try{return await sa.readFile(e,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new t(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new t(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new t(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new t(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function Ts(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=Y(n,a,o);if(s)return s;let c=js(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Wr(l,t.meta?.tenantId):Tt.expandHome(c.appPathInput);if(!W.existsSync(s))return L(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await X({session:a,flags:o}),d=await qi(e.inspectFacts)(u),f=H(n,d.operations.deployApp);if(f)return f;let p=await Ki(e.bindDevice)(u,_e);a&&R(a);let m=await p.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),h=Ds(u,c.app,s,m),g=or(h,`Installed: ${h.appName??Ir(h)}`),_=As(a,h);return _&&_!==a&&i.set(r,_),_t(i,_,t,n,g),{ok:!0,data:g}}finally{l&&Ur(l)}}async function Es(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=Y(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return L(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Cs(Ms(c,t.meta?.cwd)),u=await X({session:i,flags:a}),d=await qi(e.inspectFacts)(u),f=H(`push`,d.operations.ensureReady)??H(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Ki(e.bindDevice)(u,Me);await p.operations.ensureReady({}),i&&R(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=k(u)?or({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):or({platform:j(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return _t(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function Ds(e,t,n,r){return k(e)?Os(t,n,r):ks(e,t,n,r)}function Os(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function ks(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function As(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function js(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:L(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:L(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ms(e,t){let n=Ss(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>Tt.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Ns(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Ts({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await To({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await Es({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Ps(e,t,n){return await d(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Fs=new Set(`acceptAlert.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Is(e){return Fs.has(e)}const Ls=new Map(Ze.map(e=>[e.name,e]));function Rs(e){let t=new Set;for(let n of e){let e=zs(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function zs(e){let t=Ls.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(Is)?n:void 0}function Bs(e){if(e!==void 0&&e.remainingSteps.length!==0)return Rs(e.remainingSteps)}function Vs(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:hi(e),plannedOperations:Bs(e.internal?.executionPlan)}}function Hs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...N(`Closed: ${t.name}`)}})}function Us(e,t,n){if(!yt(t))return{kind:`not-armed`};let r=t.actions.length;Hs(e,t,n);let i=Ut(t),a=e.writeSessionLog(t,{force:Gt(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(St(t),{kind:`aborted`})}function Ws(e,t){let r=n(t),i=Nt(e.scriptPublication??Pt);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Gs(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Hs(r,n,t);try{let e=r.writeSessionLog(n,{force:Gt(n,t.flags?.force)});e.written&&Lt(n,e.path);return}catch(e){return Ks(e)}}function Ks(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof t?new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new t(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n(e).message}`,r)}async function qs(e){let t=e.clearRuntimeHints?we:ye,n=await Mi({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,ye)};let r=await n.bind(e.device,we);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Js(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await Ys(n,a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&An(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Pn(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>$t(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Ys(e,t,n,r){let i=t.get(e.name)??e;i.screenRecording&&await n(`recording`,()=>$n({session:i,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>tn({session:e,sessionName:e.name,sessionStore:t})),await n(`audio_probe`,()=>En({session:e,sessionName:e.name,sessionStore:t})),await n(`perf_capture`,()=>Qn({session:e,sessionName:e.name,sessionStore:t})),await n(`platform_snapshot_helper`,()=>gn(e,r))}function Xs(e,t){return hn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Zs(e){if(e instanceof t)return e;let n=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const Qs=(e,t)=>(e.positionals?.length??0)>0||nn(t);async function $s(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=yt(n),s=JSON.stringify(t.positionals??[]);if(o&&!vt(n,s)){let e=await tc({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Ws(n,Zs(e))};xt(n,s)}let c=Us(i,n,t);return c.kind===`failed`?{response:Ws(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function ec(e){try{return{providerData:await wn(e)}}catch(t){let r=n(t);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function tc(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Qs(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Vs(t,r,n.trace?.outPath)});return}catch(e){return e}}function nc(e,n){if(!e.flags?.saveScript||Ft(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new t(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new t(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function rc(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=a.get(r);if(!c)return await sc({req:n,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});nc(n,c);let l=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!l)return L(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let u=e.platformResourceCleanup,d=await qs({device:c.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!c.appBundleId&&An(a.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;if(R(c),n.internal?.closeAppOnly===!0&&l)return await oc({req:n,session:c,logPath:i,lifecycle:d.runtime,app:l});let f=await $s({req:n,session:c,logPath:i,sessionStore:a,lifecycle:d.runtime});if(`response`in f)return f.response;let p=await ic({req:n,session:c,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:d.runtime,clearRuntimeHints:d.clearRuntimeHints,repairArmed:f.repairArmed,platformResourceCleanup:u});return p.kind===`response`?p.response:ac({session:c,repair:f,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:p.shutdownResult,providerData:p.providerData})}async function ic(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Js({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:tc,finalizeOrdinaryCloseScript:Gs,platformResourceCleanup:e.platformResourceCleanup}),m=await ec({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Xs(r,u),g=d??h;if(g?n.deviceClaim&&P({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await Qr(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function ac(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:or({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...N(c),...o,...s}}}async function oc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await tc({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...N(`Closed: ${a}`)}}}async function sc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return L(`SESSION_NOT_FOUND`,`No active session`);let a=await qs({device:await X({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return a.type===`response`?a.response:(await a.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Vs(t,n)}),{ok:!0,data:{app:t.positionals[0],...N(`Closed: ${t.positionals[0]}`)}})}function cc(e,t){return e.operations.ensureReady(t)}function lc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function uc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return dc(t,r);case`devices`:return await pc(t);case`capabilities`:return await xc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Dc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function dc(e,t){let n=Li(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Bi(e.session,n)).map(e=>fc(e,t))}}}function fc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:kr(r),platform:j(t.device),...O(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...O(t.device.platform)&&!A(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function pc(e){try{let t=mc();return{ok:!0,data:{devices:(await gc(e)).map(e=>({...Pc(e),...hc(e,t)}))}}}catch(e){let t=c(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function mc(){let e=new Map;for(let t of Kr({})){let n=t.claim;!n||Jr(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function hc(e,t){let n=t.get(qr(mi(e)));return n?{claimedBy:n}:{}}async function gc(e){let t=e.flags?.platform;return bc(await bi(_c(e,t)),e.flags?.platform,e.flags?.target)}function _c(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:vc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:yc(n?.androidDeviceAllowlist)}}function vc(e,t,n){return D({simulatorSetPath:vi(e),platform:t,target:n})}function yc(e){let t=I(e);return t?Array.from(t).sort():void 0}function bc(e,t,n){let r=t?e.filter(e=>Fc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function xc(e){let t=await Nc({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Sc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Ac(n,e.inspectFacts);return{ok:!0,data:{device:Pc(n),availableCommands:Pe().filter(e=>e===`appstate`&&r?!0:Tc(e,i))}}}function Sc(e,t,n){return!t||!k(e)&&!A(e)||!wo(n,t)?!1:Cc(t)||wc(e,t)}function Cc(e){return!!(e.appName||e.appBundleId)}function wc(e,t){return!!(A(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Tc(e,t){let n=Ie(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>Ec(t,e)))}function Ec(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Dc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await Oc(t,e.providerAppCatalog);if(o)return o;let s=await Nc({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=ur(t.flags?.appsFilter),u=I(t.flags?.androidDeviceAllowlist),d=await jc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Mc(await lc(f,await cc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function Oc(e,t){let n=kc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,F(e.meta?.requestId))]}}}function kc(e){let t=gi(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Ac(e,t){if(t)try{return await t(e)}catch{return}}async function jc(e){if(!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await e.inspectFacts(e.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Ve)}}function Mc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Nc(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=Y(t.command,a,o);return s?{response:s}:{device:await X({session:a,flags:o,androidAvdSelection:i})}}function Pc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:j({platform:r.platform,appleOs:n}),...O(r.platform)&&n?{appleOs:n}:{}}}function Fc(e,t){return E(e,t)}function Ic(e){return L(`INVALID_ARGS`,e)}function Lc(e,n,r,i){try{return ra({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return L(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}async function Rc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await na({target:n,platform:i.platform,surface:r});return a?Ic(a):null}async function zc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await na({target:n,platform:r});return i?Ic(i):null}function Bc(e){let t=er(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:An(n),clearRemovedRuntimeHints:Cn({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Vc(e){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:c,clearRuntimeHints:l,foreground:u}=e;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!f(a??``),execution:{startupDeadlineAtMs:Uc(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:hi(n)}});let{appBundleId:d,appName:p}=await Hc({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new t(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Mn({replacedStoredRuntime:c.replacedStoredRuntime,previousRuntime:c.previousRuntime,runtime:c.runtime,session:o,clearRuntimeHints:l})}return{type:`details`,details:{appBundleId:d,appName:p,runtime:c.runtime}}}async function Hc(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function Uc(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Wc(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:L(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:L(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:L(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function Gc(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||t.flags?.foreground!==!0)return o;try{let n=await aa({req:{...t,command:`snapshot`,positionals:[],flags:{...t.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.ok?{ok:!0,data:{...o.data,snapshot:n.data}}:Kc(o.data,n.error)}catch(e){return Kc(o.data,n(e))}}function Kc(e,t){return{ok:!0,data:{...e,warnings:[...qc(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function qc(e){return!e||!Array.isArray(e.warnings)?[]:e.warnings.filter(e=>typeof e==`string`)}function Jc(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...Yc(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=j(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,ie(d.platform)&&(g.serial=d.id)),d&&k(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...N(`Opened: ${o??s??t}`)}}function Yc(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function Xc(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}function Zc(e){return e.internal?.resolvedSessionScope??Li(e)}function Qc(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Bt(t,{});return}Ft(n)&&(Wt(t),i.warnings=[...Array.isArray(i.warnings)?i.warnings.filter(e=>typeof e==`string`):[],`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`])}function $c(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function el(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function tl(e){let{req:t,sessionName:n,sessionStore:i,logPath:a,device:o,openTarget:s,openPositionals:c,appName:l,surface:u,appBundleId:d,runtimeHints:f,lifecycle:p,applyRuntimeHints:m,existingSession:h,deviceClaim:g,selection:_}=e,v=t.flags?.relaunch===!0,y=d,b=Date.now(),x=await nl({req:t,sessionName:n,sessionStore:i,device:o,surface:u,sessionAppBundleId:y,appName:l,existingSession:h});if(x.type===`response`)return x.response;let ee=x.session??h,S=Date.now(),C=await p.operations.openApplication({target:s,positionals:c,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:y,surface:u,hasExistingSession:h!==void 0,relaunch:v,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:$c(o,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Pn(f),applyRuntimeHints:m,execution:Vs(t,a,h?.trace?.outPath)});y=C.appBundleId??y;let w={...C.timing},te=Xi(_),T=s?el(S,s,y):void 0;if(zr(t.meta?.requestId)){let e=r();return L(e.code,e.message,e.details)}h&&Ai({session:h,command:`open`,positionals:[],flags:void 0});let E=Xc({existingSession:ee,sessionName:h?.name??Ri(t),sessionScope:h?.sessionScope??Zc(t),device:o,surface:u,appBundleId:y,appName:l});E.lease=Zn({req:t,existingLease:h?.lease}),g&&(E.deviceClaim=g),t.runtime!==void 0&&Nn(i,n,f);let D=i.ensureSessionDir(n),O=Ar(D,t.meta?.requestId??pr().requestId);w.totalDurationMs=Math.max(0,Date.now()-b),P({level:`info`,phase:`open_timing`,durationMs:w.totalDurationMs,data:w});let ne=Jc({sessionName:E.name,sessionStateDir:D,runnerLogPath:kr(D),requestLogPath:O,eventLogPath:i.resolveEventLogPath(n),appName:l,appBundleId:y,surface:u,startup:T,timing:w,device:o,runtime:f,runtimeHintCount:Jn,sessionReused:h!==void 0,selection:te});return Qc({session:E,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:ne}),i.set(n,E),i.recordAction(E,{command:`open`,positionals:c,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:ne}),{ok:!0,data:ne}}async function nl(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=rl(e);r.set(n,o);let s=await a(o);return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function rl(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=Xc({existingSession:o,sessionName:o?.name??Ri(t),sessionScope:o?.sessionScope??Zc(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=Zn({req:t,existingLease:o?.lease}),s}function il(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(i)return zi(t,i.session)?L(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):Tn(i,n)}async function al(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(qn(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Vn(n,r,On({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await pi({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o})}}async function ol(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=il({req:t,device:a,sessionStore:i});if(m)return m;let h=await al({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Kn(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_={mayHaveStarted:!1},v=async()=>await sl({ownership:g,effects:_,sessionName:n,sessionStore:i});try{let e=await Vc({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await v(),e.response;_.mayHaveStarted=!0;let f=t.positionals??[],m=s??e.details.appBundleId,h=await tl({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:m,openPositionals:f.length>0?f:m?[m]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,selection:p});return h.ok||await v(),h}catch(e){throw await v(),e}}async function sl(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await Qr(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await Xr(t);P({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const cl=new Map;async function ll(e){let t=qe({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Mi({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,me)};case`open-apply-runtime-hints`:{let t=await r(e.device,je);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,pe);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,ke);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ul(e){let t=Bc(e);if(t.type===`response`)return t;let n=await ll({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function dl(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await Wc({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return L(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Lc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return Ic(a?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let u=await Rc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await Co(i.device),f=Zi(d);await o.internal?.retainDeviceExecutionLock?.(d.id);let p=await ul({req:o,sessionStore:r,sessionName:t,device:d,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(p.type===`response`)return p.response;let{admission:m,runtimeHintPlan:h}=p;R(i);let g=await Vc({req:o,logPath:n,surface:l,openTarget:c,existingSession:i,runtime:m.runtime,runtimeHintPlan:h,clearRuntimeHints:m.clearRuntimeHints,foreground:!1});return g.type===`response`?g.response:await tl({req:o,sessionName:t,sessionStore:r,logPath:n,device:d,openTarget:c,openPositionals:s?o.positionals??[]:c?[c]:[],appBundleId:g.details.appBundleId,appName:g.details.appName,runtimeHints:g.details.runtime,lifecycle:m.runtime,applyRuntimeHints:m.applyRuntimeHints,surface:l,existingSession:i,selection:f})}let s=o.flags?.relaunch===!0,c=o.positionals?.[0];if(s&&!c)return Ic(`open --relaunch requires an app argument.`);let l=await zc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await Ci(o.flags??{},kn(c)),d=u.device;await o.internal?.retainDeviceExecutionLock?.(d.id);let f=Lc(d,o.flags?.surface,c);if(typeof f!=`string`)return f;let p=await Rc({shouldRelaunch:s,openTarget:c,surface:f,device:d});if(p)return p;let m=await ul({req:o,sessionStore:r,sessionName:t,device:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(m.type===`response`)return m.response;let{admission:h,runtimeHintPlan:g}=m;return await Pr(cl,d.id,async()=>await ol({req:o,sessionName:t,logPath:n,sessionStore:r,device:d,surface:f,openTarget:c,lifecycle:h.runtime,runtimeHintPlan:g,applyRuntimeHints:h.applyRuntimeHints,clearRuntimeHints:h.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:u}))}async function fl(e){let t=await dl(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Gc({...e,inspectFacts:qi(e.inspectFacts),bindDevice:Ki(e.bindDevice),openResponse:t})}const pl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,ml=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function hl(e){return t=>L(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function gl(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function _l(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function vl(e){return e.available?null:L(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function yl(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function bl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&So(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return L(`SESSION_NOT_FOUND`,e)}let s=Y(`appstate`,i,a);if(s)return s;let c=O(i?.device.platform)&&wo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return L(`SESSION_NOT_FOUND`,pl);if(u&&!c)return L(`SESSION_NOT_FOUND`,ml);if(c&&i){let e=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(A(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:j(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=A(i.device)?`macOS`:`iOS`;return L(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:j(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...k(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a});if(k(d))return L(`SESSION_NOT_FOUND`,pl);if(A(d))return L(`SESSION_NOT_FOUND`,ml);let f=await z({command:`appstate`,device:d,use:Ge,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>L(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:Sl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:j(d),package:m.package,activity:m.activity}}}async function xl(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=I(a.androidDeviceAllowlist),l=s?[...s].sort():void 0,u=se({headless:a.headless===!0}),d;try{d=await X({session:i,flags:a,androidAvdSelection:`include-stopped`})}catch(e){let t=c(e);if(u.kind===`boot-target-headless`&&!yl(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return L(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(a.target&&(d.target??`mobile`)!==a.target)return L(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await Mi({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:hl(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:a.serial,androidSerialAllowlist:l};return d=u.kind===`boot-target-headless`?await(await f.bind(d,u.use)).operations.bootTargetHeadless(p):await(await f.bind(d,u.use)).operations.bootTarget(p),{ok:!0,data:{platform:j(d),target:d.target??`mobile`,device:d.name,id:d.id,kind:d.kind,booted:!0,...O(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),a=t.flags??{},o=Y(t.command,i,a);if(o)return o;let s=await X({flags:a,session:i,androidAvdSelection:`include-stopped`}),c=vl((await gl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return L(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await _l(e.bindDevice)(s,De)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...O(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:L(l.error?.code??`COMMAND_FAILED`,Cl(l),{platform:j(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await bl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Sl(e){let t=I(e);return t?[...t].sort():void 0}function Cl(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function wl(e){let t=gr(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=W.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{W.closeSync(t)}}function Tl(e,t){oa(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=_r(e);try{W.writeFileSync(r,n,`utf8`)}finally{W.closeSync(r)}}function El(e){let t=U.dirname(e),n=U.basename(e);W.existsSync(t)||W.mkdirSync(t,{recursive:!0});let r=hr(e);try{W.fsyncSync(r)}finally{W.closeSync(r)}let i=0;for(let e of W.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{W.unlinkSync(U.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Dl(e){return fi.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function Ol(e){try{return await kl(e)}catch(e){return{ok:!1,error:n(e)}}}async function kl(e){let t=Al(e);if(!t.ok)return t;let n=t.session,r=xe(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return jl(a,o);let c=Se({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await Ml(e,n,r,c.use);case`capture-status`:return await Nl(e,n);case`capture-stop`:return await Pl(e,n)}}function Al(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:L(`SESSION_NOT_FOUND`,`audio requires an active session`)}function jl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return L(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Ml(e,t,n,r){if(t.audioProbe){await $r({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return L(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=ui.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=ui.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=U.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),c=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:s,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:o});await ci({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:o,...c,throwIfCanceled:e.throwIfCanceled});let l=e.sessionStore.get(e.sessionName)?.audioProbe;if(!l)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await l.handle.status()}}async function Nl(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Fl()};let r=await n.handle.status();return r.state===`stopped`&&await $r({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Pl(e,t){return t.audioProbe?{ok:!0,data:await $r({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Fl()}}function Fl(){return Yr({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function Il(e){let r=e.sessionStore.get(e.sessionName);if(!r)return L(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(ir(e.req.positionals?.[0]))throw new t(`INVALID_ARGS`,ar);ru(e.req);let n=di({positionals:e.req.positionals,kind:au(e.req.flags?.kind),outPath:au(e.req.flags?.out)}),i=si(n);if(i.kind===`capture-stop`)return Ll(e,await Vl(e,r,i.request));let a=await Ji({device:r.device,plan:i,inspectFacts:e.inspectFacts});return a.admitted?Ll(e,await Rl(e,r,a)):H(`perf`,a.fact)??L(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:n(e)}}}function Ll(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return _t(e.sessionStore,n,e.req,`perf`,Ql(t.data)?{...t.data}:{}),t}async function Rl(e,n,r){let{device:i,plan:a}=Gi(r),o=Ki(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:ql(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:$l(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:eu(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?Tt.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:U.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await zl(e,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new t(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=nu(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:Tt.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function zl(e,t,n,r){if(t.perfCapture)return L(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return L(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=nu(e,r.outPath,i),o=Zr.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=Zr.createNextFence({admissionLedger:Bl(e),resourcePath:o,device:t.device}),c=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:a,fence:s});return await li({admissionLedger:Bl(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:s,pendingHandle:c.pendingHandle,envelope:c.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:c.response}}function Bl(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new t(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Vl(e,t,n){let r=t.perfCapture;if(!r)return L(`INVALID_ARGS`,`no active native perf capture`);let i=Kl(r.handle.inspect(),n);if(i)return L(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(Tt.expandHome(n.outPath,e.req.meta?.cwd));let a=await ii({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Hl(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function Hl(e){if(Ul(e)||Wl(e))return e;throw new t(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Ul(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Wl(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Gl(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Gl(e,t){return t.every(t=>typeof e[t]==`string`)}function Kl(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function ql(e,t){return{...tu(e),metrics:{fps:Jl(t.metric,e)},sampling:{fps:t.sampling}}}function Jl(e,t){if(!Ql(e)||e.available!==!0)return e;let n=Yl(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Yl(e,t){let n=Xl(t.windowStartedAt),r=Xl(t.windowEndedAt)??Xl(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:Zl(e)})).slice(-12)}function Xl(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Zl(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Ql(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $l(e,t){return{...tu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function eu(e,t){return{...tu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function tu(e){return{session:e.name,platform:j(e.device),device:e.device.name,deviceId:e.device.id}}function nu(e,t,n){return t?Tt.expandHome(t,e.req.meta?.cwd):U.join(e.sessionStore.ensureSessionDir(e.sessionName),`${iu()}-${n}`)}function ru(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new t(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function iu(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function au(e){return typeof e==`string`&&e.length>0?e:void 0}const ou=[`dump`,`log`],su=`network requires ${ou.join(` or `)}`,cu=`network include mode must be one of: ${s.join(`, `)}`,lu=2048;async function uu(e){let t=e.sessionStore.get(e.sessionName);if(!t)return L(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=du(e.bindDevice),r=(await n(t.device,He)).facts.networkDump;if(!r.available)return gu(r.hint);let i=fu(e.req);if(!i.ok)return i;let a=oe({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return _u(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:t.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:lu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:n(e)}}}function du(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function fu(e){let t=pu(e);if(!t.ok)return t;let n=mu(e);if(!n.ok)return n;let r=hu(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function pu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return ou.includes(t)?{ok:!0,action:t}:L(`INVALID_ARGS`,su)}function mu(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?L(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function hu(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return L(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return s.includes(r)?{ok:!0,include:r}:L(`INVALID_ARGS`,cu)}function gu(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function _u(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:lu,maxScanLines:e.entries.length},notes:e.notes}}}function vu(e,t){let n=oi(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[yu(e.appLogFailure)]:bu(n.state)}}function yu(e){return e.hint?`${e.message} ${e.hint}`:e.message}function bu(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function xu(e,t){return We([...e,...t.notes??[]])}async function Su(e){let{req:t}=e;return t.command===`perf`?await Il({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?wu(e):t.command===`events`?await Cu(e):t.command===`network`?await uu(e):t.command===`audio`?await Ol(Iu(e)):null}async function Cu(e){let{req:t,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:t.positionals?.[0],cursor:t.positionals?.[1]})}}catch(e){return{ok:!1,error:n(e)}}}async function wu(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return L(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Lu({...e,session:a}),r=(await n.bindDevice(a.device,Ce)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=Du(ue({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Tu(n,i)}catch(e){return{ok:!1,error:n(e)}}}async function Tu(e,t){switch(t.kind){case`path`:return Ou(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return ku(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Eu(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Pu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Au(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),ju(e)}}async function Eu(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Nu(e,t.appBundleId,n.owner,n.operations.appLogStart):await Mu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Du(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):L(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ou(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=wl(a),s=vu(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function ku(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=vu(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:xu(t.notes,o)}}}function Au(e,t,n){let r=n.resolveAppLogPath(t);return Tl(r,e),{ok:!0,data:{path:r,marked:!0}}}function ju(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return L(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=El(r.resolveAppLogPath(n));return ei({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Mu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await ti({session:i,sessionName:a,sessionStore:o,resourcePath:ni.resolvePath(o.resolveSessionDir(a))});let s=El(o.resolveAppLogPath(a)),c=await Fu(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Nu(e,t,n,r){let{session:i}=e;return i.appLog?L(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Fu(e,t,r,n)}async function Pu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return L(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await ti({session:t,sessionName:n,sessionStore:r,resourcePath:ni.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Fu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=ni.resolvePath(o.resolveSessionDir(a));try{let l=Dl({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await ai({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:ri({session:i,sessionName:a,sessionStore:o,error:e})}}}function Iu(e){if(!e.bindDevice||!e.inspectFacts)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new t(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Lu(e){if(!e.bindDevice)throw new t(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new t(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Ru(e){let t=zu(e),n=ze(t);return ca(`sha256`).update(n,`utf8`).digest(`hex`)}function zu(e){let{actions:t,actionLines:n,actionSourcePaths:r,metadata:i}=e;return{platform:i.platform??null,target:i.target??null,steps:t.map((e,t)=>Bu(e,n[t]??null,r?.[t]??null))}}function Bu(e,t,n){return{command:e.command,positionals:e.positionals??[],flags:e.flags??{},runtime:e.runtime??null,targetEvidence:e.targetEvidence??null,targetEvidences:e.targetEvidences??null,source:{path:n,line:t}}}function Vu(e,t,n){let{from:r,digest:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e;if(r===void 0&&i===void 0)return{ok:!0,value:0};if(r===void 0||i===void 0)return{ok:!1,message:`replay --from requires --plan-digest (and --plan-digest requires --from).`};let s=Hu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Hu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Uu({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>Wu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Gu(n,r)];for(let e of s){let t=e();if(t)return t}}function Uu(e){let{from:t,actionCount:n,pendingRecordAndHeal:r}=e,i=t===n+1&&r!==void 0&&r.expectedFrom===t;return Number.isInteger(t)&&t>=1&&(t<=n||i)?void 0:`replay --from ${t} is out of range for a ${n}-step plan.`}function Wu(e){let{from:t,pendingRecordAndHeal:n,sessionActionsLength:r}=e;if(n?.expectedFrom===t&&r===n.actionsCountAtDivergence)return`replay --from ${t} continues a record-and-heal-shaped repair, but no corrective action was recorded in this repair segment; press the correct control via a blessed @ref from the divergence's screen.refs (recorded, no --no-record) — or, if your corrective action was a read (get/is/find/snapshot), re-run it with --record so it lands in the heal — before resuming with --from ${t}.`}function Gu(e,t){if(e!==t)return`replay --plan-digest does not match the current plan digest; the script, its includes, or its platform-conditioned expansion changed since the divergence report was generated. Run a fresh full replay to get a new digest.`}function Ku(e,n){let r=e.trimStart()[0];if(r===`{`||r===`[`)throw new t(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let i=ut(e),a=ft(e),o=Ru({actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:{platform:n?.platform??ot(i.actions)??a.platform,target:n?.target??a.target}}),s=i.actions.length;return{actions:i.actions,actionLines:i.actionLines,actionSourcePaths:i.actionSourcePaths,metadata:a,planDigest:o,resolveEntryIndex:e=>Vu(e,s,o)}}function qu(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function Ju(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Be(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Yu(e,t){if(!(!e||!t)&&(e.documentOrder!==t.documentOrder||e.sibling!==t.sibling))return`position: recorded=doc${e.documentOrder}/sibling${e.sibling} observed=doc${t.documentOrder}/sibling${t.sibling}`}function Xu(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Yu(i,a);return{matchCount:n,observed:r,mismatches:[...r?Te(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function Zu(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...Te(e,r),...be(e.ancestry,i)]:[],causeMessage:`Candidates matched the recorded wait selector during polling, but none carried the recorded landmark identity before the timeout; the wait did not report success.`}}async function Qu(e,t,n,r,i,a){if(n.targetEvidences)return $u(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return td(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return td(e,n,r,i,a);if(s.kind===`post-resolution`){let c=qu({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return td(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return nd(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=Ju({recorded:o,token:s.token});if(c.kind===`skip`)return td(e,n,r,i,a);if(c.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};let l=c.token,u=await e.captureObservation(n,i,{retryLaunchRace:!0});if(u.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,ed(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?nd(e,t,n,r,i,a,{kind:`target`,guard:d.guard}):{status:`failed`,failure:await e.buildTargetBindingFailure(n,i,{kind:d.kind,matchCount:d.matchCount,observed:d.observed,candidateNodes:d.candidateNodes,mismatches:d.mismatches,causeCode:d.causeCode,causeMessage:d.causeMessage},a,t)}}async function $u(e,t,n,r,i,a){let o=n.targetEvidences,s={};for(let c of[`source`,`destination`]){let l={...n,targetEvidence:o[c]},u=e.beginTargetVerification(l,r,i,c);if(u.kind!==`pre-dispatch`)return td(e,n,r,i,a);let d=Ju({recorded:o[c],token:u.token});if(d.kind===`skip`)return td(e,n,r,i,a);if(d.kind===`recorded-unverifiable`)return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(l,i,a,t)};let f=await e.captureObservation(l,i,{retryLaunchRace:!0});if(f.state!==`available`)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,ed(f),a,t)};let p=e.classifyTarget({action:l,index:i,token:d.token,nodes:f.nodes});if(!p.verified)return{status:`failed`,failure:await e.buildTargetBindingFailure(l,i,{kind:p.kind,matchCount:p.matchCount,observed:p.observed,candidateNodes:p.candidateNodes,mismatches:p.mismatches,causeCode:p.causeCode,causeMessage:p.causeMessage},a,t)};s[c]=p.guard}return nd(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function ed(e){return{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Could not capture a fresh snapshot to verify the recorded target before acting (${e.reason}).`,...e.hint===void 0?{}:{causeHint:e.hint}}}async function td(e,t,n,r,i){let a=await e.dispatchStep(t,n,r,i,void 0);switch(a.status){case`ok`:return{status:`ok`,artifactPaths:a.artifactPaths};case`failed`:return{status:`failed`,failure:a.failure};case`guard-mismatch`:case`landmark-mismatch`:return{status:`failed`,failure:a.plainFailure}}}async function nd(e,t,n,r,i,a,o){let s=await e.dispatchStep(n,r,i,a,o);if(s.status===`ok`)return{status:`ok`,artifactPaths:s.artifactPaths};if(s.status===`failed`)return{status:`failed`,failure:s.failure};let c=rd(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=id(c.recorded,c.matchCount,s);return{status:`failed`,failure:await e.buildPostDispatchTargetBindingFailure(c.reportAction,i,{kind:`identity-mismatch`,matchCount:l.matchCount,observed:l.observed,candidateNodes:[],mismatches:l.mismatches,causeCode:`IDENTITY_MISMATCH`,causeMessage:l.causeMessage},a,t)}}function rd(e,t,n){if(n.status!==`guard-mismatch`||t.kind!==`targets`)return e.targetEvidence?{recorded:e.targetEvidence,reportAction:e,matchCount:t.kind===`target`?t.guard.matchCount:0}:void 0;let r=n.evidence.targetRole??`source`,i=e.targetEvidences?.[r];return i?{recorded:i,reportAction:{...e,targetEvidence:i},matchCount:t.guards[r].matchCount}:void 0}function id(e,t,n){return n.status===`guard-mismatch`?Xu(e,n.evidence,t):Zu(e,n.evidence)}async function ad(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=C(e.varSources),o=[],s=[],c=ld(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!cd(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(ud(u,n.length,r,e))}let d=v(r,a,sd(e,u)),f=y(a),p=t.diagnosticsMarker(),m=await Qu(t,f,r,d,u,o);if(s.push(...t.diagnosticsSince(p)),m.status===`ok`){o=m.artifactPaths;continue}let h=await t.handleActionFailure({action:r,index:u,artifactPaths:od(o,m.failure.artifactPaths),snapshotDiagnosticSamples:s,scrubVars:f});return{status:`failed`,stepIndex:u,failure:h}}return{status:`completed`,replayed:l,artifactPaths:[...o],snapshotDiagnosticSamples:s}}function od(e,t){return t.length===0?e:[...new Set([...e,...t])]}function sd(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function cd(e){return!!(e&&e.command!==`replay`)}function ld(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(cd(n))return n.command===`close`?t:void 0}}function ud(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function dd(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:bt(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){n.update(t=>{Et(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:fd(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){bt(r())!==void 0&&n.update(ht)},markCompleteIfArmed(){bt(r())!==void 0&&n.update(Ct)},markSessionHeldIfArmed(e){if(e.ok||!wt(r()))return e;let t=wr(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&md(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{pd({session:t,...e})})}}}}function fd(e){let t=U.dirname(e),n=U.basename(e,U.extname(e));return U.join(t,`${n}.healed.ad`)}function pd(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=hd({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function md(e){e.pendingRecordAndHeal=void 0}function hd(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function gd(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e.at(-1),n=t!==void 0&&/^\d+$/.test(t)?t:null,r=n===null?e.slice():e.slice(0,-1),i=Be(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function _d(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),lt(e.command)){let n=vd(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let n=Be(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=gd([...e.positionals]);n&&t.push(n)}return We(t).filter(e=>e.trim().length>0)}function vd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&yd(n)?t.slice(0,-1):t}function yd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function bd(e){let t=xd({failedIndex:e.failedIndex,actions:e.actions,planDigest:e.planDigest,repairHint:e.repairHint,sessionExists:e.resumeStamper.sessionExists()});return e.resumeStamper.stampCorrectiveWatermark({resume:t,repairHint:e.repairHint,failedIndex:e.failedIndex,actions:e.actions}),t}function xd(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Sd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Sd(e){let{failedIndex:t,actions:n,repairHint:r,sessionExists:i}=e;if(r!==`caution`&&r!==`manual`)return;let a=t+1;if(!(a>n.length&&!i))return a}function Cd(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!wd(n))return`manual`;let i=Td(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function wd(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Ed(e.scrollRegion)}function Td(e,t){let n=Jt(t),r=Od(e.ancestry,n,t),i=e.scrollRegion;return i&&Ed(i)?r&&Dd(i,n,t):r}function Ed(e){return e.id!==void 0||e.label!==void 0}function Dd(e,t,n){return n.some(n=>At(kt(n,t),e))}function Od(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Zt(n,t,e.length);return!r.broken&&ce(r.chain,e)})}const kd=new WeakMap;function Ad(e){return{store:t=>jd(e,t),finalize:(t,n)=>Md({...e,evidence:t,projection:n})}}function jd(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{ji(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return kd.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ei(a),refFrame:Di(a)}),{evidence:s,refsGeneration:o}}function Md(e){let t=kd.get(e.evidence);kd.delete(e.evidence);let n=Pd(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Nd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Fd(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Ni(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Nd(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Ei(n)===t.runtimeRevision&&Di(n)===t.refFrame}function Pd(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Fd(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Id(e){let{sessionStore:t,observationStore:n,sessionName:r,divergence:i,responseLevel:a}=e,o,s,c=Er({divergence:i,level:a,writeOverflowArtifact:e=>{let n=l(e),r=zd(t,n);return`artifactPath`in r&&(o=n,s=r.artifactPath),r}}),u=(o??c).screen;if(u.state!==`available`||u.refs.length===0)return e.evidence&&Ad({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.state===`available`?u.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return Rd(s),Ld(c,`missing-evidence`);let d=Ad({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.refsGeneration,refs:u.refs.map(e=>e.ref)});return d.published===!0?c:(Rd(s),Ld(c,d.reason))}function Ld(e,t){let{overflow:n,...r}=e;return{...r,screen:{state:`unavailable`,reason:`ref-publication-${t}`,hint:`The replay observation changed before its refs could be published. Take a new snapshot before targeting an element.`},suggestions:e.suggestions.map(({ref:e,...t})=>t),...e.targetBinding?{targetBinding:{...e.targetBinding,candidates:e.targetBinding.candidates.map(({ref:e,...t})=>t)}}:{}}}function Rd(e){if(e)try{W.unlinkSync(e)}catch{}}function zd(e,t){try{let n=U.join(e.ensureSessionDir(),`replay-divergence`);W.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=U.join(n,r);return W.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const Bd={id:0,"role-label":1,label:2,other:3};function Vd(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Hd(n.basis)<Hd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Hd(e.basis)-Hd(t.basis)||e.nodeIndex-t.nodeIndex)}function Hd(e){return Bd[e]}async function Ud(e){let{error:t,action:n,index:r,sourcePath:i,sourceLine:a,session:o,sessionName:s,sessionStore:c,observationStore:l,resumeStamper:u,logPath:d,responseLevel:f,scrubVars:p=[],planActions:m,planDigest:h,signal:g}=e,_=Tr(p),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await Kd({session:o,sessionName:s,observationStore:l,logPath:d,action:n}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},b=Xd(y,_),x=y.state===`available`&&o?tf({action:n,session:o,nodes:y.nodes,sanitize:_}):[],ee=Cd({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Wd(y)}),S=bd({failedIndex:r+1,actions:m,planDigest:h,repairHint:ee,resumeStamper:u});return Id({sessionStore:c,observationStore:l,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(ct(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:S,repairHint:ee},responseLevel:f,evidence:y.state===`available`?y.evidence:void 0,...g?{signal:g}:{}})}function Wd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const Gd=[300,500,800,1200,2e3,3e3,4e3];async function Kd(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=Jd(a),c=Date.now()+12e3,l=await qd({session:t,sessionName:n,observationStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of Gd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await br(Math.min(e,a)),l=await qd({session:t,sessionName:n,observationStore:r,logPath:i,flags:s})}return l.observation}async function qd(e){let{session:t,sessionName:n,observationStore:r,logPath:i,flags:a}=e;try{let e=(await Fi({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(Wi(e.snapshotQuality))return{observation:{state:`unavailable`,reason:`sparse-snapshot`,hint:`The post-failure snapshot was sparse or unavailable; run snapshot -i to observe the current screen.`},retryable:!0};let o=Ad({sessionStore:r,sessionName:n}).store(e);return{observation:{state:`available`,nodes:e.nodes,refsGeneration:o.refsGeneration,evidence:o.evidence,appBundleId:t.appBundleId},retryable:!1}}catch(e){return{observation:{state:`unavailable`,reason:`capture-failed`,hint:`Post-failure snapshot capture failed (${e instanceof Error?e.message:String(e)}); the original replay failure is unaffected.`},retryable:Nr(e)}}}function Jd(e){return{snapshotInteractiveOnly:Yd(e)}}function Yd(e){return!nf(e.command)||rf(e).requiresRect}function Xd(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=ef(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function Zd(e){return!!lr(e,sr(e.type??`Element`))||e.hittable===!0}function Qd(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function $d(e,t){let n=qt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&Zd(e)),i=r.length>0?r:e.filter(e=>e.ref&&e.hittable===!0),a=i.filter(e=>e.interactionBlocked!==`covered`),o=a.length>0?a:i,s=[...o.filter(e=>Qd(e,t)),...o.filter(e=>!Qd(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function ef(e,t,n){let{nodes:r,truncated:i}=$d(e,n);return{refs:r.map(e=>{let n=sr(e.type??`Element`),r=lr(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function tf(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!nf(t.command))return[];let a=_d(t);return a.length===0?[]:af({candidates:a,nodes:r,session:n,action:t,matching:rf(t),sanitize:i})}function nf(e){return lt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function rf(e){let t=lt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function af(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=of({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Vd(s).map(e=>e.suggestion)}function of(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Ue(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:sf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function sf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Qe(t,r.device.platform,{action:i.command===`fill`?`fill`:lt(i.command)?`click`:`get`,nodes:n}),c=sr(t.type??`Element`),l=lr(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function cf(e){return{...e,hint:e.hint??df(e.details,`hint`),diagnosticId:e.diagnosticId??df(e.details,`diagnosticId`),logPath:e.logPath??df(e.details,`logPath`)}}function lf(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return uf({error:t,actionLabel:ct(n),action:n.command,positionals:gt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function uf(e){let{error:t,actionLabel:n,action:r,positionals:i,step:a,replayPath:o,artifactPaths:s,snapshotDiagnostics:c,divergence:l,scrubVars:u}=e;return{ok:!1,error:{code:`REPLAY_DIVERGENCE`,message:Cr(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Cr(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...pf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function df(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const ff=[`reason`,`recovery`,`retriable`,`supportedOn`];function pf(e){if(!e)return{};let t={};for(let n of ff)e[n]!==void 0&&(t[n]=e[n]);return t}async function mf(e){return await hf({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function hf(e){let{response:t,action:n,index:r,replayPath:i,sourcePath:a,sourceLine:o,artifactPaths:s=[],snapshotDiagnostics:c,scrubVars:l,req:u,sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,planActions:g,planDigest:_}=e;if(t.ok)return t;let v=gf(t.error.details?.replaySource),y=cf(t.error),b=await Ud({error:y,action:n,index:r,sourcePath:v?.path??a,sourceLine:v?.line??o,session:p.get(),sessionName:d,sessionStore:f,observationStore:p,resumeStamper:m,logPath:h,responseLevel:u.meta?.responseLevel,scrubVars:l,planActions:g,planDigest:_,signal:F(u.meta?.requestId)});return lf({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function gf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.path==`string`&&t.path.length>0?t.path:void 0,r=typeof t.line==`number`?t.line:void 0;if(n!==void 0||r!==void 0)return{path:n,line:r}}function _f(e,t){if(e)try{W.appendFileSync(e,`${JSON.stringify(l(t))}\n`)}catch(t){P({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function vf(e){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=e,p=Date.now();_f(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,positionals:gt(o)??[]});let m;try{m=await bf({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(e){if(!(e instanceof t))throw e;m={ok:!1,error:n(e)}}let h=Date.now();return _f(d,{type:`replay_action_stop`,ts:new Date(h).toISOString(),replayPath:s,...u?{sourcePath:u}:{},line:c,step:l,command:o.command,ok:m.ok,durationMs:h-p,resultTiming:m.ok?Sf(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),yf(m,u??s,c)}function yf(e,t,n){return e.ok||e.error.details?.replaySource!==void 0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},replaySource:{path:t,line:n}}}}}async function bf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Cf(t.flags,r.flags),s=i.command===`fill`?Rt(Ht(i)):void 0;return s&&(o.recordAs=s),await a(xf({token:t.token,session:n,flags:o,runtime:r.runtime,meta:t.meta,internal:{...t.internal,replayPlanStep:!0,...r.command===`open`?{resolvedSessionScope:t.internal?.resolvedSessionScope??Li(t)}:{}}},r))}function xf(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:st(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:pt(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Sf(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function Cf(e,t){return p(e,{...t??{}})}function wf(e){return jf(e.ok?Ef(e.data):Tf(e.error.details?.artifactPaths))}function Tf(e){return Array.isArray(e)?e.filter(Af):[]}function Ef(e){return e?[kf(e.path),kf(e.outPath),...Df(e.artifacts)].filter(Af):[]}function Df(e){return Array.isArray(e)?e.map(Of).filter(Af):[]}function Of(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return kf(t.localPath)??kf(t.path)}function kf(e){return typeof e==`string`?e:void 0}function Af(e){return typeof e==`string`}function jf(e){return[...new Set(e.filter(Mf))]}function Mf(e){try{return W.statSync(e).isFile()}catch{return!1}}function Nf(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=Pf({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Jt(r),u=de(t),d=Kt(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>jt(r,e)===t.sibling),p=d.filter(e=>At(kt(e,l),t.scrollRegion)),m=Dt(p)[t.viewportOrder]?.ref,h=Ot({winnerRef:c.winnerRef,matchedRefs:c.matchedNodes.map(e=>e.ref),identitySetRefs:d.map(e=>e.ref),siblingMatchRefs:f.map(e=>e.ref),regionMemberRefs:p.map(e=>e.ref),viewportCandidateRef:m}),g=c.matchedNodes.find(e=>e.ref===c.winnerRef);return h.outcome===`verified`&&g?{verified:!0,winnerNode:g,matchCount:c.matchedNodes.length}:h.outcome===`verified`?{verified:!1,kind:`identity-unverifiable`,matchCount:c.matchedNodes.length,observedNode:void 0,candidateNodes:d.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`Verification isolated a member that is not part of the matched-node domain (capture anomaly).`}:{verified:!1,...Lf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function Pf(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Ff(n,t,i,a):If(n,t,r,a,o)}function Ff(e,t,n,r){let i=e=>e!==null&&(!r||!!e.rect),s=a(t),c=s?o(e,s):null;if(i(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Xt(e,n):null;return i(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function If(e,t,n,r,i){let a=Ke(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return a.kind===`resolved`?{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref}:{matchedNodes:[...a.matchedNodes],winnerRef:``}}function Lf(e){let{classification:t,matchCount:n,winnerNode:r,identitySet:i,byIndex:a,recorded:o}=e;switch(t.reason){case`selector-miss`:return{kind:`selector-miss`,matchCount:0,observedNode:void 0,candidateNodes:[],mismatches:[],causeCode:`SELECTOR_MISS`,causeMessage:`The recorded target no longer matches any current element.`};case`identity-set-empty`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Rf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`The recorded selector/ref still matches, but nothing in the current tree carries the recorded identity.`};case`unique-but-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Rf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`Exactly one current element carries the recorded identity, but the resolved target is a different element.`};case`signal-isolated-wrong`:return{kind:`identity-mismatch`,matchCount:n,observedNode:r,candidateNodes:[],mismatches:r?Rf(o,r,a):[],causeCode:`IDENTITY_MISMATCH`,causeMessage:`A disambiguation signal (sibling or viewport position) isolated a different element than the resolved target.`};case`no-signal-isolation`:return{kind:`identity-unverifiable`,matchCount:n,observedNode:r,candidateNodes:i.slice(0,5),mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`${i.length} current elements carry the recorded identity and neither disambiguation signal isolated one.`}}}function Rf(e,t,n){let r=Mt(t),i=Zt(t,n,Math.max(e.ancestry.length,1)).chain;return[...Te(e,r),...be(e.ancestry,i)].slice(0,5)}function zf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=mt(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Be(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!lt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Vf(r)&&Vf(n[1])))return r}function Bf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Vf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Hf(e,t){let{recorded:n,action:r,step:i,sourcePath:a,sourceLine:o,replayPath:s,artifactPaths:c,sessionName:l,sessionStore:u,resumeStamper:d,responseLevel:f,scrubVars:p,planActions:m,planDigest:h}=e,g=Tr(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:Qf(de(n),g),...t.observed?{observed:Qf(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>$f(e,g))},v=Cd({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=bd({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b={version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(ct(r)),cause:{code:t.causeCode,message:g(t.causeMessage),...t.causeHint?{hint:g(t.causeHint)}:{}},screen:t.screen,suggestions:[],suggestionCount:0,resume:y,repairHint:v,targetBinding:_},x=Id({sessionStore:u,observationStore:e.observationStore,sessionName:l,divergence:b,responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return lf({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:x,scrubVars:p})}function Uf(e,t,n){let r=Tr(e.scrubVars);return Hf(e,{kind:t.kind,matchCount:t.matchCount,observed:t.observed,candidateNodes:t.candidateNodes,mismatches:t.mismatches,causeCode:t.causeCode,causeMessage:t.causeMessage,...t.causeHint===void 0?{}:{causeHint:t.causeHint},screen:Xd(n,r),publicationEvidence:qf(n),repairCapture:Wd(n)})}async function Wf(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await Kd({session:t,sessionName:n,observationStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function Gf(e,t){return Uf(e,{kind:`identity-unverifiable`,matchCount:void 0,observed:void 0,candidateNodes:[],mismatches:[],causeCode:`IDENTITY_UNVERIFIABLE`,causeMessage:`The recorded target evidence could not verify itself when it was captured (a structural capture anomaly), so replay cannot trust it before acting.`},await Wf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function Kf(e,t,n){return Uf(e,t,await Wf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function qf(e){return e.state===`available`?e.evidence:void 0}function Jf(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?et(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:Je(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:zf(n,i),platform:a.device.platform}:{kind:`inactive`}}function Yf(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=rf(r),s=Nf({recorded:t,token:n,nodes:i,platform:a,refLabel:Bf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Mt(s.winnerNode),structural:Ae(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Mt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function Xf(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function Zf(e){return!e.ok&&e.error.details?.reason===Yt}function Qf(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function $f(e,t){let n=sr(e.type??`Element`),r=lr(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function ep(e,t){let n=t?.kind===`target`?{replayTargetGuard:t.guard.expected}:t?.kind===`targets`?{replayTargetGuards:{source:t.guards.source.expected,destination:t.guards.destination.expected}}:t?.kind===`landmark`?{replayLandmarkGuard:t.landmark}:void 0;return n?{...e,internal:{...e.internal,...n}}:e}function tp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.role==`string`)return{...typeof t.id==`string`?{id:t.id}:{},role:t.role,...typeof t.label==`string`?{label:t.label}:{}}}function np(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`||Array.isArray(n))return[];let e=n;if(typeof e.role!=`string`)return[];t.push({role:e.role,...typeof e.label==`string`?{label:e.label}:{}})}return t}function rp(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.documentOrder==`number`&&typeof t.sibling==`number`)return{documentOrder:t.documentOrder,sibling:t.sibling}}function ip(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:tp(e?.observed),expectedStructural:rp(e?.expectedStructural),observedStructural:rp(e?.observedStructural)}}function ap(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:tp(e?.observed),observedAncestry:np(e?.observedAncestry)}}function op(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function sp(e,t,n){let r=op(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&Xf(e)?{status:`guard-mismatch`,evidence:ip(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&Zf(e)?{status:`landmark-mismatch`,evidence:ap(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function cp(e){let{ctx:t,req:n,artifactPaths:r,onStep:i,armSaveScript:a}=e,o,s,c=(e,n,r,i)=>({recorded:e.targetEvidence,action:e,step:n+1,sourcePath:t.actionSourcePaths?.[n]??t.resolved,sourceLine:t.actionLines[n]??1,replayPath:t.resolved,artifactPaths:[...r],sessionName:t.sessionName,sessionStore:t.sessionStore,observationStore:t.observationStore,resumeStamper:t.coordinator.resumeStamper,responseLevel:t.responseLevel,scrubVars:i,planActions:t.actions,planDigest:t.planDigest,signal:t.signal}),l=e=>(o=e,op(lp(e),wf(e)));return{runtime:{beginTargetVerification(e,n,r,i){return Jf({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await Kd({session:i,sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e,retryLaunchRace:r.retryLaunchRace}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a screen could be captured to verify the recorded target.`};return s=a,a.state===`available`?{state:`available`,nodes:a.nodes}:{state:`unavailable`,reason:a.reason,hint:a.hint}},classifyTarget({action:e,token:n,nodes:r}){let i=t.sessionStore.get();return Yf({recorded:e.targetEvidence,token:n,action:e,nodes:[...r],platform:i.device.platform})},async dispatchStep(e,n,i,a,s){let c=t.actionLines[i]??1,l=await vf({req:ep(t.replayReq,s),sessionName:t.sessionName,action:e,resolved:n,filePath:t.resolved,line:c,sourcePath:t.actionSourcePaths?.[i],step:i+1,tracePath:t.actionTracePath,invoke:t.invoke});o=l,wf(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:sp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await Gf(c(e,n,r,i),{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Uf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await Kf(c(e,n,i,a),r,{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(o)},async handleActionFailure({action:e,index:r,artifactPaths:i,snapshotDiagnosticSamples:a,scrubVars:s}){let c=lp(o),u=await up(t,n,e,r,c,[...i],[...a],s);return l(u)},armStep:()=>{s=void 0,a()},isRepairArmed:()=>t.coordinator.view()?.repairBoundary!==void 0,describeStepValue:e=>dp(e),onStep:i,diagnosticsMarker:()=>pp(t.sessionStore),diagnosticsSince:e=>mp(t.sessionStore,e)},readLastResponse:()=>o}}function lp(e){return e&&!e.ok?e:L(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function up(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return fp(i)?c(i):c(await mf({response:i,action:n,index:r,replayPath:e.resolved,sourcePath:e.actionSourcePaths?.[r]??e.resolved,sourceLine:e.actionLines[r]??1,artifactPaths:a,snapshotDiagnosticSamples:o,scrubVars:s,req:t,sessionName:e.sessionName,sessionStore:e.sessionStore,observationStore:e.observationStore,resumeStamper:e.coordinator.resumeStamper,logPath:e.logPath,planActions:e.actions,planDigest:e.planDigest}))}function dp(e){let t=e.positionals??[],n=Le(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function fp(e){if(e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence,n=t&&typeof t==`object`?t.kind:void 0;return typeof n==`string`&&n!==`action-failure`}function pp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function mp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function hp(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:gp(t,i)};return vp(o,`AD_PLATFORM`,a.platform??r.platform),vp(o,`AD_TARGET`,a.target??r.target),vp(o,`AD_DEVICE`,a.device),vp(o,`AD_DEVICE_ID`,_p(a)),yp(o,`AD_SHARD_INDEX`,a.shardIndex),yp(o,`AD_SHARD_COUNT`,a.shardCount),vp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function gp(e,t){let n=e.meta?.cwd??process.cwd();return U.relative(n,t)||t}function _p(e){return typeof e.serial==`string`?e.serial:e.udid}function vp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function yp(e,t,n){typeof n==`number`&&(e[t]=String(n))}const bp=3e4,xp=1e3;function Sp(e){let{scriptPath:r,env:i,publicNetworkOnly:a}=e,o=W.readFileSync(r,`utf8`),s=Object.create(null);try{fa.runInNewContext(o,Cp(i,s,a),{filename:r,timeout:bp})}catch(e){let i=n(e);throw new t(i.code,`Maestro runScript failed: ${i.message}`,u({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),e instanceof Error?e:void 0)}return Ap(s,r),Object.fromEntries(Object.entries(s).map(([e,t])=>[`output.${e}`,jp(t)]))}function Cp(e,t,n){return{...e,output:t,json:wp,http:{post:(e,t)=>Ep(`POST`,e,n,t)}}}function wp(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Tp)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,xp)},n instanceof Error?n:void 0)}}function Tp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Ep(e,n,r,i){let a=yr(process.execPath,Dp(),{stdin:JSON.stringify(kp(e,n,i,r)),timeoutMs:bp,allowFailure:!0});if(a.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${Mp(a.stderr)}`,{exitCode:a.exitCode,stderr:a.stderr});try{return JSON.parse(a.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:a.stdout.slice(0,xp),stderr:a.stderr.slice(0,xp)},r instanceof Error?r:void 0)}}function Dp(){let e=Op(import.meta.url);if(!e)throw new t(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Op(e){try{let t=ua(e),n=U.extname(t)||`.js`;return[U.join(U.dirname(t),`run-script-http-child`+n),U.join(U.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>W.existsSync(e))??null}catch{return null}}function kp(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Ap(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function jp(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Mp(e){let t=e.trim();return t.length>0?t.slice(0,xp):`request process exited without stderr`}async function Np(e){return await Pp(`tap`,async t=>{let n=U.join(t,`before.png`),r=U.join(t,`after.png`),i=await Ip(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Ip(e,r)))return await Fp(n,r,e.signal,`tap`)}})})}async function Pp(e,t){let n=await sa.mkdtemp(U.join(la.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await sa.rm(n,{recursive:!0,force:!0})}catch{}}}async function Fp(e,t,n,r){try{let[i,a]=await Promise.all([sa.readFile(e),sa.readFile(t)]);Bp(n);let o=await Ui(i,a,`Maestro screenshot`);return Bp(n),Lp(o,r)}catch(e){zp(e,n),P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Ip(e,t){try{return await sa.rm(t,{force:!0}),Bp(e.signal),await e.capture(t),Bp(e.signal),!0}catch(t){return zp(t,e.signal),!1}}function Lp(e,t){if(e.status!==`compared`)return Rp(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return Rp(t,n?`stable`:`changed`,e),n}function Rp(e,t,n){P({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function zp(t,n){if(n?.aborted||e(t))throw r()}function Bp(e){if(e?.aborted)throw r()}async function Vp(e){Up(e.timeoutMs),Bp(e.signal);let t=e.now()+e.timeoutMs;return await Pp(`animation`,async n=>{let r=U.join(n,`first.png`),i=U.join(n,`second.png`);for(;;){if(Bp(e.signal),await Hp(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Hp(e,t,n){let r=[await Ip(e,t),await Ip(e,n)];return!r[0]||!r[1]?!1:await Fp(t,n,e.signal,`animation`)===!0}function Up(e){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Wp=J.observationPollMs;async function Gp(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!sm(n)||(Z(e.context.signal),!await am(e.dependencies,t,Wp,e.context.signal)))throw n}}}function Kp(e){return qp({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function qp(e){let t=Ii(e.snapshot),n=e.platform===`ios`?Yi(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:i(n.nodes)}:e.snapshot;return Qp(lo(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,presentation:n?{snapshot:r,presentedIndexesBySourceIndex:n.presentedIndexesBySourceIndex}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function Jp(e){om(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await Gp(e,n),i=qp({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ha(e.condition,i))return i;if(e.dependencies.now()>=n)break;await am(e.dependencies,n,Wp,e.context.signal)}return Z(e.context.signal),um(t)}async function Yp(e){om(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await Gp(e,t);if(r=void 0,n=qp({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===J.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),um(n)}async function Xp(e){om(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Gp(e,t),r=cm(n);for(;;){Z(e.context.signal),await am(e.dependencies,t,Wp,e.context.signal);let i=await Gp(e,t),a=cm(i);if(a===r)return{snapshot:i,signature:a,settled:!0};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r,settled:!1}}}function Zp(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function Qp(e,t,n,r,i,a,o){if(!e.ok){let t=Zp(r);return{generation:n,matched:e.evidence.matched,visible:e.evidence.visible,candidateCount:e.evidence.candidateCount,...e.evidence.ref?{ref:e.evidence.ref}:{},...t?{viewport:t}:{}}}let s=em({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=Zp(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:$p(e.rect,c)}:{},candidateCount:e.evidence.candidateCount,rect:e.rect,...e.evidence.ref?{ref:e.evidence.ref}:{},...c?{viewport:c}:{},...s?{dispatchSelector:s}:{},...i.includeSurfaceSignature?{surfaceSignature:cm(t)}:{}}}function $p(e,t){return!Ee(e)||!Ee(t)?0:he(t,e)?100:Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))*100/(e.width*e.height)}function em(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!tm(t,n,r)||i!==1))return nm(t.selector)}function tm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!uo(e.selector)}function nm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!rm(n)||typeof r!=`string`)return;let i=Qt(r)?.trim();return i?{key:n,value:i}:void 0}function rm(e){return e===`id`||e===`label`||e===`text`}async function im(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?r():e}Z(n)}async function am(e,t,n,r){let i=t-e.now();return i<=0?!1:(await im(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw r()}function om(e,n){if(!Number.isFinite(e)||e<0)throw new t(`INVALID_ARGS`,`${n} timeout must be a non-negative number.`)}function sm(e){return e instanceof t&&e.details?.retriable===!0}function cm(e){return ca(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,bounds:lm(e.rect)})))).digest(`hex`)}function lm(e){if(e)return{left:Math.trunc(e.x),top:Math.trunc(e.y),right:Math.trunc(e.x+e.width),bottom:Math.trunc(e.y+e.height)}}function um(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function dm(e){return e.kind===`clearState`?gm(e):fm(e)?pm(e):wm(e)?Tm(e):vm(e)}function fm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function pm(e){switch(e.kind){case`launchApp`:return mm(e);case`stopApp`:return hm(e);case`openLink`:return _m(e)}}function mm(e){return{command:`open`,positionals:e.appId?[e.appId]:[],flags:{...e.relaunch?{relaunch:!0}:{},...e.clearState?{clearAppState:!0}:{},...e.launchArgs.length>0?{launchArgs:e.launchArgs}:{}}}}function hm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function gm(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function _m(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function vm(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return ym(e);case`clickPoint`:return bm(e);case`swipe`:return xm(e);case`scroll`:return Sm(e);case`pressKey`:return Cm(e)}}function ym(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function bm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function xm(e){let{from:t,to:n,durationMs:r}=e.gesture;return{command:`gesture`,positionals:[],input:{kind:`pan`,origin:t,delta:{x:n.x-t.x,y:n.y-t.y},durationMs:r},flags:{postGestureStabilization:!1},internal:{gestureExecutionProfile:`endpoint-hold`,...e.viewport?{gestureViewport:e.viewport}:{}}}}function Sm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Cm(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function wm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Tm(e){switch(e.kind){case`screenshot`:return{command:`screenshot`,positionals:[e.path],...e.stabilize===!1||e.captureBackend===`runner`?{flags:{...e.stabilize===!1?{screenshotNoStabilize:!0}:{},...e.captureBackend===`runner`?{maestro:{screenshotCaptureBackend:`runner`}}:{}}}:{}};case`snapshot`:return{command:`snapshot`,positionals:[],flags:{noRecord:!0}}}}async function Em(e,n){let r=dm(n),{input:i,flags:a,internal:o,...s}=e.baseReq,c=Dm(a,r.flags??{}),l=u({...o,...r.internal,...n.kind===`snapshot`?{observationOnly:!0}:{}}),d=await e.invoke(u({...s,command:r.command,positionals:r.positionals,input:r.input,flags:c,internal:Object.keys(l).length>0?l:void 0}));if(!d.ok)throw Nm(d);if(n.kind===`gestureViewport`){let e=d.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new t(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return d.data}function Dm(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=u({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Om(e){return e?e.kind===`scalar`?[String(e.value)]:e.kind===`list`?e.values.map(String):Object.entries(e.values).flatMap(([e,t])=>[e,String(t)]):[]}function km(e,t){return{generation:t.generation,matched:t.matched&&t.visible,candidateCount:t.candidateCount,evidence:{kind:`selector`,selector:e,visible:t.visible,candidateCount:t.candidateCount,...t.ref?{ref:t.ref}:{}}}}function Am(e){if(!e)return[];let t=[];if(typeof e.path==`string`&&t.push(e.path),Array.isArray(e.artifactPaths)&&t.push(...e.artifactPaths.filter(e=>typeof e==`string`)),Array.isArray(e.artifacts))for(let n of e.artifacts)typeof n.localPath==`string`?t.push(n.localPath):typeof n.path==`string`&&t.push(n.path);return[...new Set(t)]}function jm(e,n,r){if(U.isAbsolute(e))return e;let i=n.source?.path??r;if(!i)throw new t(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return U.resolve(U.dirname(i),e)}function Mm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Nm(e){let n=e.error,r=u({...n.details??{},hint:n.hint??Pm(n.details,`hint`),diagnosticId:n.diagnosticId??Pm(n.details,`diagnosticId`),logPath:n.logPath??Pm(n.details,`logPath`),retriable:n.retriable??Fm(n.details,`retriable`),supportedOn:n.supportedOn??Pm(n.details,`supportedOn`)});return new t(n.code,n.message,Object.keys(r).length?r:void 0)}function Pm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Fm(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Im(e){let n,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Em(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new t(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=_(i,i);return n={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let t=r.snapshot;return r=void 0,n={generation:e.generation,snapshot:t},t}return r=void 0,await l(e)},bindObservation:e=>{if(n?.generation!==e.generation)return e;let t=`maestro-observation-${++s}`;return n.observationIdentity=t,{...e,identity:t}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&n?.generation===e.generation&&e.cachedObservation.identity===n.observationIdentity)return n.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=n?.generation===e-1?{generation:e,snapshot:n.snapshot}:void 0,n=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new t(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=n?.generation===i.generation?n.snapshot:a?.snapshot,c=await Xp({timeoutMs:J.settleTimeoutMs,context:i,snapshot:l,dependencies:e.dependencies,...s?{initialSnapshot:s}:{}});return o=void 0,a=void 0,r={generation:i.generation,snapshot:c.snapshot},c}}}async function Lm(e){let{input:t,context:n,snapshots:r,options:i}=e,a=i.dependencies.now()+t.timeoutMs,o=e.allowObservationReuse===!1?void 0:r.reuseObservation(n);for(;;){let e=i.dependencies.now(),s=o!==void 0;o??=await Gp({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=Kp({query:t,context:n,snapshot:o,platform:i.platform});if(Um(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await am(i.dependencies,a,Wp,n.signal)}}}async function Rm(e,t,n,r,i,a){let o=async()=>await Vm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Np({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Em(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await zm(e,t,n,r,i,a.click,o)});return}await zm(e,t,n,r,i,a.click)}async function zm(e,t,n,r,i,a,o){let s=async()=>await Vm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:cm(await t.capture(i))),l=async()=>{let r=await Xp({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await Bm({baselineSignature:c,screenshotBaseline:o,dispatch:s,settle:l,onRetry:()=>{n.tapRetries+=1}});t.prime(i.generation,e.snapshot)}catch(e){throw t.requireStability(i.generation),e}}async function Bm(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<J.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Vm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Wm(e,o,n.point,i);return}catch(n){if(!Gm(n))throw n;let o=await Lm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Hm(o))throw n;t.invalidate(r.generation),await Km(e,Mr(o.rect),i);return}}t.invalidate(r.generation),await Km(e,n.point,i)}function Hm(e){return e.matched&&e.visible&&e.rect!==void 0}function Um(e,t){return Hm(e)?!t||e.dispatchSelector!==void 0:!1}async function Wm(e,t,n,r){P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Em(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Gm(e){let t=c(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===cr.selectorNotFound}async function Km(e,n,r){if(!n)throw new t(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);P({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:n}}),await Em(e,{kind:`clickPoint`,point:n,options:r})}function qm(e){let t=Im(e),n={screenshotCaptures:0,tapRetries:0,settleLatches:0,settleTimeouts:0},r=e=>{e.settled?n.settleLatches+=1:n.settleTimeouts+=1},i=e.platform,a=t=>(t.kind===`screenshot`&&(n.screenshotCaptures+=1),Em(e,t)),o=async(e,n,r=`none`)=>{t.invalidate(n.generation);try{return await e()}finally{r===`deferred`&&t.requireStability(n.generation)}},s=async(e,t,n=`none`)=>await o(()=>a(e),t,n),c=async(n,i)=>{mr(n),await s({kind:`typeText`,text:n},i);let a=await Xp({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});r(a),t.prime(i.generation,a.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await Lm({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await Jp({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async()=>await a({kind:`gestureViewport`}),launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Om(e.arguments),...Om(e.launchArguments)],i=e.clearState===!0,a=!i&&e.stopApp!==!1;await s({kind:`launchApp`,...n?{appId:n}:{},relaunch:a,clearState:i,launchArgs:r},t,`deferred`)},stopApp:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`stopApp`,...n?{appId:n}:{}},t)},clearState:async(e,t)=>{let n=e.appId??t.appId;await s({kind:`clearState`,...n?{appId:n}:{}},t)},openLink:async(e,t)=>{await s({kind:`openLink`,...t.appId?{appId:t.appId}:{},link:e.link,prewarmRunner:i===`ios`},t,`deferred`)},tapOn:async(r,i)=>await Rm(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>Km(e,t.target.point,u({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>Km(e,t.target.point,{holdMs:J.longPressDurationMs}),n,`deferred`)},gesture:async(e,t)=>{let n=await s({kind:`swipe`,gesture:e,...t.gestureViewport?{viewport:t.gestureViewport}:{}},t,`deferred`);return n?{data:n}:void 0},inputText:async(e,t)=>await c(e.text,t),eraseText:async(e,t)=>await c(`\b`.repeat(e.charactersToErase??J.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await Yp({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=wa(o,n.selector,n.direction,n.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await Xp({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw jn(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(km(n.selector,a))}},pressKey:async(e,t)=>{await s({kind:`pressKey`,key:e.key},t,`deferred`)},back:async(e,t)=>{await s({kind:`pressKey`,key:`back`},t,`deferred`)},hideKeyboard:async(e,t)=>{await s({kind:`pressKey`,key:`dismiss`},t,`deferred`)},waitForAnimationToEnd:async(t,n)=>({visualStabilityReached:await Vp({timeoutMs:t.timeoutMs??J.animationWaitTimeoutMs,now:e.dependencies.now,signal:n.signal,capture:async t=>{await a({kind:`screenshot`,path:t,stabilize:!1,...e.platform===`ios`?{captureBackend:`runner`}:{}})}})}),takeScreenshot:async e=>({artifactPaths:Am(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Sp({scriptPath:jm(t.file,n,e.sourcePath),publicNetworkOnly:e.baseReq.internal?.publicNetworkOnly===!0,env:{...n.env,...t.env?Mm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function Jm(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=qm(e);return vo(t,{beforeExecute:async({context:e,requiresSettledPredecessor:t})=>{if(t){let t=await n.settlePending(e);t&&i(t)}},afterExecute:({context:e,visualStabilityReached:t})=>{t&&n.consumeStabilityFromVisualWait(e)},bindObservation:n.bindObservation,readMetrics:r})}function Ym(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),Xm(()=>$m(r,e)),Xm(()=>eh(n,t,e))},actionCompleted:e=>{let r=Zm(i,e.stepIndex);Xm(()=>th(n,t,Qm(r,e),!0))},actionFailed:e=>{let r=Zm(i,e.stepIndex);Xm(()=>th(n,t,Qm(r,e),!1))}}}function Xm(e){try{e()}catch{}}function Zm(e,t){let n=e.get(t);return e.delete(t),n}function Qm(e,t){return u({...e??t,durationMs:t.durationMs,runtimeMetrics:t.runtimeMetrics,data:`data`in t?t.data:void 0,error:`error`in t?t.error:void 0})}function $m(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function eh(e,t,n){_f(e,{type:`replay_action_start`,ts:new Date().toISOString(),replayPath:t,...n.source.path&&n.source.path!==t?{sourcePath:n.source.path}:{},line:n.source.line,step:n.stepIndex,command:n.action,positionals:n.value?[n.value]:[]})}function th(e,n,r,i){let a=nh(r);_f(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:n,...r.source.path&&r.source.path!==n?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof t?{errorCode:r.error.code}:{}})}function nh(e){let t=`data`in e?e.data:void 0,n=rh(t?.timing)?t.timing:void 0;return u({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function rh(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function ih(e,t){return un(e,t)}function ah(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:lh(e.action),positionals:uh(e.action,e.value),flags:t.flags??{}}}}async function oh(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,observationStore:o,logPath:s}=e,c=F(r.meta?.requestId),l=ah(t,r),u=cf(e.error),d=[...t.redactions],f=Tr(d),p={...u,message:f(u.message),...u.hint?{hint:f(u.hint)}:{}},m=o.get(),h=m?await Kd({session:m,sessionName:i,observationStore:o,logPath:s,action:l.action}):{state:`unavailable`,reason:`no-session`,hint:`The session closed before a post-failure screen could be captured.`},g=m&&h.state===`available`&&!t.isControl?sh({failure:t,action:l.action,session:m,nodes:h.nodes,sanitize:f}):[],_=[t.action,ch(t.value)].filter(Boolean).join(` `),v=Id({sessionStore:a,observationStore:o,sessionName:i,divergence:{version:1,kind:`action-failure`,step:{index:t.stepIndex,source:{path:f(t.source.path??n),line:t.source.line}},action:f(_),cause:{code:p.code,message:p.message,...p.hint?{hint:p.hint}:{}},screen:Xd(h,f),suggestions:g.slice(0,5),suggestionCount:g.length,resume:t.resume,repairHint:Cd({kind:`action-failure`,targetEvidence:void 0,capture:Wd(h)})},responseLevel:r.meta?.responseLevel,evidence:h.state===`available`?h.evidence:void 0,...c?{signal:c}:{}});return uf({error:p,actionLabel:_,action:t.action,positionals:[...l.action.positionals],step:t.stepIndex,replayPath:n,artifactPaths:[...t.artifactPaths],snapshotDiagnostics:e.snapshotDiagnostics,divergence:v,scrubVars:d})}function sh(e){let t={createdAt:Date.now(),nodes:e.nodes};return Vd(ih(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>sf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function ch(e){return!e||e===`<text>`?e??``:dt(e)}function lh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function uh(e,t){return!t||e===`inputText`?[]:[t]}function dh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=ph(o,i),c=n.replayed;return{ok:!0,data:{replayed:c,healed:0,session:a,sessionActive:o.get()!==void 0,artifactPaths:n.artifactPaths,...n.warnings?{warnings:n.warnings}:{},...s?{snapshotDiagnostics:s}:{},message:mh(c,Date.now()-r)}}}async function fh(e){let{command:t,replayPath:r,state:i,outcome:a}=e,{request:o,session:{name:s,store:c,observationStore:l,logPath:u}}=t,{failure:d}=a,f=n(a.error);return d?await oh({error:f,failure:d,replayPath:r,req:o,sessionName:s,sessionStore:c,observationStore:l,logPath:u,snapshotDiagnostics:ph(c,i.snapshotStart)}):{ok:!1,error:f}}function ph(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return m(n)}function mh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function hh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return L(`INVALID_ARGS`,rn);if(t.flags?.saveScript!==void 0)return L(`INVALID_ARGS`,`Maestro YAML does not support --save-script; ADR 0012 repair recording applies only to .ad scripts.`);let r=Date.now(),i={snapshotStart:0};try{return await gh({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await fh({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function gh(e){let{command:t,bundle:n,startedAt:r,state:i}=e,{request:a,session:{store:o},tracePath:s,onStep:c,invoke:l}=t,u=await _h({command:t,bundle:n}),d=wh({req:a,invoke:l,device:u.device,platform:u.platform,runtimeHints:u.runtimeHints,sourcePath:u.filePath});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await mn(u.flow,d,{defaults:u.defaults,env:u.env,platform:u.platform,target:u.target,runtimeHints:u.runtimeHints,signal:u.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,readSource:e=>sn(n,e),observer:Ym({filePath:u.filePath,tracePath:s,onStep:c})});return f.ok?dh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await fh({command:t,replayPath:n.entry,state:i,outcome:f})}async function _h(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=tr(sn(n,o),o),c=a.lookup(),l=c?.session;c&&Hn(c,r.flags);let u=await vh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Sh({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:Ch(r),signal:F(r.meta?.requestId)}}async function vh(e){let{req:t,sessionStore:n,sessionName:r,session:i,flow:a}=e,o=t.flags?.platform,s=i?.device??(o===`android`||o===`ios`?void 0:await Si(t.flags??{},dn(a.appTarget,o))),c=kh(t,s),l=bh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await yh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:Ah(t,s),runtimeHints:l,flow:a})}async function yh(e){if(e.device||!xh(e.runtimeHints))return e;let t=await Si(e.req.flags??{},dn(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:Ah(e.req,t),runtimeHints:bh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function bh(e){return Bn({req:e.req,sessionStore:{getRuntimeHints:t=>t===e.sessionName?e.sessionStore.getRuntimeHints():void 0},sessionName:e.sessionName,device:e.device,platform:e.platform})}function xh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Sh(e){return{...hp({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function Ch(e){return{...b(T(e.flags?.replayShellEnv)),...x(w(e.flags?.replayEnv))}}function wh(e){let{req:t,invoke:n,device:r,platform:i,runtimeHints:a,sourcePath:o}=e,{command:s,positionals:c,input:l,flags:d,...f}=t;return Jm({baseReq:u({...f,flags:Th(r,i,t.flags),runtime:a}),invoke:n,platform:i,sourcePath:o,dependencies:{now:Date.now,sleep:async(e,t)=>{await da(e,void 0,{signal:t})}}})}function Th(e,t,n){if(!e)return Eh(t,n);let r={platform:t,target:e.target,noRecord:!0};return t===`android`?{...r,serial:e.id}:{...r,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}}}function Eh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Dh(n,t):Oh(n,t)}function Dh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function Oh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function kh(e,n){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(n?.platform===`android`)return`android`;if(n?.platform===`apple`&&n.appleOs===`ios`)return`ios`;throw new t(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function Ah(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function jh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(S(t,a.flags?.replayBackend)===`maestro`)return n?L(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await hh(i):L(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Mh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Nh(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=Ph(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(),_=Fh({req:t,coordinator:s,manifest:l,preEntrySession:g});return _.ok?{ok:!0,value:{replayReq:u,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h,preEntrySession:g,entryIndex:_.value,varSources:Lh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Nh(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return L(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Ph(e,t){let n=Ku(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Ih({...e,flags:fn(e.flags,n.actions)},n.metadata)}}function Fh(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:L(`INVALID_ARGS`,a.message)}}function Ih(e,t){return!t.platform&&!t.target?e:{...e,flags:Rh(e.flags,t)}}function Lh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:hp({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:b(T(t.flags?.replayShellEnv)),cliEnv:x(w(t.flags?.replayEnv))}}function Rh(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function zh(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=Bh({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Uh({req:t,coordinator:a}),Hh({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function Bh(e){let t=Wh(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return Ti()}function Vh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?L(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):Gh({saveScript:t,liveForce:n,persistedForce:zt(r)||void 0,sourcePath:i,existingSaveScriptPath:Nt(r)})}function Hh(e){let{req:t,sessionStore:n,sourcePath:r,coordinator:i}=e,a=n.get(),{saveScript:o,force:s}=t.flags??{},c=Vh({saveScript:o,force:s,preRunState:a?.scriptPublication??Pt,sourcePath:r});return c?{ok:!1,response:c}:(i.demoteForRerunIfArmed(),{ok:!0,armSaveScript:Kh({saveScript:o,force:s,coordinator:i,sourcePath:r})})}function Uh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Wh(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return L(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function Gh(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Or(t):a??fd(i);if(!(n||r&&o===a)&&W.existsSync(o))return L(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function Kh(e){let{saveScript:t,force:n,coordinator:r,sourcePath:i}=e;if(!t)return()=>{};let a=!0;return()=>{r.armStep({saveScript:t,force:n,sourcePath:i,firstArm:a}),a=!1}}async function qh(e){let{request:t,session:{name:n,logPath:r,store:i,mutationStore:a,observationStore:o},tracePath:s,onStep:l,invoke:u}=e,d=t.flags?.replayScriptSource;if(!d)return L(`INVALID_ARGS`,rn);let f=Date.now(),p=t.flags?.replayKeepSession===!0,m=``,h=new Set,g=dd({sessionStore:i,mutationStore:a});try{if(m=d.entry,te(m)&&t.flags?.replayBackend!==`maestro`)return L(`INVALID_ARGS`,ee(`replay`,m));let a=await jh({resolved:m,keepSession:p,coordinator:g,command:e});if(a)return a;let c=Mh({req:t,sessionName:n,sessionStore:i,tracePath:s,resolved:m,script:sn(d,m),coordinator:g});if(!c.ok)return c.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=c.value,T=zh({req:t,entryIndex:S,sessionStore:i,sourcePath:m,coordinator:g});if(!T.ok)return T.response;let{runtime:E,readLastResponse:D}=cp({ctx:{replayReq:_,sessionName:n,sessionStore:i,observationStore:o,logPath:r,resolved:m,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:u,signal:F(t.meta?.requestId),coordinator:g},req:t,artifactPaths:h,onStep:l,armSaveScript:T.armSaveScript}),O=await ad({actions:v,entryIndex:S,keepSession:p,actionLines:y,actionSourcePaths:b,resolvedPath:m,varSources:C},E);return O.status===`failed`?D()??L(`COMMAND_FAILED`,`replay step failed with no recorded response`):Jh({startedAt:f,sessionName:n,sessionStore:i,replayed:O.replayed,artifactPaths:O.artifactPaths,snapshotDiagnosticSamples:O.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:g,keepSession:p})}catch(e){let t=c(e);return L(t.code,t.message,h.size>0?{artifactPaths:[...h]}:void 0)}}function Jh(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:l}=e;s(),c.markCompleteIfArmed();let u=r.get(),d=Xh({keepSession:l,sessionName:n,completedSession:u,artifactPaths:a});if(d)return d;let f=m([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:u!==void 0,artifactPaths:[...a],...f?{snapshotDiagnostics:f}:{},message:Yh(i,Date.now()-t)}}}function Yh(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function Xh(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return L(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function Zh(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=U.resolve(n??`.`,t??`.agent-device/test-artifacts`);return U.join(i,r)}function Qh(e,t){let n=t?U.relative(t,e):U.basename(e),r=n.length===0||n.startsWith(`..`)?U.basename(e):n;return Ye(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function $h(e,t){W.mkdirSync(t,{recursive:!0}),ng(e,t)}function eg(e){let{outcome:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=t.status===`passed`,c=[...new Set(t.artifactPaths)];t.status===`failed`&&typeof t.error.logPath==`string`&&c.push(t.error.logPath);let l=tg(c,o),u=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${s?`passed`:`failed`}`];t.status===`passed`?u.push(`replayed: ${t.replayed}`,`healed: ${t.healed}`):(u.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&u.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&u.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&u.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&u.push(`timeoutMode: cooperative`)),l.length>0&&u.push(`copiedArtifacts: ${l.map(e=>U.basename(e)).join(`, `)}`);let d=U.join(o,`result.txt`),f=`${u.join(`
|
|
2
|
+
`)}\n`;W.writeFileSync(d,f),s||W.writeFileSync(U.join(o,`failure.txt`),f)}function tg(e,t){let n=[],r=new Map;for(let i of e){if(!ig(i))continue;let e=rg(U.basename(i),r),a=U.join(t,e);U.resolve(i)!==U.resolve(a)&&W.copyFileSync(i,a),n.push(a)}return n}function ng(e,t){let n=U.join(t,`replay.ad`);if(W.copyFileSync(e,n),U.extname(e).toLowerCase()===`.ad`)return;let r=U.join(t,U.basename(e));U.resolve(r)!==U.resolve(n)&&W.copyFileSync(e,r)}function rg(e,t){let n=U.extname(e),r=n?e.slice(0,-n.length):e,i=t.get(e)??0;return t.set(e,i+1),i===0?e:`${r}-${i+1}${n}`}function ig(e){try{return W.statSync(e).isFile()}catch{return!1}}function ag(e){let{platformFilter:n,discoverSources:r}=e,i=r(),a=[];for(let e of i){let{path:t,manifest:r}=e,i={kind:`run`,path:t,title:r.title,manifest:r};if(!n){a.push(i);continue}let o=r.device.platform;if(o.kind===`caller-bound`){a.push(i);continue}if(o.kind===`unspecified`){a.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${n}`});continue}dg(n,o.value)&&a.push(i)}if(a.filter(e=>e.kind===`run`).length===0){let e=n?` for --platform ${n}`:``;throw new t(`INVALID_ARGS`,`No replay tests matched${e}.`)}return a}function og(e,t,n,r,i=0){let a=U.basename(n,U.extname(n)),o=Ye(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function sg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return Ye(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function cg(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e;return[t??n,...o===void 0?[]:[`shard`,o+1],`test`,i+1,U.basename(r),`attempt`,a+1].join(`:`)}function lg(e,t){return typeof e==`number`?e:t}function ug(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function dg(e,t){return e===`apple`?O(t):t===e}function fg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const pg=2e3;async function mg(e){let{filePath:t,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,ee=Date.now(),S=xg({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),C=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:S,appendTimingEvent:e=>Q(S,e),shard:u,onStep:d}).catch(e=>fg({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([C,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Sg(o,[...v]))},o)})]):await C,Q(S,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-ee,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await gg(C)||(x=yg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:pg}}),_g({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await vg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:S,emitDiagnostic:h});x?.status===`passed`&&e&&(x=bg(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(S,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Q(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=hg(x,i,v)}}return x??fg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function hg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:fg({error:t,artifactPaths:[...n],infrastructure:!0})}async function gg(e){return await Promise.race([e.then(()=>!0),da(pg).then(()=>!1)])}async function _g(e){let{replayPromise:t,cleanupSession:r,sessionName:i,requestId:a,emitDiagnostic:o}=e;try{await t}finally{try{await r(i)}catch(e){o({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:n(e).message}})}}}async function vg(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=e;if(!t)return;let c=Date.now();Q(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,appendTimingEvent:e=>Q(o,e)});return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e===void 0,durationMs:Date.now()-c,errorCode:e?.error.code}),e}catch(e){let t=n(e);return Q(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-c,errorCode:t.code}),s({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:t.message}}),fg({error:t})}}function yg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function bg(e,t){return{...e,warnings:[...e.warnings,t]}}function xg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=U.join(t,`replay-timing.ndjson`);return W.mkdirSync(U.dirname(l),{recursive:!0}),W.writeFileSync(l,``),n.add(l),Q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Q(e,t){e&&W.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Sg(e,t=[]){return fg({artifactPaths:t,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}})}async function Cg(e){let t=wg(e),n=await Tg(e,t);return{result:jg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function wg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:U.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Qh(t.path,n)),maxAttempts:r+1}}async function Tg(e,t){Dg(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Eg(e,t,r);if(Og(n,i),kg(e,i.outcome,r))break;Ag(e,t,i)}return n}async function Eg(e,t,n){let{entry:r,sessionName:i,suiteInvocationId:a,caseIndex:o,suiteIndex:s,suiteTotal:c,requestId:l,timeoutMs:u,shard:d}=e,f=n+1,p=Date.now(),m=og(i,a,r.path,o,n),h=U.join(t.testArtifactsDir,`attempt-${f}`);$h(r.path,h);let g=cg({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_={file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Fg(d)},v=await mg({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.manifest.device.platform.kind===`declared`?r.manifest.device.platform.value:void 0,target:r.manifest.device.target,artifactsDir:h,shard:d,onStep:t=>{e.emitProgress({type:`replay-test`,..._,status:`progress`,stepIndex:t.index,stepTotal:t.total,...t.command===void 0?{}:{stepCommand:t.command},...t.value===void 0?{}:{stepValue:t.value}})},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt,emitDiagnostic:e.emitDiagnostic,bindAttemptCancellation:e.bindAttemptCancellation}),y=Date.now()-p;return eg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Dg(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;e.emitProgress({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:og(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Fg(c)})}function Og(e,t){e.finalOutcome=t.outcome,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,t.outcome.status!==`passed`&&e.attemptFailures.push({attempt:t.attempt,message:t.outcome.error.message,durationMs:t.durationMs})}function kg(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Ag(e,t,n){n.outcome.status!==`passed`&&e.emitProgress({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.outcome.error.message,hint:n.outcome.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Fg(e.shard)})}function jg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Mg(e,t,n,r):Ng(e,t,n,r)}function Mg(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome;if(c?.status!==`passed`)throw Error(`Expected passing replay test outcome.`);return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Fg(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,replayed:c.replayed,healed:c.healed,...c.warnings.length>0?{warnings:[...c.warnings]}:{},...c.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...Pg(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Ng(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalOutcome,l=c?.status===`failed`?c.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`};return e.emitProgress({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:l.message,hint:l.hint,...Fg(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:l,...c?.status===`failed`&&c.infrastructure?{infrastructure:!0}:{},...c?.snapshotDiagnostics?{snapshotDiagnostics:c.snapshotDiagnostics}:{},...Pg(s)}}function Pg(e){return Fg(e)}function Fg(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Ig(e,t,n,r){if(!e||t.length===0)return;let i=await r(e.count);return{mode:e.kind,shardCount:e.count,total:n+(e.kind===`all`?t.length*e.count:t.length),shards:i.map((n,r)=>({shardIndex:r,shardCount:e.count,device:n,entries:e.kind===`all`?t:t.filter((t,n)=>n%e.count===r)}))}}async function Lg(e){let{request:t,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),c=await Rg(t,u,d);Hg(c,a);let p=c.shardPlan?Ug({entries:c.entries,total:c.total,emitProgress:a}):[];return c.shardPlan?p.push(...await Wg({shards:c.shardPlan.shards,sessionName:f,suiteInvocationId:c.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:c.suiteArtifactsDir,suiteTotal:c.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l})):p.push(...await Jg({discoveryEntries:c.entries,sessionName:f,suiteInvocationId:c.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:c.suiteArtifactsDir,suiteTotal:c.total,runReplay:n,cleanupSession:r,finalizeAttempt:i,emitProgress:a,isCanceled:o,emitDiagnostic:s,bindAttemptCancellation:l})),{status:`completed`,data:Zg(c.total,p,Date.now()-e,c.suiteArtifactsDir)}}catch(e){let t=c(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Rg(e,t,n){let r=zg(e,t),i=Bg(r),a=r.length-i.length,o=sg(e.requestId),s=await Ig(e.shard?{kind:e.shard.mode,count:e.shard.count}:void 0,i,a,n);return{entries:r,runnable:i,shardPlan:s,suiteInvocationId:o,suiteArtifactsDir:Vg(e,o),total:s?.total??r.length}}function zg(e,t){return ag({platformFilter:e.platformFilter,discoverSources:t})}function Bg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Vg(e,t){return Zh({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Hg(e,t){t({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function Ug(e){let{entries:t,total:n}=e,r=[];for(let[i,a]of t.entries())a.kind===`skip`&&(e.emitProgress({type:`replay-test`,file:a.path,status:`skip`,index:i+1,total:n,message:a.message}),r.push({file:a.path,status:`skipped`,durationMs:0,reason:a.reason,message:a.message}));return r}async function Wg(e){return(await Promise.allSettled(e.shards.map(async t=>await Kg({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Gg(r,e.sessionName,t.reason)]:[]})}function Gg(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:qg(t,e),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}}async function Kg(e){let{shard:t,sessionName:n}=e;return await Yg({...e,entries:t.entries,sessionName:qg(n,t),shard:t})}function qg(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Jg(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h}=e,g=[],_=0;for(let[e,v]of t.entries()){if(p())break;if(v.kind===`skip`){f({type:`replay-test`,file:v.path,status:`skip`,index:e+1,total:c,message:v.message}),g.push({file:v.path,status:`skipped`,durationMs:0,reason:v.reason,message:v.message});continue}_+=1;let t=await Cg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:ug(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:lg(o.timeoutMs,v.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d,emitProgress:f,isCanceled:p,emitDiagnostic:m,bindAttemptCancellation:h});if(g.push(t.result),Xg(t,o,p))break}return g}async function Yg(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,request:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=[];for(let[e,v]of t.entries()){if(m())break;let{entry:t,suiteIndex:y}=v,b=await Cg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:ug(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:lg(o.timeoutMs,t.manifest.attemptDefaults?.timeoutMs),suiteArtifactsDir:s,suiteIndex:y,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f,emitProgress:p,isCanceled:m,emitDiagnostic:h,bindAttemptCancellation:g});if(_.push(b.result),Xg(b,o,m))break}return _}function Xg(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function Zg(e,t,n,r){let i=t.filter(e=>e.status===`passed`).length,a=t.filter(e=>e.status===`failed`),o=a.length,s=t.filter(e=>e.status===`skipped`).length,c=i+o,l=g(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:c,passed:i,failed:o,skipped:s,notRun:Math.max(0,e-c-s),durationMs:n,failures:a,tests:t,artifactsDir:r,...l?{snapshotDiagnostics:l}:{}}}function Qg(e,t){return()=>e.map(e=>$g(e,t))}function $g(e,t){let n=e.entry,r=sn(e,n),i=S(n,t)===`maestro`,a=ft(r);return{path:n,manifest:{...i?{title:tr(r,n).name}:{},device:{platform:a.platform?{kind:`declared`,value:a.platform}:i?{kind:`caller-bound`}:{kind:`unspecified`},...a.target===void 0?{}:{target:a.target}},...a.timeoutMs!==void 0||a.retries!==void 0?{attemptDefaults:{...a.timeoutMs===void 0?{}:{timeoutMs:a.timeoutMs},...a.retries===void 0?{}:{retries:a.retries}}}:{}}}}function e_(e){return async t=>(await r_(e,t)).map(t_)}function t_(e){if(e.platform===`web`||!ne(e))throw new t(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function n_(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}async function r_(e,n){let r=s_(e),i=a_(await bi(i_(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${o_(n)}, but only ${i.length} matched`);return i.slice(0,n)}function i_(e){let t=I(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:D({simulatorSetPath:vi(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function a_(e,t,n){return t.length>0?c_(e,t,n):e.filter(e=>l_(e,n)).sort(f_)}function o_(e){return`${e} device${e===1?``:`s`}`}function s_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function c_(e,n,r){return n.map(n=>{let i=d_(n),a=e.find(e=>u_(e,r)&&(e.id===n||d_(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function l_(e,t){return!u_(e,t)||!ne(e)?!1:e.booted!==!1}function u_(e,t){return!(!E(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function d_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function f_(e,t){return e.id.localeCompare(t.id)}function p_(e){let n=m_(e?.shardAll,`--shard-all`),r=m_(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{mode:`all`,count:n};if(r!==void 0)return{mode:`split`,count:r}}function m_(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}const h_=new Set([`IOS_BOOT_TIMEOUT`,`IOS_RUNNER_CONNECT_TIMEOUT`,`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,`IOS_TOOL_MISSING`,`ANDROID_BOOT_TIMEOUT`,`ADB_TRANSPORT_UNAVAILABLE`,`CI_RESOURCE_STARVATION_SUSPECTED`]);function g_(e){return h_.has(e.toUpperCase())}const __=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function v_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=y_(e);return t?b_(t.details)||x_(t.code,t.message):!1}function y_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function b_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||Un(t)?!0:t?g_(t):!1}function x_(e,t){let n=`${e}\n${t}`.toLowerCase();return __.some(e=>n.includes(e))}function S_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:T_(e.error.details?.artifactPaths),infrastructure:v_(e),...E_(e.error.details?.snapshotDiagnostics)};let t=e.data;return{status:`passed`,replayed:typeof t?.replayed==`number`?t.replayed:0,healed:typeof t?.healed==`number`?t.healed:0,warnings:w_(t?.warnings),artifactPaths:T_(t?.artifactPaths),...E_(t?.snapshotDiagnostics)}}function C_(e){if(!e||e.ok)return;let t=S_(e);return t.status===`failed`?t:void 0}function w_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function T_(e){return[...new Set(w_(e))]}function E_(e){let t=h(e);return t?{snapshotDiagnostics:t}:{}}const D_=1e3,O_=3e3;function k_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await A_(e)}}async function A_(e){let{req:t,sessionName:n,sessionStore:r,artifactsDir:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0)return;let o=r.get();if(!o||o.screenRecording)return;let s=Sr(o.device.platform),c=i?U.join(i,`recording${s}`):xr(o.device.platform);M_(a,{type:`video_recording_start`,session:n,videoPath:c}),P({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(N_({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return M_(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await br(D_),M_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:D_}),P({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:D_}}),l}async function j_(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;M_(a,{type:`video_tail_start`,session:n,requestedDurationMs:O_});let o=Date.now();await br(O_);let s=Date.now(),c=await e.video.record(N_({req:t,sessionName:n,phase:`stop`}));return wf(c).forEach(e=>i.add(e)),M_(a,{type:`video_recording_stop`,session:n,ok:c.ok,durationMs:Date.now()-s,tailDurationMs:s-o,errorCode:c.ok?void 0:c.error.code}),P({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function M_(e,t){e({...t,ts:new Date().toISOString()})}function N_(e){let t={token:e.req.token,meta:e.req.meta};return e.phase===`start`?{request:t,sessionName:e.sessionName,phase:`start`,outputPath:e.outputPath}:{request:t,sessionName:e.sessionName,phase:`stop`}}const P_=[{keys:[`replayKeepSession`],requested:e=>e.replayKeepSession===!0,message:`test does not support --keep-session; suite attempts own their cleanup. Run one native .ad script directly with replay --keep-session.`},{keys:[`replayFrom`,`replayPlanDigest`],requested:e=>e.replayFrom!==void 0||e.replayPlanDigest!==void 0,message:`test does not support --from/--plan-digest; resume is replay-only. Run the failing script directly with replay --from.`},{keys:[`saveScript`,`force`],requested:e=>!!e.saveScript||e.force===!0,message:`test does not support --save-script/--force; the agent-supervised repair loop is replay-only. Repair the failing script directly with replay --save-script.`}],F_=({attemptId:e,parentAttemptId:t})=>{Vr(e);let n=I_(e,t);return{cancel:()=>Rr(e),release:()=>{n(),Br(e)}}};function I_(e,t){if(!t||t===e)return()=>{};let n=F(t);if(!n)return()=>{};let r=()=>{Rr(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function L_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=R_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:n_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function R_(e){if(!e||e.recordVideo!==!0&&e.replayScriptSources===void 0)return e;let t={...e};return delete t.recordVideo,delete t.replayScriptSources,Object.keys(t).length>0?t:void 0}async function z_(e){let{request:t,session:{name:n,logPath:r},createSession:i,invoke:a,cleanupSession:o,video:s}=e;if(t.flags?.recordVideo===!0&&s===void 0)return L(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of P_)if(e.requested(l))return L(`INVALID_ARGS`,e.message);let u,d;try{u=H_(t,n),d=V_(t)}catch(e){let t=c(e);return L(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Lg({request:u,emitProgress:Hr,isCanceled:()=>zr(t.meta?.requestId),emitDiagnostic:P,bindAttemptCancellation:F_,runReplay:async({filePath:e,sessionName:n,platform:o,target:c,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&wf(e).forEach(e=>d.add(e)),e),v=L_({parentFlags:t.flags,platform:o,target:c,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=i(n,r),b=s?{req:t,sessionName:n,sessionStore:y.store,artifactsDir:u,appendTimingEvent:m,video:s}:void 0,x=b?k_(b):void 0;return S_(await qh({request:{...t,command:`replay`,session:n,positionals:[e],flags:v,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||x?{internal:{...t.internal??{},...x?{openLifecycle:x}:{}}}:{}},session:y,tracePath:p,onStep:g,invoke:async e=>{let t=b?await A_(b):void 0;return t&&!t.ok?t:_(await a(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,appendTimingEvent:o})=>{if(s)return C_(await j_({req:t,sessionName:e,sessionStore:i(e,r).store,artifactsDir:a,appendTimingEvent:o,artifactPaths:n,video:s}))},discoverSources:Qg(d,t.flags?.replayBackend),resolveShardTargets:e_(t.flags),cleanupSession:o});return p.status===`completed`?{ok:!0,data:B_(p.data,t)}:L(p.error.code,p.error.message)}function B_(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=U.join(n,U.basename(r)),a=e=>e===r||e.startsWith(r+U.sep)?i+e.slice(r.length):e,o={...e,artifactsDir:i,tests:e.tests.map(e=>`artifactsDir`in e&&e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e),failures:e.failures.map(e=>e.artifactsDir?{...e,artifactsDir:a(e.artifactsDir)}:e)};return W.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:U.basename(r)}]}:o}function V_(e){let n=e.flags?.replayScriptSources;if(!n)throw new t(`INVALID_ARGS`,rn);return n}function H_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=W_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:Or(i,r),failFast:n.failFast===!0,retries:U_(n.retries),timeoutMs:U_(n.timeoutMs),shard:p_(n)}}function U_(e){return typeof e==`number`?e:void 0}function W_(e){return typeof e==`string`?e:void 0}function G_(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await ea({req:K_(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function K_(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const q_=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await qh({request:e,session:Y_(t,n,r),invoke:a??i}),J_=async({req:e,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new t(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=G_({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await z_({request:e,session:Y_(n,r,i),createSession:(e,t)=>Y_(e,t,i),invoke:s??o,cleanupSession:async t=>await X_({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Y_(e,t,n){let r=t=>{let r=n.get(e);return r?(t(r),n.set(e,r),!0):!1};return{name:e,logPath:t,store:{get:()=>n.get(e),lookup:()=>n.lookup(e),getRuntimeHints:()=>n.getRuntimeHints(e),ensureSessionDir:()=>n.ensureSessionDir(e)},mutationStore:{update:r,clearRepairTombstone:()=>n.clearRepairTombstone(e)},observationStore:{get:()=>n.get(e),update:r}}}async function X_(e){let{req:n,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await rc({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new t(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function Z_(e){let{req:n,sessionName:r,sessionStore:i}=e;if(n.command!==rr.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return tv(new t(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return tv(new t(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=ev(a);if(o)return tv(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return tv(new t(`INVALID_ARGS`,`session save-script path cannot be empty.`));It(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:Gt(a,n.flags?.force),publication:`active`});return c.written?(Vt(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...N(`Published script: ${c.path}`)}}):tv(c.error??new t(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function Q_(e){if(yt(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Ft(e)?void 0:`not-armed`}const $_={repair:()=>new t(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new t(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new t(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new t(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function ev(e){let t=Q_(e);return t?$_[t]():void 0}function tv(e){return{ok:!1,error:n(e)}}function nv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function rv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Pi(e)}}async function iv(e,n,r){if(r.length!==1)throw new t(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(rv(n))}}async function av(e,n,r){if(r.length<2)throw new t(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...rv(n),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...N(`Clipboard updated`)}}async function ov(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await z({command:`clipboard`,device:t,use:$e,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>iv(n,e,r)}}let o=await z({command:`clipboard`,device:t,use:Re,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>av(s,e,r)}}async function sv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=Y(nr.clipboard,s,c);if(l)return l;let u=t.positionals??[],d=nv(u);if(!d)return L(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let f=await X({session:s,flags:c}),p=await ov({device:f,action:d,positionals:u,inspectFacts:a,bindDevice:o});if(!p.ok)return p.response;let m=await p.execute(Oi(r,t.flags,s?.appBundleId,s?.trace?.outPath));return _t(i,s,t,t.command,m),{ok:!0,data:{platform:j(f),...m}}}function cv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function lv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function uv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function dv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Hr({type:`command`,status:`progress`,message:fv(t)})}function fv(e){return[$i(e),...Qi(e)].join(`
|
|
3
|
+
`)}async function pv(e,t){let{device:r,targetApp:i,session:a,listInstalledApps:o}=t;if(i)try{let t=o?mv(i,await o(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${j(r)}.`,evidence:{requested:i,platform:j(r)}});return}$(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(t){let i=n(t);$(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${j(r)} --all`,evidence:{code:i.code,message:i.message}})}}function mv(e,n){let r=e.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new t(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new t(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function hv(e,t,r){let i=_v(t,r);try{let t=await yv(i),n=vv(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Cv(n,i,t.failures),hint:n.length===0?Ev(t.failures):void 0,command:n.length===0?jv(i):void 0,evidence:Mv(n,t.failures)}),n.length>0&&bv(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(t){let r=n(t);return $(e,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function gv(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:j(e),id:e.id,name:e.name}))}})}function _v(e,t){let n=e.flags??{};return wi({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function vv(e,t){return e.filter(e=>re(e,t,{includeExplicitSelectors:!0}))}async function yv(e){if(e.platform)return{devices:await bi(e),failures:[]};let t=[],n=[];for(let r of fr)try{t.push(...await bi({...e,platform:r}))}catch(e){n.push(Sv(r,e))}return{devices:t,failures:n}}function bv(e,t){for(let n of t)$(e,xv(n))}function xv(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${kv(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${kv(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Sv(e,t){let r=n(t);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Cv(e,t,n){if(e.length===0)return n.length>0?`No ${wv(t)} devices found; ${Tv(n)}.`:`No ${wv(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${wv(t)} ${Av(e.length,`device`)} available; ${r} booted`,a=Dv(e,t);return a?`${i} (${a}).`:`${i}.`}function wv(e){let t=e.platform?kv(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Tv(e){return e.slice(0,2).map(e=>`${kv(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Ev(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Dv(e,t){if(t.platform||t.target)return;let n=dr(e),r=Ov();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function Ov(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function kv(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function Av(e,t){return e===1?t:`${t}s`}function jv(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Mv(e,t){let n=new Map;for(let t of e){let e=j(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Nv=1500;async function Pv(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await Fv(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Iv(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function Fv(e,t,n){try{return await(n.resolveProcessInfo??Lv)(e,t)}catch{return}}function Iv(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function Lv(e,t){if(!Rv(e))return;let n=await zv(t);if(n!==void 0)return{pid:n,cwd:await Bv(n)}}function Rv(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function zv(e){let t=await vr(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Nv});if(t.exitCode===0)return t.stdout.split(`
|
|
4
|
+
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Bv(e){let t=await vr(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Nv});if(t.exitCode===0)return t.stdout.split(`
|
|
5
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Vv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Hv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Uv(e,t){let n=jr(e.meta?.cwd);return{targetApp:Jv(e.flags?.targetApp)??t?.appBundleId,metroHost:Jv(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Yv(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Kv(e,n)}}function Wv(e,t={}){let n=qv(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Gv(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${j(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Kv(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function qv(e){let t={...Object.fromEntries([...Vv,...Hv].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function Jv(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Yv(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Xv(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==nr.doctor)return null;let s=Zv(e.hostDiagnostics),c=r.get(n),l=Uv(t,c),u=ey(r,n),d=[];if(dv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Dr()} using ${u}`,evidence:{version:Dr(),stateDir:u}},...Wv(t,{required:l.remote}),...Gv(r,n,c,{remote:l.remote})),l.remote)return ay(d,l);let f=Qv(l,u,i),p=await hv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await ty({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??$v(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return ay(d,l,{device:h,includeMetro:!0,inventory:p})}function Zv(e){if(!e)throw new t(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function Qv(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>Gr(e),emitProgress:e=>Hr({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await xi(e),shouldPropagateInventoryProbeError:yi,transportOverrides:Object.freeze({androidAdb:n})})}function $v(e){let t=(e?.devices??[]).filter(e=>k(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function ey(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function ty(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??gv(t,i,a.targetApp);return u&&await ny(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await Pv(a.metroHost,a.metroPort,a.kind)),dv(t,...await r.ambientChecks(n)),u}async function ny(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await ry({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await pv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),dv(e,...await r.deviceChecks(i,n))}async function ry(e){if(e.device.platform!==`harmonyos`)return iy(e)}async function iy(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,Ve),u=I(n.flags?.androidDeviceAllowlist),d=await cc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await lc(l,d,e)}function ay(e,t,n={}){let r=cv(e);return{ok:!0,data:{status:r,summary:lv(r),kind:t.kind,platform:n.device?j(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:uv(e)}}}async function oy(e){return await z({...e,command:`prepare`,use:ve})}async function sy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return L(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(nr.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s}),u=await oy({device:l,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(u.type===`response`)return u.response;let d=Date.now(),f=await u.runtime.operations.prepareAppleRunner({timeoutMs:cy(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:hi(t)}});return{ok:!0,data:ly(a,l,Math.max(0,Date.now()-d),f)}}function cy(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:ae}function ly(e,t,n,r){return{action:e,platform:j(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:uy(n,r),message:`Prepared Apple runner: ${t.name}`}}function uy(e,t){let n=dy(t.buildMs),r=fy(t.connectMs),i=fy(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function dy(e){return e===void 0?void 0:fy(e)}function fy(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const py=e=>uc(e),my=e=>fl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),hy=e=>rc({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),gy=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await xl({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),_y=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await Su({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),vy={session_list:py,devices:py,capabilities:py,apps:py,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Xv({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:gy,shutdown:gy,appstate:gy,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Z_({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ho({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await sv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:ys,perf:_y,logs:_y,events:_y,network:_y,audio:_y,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await sy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Ns,reinstall:Ns,install_source:Ns,release_materialized_paths:async({req:e})=>await Eo({req:e}),push:Ns,"trigger-app-event":bs,open:my,replay:q_,test:J_,batch:async({req:e,sessionName:t,invoke:n})=>await Ps(e,t,n),close:hy};async function yy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Dn,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:ee,platformResourceCleanup:S}=e,C=vy[t.command];return C?await C({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:ee,platformResourceCleanup:S}):null}export{yy as handleSessionCommands};
|