agent-device 0.20.9 → 0.21.0
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.9.apk → agent-device-android-ime-helper-0.21.0.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.0.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.9.manifest.json → agent-device-android-ime-helper-0.21.0.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.9.manifest.json → agent-device-android-snapshot-helper-0.21.0.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 +49 -0
- package/apple/snapshot-bridge/SnapshotBridge.m +280 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +33 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +382 -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/RunnerAlertVerification.swift +36 -0
- 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/RunnerTapPointPolicy.swift +2 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +21 -12
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +21 -88
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +110 -107
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +6 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +85 -114
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +72 -175
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +10 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +78 -64
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +17 -9
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +47 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +232 -438
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +98 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +229 -168
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +110 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +147 -25
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +21 -18
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +24 -307
- 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 +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +49 -16
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +2 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +4 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +16 -20
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +42 -81
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +35 -82
- 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 +61 -0
- package/dist/src/ai-sdk.js +1 -0
- 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/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/back-mode.js +1 -0
- 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 +77 -51
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +5 -7
- 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 +1606 -0
- 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 -0
- package/dist/src/command.js +1 -0
- package/dist/src/{selector-vocabulary.js → compatibility-policy.js} +1 -1
- 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/format.js +2 -0
- 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 +2 -1578
- 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/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 +1618 -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 -0
- 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/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-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-apple-resources.js +1 -0
- 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 -15
- 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 +39 -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 -8
- 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-selector-query.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 +4 -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 +222 -99
- 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 +539 -199
- 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 +10 -3
- package/dist/src/session-allocation.js +1 -0
- package/dist/src/session-artifact-paths.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 -28
- 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 -0
- 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 -0
- 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 -0
- package/dist/src/toolchain-probe.js +2 -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/linux/atspi-dump.py +54 -9
- package/package.json +73 -38
- package/server.json +9 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.9.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.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 -75
- 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+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/cancel.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/screenshot-geometry.js +0 -1
- 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,28 +1,5 @@
|
|
|
1
|
-
import{C as e,D as t,_ as n,c as r,d as i,p as a,t as o,v as s}from"./sdk-contracts.js";import{l as c,p as l,u}from"./location-coordinates.js";import{$t as d,Br as f,Cn as p,D as m,E as h,Er as g,Et as _,F as v,Ft as y,Ht as b,I as x,K as ee,L as S,M as C,N as w,O as te,On as T,P as ne,Q as re,Qt as ie,S as ae,Sn as oe,Sr as E,T as se,Tn as ce,Ut as le,X as ue,Xt as de,Y as fe,Zt as pe,bn as me,en as he,f as ge,ft as _e,gt as ve,ht as ye,ir as be,k as xe,kr as Se,lr as Ce,mt as we,n as Te,pt as Ee,t as De,vt as Oe,w as ke,yr as Ae,yt as je,zr as Me}from"./sdk-batch-runner.js";import{_ as D,c as O,g as Ne,h as Pe,l as Fe,p as Ie,s as k,u as Le,y as Re}from"./sdk-device.js";import{B as ze,H as Be,Ht as Ve,Mt as He,R as Ue,S as We,St as Ge,V as Ke,Vt as A,Z as qe,_t as Je,a as Ye,gt as Xe,j as Ze,jt as Qe,o as $e,wt as et,xt as tt}from"./prepare-kind.js";import{C as nt,O as rt,R as it,w as at}from"./interaction.js";import{$ as ot,B as st,C as ct,G as lt,H as ut,I as dt,J as ft,K as pt,L as mt,N as ht,O as gt,Q as _t,R as vt,U as yt,V as bt,W as xt,Y as St,Z as Ct,_t as wt,at as Tt,bt as Et,et as Dt,gt as Ot,ht as kt,it as At,q as jt,rt as Mt,tt as Nt,vt as Pt,w as Ft,x as j,xt as It,yt as Lt,z as Rt}from"./screenshot-result.js";import{a as zt,n as Bt,o as Vt,r as Ht,s as Ut,t as Wt}from"./session-target-evidence.js";import{n as M,t as Gt}from"./command-catalog.js";import{a as Kt,c as qt,d as Jt,f as Yt,m as Xt,p as Zt,r as Qt,s as $t,t as en,u as tn}from"./observability.js";import{t as nn}from"./verdict.js";import{c as rn,f as an,o as on}from"./device.js";import{A as N,M as sn,N as cn,S as ln,_ as un,o as dn}from"./sdk-android-adb.js";import{n as fn,r as pn}from"./output-path.js";import{n as mn}from"./version.js";import{n as hn}from"./shell-quote.js";import{t as gn}from"./timeouts.js";import{t as _n}from"./project-runtime.js";import{r as vn}from"./boot-diagnostics.js";import{i as yn,o as bn,r as xn,t as Sn}from"./ime-lifecycle.js";import{t as Cn}from"./keyed-lock.js";import{a as wn,c as Tn,i as En,n as Dn,o as On,r as kn,s as An}from"./cancel.js";import{D as jn,u as Mn}from"./runner-disposal.js";import{i as Nn,o as Pn,r as Fn}from"./interactors.js";import{t as In}from"./device-claim-inspection.js";import{i as Ln}from"./lease-context.js";import{o as P,s as Rn}from"./simctl.js";import{a as zn,c as Bn,n as Vn,o as Hn,r as Un,t as Wn}from"./verified-file.js";import{a as F,c as Gn,f as Kn,l as qn,o as Jn,p as I,r as Yn,s as Xn,t as Zn}from"./dispatch.js";import{n as Qn}from"./provider.js";import{n as $n,s as er}from"./agent-browser-tool.js";import{r as tr}from"./png-resize.js";import{a as L,o as nr,s as rr}from"./selector-vocabulary.js";import{o as ir,t as ar}from"./runner-client.js";import{a as or,c as sr,d as cr,f as lr,g as ur,h as dr,i as fr,l as pr,m as mr,n as hr,r as gr,s as _r,t as vr,u as yr,v as br}from"./perf.js";import{$ as xr,$t as Sr,A as Cr,At as wr,B as Tr,Bt as Er,D as Dr,E as Or,F as kr,Ft as Ar,G as jr,Gt as Mr,H as Nr,I as Pr,J as Fr,Jt as Ir,K as Lr,L as Rr,M as zr,N as Br,O as Vr,Ot as Hr,P as Ur,Pt as R,Q as Wr,Qt as Gr,R as Kr,Rt as qr,T as Jr,U as Yr,Ut as Xr,V as Zr,W as Qr,X as $r,Xt as ei,Y as ti,Yt as ni,Z as ri,Zt as ii,_ as ai,_t as oi,a as si,at as ci,c as li,ct as z,d as ui,dt as di,en as fi,et as pi,f as mi,g as hi,gt as gi,h as _i,ht as vi,i as yi,it as bi,j as xi,k as Si,l as Ci,lt as wi,m as Ti,mt as Ei,n as Di,nt as Oi,o as ki,ot as Ai,p as ji,pt as Mi,q as Ni,qt as Pi,r as Fi,rn as Ii,rt as Li,s as Ri,st as zi,tn as Bi,tt as Vi,u as Hi,ut as B,v as Ui,vt as Wi,w as Gi,xt as Ki,y as qi,yt as Ji,z as Yi}from"./internal/daemon.js";import{n as Xi}from"./hdc.js";import{t as Zi}from"./device-ready.js";import{t as V}from"./handler-utils.js";import{t as Qi}from"./record-runtime.js";import{i as $i,n as ea,o as ta,r as na}from"./platform-runtime-open-target.js";import{n as ra}from"./snapshot-runtime.js";import{t as ia}from"./app-log-files.js";import H from"node:path";import{createHash as aa}from"node:crypto";import U,{promises as oa}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){return e.startsWith(`AD_`)}function fa(e){return new n(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${e} to avoid the AD_ prefix.`)}function pa(e){let t={};if(e.builtins)for(let[n,r]of Object.entries(e.builtins))t[n]=r;let n=[e.fileEnv,e.shellEnv,e.cliEnv];for(let e of n)if(e)for(let[n,r]of Object.entries(e)){if(da(n))throw fa(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function ma(e){let t={};for(let[n,r]of Object.entries(e)){if(typeof r!=`string`||!n.startsWith(`AD_VAR_`))continue;let e=n.slice(7);e.length!==0&&kt.test(e)&&(da(e)||(t[e]=r))}return t}function ha(e){let t={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new n(`INVALID_ARGS`,`Invalid -e entry "${r}": expected KEY=VALUE.`);let i=r.slice(0,e);if(!kt.test(i))throw new n(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(da(i))throw fa(i);t[i]=r.slice(e+1)}return t}function ga(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function _a(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}return process.env}function va(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function ya(e){return va(e)||e>=`0`&&e<=`9`||e===`.`}function ba(e){return e===`
|
|
2
|
-
`||e===`\r`||e===`\u2028`||e===`\u2029`}function xa(e,t){let n=t+2;if(n>=e.length||!va(e[n]))return null;for(n+=1;n<e.length&&ya(e[n]);)n+=1;let r=e.slice(t+2,n);if(e[n]===`}`)return{key:r,fallback:void 0,end:n+1};if(e[n]!==`:`||e[n+1]!==`-`)return null;n+=2;let i=``;for(;n<e.length;){let t=e[n];if(t===`}`)return{key:r,fallback:i,end:n+1};if(t===`\\`){let t=e[n+1];if(t===void 0)return{abortEnd:e.length};if(ba(t))return{abortEnd:n+2};i+=t,n+=2;continue}i+=t,n+=1}return{abortEnd:e.length}}function Sa(e,t,r){let i=``,a=0;for(;a<e.length;){let o=e[a];if(o===`\\`&&e.startsWith("${",a+1)){i+="${",a+=3;continue}if(o===`$`&&e[a+1]===`{`){let o=xa(e,a);if(o!==null&&`abortEnd`in o){i+=e.slice(a,o.abortEnd),a=o.abortEnd;continue}if(o!==null){let{key:e,fallback:s}=o;if(Object.prototype.hasOwnProperty.call(t.values,e))da(e)&&(t.expandedBuiltinNames??=new Set).add(e),i+=String(t.values[e]);else if(s!==void 0)i+=s;else throw new n(`INVALID_ARGS`,`Unresolved variable \${${e}} at ${r.file}:${r.line}.`);a=o.end;continue}}i+=o,a+=1}return i}function Ca(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>Sa(e,t,n)),flags:wa(e.flags,t,n)??{},runtime:wa(e.runtime,t,n)}}function wa(e,t,n){return e&&Ta(e,t,n)}function Ta(e,t,n){return typeof e==`string`?Sa(e,t,n):Array.isArray(e)?e.map(e=>Ta(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,Ta(r,t,n)])):e}function Ea(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!da(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function W(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 Da(e){return B({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function Oa(e,t){let n=Na(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},Da(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{},...e.condition.childOf?{childOf:e.condition.childOf}:{}};return{generation:e.generation,matched:ka(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ka(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function Aa(e,t,n,r){let i=Na(await r.resolveTarget({selector:e,...t},W(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw zi(`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 ja(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{},...e.query.childOf?{childOf:e.query.childOf}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function Ma(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 Na(e,t){return Pa(e,t),Fa(e),Ia(e),La(e),e}function Pa(e,t){if(e.generation!==t)throw new n(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Fa(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Ia(e){if(e.rect!==void 0&&!Ma(e.rect)||e.viewport!==void 0&&!Ma(e.viewport))throw new n(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function La(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new n(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Ra(e,t,n,r,i){let a=za(e,t,n,i);if(!a)return;let{start:o,end:s}=Ga(a,n);return{gesture:{from:o,to:s,durationMs:r},viewport:a}}function za(e,t,n,r){let i=n===`up`||n===`down`,a=bi({nodes:e.nodes,matches:e.nodes.filter(e=>Ae(e)),platform:r}),o=Va(e.nodes)??Ha(a);if(!o||!E(o))return;let s=a.flatMap(e=>{if(!E(e.rect))return[];let t=Ua(e.rect,o);return!t||(i?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),c=new Map(e.nodes.map(e=>[e.index,e])),l=new Map(s.map(e=>[e.node.index,e]));for(let n of e.nodes.filter(e=>ci(e,t))){let e=Ba(n,c),t=e?l.get(e.index):void 0;if(t)return t.viewport}return s.sort(Wa)[0]?.viewport}function Ba(e,t){return Ae(e)?e:be(e,t)}function Va(e){return e.filter(e=>E(e.rect)&&Ce(e)).sort((e,t)=>t.rect.width*t.rect.height-e.rect.width*e.rect.height)[0]?.rect}function Ha(e){let t;for(let n of e)E(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ua(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 Wa(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Ga(e,t){let n=G(e,.5,.5),r=L.scrollUntilVisibleSwipe.nearEdgeFraction,i=L.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:G(e,.5,i)};case`down`:return{start:n,end:G(e,.5,r)};case`left`:return{start:n,end:G(e,i,.5)};case`right`:return{start:n,end:G(e,r,.5)}}}async function Ka(e,t,r){let i=z(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new n(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let a=e.start.space===`percent`?await r.resolveGestureViewport(W(t,t.command)):void 0;return{authored:e,gesture:Ja(await qa(e.start,t,r,a),await qa(e.end,t,r,a),i),...a?{viewport:a}:{}}}if(e.kind===`screen`){let n=await r.resolveGestureViewport(W(t,t.command)),{start:a,end:o}=Ya(n,e.direction,r.platform);return{authored:e,gesture:Ja(a,o,i),viewport:n}}let a=await Aa(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs},t,r),o=a.viewport??await r.resolveGestureViewport(W(t,t.command)),{start:s,end:c}=Xa(a,e.direction,o);return{authored:e,gesture:Ja(s,c,i),target:a,viewport:o}}async function qa(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(W(t,t.command));return{x:i.x+Math.trunc(i.width*e.x/100),y:i.y+Math.trunc(i.height*e.y/100)}}function Ja(e,t,n){return{from:e,to:t,durationMs:n??L.command.swipeDurationMs}}function Ya(e,t,n){if(t===`left`||t===`right`){let n=it(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=L.screenSwipe,i=G(e,r.centerFraction,r.nearEdgeFraction),a=G(e,r.centerFraction,r.farEdgeFraction),o=G(e,r.centerFraction,r.downStartFraction),s=G(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function G(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function Xa(e,t,n){let r=wi(e.rect),i=n.x+Math.trunc(n.width*L.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*L.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*L.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*L.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 Za={launchApp:no,stopApp:no,openLink:no,tapOn:io,doubleTapOn:io,longPressOn:io,swipe:lo,inputText:uo,eraseText:uo,scroll:K,scrollUntilVisible:K,hideKeyboard:K,pressKey:K,back:K,waitForAnimationToEnd:K,takeScreenshot:mo,runScript:mo,assertVisible:ho,assertNotVisible:ho,extendedWaitUntil:ho},Qa={launchApp:!0,stopApp:!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,extendedWaitUntil:!1};function $a(e){return Qa[e.kind]}async function eo(e,t){let n=e.command;return await to(n,e,t,W(e,n))}function to(e,t,n,r){let i=Za[e.kind];return i(e,t,n,r)}async function no(e,t,n,r){switch(e.kind){case`launchApp`:return await q(n.launchApp,ro(e,t),r,`invalidate`);case`stopApp`:return await q(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await q(n.openLink,{link:e.link},r,`invalidate`)}}function ro(e,t){return B({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function io(e,t,n,r){switch(e.kind){case`tapOn`:return await ao(e,t,n,r);case`doubleTapOn`:{let i=await Co(e.target,{purpose:`doubleTap`,timeoutMs:so(e)},t,n),a=z(e.delay,`doubleTapOn.delay`)??L.command.repeatDelayMs;return await q(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?ja(i.resolution):void 0)}case`longPressOn`:{let i=await Co(e.target,{purpose:`longPress`,timeoutMs:so(e)},t,n);return await q(n.longPressOn,{target:i},r,`invalidate`,i.resolution?ja(i.resolution):void 0)}}}async function ao(e,t,n,r){let i=await oo(e,t,n);return await q(n.tapOn,co(e,i),r,`invalidate`,i.resolution?ja(i.resolution):void 0)}async function oo(e,t,n){let r={purpose:`tap`,timeoutMs:so(e),index:z(e.index,`tapOn.index`),childOf:e.childOf,allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await Co(e.target,r,t,n)}function so(e){return e.optional===!0?L.command.optionalTargetLookupTimeoutMs:L.command.targetLookupTimeoutMs}function co(e,t){let n=z(e.repeat,`tapOn.repeat`),r=z(e.delay,`tapOn.delay`),i=n===void 0?r:r??L.command.repeatDelayMs;return B({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function lo(e,t,n,r){let i=await Ka(e.gesture,t,n);return await q(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?ja(i.target):void 0)}async function uo(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:z(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function K(e,t,n,r){switch(e.kind){case`scroll`:return await q(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await q(n.scrollUntilVisible,fo(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,po(e),r,`preserve`)}}function fo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:z(e.timeout,`scrollUntilVisible.timeout`)??L.command.scrollUntilVisibleTimeoutMs,durationMs:rr(L.command.scrollUntilVisibleSpeed)}}function po(e){return B({timeoutMs:z(e.timeout,`waitForAnimationToEnd.timeout`)})}async function mo(e,t,n,r){switch(e.kind){case`takeScreenshot`:return _o(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 ho(e){throw new n(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}async function q(e,t,n,r,i){let a=go(n,r);return _o(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function go(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function _o(e,t,n,r){let i=e?.observation;return vo(i,r),{...yo(n??i),...bo(e?.outputEnv),...xo(t,e?.artifactPaths),...So(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function vo(e,t){if(!(!e||t===void 0||e.generation===t))throw new n(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function yo(e){return e?{observation:e}:{}}function bo(e){return e?{outputEnv:{...e}}:{}}function xo(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 Aa(e.selector,t,n,r);return{authored:e,point:wi(i.rect),resolution:i}}return{authored:e,point:await qa(e,n,r)}}function wo(e,t,n,r={}){let i=Oi(e,t.selector,n,t.childOf);if(!i.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:Oo(t,i.matches,[],void 0)};let{matches:a,ranked:o}=i,s=Li(o,t.index),c=Oo(t,a,o,s?.node);if(!s)return To(t,a,o,c);let l=r.interactiveBounds===!0?r.interactiveRects?.get(s.node.index)??s.rect:s.rect;return{ok:!0,node:s.node,rect:l,matches:o.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!t.childOf?Eo(t,{...s,rect:l},r.canonicalSnapshot):0,evidence:c}}function To(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.index===void 0?``:` index ${e.index}`}.`,evidence:r}}function Eo(e,t,n){if(!n)return 0;let r=Oi(n,e.selector,`ios`).ranked;if(r.length!==1)return r.length;let i=Li(r,void 0);return i&&i.node.hittable!==!1&&Do(i.rect,t.rect)?1:0}function Do(e,t){let n=wi(e),r=wi(t);return n.x===r.x&&n.y===r.y}function Oo(e,t,n,r){return B({selector:e.selector,childOf:e.childOf,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const J={settleTimeoutMs:nr,retryTapMaxAttempts:L.command.retryTapMaxAttempts,longPressDurationMs:L.command.longPressDurationMs,eraseTextMaxCharacters:L.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:L.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:L.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:L.command.waitForAnimationToEndDifferencePercent,observationPollMs:L.observation.pollIntervalMs};function ko(e,t={}){return{execute:async n=>{let r=W(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:$a(n.command)&&!i,visualStabilityBarrier:i});let a=await eo(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await Oa(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function Ao(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function jo(e){let t=e.meta?.installSource;if(!t)throw new n(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new n(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new n(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new n(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Ao(t)}}function Mo(e){let t=jo(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Ii(n,e.meta?.tenantId)},cleanup:()=>{Bi(n)}}}function Y(e,t,n){return t||Pi(n)?null:F(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function No(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function X(e){let t=Pi(e.flags)||!e.session?await I(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Po(e.session.device);return e.ensureReady!==!1&&await Zi(t),t}async function Po(e){if(Pn(e)||!O(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(ir(e.id)?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await I(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await I({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Fo(e,t){return t?Wi(t,e).length===0:!1}function Io(e,t){if(!t.available)return F(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:t.reason},t.hint?{hint:t.hint}:void 0)}function Lo(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`)}function Ro(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`)}async function zo(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r),o,s,c;try{o=Mo(n);let e=Uo(n),l=await Vo(a,n.flags),u=await Lo(t.inspectFacts)(l),d=Io(`install_from_source`,u.operations.ensureReady)??Io(`install_from_source`,u.operations.materializeAppSource)??Io(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Ro(t.bindDevice)(l,Ee);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Wo({artifact:s,retention:e,req:n,session:a,sessionName:r}),a&&R(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Go(l,s,p,c),h=Ve(m,`Installed: ${He(m)}`);return V(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(t){return c&&await Br(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:e(t)}}finally{await s?.cleanup(),o?.cleanup()}}async function Bo(t){let{req:r}=t;try{let e=r.meta?.materializationId?.trim();if(!e)throw new n(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Br(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(t){return{ok:!1,error:e(t)}}}async function Vo(e,t){let r=Ho(t?.platform);if(e&&r&&e.device.platform!==r)throw new n(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${e.device.platform}`);if(!e&&!r)throw new n(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await X({session:e,flags:t,ensureReady:!1})}function Ho(e){return e===`ios`||e===`android`?e:void 0}function Uo(e){let t=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(r!==void 0&&r<=0)throw new n(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function Wo(e){if(e.retention.enabled)return await kr({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 Go(e,t,n,r){return O(e)?Ko(t,n,r):qo(t,n,r)}function Ko(e,t,r){let i=t.bundleId??e.bundleId;if(!i)throw new n(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Yo(r),bundleId:i,...Jo(t,e),launchTarget:t.launchTarget??i}}function qo(e,t,r){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new n(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Yo(r),packageName:i,...Jo(t,e),launchTarget:t.launchTarget??i}}function Jo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Yo(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Xo(e){let t=await Qo(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):F(`UNSUPPORTED_OPERATION`,`${e.command} is not supported on this device`,void 0,r.hint?{hint:r.hint}:void 0)}}return{type:`admitted`,bind:$o(e.bindDevice)}}async function Zo(e){let t=await Xo({...e,required:e.use.required});return t.type===`response`?t:{type:`runtime`,runtime:await t.bind(e.device,e.use)}}function Qo(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function $o(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}async function es(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=ts(t);if(!a.ok)return a.response;let o=Y(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await Zo({device:await X({session:n,flags:t.flags,ensureReady:!1}),inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:xe});if(s.type===`response`)return s.response;if(s.runtime.owner.kind!==`provider-runtime`||s.runtime.owner.provider!==a.options.provider)return F(`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}}:F(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function ts(e){let t=ns(e);if(!t.ok)return t;let n=rs(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 ns(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function rs(e){let t=is(e.flags?.devicePort),n=is(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:F(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function is(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function as(e){return await Zo({...e,command:`runtime clear`,use:h})}async function os(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await es({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!ss(i))return F(`INVALID_ARGS`,`runtime requires set, show, clear, or port-reverse`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await cs({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?ls(n,o):ds({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function ss(e){return e===`set`||e===`show`||e===`clear`}async function cs(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(yi(i)&&r?.appBundleId){let e=await as({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:li(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function ls(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function us(e){return e?D(e.device):void 0}function ds(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=us(i),s=ui(t.flags?.platform??a?.platform??o);if(!s)return F(`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 F(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=ki(a,Di(t.flags,s));return Fi(c)===0?F(`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 fs(e){return F(`INVALID_ARGS`,e)}function ps(e,t,r,i){try{return na({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return F(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}async function ms(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await ta({target:n,platform:i.platform,surface:r});return a?fs(a):null}async function hs(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await ta({target:n,platform:r});return i?fs(i):null}function gs(e){let t=mi(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:yi(n),clearRemovedRuntimeHints:Hi({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function _s(e){let{req:t,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:t.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!ee(a??``),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:Ln(t)}});let{appBundleId:d,appName:f}=await vs({runtime:s,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:u});if(c.clearRemovedRuntimeHints){if(!l)throw new n(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await si({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 vs(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 ys(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:F(`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:F(`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:F(`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 bs(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 ra({req:{...n,command:`snapshot`,positionals:[],flags:{...n.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a});return e.ok?{ok:!0,data:{...o.data,snapshot:e.data}}:xs(o.data,e.error)}catch(t){return xs(o.data,e(t))}}function xs(e,t){return{ok:!0,data:{...e,warnings:[...Ss(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Ss(e){return!e||!Array.isArray(e.warnings)?[]:e.warnings.filter(e=>typeof e==`string`)}const Cs=`open-command-roundtrip`;function ws(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=D(d),h.target=d.target??`mobile`,h.device=d.name,h.id=d.id,h.kind=d.kind,Ie(d.platform)&&(h.serial=d.id)),d&&O(d)&&(h.device_udid=d.id,h.ios_simulator_device_set=d.simulatorSetPath??null),{...h,...A(`Opened: ${o??s??t}`)}}function Ts(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 Es(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:Ln(e)}}function Ds(e,t){let n=t.claim?D({platform:t.claim.device.family,appleOs:t.claim.device.appleOs}):D(e),r=k(e.platform)?`--udid`:`--serial`;return[`agent-device device status`,`--platform ${hn(n)}`,`${r} ${hn(e.id)}`,...In(t.classification)?[`--stale`]:[]].join(` `)}function Os(e,t){let n=t.claim,r=Ds(e,t),i=D(n?{platform:n.device.family,appleOs:n.device.appleOs}:e);return F(`DEVICE_IN_USE`,n?`${i} device ${e.id} is owned by session "${n.session}" in workspace "${n.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:ks(t.classification),classification:t.classification,deviceKey:t.deviceKey,...n?{owner:{session:n.session,workspace:n.workspace,stateDir:n.stateDir}}:{},recovery:{command:r}},{hint:`Inspect the owner with: ${r}`,retriable:!1})}function ks(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function As(e){return e.internal?.resolvedSessionScope??Ei(e)}function js(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){jt(t,{});return}St(n)&&(pt(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 Ms(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ns(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:Cs,appTarget:t,appBundleId:n}}async function Ps(e){let{req:t,sessionName:n,sessionStore:r,logPath:i,device:a,openTarget:o,openPositionals:s,appName:c,surface:l,appBundleId:u,runtimeHints:d,lifecycle:f,applyRuntimeHints:p,existingSession:m,deviceClaim:h}=e,g=t.flags?.relaunch===!0,_=u,v=Date.now(),y=await Fs({req:t,sessionName:n,sessionStore:r,device:a,surface:l,sessionAppBundleId:_,appName:c,existingSession:m});if(y.type===`response`)return y.response;let b=y.session??m,x=Date.now(),ee=await f.operations.openApplication({target:o,positionals:s,outPath:t.flags?.out,runtimeLaunchUrl:d?.launchUrl,appBundleId:_,surface:l,hasExistingSession:m!==void 0,relaunch:g,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:Ms(a,t),stateDir:r.resolveDaemonStateDir(),runtimeHints:li(d),applyRuntimeHints:p,execution:Es(t,i,m?.trace?.outPath)});_=ee.appBundleId??_;let S={...ee.timing},C=o?Ns(x,o,_):void 0;if(wn(t.meta?.requestId)){let e=kn();return F(e.code,e.message,e.details)}m&&Xr({session:m,command:`open`,positionals:[],flags:void 0});let w=Ts({existingSession:b,sessionName:m?.name??vi(t),sessionScope:m?.sessionScope??As(t),device:a,surface:l,appBundleId:_,appName:c});w.lease=ni({req:t,existingLease:m?.lease}),h&&(w.deviceClaim=h),t.runtime!==void 0&&Ci(r,n,d);let te=r.ensureSessionDir(n),T=ct(te,t.meta?.requestId??sn().requestId);S.totalDurationMs=Math.max(0,Date.now()-v),N({level:`info`,phase:`open_timing`,durationMs:S.totalDurationMs,data:S});let ne=ws({sessionName:w.name,sessionStateDir:te,runnerLogPath:Ft(te),requestLogPath:T,eventLogPath:r.resolveEventLogPath(n),appName:c,appBundleId:_,surface:l,startup:C,timing:S,device:a,runtime:d,runtimeHintCount:Fi,sessionReused:m!==void 0});return js({session:w,existingSession:m,saveScriptRequested:!!t.flags?.saveScript,responseData:ne}),r.set(n,w),r.recordAction(w,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:d,result:ne}),{ok:!0,data:ne}}async function Fs(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=Is(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 Is(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=Ts({existingSession:o,sessionName:o?.name??vi(t),sessionScope:o?.sessionScope??As(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=ni({req:t,existingLease:o?.lease}),s}function Ls(e){let{req:t,device:n,sessionStore:r}=e,i=r.toArray().find(e=>e.device.id===n.id);if(i)return Mi(t,i)?F(`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.`}):Rs(i,n)}function Rs(e,t){return F(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:t.id,deviceName:t.name,hint:Ji(e,`device-in-use`)})}async function zs(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;return Sr(r)?await ii({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o}):{status:`not-required`}}async function Bs(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=Ls({req:t,device:a,sessionStore:i});if(p)return p;let m=await zs({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(m.status===`conflict`)return Os(a,m.conflict);let h=m.status===`acquired`?m.ownership:void 0,g={mayHaveStarted:!1};try{let e=await _s({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 Vs(h,g),e.response;g.mayHaveStarted=!0;let f=t.positionals??[],p=s??e.details.appBundleId,m=await Ps({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 Vs(h,g),m}catch(e){throw await Vs(h,g),e}}async function Vs(e,t){if(e){if(t.mayHaveStarted){N({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:e.deviceKey}});return}await Gr(e)}}const Hs=new Map;async function Us(e){let t=S({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Xo({...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,C)};case`open-apply-runtime-hints`:{let t=await r(e.device,ne);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,v);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,w);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function Ws(e){let t=gs(e);if(t.type===`response`)return t;let n=await Us({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 Gs(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await ys({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 F(`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=ps(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return fs(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 ms({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await Po(i.device);await o.internal?.retainDeviceExecutionLock?.(d.id);let f=await Ws({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;R(i);let h=await _s({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 Ps({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 fs(`open --relaunch requires an app argument.`);let l=await hs({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await I(o.flags??{},di(c));await o.internal?.retainDeviceExecutionLock?.(u.id);let d=ps(u,o.flags?.surface,c);if(typeof d!=`string`)return d;let f=await ms({shouldRelaunch:s,openTarget:c,surface:d,device:u});if(f)return f;let p=await Ws({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 Cn(Hs,u.id,async()=>await Bs({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 Ks(e,t,n){if(!st(t))return{kind:`not-armed`};let r=t.actions.length;V(e,t,n,`close`,{session:t.name,...A(`Closed: ${t.name}`)});let i=Ct(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`}:(mt(t),{kind:`aborted`})}function qs(t,n){let r=e(n),i=Tt(t.scriptPublication??Mt);return{ok:!1,error:{...r,details:{...r.details,session:t.name,...i?{savedScript:i}:{}},retriable:!0}}}function Js(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||V(r,n,t,`close`,{session:n.name,...A(`Closed: ${n.name}`)});try{let e=r.writeSessionLog(n,{force:ft(n,t.flags?.force)});e.written&&ot(n,e.path);return}catch(e){return Ys(e)}}function Ys(t){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return t instanceof n?new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${t.message}`,{...t.details,...r},t.cause):new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e(t).message}`,r)}async function Xs(e){let t=e.clearRuntimeHints?te:m,n=await Xo({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,m)};let r=await n.bind(e.device,te);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Zs(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=Qs(t,n),m=a.getRuntimeHints(r);await $s(n,a,f);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&yi(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:li(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`,()=>Ur(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}function Qs(e,t){return ji(t.device)&&!e.flags?.shutdown&&!t.screenRecording&&!t.lease&&!t.device.simulatorSetPath}async function $s(e,t,n){let r=t.get(e.name)??e;r.screenRecording&&await n(`recording`,()=>Ti({session:r,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>Ui({session:e,sessionName:e.name,sessionStore:t})),await n(`audio_probe`,async()=>{await zr(e,`session-close`)}),await n(`apple_perf`,()=>qi(e)),await n(`android_native_perf`,()=>hi(e)),await n(`android_snapshot_helper`,()=>ai(e))}function ec(e,t){return _i({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function tc(e){return e instanceof n?e:new n(`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 nc(e){return JSON.stringify(e.positionals??[])}async function rc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=st(n),s=nc(t);if(o&&!Rt(n,s)){let e=await ac({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:qs(n,tc(e))};yt(n,s)}let c=Ks(i,n,t);return c.kind===`failed`?{response:qs(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function ic(t){try{return{providerData:await Ir(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 ac(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(dc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Es(t,r,n.trace?.outPath)});return}catch(e){return e}}function oc(e,t){if(!e.flags?.saveScript||St(t))return;let r=t.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new n(`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 n(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function sc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await pc({req:t,logPath:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(oc(t,s),t.internal?.closeAppOnly===!0&&!t.positionals?.[0])return F(`INVALID_ARGS`,`App-only close requires an app target`);let c=await Xs({device:s.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!s.appBundleId&&yi(i.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(c.type===`response`)return c.response;if(R(s),t.internal?.closeAppOnly===!0)return await uc({req:t,session:s,logPath:r,lifecycle:c.runtime});let l=await rc({req:t,session:s,logPath:r,sessionStore:i,lifecycle:c.runtime});if(`response`in l)return l.response;let u=await cc({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:lc({session:s,repair:l,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:u.shutdownResult,providerData:u.providerData})}async function cc(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Zs({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:ac,finalizeOrdinaryCloseScript:Js}),m=await ic({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=ec(r,u),g=d??h;if(g?n.deviceClaim&&N({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await Gr(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function lc(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:Ve({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...A(c),...o,...s}}}async function uc(e){let{req:t,session:n,logPath:r,lifecycle:i}=e,a=t.positionals?.[0];if(!a)return F(`INVALID_ARGS`,`App-only close requires an app target`);let o=await ac({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...A(`Closed: ${a}`)}}}function dc(e,t){return fc(e)||t.device.platform===`web`}function fc(e){return(e.positionals?.length??0)>0}async function pc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return F(`SESSION_NOT_FOUND`,`No active session`);let a=await Xs({device:await X({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:Es(t,n)}),{ok:!0,data:{app:t.positionals[0],...A(`Closed: ${t.positionals[0]}`)}})}function mc(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function hc(e,t){let r=t?.subject??`Payload`,i=e.trim();if(!i)throw new n(`INVALID_ARGS`,`${r} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!U.statSync(a).isFile())throw new n(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof n)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new n(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new n(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(mc(i))return{kind:`inline`,text:i};throw new n(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function gc(e){let t=hc(e,{subject:`Push payload`}),r=t.kind===`inline`?t.text:await _c(t.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof n?t:new n(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function _c(e){try{return await oa.readFile(e,`utf8`)}catch(t){let r=t.code;throw r===`ENOENT`?new n(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new n(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new n(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new n(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function vc(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=wc(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?Ii(l,t.meta?.tenantId):j.expandHome(c.appPathInput);if(!U.existsSync(s))return F(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await X({session:a,flags:o,ensureReady:!1}),d=Io(n,(await Lo(e.inspectFacts)(u)).operations.deployApp);if(d)return d;let f=await Ro(e.bindDevice)(u,_e);a&&R(a);let p=await f.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),m=bc(u,c.app,s,p),h=Ve(m,`Installed: ${m.appName??Qe(m)}`),g=Cc(a,m);return g&&g!==a&&i.set(r,g),V(i,g,t,n,h),{ok:!0,data:h}}finally{l&&Bi(l)}}async function yc(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 F(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await gc(Tc(c,t.meta?.cwd)),u=await X({session:i,flags:a,ensureReady:!1}),d=await Lo(e.inspectFacts)(u),f=Io(`push`,d.operations.ensureReady)??Io(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Ro(e.bindDevice)(u,we);await p.operations.ensureReady({}),i&&R(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=O(u)?Ve({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):Ve({platform:D(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return V(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function bc(e,t,n,r){return O(e)?xc(t,n,r):Sc(e,t,n,r)}function xc(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 Sc(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 Cc(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function wc(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:F(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:F(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Tc(e,t){let n=hc(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>j.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Ec(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await vc({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await zo({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await yc({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Dc(e,t,n){return await Te(e,t,n)}function Oc(e,t){return e.operations.ensureReady(t)}function kc(e,t,n){return e.operations.listApps({device:t,filter:n})}const Ac=new Set([M.install,M.reinstall,M.installFromSource,M.push]),jc=new Map([[M.installFromSource,Gt.installSource]]);function Mc(e,t){let n=Nc(e);if(n)return t!==void 0&&n.required.every(e=>Fc(t,e))}function Nc(e){let t=Pc(e);if(!t)return;let n=ge.find(e=>e.name===t)?.platformExecution;if(!(n?.kind!==`device-runtime`||!(`use`in n)))return n.use}function Pc(e){if(Ac.has(e))return jc.get(e)??e}function Fc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Ic(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return Lc(t,r);case`devices`:return await zc(t);case`capabilities`:return await Gc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`apps`:return await Zc({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts});default:return null}}function Lc(e,t){let n=Ei(e);return{ok:!0,data:{sessions:t.toArray().filter(e=>gi(e,n)).map(e=>Rc(e,t))}}}function Rc(e,t){let n=t.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:n,runnerLogPath:Ft(n),platform:D(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)&&!Fe(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}}async function zc(e){try{return{ok:!0,data:{devices:(await Bc(e)).map(nl)}}}catch(e){let t=s(e);return F(t.code,t.message,t.details)}}async function Bc(e){let t=e.flags?.platform;return Wc(await zn(Vc(e,t)),e.flags?.platform,e.flags?.target)}function Vc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:Hc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Uc(n?.androidDeviceAllowlist)}}function Hc(e,t,n){return Re({simulatorSetPath:Rn(e),platform:t,target:n})}function Uc(e){let t=P(e);return t?Array.from(t).sort():void 0}function Wc(e,t,n){let r=t?e.filter(e=>rl(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function Gc(e){let t=await tl({...e,ensureReady:!1,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Kc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Qc(n,e.inspectFacts),[a,o,s]=e.bindDevice?await Promise.all([e.bindDevice(n,ke).then(e=>e.facts.appLogInspect.available),e.bindDevice(n,fe).then(e=>e.facts.networkDump.available),e.bindDevice(n,re).then(e=>e.facts.screenRecordingStart.available)]):[!1,!1,!1];return{ok:!0,data:{device:nl(n),availableCommands:qn().filter(e=>{if(e===`appstate`&&r)return!0;let t=Mc(e,i);if(t!==void 0)return t;let c=Xc(e,i);return c===void 0?e===`logs`?a:e===`network`?o:e===`record`?s:Gn(e,n):c})}}}function Kc(e,t,n){return!t||!O(e)&&!Fe(e)||!Fo(n,t)?!1:qc(t)||Jc(e,t)}function qc(e){return!!(e.appName||e.appBundleId)}function Jc(e,t){return!!(Fe(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}const Yc=Object.freeze({apps:[`ensureReady`,`listApps`],appstate:[`ensureReady`,`appState`],shutdown:[`shutdownTarget`],open:[`resolveOpenTarget`,`prepareApplicationOpen`,`openApplication`],close:[`closeApplication`,`finalizeApplicationClose`],prepare:[`prepareAppleRunner`],runtime:[`clearRuntimeHints`]});function Xc(e,t){let n=Yc[e];if(n)return t?n.every(e=>t.operations[e].available):!1}async function Zc(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await tl({req:t,sessionName:n,sessionStore:r,ensureReady:!1,androidAvdSelection:`include-stopped`});if(`response`in o)return o.response;let{device:s}=o,c=an(t.flags?.appsFilter),l=P(t.flags?.androidDeviceAllowlist),u=await $c({device:s,inspectFacts:a,bindDevice:i});if(`response`in u)return u.response;let d=u.runtime;return el(await kc(d,await Oc(d,{serial:t.flags?.serial,androidSerialAllowlist:l?[...l].sort():void 0}),c))}async function Qc(e,t){if(t)try{return await t(e)}catch{return}}async function $c(e){if(!e.inspectFacts)throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),r=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:F(`UNSUPPORTED_OPERATION`,`apps is not supported on this device`,void 0,r.hint?{hint:r.hint}:void 0)};if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,ve)}}function el(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function tl(e){let{req:t,sessionName:n,sessionStore:r,ensureReady:i,androidAvdSelection:a}=e,o=r.get(n),s=t.flags??{},c=Y(t.command,o,s);return c?{response:c}:{device:await X({session:o,flags:s,ensureReady:i,androidAvdSelection:a})}}function nl({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:D({platform:r.platform,appleOs:n}),...k(r.platform)&&n?{appleOs:n}:{}}}function rl(e,t){return Ne(e,t)}const il=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,al=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function ol(e){return t=>F(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 sl(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function cl(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function ll(e){return e.available?null:F(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function ul(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function dl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&No(a))return F(`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=Y(`appstate`,i,a);if(s)return s;let c=k(i?.device.platform)&&Fo(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return F(`SESSION_NOT_FOUND`,il);if(u&&!c)return F(`SESSION_NOT_FOUND`,al);if(c&&i){let e=i.appName??i.appBundleId;return!i.appName&&!i.appBundleId?Fe(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`?{ok:!0,data:{platform:D(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}}:F(`COMMAND_FAILED`,`No foreground app is tracked for this ${Fe(i.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:D(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...O(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await X({session:i,flags:a,ensureReady:!1});if(O(d))return F(`SESSION_NOT_FOUND`,il);if(Fe(d))return F(`SESSION_NOT_FOUND`,al);let f=await Zo({command:`appstate`,device:d,use:ye,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>F(`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:pl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:D(d),package:m.package,activity:m.activity}}}async function fl(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 c=P(a.androidDeviceAllowlist),l=c?[...c].sort():void 0,u=Oe({headless:a.headless===!0}),d;try{d=await X({session:i,flags:a,ensureReady:!1,androidAvdSelection:`include-stopped`})}catch(e){let t=s(e);if(u.kind===`boot-target-headless`&&!ul(a.device,i?.device)&&t.code===`DEVICE_NOT_FOUND`)return F(`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 F(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${a.target}.`);let f=await Xo({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:ol(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:D(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=Y(t.command,i,a);if(o)return o;let s=await X({ensureReady:!1,flags:a,session:i,androidAvdSelection:`include-stopped`}),c=ll((await sl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(i&&i.device.platform===s.platform&&i.device.id===s.id)return F(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:D(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await cl(e.bindDevice)(s,je)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:D(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...k(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:F(l.error?.code??`COMMAND_FAILED`,ml(l),{platform:D(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await dl({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function pl(e){let t=P(e);return t?[...t].sort():void 0}function ml(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function hl(e){let t=Vn(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 gl(e,t){ia(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=Wn(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function _l(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=Un(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 vl(e){return Jr.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function yl(e){if(!_(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const bl=[`probe`],xl=[`start`,`status`,`stop`],Sl=`audio probe requires ${xl.join(`, `)}`;async function Cl(t){let n=wl(t);if(!n.ok)return n;let r=await yl(n.session.device);if(r)return await El(t,n,r);let i=Qn();if(!i.probeAudio)return F(`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 wl(e){let t=Tl(e);if(!t.ok)return t;let n=Dl(e.req);if(!n.ok)return n;let r=Ol(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function Tl(e){let t=e.sessionStore.get(e.sessionName);return t?Gn(`audio`,t.device)?{ok:!0,session:t}:F(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):F(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function El(t,n,r){try{return{ok:!0,data:await xi({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 Dl(e){if(!kl(e.positionals?.[0]))return F(`INVALID_ARGS`,`audio requires probe`);let t=Al(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:F(`INVALID_ARGS`,Sl)}function Ol(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return F(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=jl(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 F(`INVALID_ARGS`,n.message);let r=jl(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?F(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function kl(e){let t=(e??`probe`).toLowerCase();return bl.includes(t)?`probe`:void 0}function Al(e){let t=(e??`status`).toLowerCase();return xl.includes(t)?t:void 0}function jl(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 Ml(t){let n=Nl(t.req,t.area);if(!n.ok)return n;let{session:r}=t;if(r.device.platform!==`android`)return F(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return F(`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 Hl(t,r,r.appBundleId,n):await Ul(t,r,r.appBundleId,n)}}catch(t){return{ok:!1,error:e(t)}}}function Nl(e,t){let n=Vl(e,t);return t===`cpu`?Pl(e,n):Fl(e,n)}function Pl(e,t){let n=Il(e,1),r=Il(e,2),i=Il(e,3);return Xt(n)?Ll(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:F(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):F(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):F(`INVALID_ARGS`,qt)}function Fl(e,t){let n=Il(e,1),r=Il(e,2);return Rl(n)?Yt(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:F(`INVALID_ARGS`,`perf trace requires --kind perfetto`):F(`INVALID_ARGS`,Kt):F(`INVALID_ARGS`,`perf trace action must be start or stop`)}function Il(e,t){return(e.positionals?.[t]??``).toLowerCase()}function Ll(e){return e===`start`||e===`stop`||e===`report`}function Rl(e){return e===`start`||e===`stop`}function zl(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),Jl(t)}function Bl(e,t,n){return t?j.expandHome(t,e.req.meta?.cwd):ql(e.sessionStore,e.sessionName,n)}function Vl(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 Hl(e,t,n,r){if(r.action===`start`){Gl(t);let i=Bl(e,r.outPath,`cpu.perf.data`);return zl(e,await sr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Yl(t,`cpu-profile`,r.kind);if(r.action===`report`){await Wl(i);let n=Bl(e,r.outPath,`cpu-report.json`);return await yr(t.device,i,n,{adb:e.androidAdbExecutor})}let a=Kl(e,r.outPath,i);return zl(e,await pr(t.device,i,a,{adb:e.androidAdbExecutor}))}async function Ul(e,t,n,r){if(r.action===`start`){Gl(t);let i=Bl(e,r.outPath,`app.perfetto-trace`);return zl(e,await cr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=Yl(t,`trace`,r.kind),a=Kl(e,r.outPath,i);return zl(e,await lr(t.device,i,a,{adb:e.androidAdbExecutor}))}function Wl(e){if(e.state===`running`)throw new n(`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 Gl(e){let t=e.nativePerf?.android;if(t?.state===`running`)throw new n(`COMMAND_FAILED`,`Android ${t.kind} ${t.type} is already running for this session.`,{hint:t.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 Kl(e,t,n){return t?Bl(e,t,n.outPath):n.outPath}function ql(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return H.join(e.ensureSessionDir(t),`${r}-${n}`)}function Jl(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 Yl(e,t,r){let i=e.nativePerf?.android;if(i?.type===t&&i.kind===r)return i;throw new n(`COMMAND_FAILED`,`No Android ${r} ${t} is active for this session.`,{hint:t===`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 Xl(t,n){let r=Zl(t.req);if(!r.ok)return r;if(n.device.platform===`android`)return F(`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 F(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return F(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await nu(t,n,r):r.action===`stop`?await ru(t,n,r):await cu(t,n,r)}catch(t){return{ok:!1,error:e(t)}}}function Zl(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Ql(t):n===`trace`?$l(t):F(`INVALID_ARGS`,Qt)}function Ql(e){if(e[1]?.toLowerCase()!==`profile`)return F(`INVALID_ARGS`,`perf cpu requires profile`);let t=eu(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=tu(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 $l(e){let t=eu(e[1],`perf trace`,!1);if(!t.ok)return t;let n=tu(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 eu(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:F(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function tu(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:F(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function nu(e,t,n){if(t.applePerf?.active)return F(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??fu(n.mode),i=du(e,n),a=await Pr({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=pu(`started`,a);return uu(e,t,o),{ok:!0,data:o}}async function ru(e,t,n){let r=t.applePerf?.active;if(!r)return F(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?j.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await Rr(r,i)}catch(n){throw au(n)&&iu(e,t),n}ou(e,t,a);let o=pu(`stopped`,a);return uu(e,t,o),{ok:!0,data:o}}function iu(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function au(e){return s(e).details?.captureCleanedUp===!0}function ou(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...su(n)},e.sessionStore.set(e.sessionName,t)}function su(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function cu(e,t,n){if(n.mode!==`cpu-profile`)return F(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return F(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=du(e,n),i=lu(t,n);if(!i.ok)return i;let a={perf:`reported`,...await Kr({tracePath:j.expandHome(i.value,e.req.meta?.cwd),outPath:r,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return uu(e,t,a),{ok:!0,data:a}}function lu(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:F(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function uu(e,t,n){V(e.sessionStore,t,e.req,`perf`,n)}function du(e,t){if(t.outPath)return j.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 fu(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function pu(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 mu=`hdc-shell-proc-status`;function hu(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 gu(e){let t=yu(e,`VmRSS`);if(t===void 0)return;let n=yu(e,`VmHWM`);return{totalRssKb:t,...n===void 0?{}:{peakRssKb:n}}}async function _u(e,t){let r=await vu(e,t),i=gu((await Xi(e,[`shell`,`cat`,`/proc/${r}/status`],{timeoutMs:15e3})).stdout);if(!i)throw new n(`COMMAND_FAILED`,`Could not read resident memory for ${t}`,{hint:`Verify the app is still running, then retry perf memory sample.`,details:{bundleName:t,pid:r}});return{...i,measuredAt:new Date().toISOString(),method:mu,pid:r}}async function vu(e,t){let r=await Xi(e,[`shell`,`pidof`,t],{allowFailure:!0,timeoutMs:15e3}),i=r.exitCode===0?hu(r.stdout):void 0;if(i!==void 0)return i;throw new n(`COMMAND_FAILED`,`Could not find a running process for ${t}`,{hint:`Open the app in this session, then retry perf memory sample.`,details:{bundleName:t}})}function yu(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}Fn();async function bu(e,t={}){let n=Cu(e);return Eu(e)?e.appBundleId?(await Tu(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:Du(e)},n):n}async function xu(e,t){let n=wu(e);return Eu(e)?t.action===`sample`?(n.metrics={memory:await ju(e,t)},n):(n.artifact=await Nu(e,t),n.support=zu(n.artifact.support)??Ru(e),n):t.action===`snapshot`?(n.artifact=Iu(e,Pu(e,t.kind)),n.support=zu(n.artifact.support)??Ru(e),n):(n.metrics={memory:{available:!1,reason:`Not implemented for this platform in this release.`}},n)}function Su(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function Cu(e){return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:Su()},sampling:{fps:Au(e)}}}function wu(e){return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:Ou(e),snapshot:ku(e)}}}async function Tu(e,t,n,r){if(t.device.platform===`harmonyos`)return;let i=t.device.platform===`android`?await Bu(mr(t.device,n,{adb:r.androidAdb})):await Bu(jr(t.device,n));e.metrics.fps=Hu(Vu(i),t)}function Eu(e){return Nn(e.device.platform)?.perf?.supportsObservations(e.device)??!1}function Du(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 Ou(e){return e.device.platform===`android`?{method:fr,description:gr,unit:`kB`,topConsumerLimit:5}:e.device.platform===`harmonyos`?{method:mu,description:`Resident memory snapshot from HarmonyOS /proc/<pid>/status. Values are reported in kilobytes.`,unit:`kB`,topConsumerLimit:1}:Nr(e.device)}function ku(e){return e.device.platform===`android`?{method:hr,description:vr,defaultKind:`android-hprof`,artifactOnly:!0}:e.device.platform===`harmonyos`?{method:`unsupported`,description:`HarmonyOS memory snapshot capture is not available through HDC.`,artifactOnly:!0}:{method:Tr,description:Yi,defaultKind:`memgraph`,artifactOnly:!0}}function Au(e){return e.device.platform===`android`?{method:ur,description:dr,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:e.device.platform===`harmonyos`?Su():Zr(e.device)}async function ju(e,t){return e.appBundleId?Vu(e.device.platform===`android`?await Bu(_r(e.device,e.appBundleId,{adb:t.androidAdb})):e.device.platform===`harmonyos`?await Bu(_u(e.device,e.appBundleId)):await Bu(Mu(e))):{available:!1,reason:Du(e)}}async function Mu(e){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Du(e));return await Lr(e.device,e.appBundleId)}async function Nu(e,t){if(!e.appBundleId)throw new n(`INVALID_ARGS`,Du(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Pu(e,t.kind),i=Fu(t,r);return e.device.platform===`android`?r===`android-hprof`?await or(e.device,e.appBundleId,i,{adb:t.androidAdb}):Iu(e,r):e.device.platform===`harmonyos`||r!==`memgraph`?Iu(e,r):await Qr(e.device,e.appBundleId,i)}function Pu(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Fu(e,t){if(e.out)return j.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 Iu(e,t){let n=Ru(e),r=Lu(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Lu(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 Ru(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)?{...Yr(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 zu(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Bu(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Vu(t){if(t.status===`fulfilled`)return{available:!0,...t.value};let n=e(t.reason);return{available:!1,reason:n.message,error:n}}function Hu(e,t){if(e.available!==!0)return e;let n=Uu(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Uu(e,t){let n=Wu(t.windowStartedAt),r=Wu(t.windowEndedAt)??Wu(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:Gu(e)})).slice(-12)}function Wu(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Gu(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 Ku=`adb-shell-dumpsys-cpuinfo`;async function qu(e,t,n={}){let r=dn(e,n.adb);try{return Ju((await r([`shell`,`dumpsys`,`cpuinfo`],{timeoutMs:15e3})).stdout,t,new Date().toISOString())}catch(e){throw Zu(t,e)}}function Ju(e,t,n){let r=new Set,i=0;for(let n of Me(e)){let e=Yu(n,t);e&&(i+=e.percent,r.add(e.processName))}return{usagePercent:br(i),measuredAt:n,method:Ku,matchedProcesses:[...r]}}function Yu(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)||!Xu(i,t)))return{percent:r,processName:i}}function Xu(e,t){return e===t||e.startsWith(`${t}:`)}function Zu(e,t){return t instanceof n?new n(t.code,t.message,{...t.details??{},metric:`cpu`,package:e},t):new n(`COMMAND_FAILED`,`Failed to sample Android cpu for ${e}`,{metric:`cpu`,package:e},t)}async function Qu(e,t){let n=await bu(e,t),r=await xu(e,{...t,action:`sample`}),i=await $u(e,t.androidAdb);return{session:e.name,platform:D(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:nd(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:Cs,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},cpu:td(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 $u(t,n){if(t.device.platform!==`android`)return ed();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 qu(t.device,t.appBundleId,{adb:n})}}catch(t){let n=e(t);return{available:!1,reason:n.message,error:n}}}function ed(){return{available:!1,reason:`Point CPU sampling is unavailable. Use a native CPU profile for CPU evidence.`}}function td(e){return e.device.platform===`android`?{method:Ku,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 nd(e){let t=rd(e),n=t.at(-1);return n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:Cs,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:Cs}}function rd(e){let t=[];for(let n of e){let e=id(n);e&&t.push(e)}return t.slice(-20)}function id(e){if(e.command!==`open`)return;let t=e.result?.startup;if(!t||typeof t!=`object`)return;let n=t,r=ad(n.durationMs),i=od(n.measuredAt);if(!(r===void 0||!i||n.method!==`open-command-roundtrip`))return{durationMs:r,measuredAt:i,method:Cs,appTarget:sd(n.appTarget),appBundleId:sd(n.appBundleId)}}function ad(e){if(!(typeof e!=`number`||!Number.isFinite(e)))return Math.max(0,Math.round(e))}function od(e){if(!(typeof e!=`string`||e.trim().length===0))return e}function sd(e){return typeof e==`string`&&e.length>0?e:void 0}const cd=[`dump`,`log`],ld=`network requires ${cd.join(` or `)}`,ud=`network include mode must be one of: ${o.join(`, `)}`,dd=2048;async function fd(t){let n=t.sessionStore.get(t.sessionName);if(!n)return F(`SESSION_NOT_FOUND`,`network requires an active session`);try{let e=pd(t.bindDevice),r=(await e(n.device,fe)).facts.networkDump;if(!r.available)return vd(r.hint);let i=md(t.req);if(!i.ok)return i;let a=ue({action:i.action,include:i.include}),o=await e(n.device,a.use),s=n.appLog?.handle.inspect();return yd(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:dd,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(t){return{ok:!1,error:e(t)}}}function pd(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function md(e){let t=hd(e);if(!t.ok)return t;let n=gd(e);if(!n.ok)return n;let r=_d(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function hd(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return cd.includes(t)?{ok:!0,action:t}:F(`INVALID_ARGS`,ld)}function gd(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?F(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function _d(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return F(`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}:F(`INVALID_ARGS`,ud)}function vd(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function yd(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:dd,maxScanLines:e.entries.length},notes:e.notes}}}function bd(e,t){let n=Vr(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[xd(e.appLogFailure)]:Sd(n.state)}}function xd(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Sd(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 Cd(e,t){return Ni([...e,...t.notes??[]])}async function wd(e){let{req:t}=e;return t.command===`perf`?Ed(e):t.command===`logs`?zd(e):t.command===`events`?await Td(e):t.command===`network`?await fd(e):t.command===`audio`?await Cl(e):null}async function Td(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 Ed(t){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=t,o=i.get(r);if(!o)return F(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=Dd(n);if(!s.ok)return s;if(s.native)return o.device.platform===`android`?await Ml({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s.area}):await Xl(t,o);try{return{ok:!0,data:await Od(t,o,s)}}catch(t){return{ok:!1,error:e(t)}}}function Dd(t){let r=kd(t.positionals?.[0]);if(r instanceof n)return{ok:!1,error:e(r)};if(r===`cpu`||r===`trace`)return{ok:!0,native:!0,area:r};let i=Ad(t.positionals?.[1]);if(!i)return F(`INVALID_ARGS`,en);let a=jd(t.flags?.kind);return a instanceof n?{ok:!1,error:e(a)}:(Md(r,i)??Fd(t,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:Rd(t.flags?.out)}}async function Od(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await xu(t,{action:Pd(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`metrics`?await Qu(t,{androidAdb:a,sessionName:r,sessionStore:i}):await bu(t,{androidAdb:a})}function kd(e){if(e==null)return`metrics`;let t=e.toString().toLowerCase();return Jt(t)?t:new n(`INVALID_ARGS`,Qt)}function Ad(e){let t=(e??`sample`).toString().toLowerCase();return tn(t)?t:void 0}function jd(e){if(e!==void 0)return typeof e!=`string`||!Yt(e)?new n(`INVALID_ARGS`,Kt):e}function Md(e,t){if(e===`metrics`)return t===`sample`?void 0:F(`INVALID_ARGS`,`perf metrics only supports sample`);if(e===`memory`)return Nd(t)?void 0:F(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return F(`INVALID_ARGS`,`perf frames only supports sample`)}function Nd(e){return e===`sample`||e===`snapshot`}function Pd(e){if(Nd(e))return e;throw new n(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function Fd(e,t,n,r){return Id(e.flags?.out,t,n)??Ld(r,t,n)}function Id(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return F(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function Ld(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return F(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!Zt(e))return F(`INVALID_ARGS`,$t)}}function Rd(e){return typeof e==`string`&&e.length>0?e:void 0}async function zd(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r);if(!a)return F(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let e=Zd({...t,session:a}),r=(await e.bindDevice(a.device,ke)).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=Hd(se({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Bd(e,i)}catch(t){return{ok:!1,error:e(t)}}}async function Bd(e,t){switch(t.kind){case`path`:return Ud(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Wd(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Vd(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Yd(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Gd(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Kd(e)}}async function Vd(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Jd(e,t.appBundleId,n.owner,n.operations.appLogStart):await qd(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Hd(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):F(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ud(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=hl(a),s=bd(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 Wd(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=bd(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:Cd(t.notes,o)}}}function Gd(e,t,n){let r=n.resolveAppLogPath(t);return gl(r,e),{ok:!0,data:{path:r,marked:!0}}}function Kd(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return F(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=_l(r.resolveAppLogPath(n));return Or({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function qd(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await Dr({session:i,sessionName:a,sessionStore:o,resourcePath:Cr.resolvePath(o.resolveSessionDir(a))});let s=_l(o.resolveAppLogPath(a)),c=await Xd(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Jd(e,t,n,r){let{session:i}=e;return i.appLog?F(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Xd(e,t,r,n)}async function Yd(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return F(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await Dr({session:t,sessionName:n,sessionStore:r,resourcePath:Cr.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Xd(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=Cr.resolvePath(o.resolveSessionDir(a));try{let l=vl({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 Gi({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:Si({session:i,sessionName:a,sessionStore:o,error:e})}}}function Zd(e){if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new n(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Qd(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=H.resolve(n??`.`,t??`.agent-device/test-artifacts`);return H.join(i,r)}function $d(e,t){let n=t?H.relative(t,e):H.basename(e);return sf((n.length===0||n.startsWith(`..`)?H.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`))||`test`}function ef(e,t){U.mkdirSync(t,{recursive:!0}),rf(e,t)}function tf(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=nf(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(`
|
|
3
|
-
`)}\n`;U.writeFileSync(d,f),s||U.writeFileSync(H.join(o,`failure.txt`),f)}function nf(e,t){let n=[],r=new Map;for(let i of e){if(!of(i))continue;let e=af(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 rf(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 af(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 of(e){try{return U.statSync(e).isFile()}catch{return!1}}function sf(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 cf(e){let{inputs:t,cwd:r,platformFilter:i,discoverSources:a}=e,o=a({inputs:t,cwd:r}),s=[];for(let e of o){let{path:t,manifest:n}=e,r={kind:`run`,path:t,title:n.title,manifest:n};if(!i){s.push(r);continue}let a=n.device.platform;if(a.kind===`caller-bound`){s.push(r);continue}if(a.kind===`unspecified`){s.push({kind:`skip`,path:t,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${i}`});continue}mf(i,a.value)&&s.push(r)}if(s.filter(e=>e.kind===`run`).length===0)throw new n(`INVALID_ARGS`,`No replay tests matched${i?` for --platform ${i}`:``}.`);return s}function lf(e,t,n,r,i=0){let a=sf(H.basename(n,H.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function uf(e){return sf((e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`))||`suite`}function df(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 ff(e,t){return typeof e==`number`?e:t}function pf(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function mf(e,t){return e===`apple`?k(t):t===e}function hf(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const gf=2e3;async function _f(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=Cf({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=>Z(S,e),shard:u,onStep:d}).catch(t=>hf({error:e(t)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([C,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(wf(o,[...v]))},o)})]):await C,Z(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 vf(C)||(x=xf(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:gf}}),yf({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let t=await bf({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:S,emitDiagnostic:h});x?.status===`passed`&&t&&(x=Sf(x,`Replay test finalization failed: ${t.error.message}`));let n=Date.now();try{Z(S,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Z(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(t){let i=e(t);Z(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??hf({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}async function vf(e){return await Promise.race([e.then(()=>!0),la(gf).then(()=>!1)])}async function yf(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 bf(t){let{finalizeAttempt:n,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o,emitDiagnostic:s}=t;if(!n)return;let c=Date.now();Z(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=>Z(o,e)});return Z(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 Z(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}}),hf({error:n})}}function xf(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function Sf(e,t){return{...e,warnings:[...e.warnings,t]}}function Cf(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),Z(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function Z(e,t){e&&U.appendFileSync(e,`${JSON.stringify(t)}\n`)}function wf(e,t=[]){return hf({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 Tf(e){let t=Ef(e),n=await Df(e,t);return{result:Nf(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Ef(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}`]:[],$d(t.path,n)),maxAttempts:r+1}}async function Df(e,t){kf(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Of(e,t,r);if(Af(n,i),jf(e,i.outcome,r))break;Mf(e,t,i)}return n}async function Of(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=lf(i,a,r.path,o,n),h=H.join(t.testArtifactsDir,`attempt-${f}`);ef(r.path,h);let g=df({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,...Lf(d)},v=await _f({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 tf({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function kf(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:lf(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Lf(c)})}function Af(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 jf(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function Mf(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,...Lf(e.shard)})}function Nf(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Pf(e,t,n,r):Ff(e,t,n,r)}function Pf(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,...Lf(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}:{},...If(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Ff(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,...Lf(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}:{},...If(s)}}function If(e){return Lf(e)}function Lf(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Rf(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 zf(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 Bf(t,u,d);Wf(s,a);let p=s.shardPlan?Gf({entries:s.entries,total:s.total,emitProgress:a}):[];return s.shardPlan?p.push(...await Kf({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 Xf({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:$f(s.total,p,Date.now()-e)}}catch(e){let t=s(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function Bf(e,t,n){let r=Vf(e,t),i=Hf(r),a=r.length-i.length,o=uf(e.requestId),s=await Rf(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:Uf(e,o),total:s?.total??r.length}}function Vf(e,t){return cf({inputs:[...e.inputs],cwd:e.cwd,platformFilter:e.platformFilter,discoverSources:t})}function Hf(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Uf(e,t){return Qd({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Wf(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 Gf(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 Kf(e){return(await Promise.allSettled(e.shards.map(async t=>await Jf({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[qf(r,e.sessionName,t.reason)]:[]})}function qf(t,n,r){let i=e(r);return{file:t.entries[0]?.entry.path??`shard-${t.shardIndex+1}`,session:Yf(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 Jf(e){let{shard:t,sessionName:n}=e;return await Zf({...e,entries:t.entries,sessionName:Yf(n,t),shard:t})}function Yf(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Xf(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 Tf({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:pf(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:ff(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),Qf(t,o,p))break}return g}async function Zf(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 Tf({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:pf(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:ff(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),Qf(b,o,m))break}return _}function Qf(e,t,n){return n()||t.failFast===!0&&e.result.status===`failed`||e.infrastructure}function $f(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,l=c(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,...l?{snapshotDiagnostics:l}:{}}}function ep(e){return JSON.stringify(tp(e))}function tp(e){if(Array.isArray(e))return e.map(tp);if(!e||typeof e!=`object`)return e;let t=e;return Object.fromEntries(Object.keys(t).sort().map(e=>[e,tp(t[e])]))}function np(e){let t=ep(rp(e));return aa(`sha256`).update(t,`utf8`).digest(`hex`)}function rp(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)=>ip(e,n[t]??null,r?.[t]??null))}}function ip(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 ap(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=op({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function op(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>sp({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>cp({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>lp(n,r)];for(let e of s){let t=e();if(t)return t}}function sp(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 cp(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 lp(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 up(e,t){let r=U.readFileSync(e,`utf8`),i=r.trimStart()[0];if(i===`{`||i===`[`)throw new n(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let a=Ot(r),o=wt(r),s=np({actions:a.actions,actionLines:a.actionLines,actionSourcePaths:a.actionSourcePaths,metadata:{platform:t?.platform??Pt(a.actions)??o.platform,target:t?.target??o.target}}),c=a.actions.length;return{actions:a.actions,actionLines:a.actionLines,actionSourcePaths:a.actionSourcePaths,metadata:o,planDigest:s,resolveEntryIndex:e=>ap(e,c,s)}}function dp(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function fp(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&ie(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function pp(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 mp(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=pp(i,a);return{matchCount:n,observed:r,mismatches:[...r?p(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 hp(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...p(e,r),...oe(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 gp(e,t,n,r,i,a){if(n.targetEvidences)return _p(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return yp(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return yp(e,n,r,i,a);if(s.kind===`post-resolution`){let c=dp({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return yp(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return bp(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=fp({recorded:o,token:s.token});if(c.kind===`skip`)return yp(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,vp(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?bp(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 _p(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 yp(e,n,r,i,a);let d=fp({recorded:o[c],token:u.token});if(d.kind===`skip`)return yp(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,vp(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 bp(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function vp(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 yp(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 bp(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=xp(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=Sp(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 xp(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 Sp(e,t,n){return n.status===`guard-mismatch`?mp(e,n.evidence,t):hp(e,n.evidence)}async function Cp(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=pa(e.varSources),o=[],s=[],c=Dp(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!Ep(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(Op(u,n.length,r,e))}let d=Ca(r,a,Tp(e,u)),f=Ea(a),p=t.diagnosticsMarker(),m=await gp(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:wp(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 wp(e,t){return t.length===0?e:[...new Set([...e,...t])]}function Tp(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function Ep(e){return!!(e&&e.command!==`replay`)}function Dp(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(Ep(n))return n.command===`close`?t:void 0}}function Op(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function kp(e){let{sessionStore:t,sessionName:n}=e,r=()=>t.get(n);return{view(){let e=r();if(e)return{repairBoundary:xt(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){let i=r();i&&(vt(i,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Ap(e.sourcePath),firstArm:e.firstArm}),t.set(n,i))},demoteForRerunIfArmed(){let e=r();!e||xt(e)===void 0||lt(e)},markCompleteIfArmed(){let e=r();!e||xt(e)===void 0||(ut(e),t.set(n,e))},markSessionHeldIfArmed(e){if(e.ok||!bt(r()))return e;let t=jp(e);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){t.clearRepairTombstone(n)},clearCorrectiveWatermarkIfExpected(e){let i=r();!i||i.pendingRecordAndHeal?.expectedFrom!==e||(Pp(i),t.set(n,i))},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){let i=r();i&&(Np({session:i,...e}),t.set(n,i))}}}}function Ap(e){let t=H.dirname(e),n=H.basename(e,H.extname(e));return H.join(t,`${n}.healed.ad`)}function jp(e){let t=e.error.details?.divergence;if(!(!Se(t)||!Mp(t.resume)))return t.resume}function Mp(e){return!Se(e)||typeof e.allowed!=`boolean`||!Number.isInteger(e.from)||typeof e.planDigest!=`string`?!1:e.allowed||typeof e.reason==`string`}function Np(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Fp({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Pp(e){e.pendingRecordAndHeal=void 0}function Fp(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 Ip(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=ie(`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 Lp(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),It(e.command)){let n=Rp(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=ie(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=Ip([...e.positionals]);n&&t.push(n)}return Ni(t).filter(e=>e.trim().length>0)}function Rp(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&zp(n)?t.slice(0,-1):t}function zp(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Bp(e){let t=Vp({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 Vp(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=Hp({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function Hp(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 Up(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Wp(n))return`manual`;let i=Gp(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Wp(e){return e.ancestry.length>0?!0:e.scrollRegion!==void 0&&Kp(e.scrollRegion)}function Gp(e,t){let n=Ke(t),r=Jp(e.ancestry,n,t),i=e.scrollRegion;return i&&Kp(i)?r&&qp(i,n,t):r}function Kp(e){return e.id!==void 0||e.label!==void 0}function qp(e,t,n){return n.some(n=>Vt(Bt(n,t),e))}function Jp(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=ze(n,t,e.length);return!r.broken&&ce(r.chain,e)})}const Yp=new WeakMap;function Xp(e){return{store:t=>Zp(e,t),finalize:(t,n)=>Qp({...e,evidence:t,projection:n})}}function Zp(e,t){let{sessionStore:n,sessionName:r}=e,i=n.get(r);if(!i)throw Error(`Internal observation session is no longer available.`);wr(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 Yp.set(o,{sessionName:r,session:i,sessionCreatedAt:i.createdAt,snapshot:t,snapshotGeneration:a,runtimeRevision:Ar(i),refFrame:em(i)}),{evidence:o,refsGeneration:a}}function Qp(e){let t=Yp.get(e.evidence);Yp.delete(e.evidence);let n=nm(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!$p(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!rm(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Hr(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function $p(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&&Ar(n)===t.runtimeRevision&&tm(em(n),t.refFrame)}function em(e){return{state:e.refFrameState,scope:e.refFrameScope,tree:e.refFrameTree,generation:e.refFrameGeneration}}function tm(e,t){return e.state===t.state&&e.scope===t.scope&&e.tree===t.tree&&e.generation===t.generation}function nm(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 rm(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function im(e){let{sessionStore:n,sessionName:r,divergence:i,responseLevel:a}=e,o,s,c=tt({divergence:i,level:a,writeOverflowArtifact:e=>{let i=t(e),a=sm(n,r,i);return`artifactPath`in a&&(o=i,s=a.artifactPath),a}}),l=(o??c).screen;if(l.state!==`available`||l.refs.length===0)return e.evidence&&Xp({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:l.state===`available`?l.refsGeneration:void 0,refs:[]}),c;if(!e.evidence)return om(s),am(c,`missing-evidence`);let u=Xp({sessionStore:n,sessionName:r,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:l.refsGeneration,refs:l.refs.map(e=>e.ref)});return u.published===!0?c:(om(s),am(c,u.reason))}function am(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 om(e){if(e)try{U.unlinkSync(e)}catch{}}function sm(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 cm={id:0,"role-label":1,label:2,other:3};function lm(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||um(n.basis)<um(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>um(e.basis)-um(t.basis)||e.nodeIndex-t.nodeIndex)}function um(e){return cm[e]}async function dm(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=Ge(f),_={code:t.code,message:g(t.message),...t.hint?{hint:g(t.hint)}:{}},v=o?await mm({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=vm(v,g),b=v.state===`available`&&o?Cm({action:n,session:o,nodes:v.nodes,sanitize:g}):[],x=Up({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:fm(v)}),ee=Bp({failedIndex:r+1,actions:p,planDigest:m,repairHint:x,resumeStamper:l});return im({sessionStore:c,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:g(i),line:a}},action:g(Lt(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 fm(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const pm=[300,500,800,1200,2e3,3e3,4e3];async function mm(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=gm(a),c=Date.now()+12e3,l=await hm({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of pm){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await gn(Math.min(e,a)),l=await hm({session:t,sessionName:n,sessionStore:r,logPath:i,flags:s})}return l.observation}async function hm(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,flags:a}=e;try{let e=(await qr({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(nn(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=Xp({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:y(e)}}}function gm(e){return{snapshotInteractiveOnly:_m(e)}}function _m(e){return wm(e.command)?Tm(e).requiresRect:!0}function vm(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=Sm(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function ym(e){return!!Xe(e,Je(e.type??`Element`))||e.hittable===!0}function bm(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function xm(e,t){let n=We(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&ym(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=>bm(e,t)),...o.filter(e=>!bm(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function Sm(e,t,n){let{nodes:r,truncated:i}=xm(e,n);return{refs:r.map(e=>{let n=Je(e.type??`Element`),r=Xe(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function Cm(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!wm(t.command))return[];let a=Lp(t);return a.length===0?[]:Em({candidates:a,nodes:r,session:n,action:t,matching:Tm(t),sanitize:i})}function wm(e){return It(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function Tm(e){let t=It(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function Em(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=Dm({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return lm(s).map(e=>e.suggestion)}function Dm(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=he(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:Om({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function Om(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=de(t,r.device.platform,{action:i.command===`fill`?`fill`:It(i.command)?`click`:`get`,nodes:n}),c=Je(t.type??`Element`),l=Xe(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function km(e){return{...e,hint:e.hint??Mm(e.details,`hint`),diagnosticId:e.diagnosticId??Mm(e.details,`diagnosticId`),logPath:e.logPath??Mm(e.details,`logPath`)}}function Am(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return jm({error:t,actionLabel:Lt(n),action:n.command,positionals:gt(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function jm(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:et(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:et(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...Pm(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function Mm(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const Nm=[`reason`,`retriable`,`supportedOn`];function Pm(e){if(!e)return{};let t={};for(let n of Nm)e[n]!==void 0&&(t[n]=e[n]);return t}async function Fm(e){return await Im({...e,snapshotDiagnostics:l(e.snapshotDiagnosticSamples)})}async function Im(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 _=Lm(t.error.details?.replaySource),v=km(t.error),y=await dm({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:En(u.meta?.requestId)});return Am({error:v,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:y,scrubVars:l})}function Lm(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 Rm(e,n){if(e)try{U.appendFileSync(e,`${JSON.stringify(t(n))}\n`)}catch(t){N({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function zm(t){let{req:r,sessionName:i,action:a,resolved:o,filePath:s,line:c,step:l,sourcePath:u,tracePath:d,invoke:f}=t,p=Date.now();Rm(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 Vm({req:r,sessionName:i,resolved:o,sourceAction:a,invoke:f})}catch(t){if(!(t instanceof n))throw t;m={ok:!1,error:e(t)}}let h=Date.now();return Rm(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?Um(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),Bm(m,u??s,c)}function Bm(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 Vm(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Wm(t.flags,r.flags),s=i.command===`fill`?ht(dt(i)):void 0;return s&&(o.recordAs=s),await a(Hm({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??Ei(t)}:{}}},r))}function Hm(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:at(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:rt(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function Um(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 Wm(e,t){return De(e,{...t??{}})}function Gm(e){return Qm(e.ok?qm(e.data):Km(e.error.details?.artifactPaths))}function Km(e){return Array.isArray(e)?e.filter(Zm):[]}function qm(e){return e?[Xm(e.path),Xm(e.outPath),...Jm(e.artifacts)].filter(Zm):[]}function Jm(e){return Array.isArray(e)?e.map(Ym).filter(Zm):[]}function Ym(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return Xm(t.localPath)??Xm(t.path)}function Xm(e){return typeof e==`string`?e:void 0}function Zm(e){return typeof e==`string`}function Qm(e){return[...new Set(e.filter($m))]}function $m(e){try{return U.statSync(e).isFile()}catch{return!1}}function eh(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=th({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Ke(r),u=me(t),d=Be(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>Ht(r,e)===t.sibling),p=d.filter(e=>Vt(Bt(e,l),t.scrollRegion)),m=zt(p)[t.viewportOrder]?.ref,h=Ut({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,...ih({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function th(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?nh(n,t,i,a):rh(n,t,r,a,o)}function nh(e,t,n,r){let o=e=>e!==null&&(!r||!!e.rect),s=a(t),c=s?i(e,s):null;if(o(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?Ue(e,n):null;return o(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function rh(e,t,n,r,i){let a=d(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return a.kind===`resolved`?{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref}:{matchedNodes:[...a.matchedNodes],winnerRef:``}}function ih(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?ah(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?ah(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?ah(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 ah(e,t,n){let r=Wt(t),i=ze(t,n,Math.max(e.ancestry.length,1)).chain;return[...p(e,r),...oe(e.ancestry,i)].slice(0,5)}function oh(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=nt(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=ie(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!It(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(ch(r)&&ch(n[1])))return r}function sh(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function ch(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function lh(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=Ge(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:yh(me(n),g),...t.observed?{observed:yh(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>bh(e,g))},v=Up({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Bp({failedIndex:i,actions:m,planDigest:h,repairHint:v,resumeStamper:d}),b=im({sessionStore:u,sessionName:l,divergence:{version:1,kind:t.kind,step:{index:i,source:{path:g(a),line:o}},action:g(Lt(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 Am({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:b,scrubVars:p})}function uh(e,t,n){let r=Ge(e.scrubVars);return lh(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:vm(n,r),publicationEvidence:mh(n),repairCapture:fm(n)})}async function dh(e){let{session:t,sessionName:n,sessionStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await mm({session:t,sessionName:n,sessionStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function fh(e,t){return uh(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 dh({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function ph(e,t,n){return uh(e,t,await dh({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function mh(e){return e.state===`available`?e.evidence:void 0}function hh(e){let{action:t,resolvedAction:n,sessionName:r,sessionStore:i,targetRole:a}=e,o=i.get(r);return o?ae(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:le(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:oh(n,a),platform:o.device.platform}:{kind:`inactive`}}function gh(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=Tm(r),s=eh({recorded:t,token:n,nodes:i,platform:a,refLabel:sh(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Wt(s.winnerNode),structural:T(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Wt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function _h(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function vh(e){return!e.ok&&e.error.details?.reason===Ze}function yh(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function bh(e,t){let n=Je(e.type??`Element`),r=Xe(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function xh(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 Sh(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 Ch(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 wh(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 Th(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:Sh(e?.observed),expectedStructural:wh(e?.expectedStructural),observedStructural:wh(e?.observedStructural)}}function Eh(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:Sh(e?.observed),observedAncestry:Ch(e?.observedAncestry)}}function Dh(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function Oh(e,t,n){let r=Dh(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&_h(e)?{status:`guard-mismatch`,evidence:Th(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&vh(e)?{status:`landmark-mismatch`,evidence:Eh(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function kh(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,Dh(Ah(e),Gm(e)));return{runtime:{beginTargetVerification(e,n,r,i){return hh({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 mm({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 gh({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 zm({req:xh(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,Gm(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:Oh(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await fh(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=uh(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await ph(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=Ah(o),u=await jh(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=>Mh(e),onStep:i,diagnosticsMarker:()=>Ph(t.sessionStore,t.sessionName),diagnosticsSince:e=>Fh(t.sessionStore,t.sessionName,e)},readLastResponse:()=>o}}function Ah(e){return e&&!e.ok?e:F(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function jh(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return Nh(i)?c(i):c(await Fm({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 Mh(e){let t=e.positionals??[],n=pe(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function Nh(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 Ph(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function Fh(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function Ih(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:Lh(t,i)};return zh(o,`AD_PLATFORM`,a.platform??r.platform),zh(o,`AD_TARGET`,a.target??r.target),zh(o,`AD_DEVICE`,a.device),zh(o,`AD_DEVICE_ID`,Rh(a)),Bh(o,`AD_SHARD_INDEX`,a.shardIndex),Bh(o,`AD_SHARD_COUNT`,a.shardCount),zh(o,`AD_ARTIFACTS`,a.artifactsDir),o}function Lh(e,t){let n=e.meta?.cwd??process.cwd();return H.relative(n,t)||t}function Rh(e){return typeof e.serial==`string`?e.serial:e.udid}function zh(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function Bh(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Vh=3e4,Hh=1e3;function Uh(t){let{scriptPath:r,env:i}=t,a=U.readFileSync(r,`utf8`),o=Object.create(null);try{ua.runInNewContext(a,Wh(i,o),{filename:r,timeout:Vh})}catch(t){let i=e(t);throw new n(i.code,`Maestro runScript failed: ${i.message}`,f({...i.details??{},hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,retriable:i.retriable,supportedOn:i.supportedOn,scriptPath:r}),t instanceof Error?t:void 0)}return Jh(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Yh(t)]))}function Wh(e,t){return{...e,output:t,json:Gh,http:{post:(e,t)=>qh(`POST`,e,t)}}}function Gh(e){if(typeof e!=`string`)throw new n(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new n(`COMMAND_FAILED`,`Maestro runScript json() received an empty body.`,{hint:`Check the preceding HTTP response status and setup server output.`});try{return JSON.parse(e,Kh)}catch(t){throw new n(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Hh)},t instanceof Error?t:void 0)}}function Kh(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function qh(e,t,r){let i=ln(process.execPath,[`-e`,`
|
|
4
|
-
|
|
5
|
-
const input = JSON.parse(fs.readFileSync(0, 'utf8'));
|
|
6
|
-
if (typeof fetch !== 'function') {
|
|
7
|
-
console.error('global fetch is required for Maestro runScript http helpers');
|
|
8
|
-
process.exit(1);
|
|
9
|
-
}
|
|
10
|
-
fetch(input.url, {
|
|
11
|
-
method: input.method,
|
|
12
|
-
headers: input.headers,
|
|
13
|
-
body: input.body,
|
|
14
|
-
}).then(async response => {
|
|
15
|
-
process.stdout.write(JSON.stringify({
|
|
16
|
-
status: response.status,
|
|
17
|
-
body: await response.text(),
|
|
18
|
-
headers: Object.fromEntries(response.headers.entries()),
|
|
19
|
-
}));
|
|
20
|
-
}).catch(error => {
|
|
21
|
-
console.error(error && error.stack ? error.stack : String(error));
|
|
22
|
-
process.exit(1);
|
|
23
|
-
});
|
|
24
|
-
`],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??``}),timeoutMs:Vh,allowFailure:!0});if(i.exitCode!==0)throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Xh(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(r){throw new n(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:i.stdout.slice(0,Hh),stderr:i.stderr.slice(0,Hh)},r instanceof Error?r:void 0)}}function Jh(e,t){for(let r of Object.keys(e))if(r.includes(`.`))throw new n(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:t,key:r})}function Yh(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Xh(e){let t=e.trim();return t.length>0?t.slice(0,Hh):`request process exited without stderr`}async function Zh(e){return await Qh(`tap`,async t=>{let n=H.join(t,`before.png`),r=H.join(t,`after.png`),i=await eg(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await eg(e,r)))return await $h(n,r,e.signal,`tap`)}})})}async function Qh(e,t){let n=await oa.mkdtemp(H.join(sa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await oa.rm(n,{recursive:!0,force:!0})}catch{}}}async function $h(e,t,n,r){try{let[i,a]=await Promise.all([oa.readFile(e),oa.readFile(t)]);ig(n);let o=await tr(i,a,`Maestro screenshot`);return ig(n),tg(o,r)}catch(e){rg(e,n),N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function eg(e,t){try{return await oa.rm(t,{force:!0}),ig(e.signal),await e.capture(t),ig(e.signal),!0}catch(t){return rg(t,e.signal),!1}}function tg(e,t){if(e.status!==`compared`)return ng(t,e.status,e),!1;let n=e.differencePercent<=J.animationDifferencePercent;return ng(t,n?`stable`:`changed`,e),n}function ng(e,t,n){N({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function rg(e,t){if(t?.aborted||On(e))throw kn()}function ig(e){if(e?.aborted)throw kn()}async function ag(e){sg(e.timeoutMs),ig(e.signal);let t=e.now()+e.timeoutMs;return await Qh(`animation`,async n=>{let r=H.join(n,`first.png`),i=H.join(n,`second.png`);for(;;){if(ig(e.signal),await og(e,r,i))return!0;if(e.now()>=t)return!1}})}async function og(e,t,n){let r=[await eg(e,t),await eg(e,n)];return!r[0]||!r[1]?!1:await $h(t,n,e.signal,`animation`)===!0}function sg(e){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const cg=J.observationPollMs;async function lg(e,t){for(;;){Q(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!Tg(n)||(Q(e.context.signal),!await Cg(e.dependencies,t,cg,e.context.signal)))throw n}}}function ug(e){return dg({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function dg(e){let t=Ki(e.snapshot),n=e.platform===`ios`?Er(e.snapshot.nodes):void 0;return gg(wo(e.snapshot,e.query,e.platform,{interactiveBounds:e.mode===`tap`,interactiveRects:n?new Map([...n.sourceNodes].flatMap(([e,t])=>t.rect?[[e,t.rect]]:[])):void 0,canonicalSnapshot:n?{...e.snapshot,nodes:r(n.nodes)}:void 0}),e.snapshot,e.context.generation,t,e.query,e.platform,e.mode)}async function fg(e){wg(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Q(e.context.signal);let r=await lg(e,n),i=dg({query:{selector:e.condition.selector,childOf:e.condition.childOf},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ka(e.condition,i))return i;if(e.dependencies.now()>=n)break;await Cg(e.dependencies,n,cg,e.context.signal)}return Q(e.context.signal),Og(t)}async function pg(e){wg(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Q(e.context.signal);let i=r??await lg(e,t);if(r=void 0,n=dg({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 Q(e.context.signal),Og(n)}async function mg(e){wg(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await lg(e,t),r=Eg(n);for(;;){Q(e.context.signal),await Cg(e.dependencies,t,cg,e.context.signal);let i=await lg(e,t),a=Eg(i);if(a===r)return{snapshot:i,signature:a};if(n=i,r=a,e.dependencies.now()>=t)return{snapshot:n,signature:r}}}function hg(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function gg(e,t,n,r,i,a,o){if(!e.ok){let t=hg(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=vg({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=hg(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:_g(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:Eg(t)}:{}}}function _g(e,t){return!E(e)||!E(t)?0:g(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 vg(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!yg(t,n,r)||i!==1))return bg(t.selector)}function yg(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&e.index===void 0&&e.childOf===void 0}function bg(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!xg(n)||typeof r!=`string`)return;let i=Ai(r)?.trim();return i?{key:n,value:i}:void 0}function xg(e){return e===`id`||e===`label`||e===`text`}async function Sg(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?kn():e}Q(n)}async function Cg(e,t,n,r){let i=t-e.now();return i<=0?!1:(await Sg(e,Math.min(n,i),r),!0)}function Q(e){if(e?.aborted)throw kn()}function wg(e,t){if(!Number.isFinite(e)||e<0)throw new n(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function Tg(e){return e instanceof n&&e.details?.retriable===!0}function Eg(e){return aa(`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:Dg(e.rect)})))).digest(`hex`)}function Dg(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 Og(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function kg(e){return Ag(e)?jg(e):Vg(e)?Hg(e):Fg(e)}function Ag(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function jg(e){switch(e.kind){case`launchApp`:return Mg(e);case`stopApp`:return Ng(e);case`openLink`:return Pg(e)}}function Mg(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 Ng(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function Pg(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function Fg(e){switch(e.kind){case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return Ig(e);case`clickPoint`:return Lg(e);case`swipe`:return Rg(e);case`scroll`:return zg(e);case`pressKey`:return Bg(e)}}function Ig(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function Lg(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Rg(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 zg(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function Bg(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Vg(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Hg(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 Ug(e,t){let n=kg(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=Wg(i,n.flags??{}),c=f({...a,...n.internal,...t.kind===`snapshot`?{observationOnly:!0}:{}}),l=await e.invoke(f({...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 Xg(l);return l.data}function Wg(e,t){let n=e?.maestro===void 0&&t.maestro===void 0?void 0:{...e?.maestro,...t.maestro},r=f({...e,...t,maestro:n});return Object.keys(r).length>0?r:void 0}function Gg(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 Kg(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 qg(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 Jg(e,t,r){if(H.isAbsolute(e))return e;let i=t.source?.path??r;if(!i)throw new n(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return H.resolve(H.dirname(i),e)}function Yg(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Xg(e){let t=e.error,r=f({...t.details??{},hint:t.hint??Zg(t.details,`hint`),diagnosticId:t.diagnosticId??Zg(t.details,`diagnosticId`),logPath:t.logPath??Zg(t.details,`logPath`),retriable:t.retriable??Qg(t.details,`retriable`),supportedOn:t.supportedOn??Zg(t.details,`supportedOn`)});return new n(t.code,t.message,Object.keys(r).length?r:void 0)}function Zg(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Qg(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function $g(e){let t,r,i,a,o,s=0,c=0,l=async r=>{c+=1;let i=await Ug(e,{kind:`snapshot`});if(!i||!Array.isArray(i.nodes))throw new n(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let a=i;return t={generation:r.generation,snapshot:a},a};return{capture:async e=>{if(r?.generation===e.generation){let n=r.snapshot;return r=void 0,t={generation:e.generation,snapshot:n},n}return r=void 0,await l(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++s}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:c}),invalidate:e=>{i=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,r=void 0},requireStability:e=>{o=e,a=i?.generation===e?i:void 0,i=void 0,r=void 0},consumeStabilityFromVisualWait:e=>{if(o!==void 0){if(o!==e.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${e.generation}.`);o=void 0,a=void 0,i=void 0,r=void 0}},prime:(e,t)=>{r={generation:e,snapshot:t}},settlePending:async i=>{if(o===void 0)return;if(o!==i.generation)throw new n(`COMMAND_FAILED`,`Maestro stability generation ${o} does not match ${i.generation}.`);let s=t?.generation===i.generation?t.snapshot:a?.snapshot,c=await mg({timeoutMs:J.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 e_(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 lg({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=ug({query:t,context:n,snapshot:o,platform:i.platform});if(o_(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await Cg(i.dependencies,a,cg,n.signal)}}}async function t_(e,t,n,r,i,a){let o=async()=>await i_(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Zh({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Ug(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await n_(e,t,n,r,i,a.click,o)});return}await n_(e,t,n,r,i,a.click)}async function n_(e,t,n,r,i,a,o){let s=async()=>await i_(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:Eg(await t.capture(i))),l=async()=>await mg({timeoutMs:J.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});try{let e=await r_({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 r_(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 i_(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await s_(e,o,n.point,i);return}catch(n){if(!c_(n))throw n;let o=await e_({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!a_(o))throw n;t.invalidate(r.generation),await l_(e,qe(o.rect),i);return}}t.invalidate(r.generation),await l_(e,n.point,i)}function a_(e){return e.matched&&e.visible&&e.rect!==void 0}function o_(e,t){return a_(e)?!t||e.dispatchSelector!==void 0:!1}async function s_(e,t,n,r){N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Ug(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function c_(e){let t=s(e).code;return t===`AMBIGUOUS_MATCH`||t===`ELEMENT_NOT_FOUND`||t===`ELEMENT_OFFSCREEN`}async function l_(e,t,r){if(!t)throw new n(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);N({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Ug(e,{kind:`clickPoint`,point:t,options:r})}function u_(e){let t=$g(e),r={screenshotCaptures:0,tapRetries:0},i=e.platform,a=t=>(t.kind===`screenshot`&&(r.screenshotCaptures+=1),Ug(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,r)=>{cn(n),await s({kind:`typeText`,text:n},r);let i=await mg({timeoutMs:J.settleTimeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies});t.prime(r.generation,i.snapshot)};return{operations:{platform:i,resolveTarget:async(n,r)=>await e_({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await fg({condition:n.condition,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i}),resolveGestureViewport:async t=>{let r=await e.dependencies.resolveGestureViewport(t);if(!r)throw new n(`COMMAND_FAILED`,`Unable to resolve Maestro gesture viewport.`);return r},launchApp:async(e,t)=>{let n=e.appId??t.appId,r=[...Gg(e.arguments),...Gg(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(n,i)=>await t_(e,t,r,n.target,i,{click:{count:n.repeat,intervalMs:n.delay},retryIfNoChange:n.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>l_(e,t.target.point,f({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>l_(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 pg({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=Ra(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 mg({timeoutMs:Math.min(J.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==J.scrollUntilVisiblePercentage)throw zi(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Kg(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 ag({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:qg(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:Uh({scriptPath:Jg(t.file,n,e.sourcePath),env:{...n.env,...t.env?Yg(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...r})}}function d_(e){let{operations:t,snapshots:n,readMetrics:r}=u_(e);return ko(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 f_(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),p_(()=>g_(r,e)),p_(()=>__(n,t,e))},actionCompleted:e=>{let r=m_(i,e.stepIndex);p_(()=>v_(n,t,h_(r,e),!0))},actionFailed:e=>{let r=m_(i,e.stepIndex);p_(()=>v_(n,t,h_(r,e),!1))}}}function p_(e){try{e()}catch{}}function m_(e,t){let n=e.get(t);return e.delete(t),n}function h_(e,t){return f({...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 g_(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function __(e,t,n){Rm(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 v_(e,t,r,i){let a=y_(r);Rm(e,{type:`replay_action_stop`,ts:new Date().toISOString(),replayPath:t,...r.source.path&&r.source.path!==t?{sourcePath:r.source.path}:{},line:r.source.line,step:r.stepIndex,command:r.action,ok:i,durationMs:r.durationMs,...Object.keys(a).length>0?{resultTiming:a}:{},...!i&&`error`in r&&r.error instanceof n?{errorCode:r.error.code}:{}})}function y_(e){let t=`data`in e?e.data:void 0,n=b_(t?.timing)?t.timing:void 0;return f({...e.runtimeMetrics??{},...typeof n?.executionProfile==`string`?{executionProfile:n.executionProfile}:{},...typeof n?.gestureDurationMs==`number`?{gestureDurationMs:n.gestureDurationMs}:{}})}function b_(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function x_(e,t){return xr(e,t)}function S_(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:E_(e.action),positionals:D_(e.action,e.value),flags:t.flags??{}}}}async function C_(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,logPath:o}=e,s=En(r.meta?.requestId),c=S_(t,r),l=km(e.error),u=[...t.redactions],d=Ge(u),f={...l,message:d(l.message),...l.hint?{hint:d(l.hint)}:{}},p=a.get(i),m=p?await mm({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?w_({failure:t,action:c.action,session:p,nodes:m.nodes,sanitize:d}):[],g=[t.action,T_(t.value)].filter(Boolean).join(` `),_=im({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:vm(m,d),suggestions:h.slice(0,5),suggestionCount:h.length,resume:t.resume,repairHint:Up({kind:`action-failure`,targetEvidence:void 0,capture:fm(m)})},responseLevel:r.meta?.responseLevel,evidence:m.state===`available`?m.evidence:void 0,...s?{signal:s}:{}});return jm({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 w_(e){let t={createdAt:Date.now(),nodes:e.nodes};return lm(x_(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>Om({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function T_(e){return!e||e===`<text>`?e??``:Et(e)}function E_(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function D_(e,t){return!t||e===`inputText`?[]:[t]}function O_(e){let{outcome:t,startedAt:n,sessionName:r,sessionStore:i,snapshotStart:a}=e,o=A_(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:M_(s,Date.now()-n)}}}async function k_(t){let{failure:n}=t.outcome,r=e(t.outcome.error);return n?await C_({error:r,failure:n,replayPath:j.expandHome(t.requestedPath,t.req.meta?.cwd),req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,snapshotDiagnostics:A_(t.sessionStore,t.sessionName,t.state.snapshotStart)}):F(r.code,r.message,{...r.details??{},...j_(n)})}function A_(e,t,n){return l(e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[])}function j_(e){return e?{replaySource:e.source,replayStep:e.stepIndex,replayStepTotal:e.stepTotal}:{}}function M_(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function N_(e){let{req:t}=e,n=t.positionals?.[0];if(!n)return F(`INVALID_ARGS`,`replay requires a path`);if(t.flags?.saveScript!==void 0)return F(`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 P_({...e,requestedPath:n,startedAt:r,state:i})}catch(t){return await k_({...e,requestedPath:n,state:i,outcome:{ok:!1,error:t}})}}async function P_(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,onStep:a,invoke:o,state:s}=e,c=await F_(e),l=V_({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 pi(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,observer:f_({filePath:c.filePath,tracePath:i,onStep:a})});return u.ok?O_({outcome:u,startedAt:e.startedAt,sessionName:n,sessionStore:r,snapshotStart:s.snapshotStart}):await k_({...e,requestedPath:e.requestedPath,state:s,outcome:u})}async function F_(e){let{req:t,requestedPath:n,sessionName:r,sessionStore:i}=e,a=j.expandHome(n,t.meta?.cwd),o=Vi(U.readFileSync(a,`utf8`),a),s=i.get(r);s&&oi(s,t.flags);let c=await I_({req:t,sessionStore:i,sessionName:r,session:s,flow:o});return{filePath:a,flow:o,...c,defaults:z_({req:t,sessionName:r,filePath:a,platform:c.platform,target:c.target}),env:B_(t),signal:En(t.meta?.requestId)}}async function I_(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 I(t.flags??{},Fr(a.appTarget,o))),c=K_(t,s),l=Ri({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await L_({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:q_(t,s),runtimeHints:l,flow:a})}async function L_(e){if(e.device||!R_(e.runtimeHints))return e;let t=await I(e.req.flags??{},Fr(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:q_(e.req,t),runtimeHints:Ri({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function R_(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function z_(e){return{...Ih({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function B_(e){return{...ma(_a(e.flags?.replayShellEnv)),...ha(ga(e.flags?.replayEnv))}}function V_(e){let{req:t,invoke:r,logPath:i,sessionName:a,sessionStore:o,device:s,platform:c,runtimeHints:l,sourcePath:u}=e,{command:d,positionals:p,input:m,flags:h,...g}=t;return d_({baseReq:f({...g,flags:H_(s,c,t.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 n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);return await Yn(e.device,Mr(i,t.flags,e.appBundleId,e.trace?.outPath))}}})}function H_(e,t,n){if(!e)return U_(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 U_(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?W_(n,t):G_(n,t)}function W_(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function G_(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function K_(e,t){let r=e.flags?.platform;if(r===`android`||r===`ios`)return r;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new n(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function q_(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function J_(e){let{resolved:t,req:n,keepSession:r,coordinator:i,maestroParams:a}=e;if(Wr(t,n.flags?.replayBackend)===`maestro`)return r?F(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):i.view()?.repairBoundary===void 0?await N_(a):F(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Y_(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,coordinator:o}=e,s=X_(t);if(s)return{ok:!1,response:s};let{manifest:c,replayReq:l}=Z_(t,a),{metadata:u,actions:d,actionLines:f,actionSourcePaths:p,planDigest:m}=c,h=r.get(n),g=Q_({req:t,coordinator:o,manifest:c,preEntrySession:h});return g.ok?{ok:!0,value:{replayReq:l,actions:d,actionLines:f,actionSourcePaths:p,planDigest:m,preEntrySession:h,entryIndex:g.value,varSources:ev({req:t,replayReq:l,sessionName:n,resolved:a,metadata:u}),actionTracePath:i??h?.trace?.outPath}}:{ok:!1,response:g.response}}function X_(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return F(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Z_(e,t){let n=up(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:$_({...e,flags:ti(e.flags,n.actions)},n.metadata)}}function Q_(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:F(`INVALID_ARGS`,a.message)}}function $_(e,t){return!t.platform&&!t.target?e:{...e,flags:tv(e.flags,t)}}function ev(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:Ih({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:ma(_a(t.flags?.replayShellEnv)),cliEnv:ha(ga(t.flags?.replayEnv))}}function tv(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 nv(e){let{req:t,entryIndex:n,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}=e,s=rv({entryIndex:n,sessionStore:r,sessionName:i,coordinator:o});return s?{ok:!1,response:s}:(ov({req:t,coordinator:o}),av({req:t,sessionStore:r,sessionName:i,sourcePath:a,coordinator:o}))}function rv(e){let t=sv(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get(e.sessionName))return Jn()}function iv(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?F(`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.`):cv({saveScript:t,liveForce:n,persistedForce:At(r)||void 0,sourcePath:i,existingSaveScriptPath:Tt(r)})}function av(e){let{req:t,sessionStore:n,sessionName:r,sourcePath:i,coordinator:a}=e,o=n.get(r),{saveScript:s,force:c}=t.flags??{},l=iv({saveScript:s,force:c,preRunState:o?.scriptPublication??Mt,sourcePath:i});return l?{ok:!1,response:l}:(a.demoteForRerunIfArmed(),{ok:!0,armSaveScript:lv({saveScript:s,force:c,coordinator:a,sourcePath:i})})}function ov(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function sv(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return F(`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 cv(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?Nt(t):a??Ap(i);if(!(n||r&&o===a)&&U.existsSync(o))return F(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function lv(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 uv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,onStep:o,invoke:c}=e,l=t.positionals?.[0];if(!l)return F(`INVALID_ARGS`,`replay requires a path`);let u=Date.now(),d=t.flags?.replayKeepSession===!0,f=``,p=new Set,m=kp({sessionStore:i,sessionName:n});try{if(f=j.expandHome(l,t.meta?.cwd),$r(f)&&t.flags?.replayBackend!==`maestro`)return F(`INVALID_ARGS`,ri(`replay`,l));let s=await J_({resolved:f,req:t,keepSession:d,coordinator:m,maestroParams:e});if(s)return s;let h=Y_({req:t,sessionName:n,sessionStore:i,tracePath:a,resolved: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=nv({req:t,entryIndex:x,sessionStore:i,sessionName:n,sourcePath:f,coordinator:m});if(!C.ok)return C.response;let{runtime:w,readLastResponse:te}=kh({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:En(t.meta?.requestId),coordinator:m},req:t,artifactPaths:p,onStep:o,armSaveScript:C.armSaveScript}),T=await Cp({actions:_,entryIndex:x,keepSession:d,actionLines:v,actionSourcePaths:y,resolvedPath:f,varSources:ee},w);return T.status===`failed`?te()??F(`COMMAND_FAILED`,`replay step failed with no recorded response`):dv({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 F(t.code,t.message,p.size>0?{artifactPaths:[...p]}:void 0)}}function dv(e){let{startedAt:t,sessionName:n,sessionStore:r,replayed:i,artifactPaths:a,snapshotDiagnosticSamples:o,armSaveScript:s,coordinator:c,keepSession:u}=e;s(),c.markCompleteIfArmed();let d=r.get(n),f=pv({keepSession:u,sessionName:n,completedSession:d,artifactPaths:a});if(f)return f;let p=l([...o]);return{ok:!0,data:{replayed:i,healed:0,session:n,sessionActive:d!==void 0,artifactPaths:[...a],...p?{snapshotDiagnostics:p}:{},message:fv(i,Date.now()-t)}}}function fv(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function pv(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return F(`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)}const mv=/[*?[\]{}]/;function hv(e){let t=e.replayBackend===`maestro`?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`]),n=[],r=[];for(let i of e.inputs){let a=gv(i,e.cwd,t);if(a.source===`file`){n.push(...a.paths);continue}r.push(a.source===`directory`?xv(a.paths):yv(a.paths))}return xv([...n,...r.flat()])}function gv(e,t,r){let i=j.expandHome(e,t);if(U.existsSync(i)){let t=U.statSync(i);return t.isDirectory()?{paths:vv(i,r),source:`directory`}:t.isFile()?(_v(e,i,r),{paths:[i],source:`file`}):{paths:[],source:`file`}}if(!Sv(e)&&!Sv(i))throw new n(`INVALID_ARGS`,`test input not found: ${e}`);let a=H.isAbsolute(i)?i:e;return{source:`glob`,paths:U.globSync(a,{cwd:H.isAbsolute(i)?void 0:t}).map(e=>H.isAbsolute(e)?e:H.resolve(t,e)).filter(e=>r.has(H.extname(e).toLowerCase())&&Cv(e))}}function _v(e,t,r){if(!r.has(H.extname(t).toLowerCase()))throw $r(t)&&!r.has(`.yaml`)?new n(`INVALID_ARGS`,ri(`test`,e)):new n(`INVALID_ARGS`,`test does not support this file type: ${e}`)}function vv(e,t){let n=[],r=U.opendirSync(e);try{let i;for(;(i=r.readSync())!==null;){let r=H.join(e,i.name);i.isDirectory()?n.push(...vv(r,t)):i.isFile()&&t.has(H.extname(i.name).toLowerCase())&&n.push(r)}}finally{r.closeSync()}return n}function yv(e){return e.map(e=>H.normalize(e)).sort((e,t)=>{let n=bv(e)-bv(t);return n===0?e.localeCompare(t):n})}function bv(e){return+(H.extname(e).toLowerCase()===`.ad`)}function xv(e){return[...new Set(e.map(e=>H.normalize(e)))]}function Sv(e){return mv.test(e)}function Cv(e){try{return U.statSync(e).isFile()}catch{return!1}}function wv(e){return({inputs:t,cwd:n})=>hv({inputs:t,cwd:n??process.cwd(),replayBackend:e}).map(t=>Tv(t,e))}function Tv(e,t){let n=U.readFileSync(e,`utf8`),r=Wr(e,t)===`maestro`,i=wt(n);return{path:e,manifest:{...r?{title:Vi(n,e).name}:{},device:{platform:i.platform?{kind:`declared`,value:i.platform}:r?{kind:`caller-bound`}:{kind:`unspecified`},...i.target===void 0?{}:{target:i.target}},...i.timeoutMs!==void 0||i.retries!==void 0?{attemptDefaults:{...i.timeoutMs===void 0?{}:{timeoutMs:i.timeoutMs},...i.retries===void 0?{}:{retries:i.retries}}}:{}}}}function Ev(e){return async t=>(await kv(e,t)).map(Dv)}function Dv(e){if(e.platform===`web`||!Le(e))throw new n(`INVALID_ARGS`,`test sharding requires a mobile device; ${e.id} is ${e.platform}`);return{id:e.id,name:e.name,platform:e.platform,...e.target===void 0?{}:{target:e.target}}}function Ov(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 kv(e,t){let r=Nv(e),i=jv(await zn(Av(e)),r,e);if(i.length<t)throw new n(`DEVICE_NOT_FOUND`,`test sharding requires ${Mv(t)}, but only ${i.length} matched`);return i.slice(0,t)}function Av(e){let t=P(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:Re({simulatorSetPath:Rn(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function jv(e,t,n){return t.length>0?Pv(e,t,n):e.filter(e=>Fv(e,n)).sort(Rv)}function Mv(e){return`${e} device${e===1?``:`s`}`}function Nv(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Pv(e,t,r){return t.map(t=>{let i=Lv(t),a=e.find(e=>Iv(e,r)&&(e.id===t||Lv(e.name)===i));if(!a)throw new n(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return a})}function Fv(e,t){return!Iv(e,t)||!Le(e)?!1:e.booted!==!1}function Iv(e,t){return!(!Ne(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function Lv(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function Rv(e,t){return e.id.localeCompare(t.id)}function zv(e){let t=Bv(e?.shardAll,`--shard-all`),r=Bv(e?.shardSplit,`--shard-split`);if(t!==void 0&&r!==void 0)throw new n(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(r!==void 0)return{mode:`split`,count:r}}function Bv(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new n(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const Vv=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Hv(e){let t=Uv(e);return t?Wv(t.details)||Gv(t.code,t.message):!1}function Uv(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Wv(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?vn(t):!1}function Gv(e,t){let n=`${e}\n${t}`.toLowerCase();return Vv.some(e=>n.includes(e))}function Kv(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:Yv(e.error.details?.artifactPaths),infrastructure:Hv(e),...Xv(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:Jv(t?.warnings),artifactPaths:Yv(t?.artifactPaths),...Xv(t?.snapshotDiagnostics)}}function qv(e){if(!e||e.ok)return;let t=Kv(e);return t.status===`failed`?t:void 0}function Jv(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Yv(e){return[...new Set(Jv(e))]}function Xv(e){let t=u(e);return t?{snapshotDiagnostics:t}:{}}const Zv=1e3,Qv=3e3;function $v(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await ey(e)}}async function ey(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=pn(o.device.platform),c=i?H.join(i,`recording${s}`):fn(o.device.platform);ny(a,{type:`video_recording_start`,session:n,videoPath:c}),N({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.throwIfCanceled();let l=await Qi({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 ny(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await gn(Zv),ny(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:Zv}),N({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:Zv}}),l}async function ty(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get(n)?.screenRecording)return;ny(a,{type:`video_tail_start`,session:n,requestedDurationMs:Qv});let o=Date.now();await gn(Qv);let s=Date.now(),c=await Qi({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 Gm(c).forEach(e=>i.add(e)),ny(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}),N({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function ny(e,t){e({...t,ts:new Date().toISOString()})}const ry=[{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.`}],iy=({attemptId:e,parentAttemptId:t})=>{Tn(e);let n=ay(e,t);return{cancel:()=>An(e),release:()=>{n(),Dn(e)}}};function ay(e,t){if(!t||t===e)return()=>{};let n=En(t);if(!n)return()=>{};let r=()=>{An(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function oy(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=sy(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:Ov({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function sy(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function cy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;if(t.command===`replay`)return await uv({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o});if(t.command===`test`){let c=ly(e);if(t.flags?.recordVideo===!0&&c===void 0)return F(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of ry)if(e.requested(l))return F(`INVALID_ARGS`,e.message);let u;try{u=uy(t,n)}catch(e){let t=s(e);return F(t.code,t.message)}let d=await zf({request:u,emitProgress:jn,isCanceled:()=>wn(t.meta?.requestId),emitDiagnostic:N,bindAttemptCancellation:iy,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:f,appendTimingEvent:p,shard:m,onStep:h})=>{let g=e=>(d&&Gm(e).forEach(e=>d.add(e)),e),_=oy({parentFlags:t.flags,platform:a,target:s,artifactsDir:u,shard:m}),v=c?{req:t,sessionName:n,sessionStore:i,artifactsDir:u,appendTimingEvent:p,...c}:void 0,y=v?$v(v):void 0;return Kv(await uv({req:{...t,command:`replay`,session:n,positionals:[e],flags:_,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||y?{internal:{...t.internal??{},...y?{openLifecycle:y}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:f,onStep:h,invoke:async e=>{let t=v?await ey(v):void 0;return t&&!t.ok?t:g(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:r,appendTimingEvent:a})=>{if(c)return qv(await ty({req:t,sessionName:e,sessionStore:i,artifactsDir:r,appendTimingEvent:a,artifactPaths:n,...c}))},discoverSources:wv(t.flags?.replayBackend),resolveShardTargets:Ev(t.flags),cleanupSession:async n=>{i.get(n)&&await sc({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 d.status===`completed`?{ok:!0,data:d.data}:F(d.error.code,d.error.message)}return null}function ly(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 uy(e,t){let n=e.flags??{},r=e.meta?.cwd,i=fy(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:j.expandHome(i,r),failFast:n.failFast===!0,retries:dy(n.retries),timeoutMs:dy(n.timeoutMs),shard:zv(n)}}function dy(e){return typeof e==`number`?e:void 0}function fy(e){return typeof e==`string`?e:void 0}function py(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==Gt.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return _y(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return _y(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=gy(a);if(o)return _y(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return _y(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));Dt(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:ft(a,t.flags?.force),publication:`active`});return c.written?(_t(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...A(`Published script: ${c.path}`)}}):_y(c.error??new n(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function my(e){if(st(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:St(e)?void 0:`not-armed`}const hy={repair:()=>new n(`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 n(`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 n(`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 n(`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 gy(e){let t=my(e);return t?hy[t]():void 0}function _y(t){return{ok:!1,error:e(t)}}function vy(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function yy(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function by(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function xy(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),jn({type:`command`,status:`progress`,message:Sy(t)})}function Sy(e){return[$e(e),...Ye(e)].join(`
|
|
25
|
-
`)}const Cy=2e3;async function wy(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;if(n.platform!==`android`)return;let o=dn(n,a);i&&$(e,await Ay(o,n.id,r)),$(e,await Ty(o,n))}async function Ty(e,t){try{let n=await yn(e),r=xn(t);return n===await Ey()&&!r?await Dy(e,t,n):Oy(t,n,r)}catch(e){return ky(e)}}async function Ey(){try{return(await bn()).manifest.serviceComponent}catch{return}}async function Dy(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,Sn.previousIme],{allowFailure:!0,timeoutMs:Cy})).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 Oy(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 ky(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 Ay(t,n,r){try{let e=await t([`reverse`,`--list`],{allowFailure:!0,timeoutMs:Cy}),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 jy(t,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let e=o?My(i,await o(`all`))?.id:void 0;if(!e){$(t,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${D(r)}.`,evidence:{requested:i,platform:D(r)}});return}$(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);$(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 ${D(r)} --all`,evidence:{code:i.code,message:i.message}})}}function My(e,t){let r=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new n(`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 n(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Ny(t,n,r){let i=Fy(n,r);try{let e=await Ly(i),n=Iy(e.devices,i);return $(t,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Vy(n,i,e.failures),hint:n.length===0?Wy(e.failures):void 0,command:n.length===0?Yy(i):void 0,evidence:Xy(n,e.failures)}),n.length>0&&Ry(t,e.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=e(n);return $(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 Py(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:D(e),id:e.id,name:e.name}))}})}function Fy(e,t){let n=e.flags??{};return Kn({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 Iy(e,t){return e.filter(e=>Pe(e,t,{includeExplicitSelectors:!0}))}async function Ly(e){if(e.platform)return{devices:await zn(e),failures:[]};let t=[],n=[];for(let r of on)try{t.push(...await zn({...e,platform:r}))}catch(e){n.push(By(r,e))}return{devices:t,failures:n}}function Ry(e,t){for(let n of t)$(e,zy(n))}function zy(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${qy(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${qy(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function By(t,n){let r=e(n);return{platform:t,message:r.message,hint:r.hint,code:r.code}}function Vy(e,t,n){if(e.length===0)return n.length>0?`No ${Hy(t)} devices found; ${Uy(n)}.`:`No ${Hy(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Hy(t)} ${Jy(e.length,`device`)} available; ${r} booted`,a=Gy(e,t);return a?`${i} (${a}).`:`${i}.`}function Hy(e){let t=e.platform?qy(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Uy(e){return e.slice(0,2).map(e=>`${qy(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Wy(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Gy(e,t){if(t.platform||t.target)return;let n=rn(e),r=Ky();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 Ky(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function qy(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 Jy(e,t){return e===1?t:`${t}s`}function Yy(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Xy(e,t){let n=new Map;for(let t of e){let e=D(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Zy=1500;async function Qy(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 $y(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?eb(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 $y(e,t,n){try{return await(n.resolveProcessInfo??tb)(e,t)}catch{return}}function eb(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 tb(e,t){if(!nb(e))return;let n=await rb(t);if(n!==void 0)return{pid:n,cwd:await ib(n)}}function nb(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function rb(e){let t=await un(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Zy});if(t.exitCode===0)return t.stdout.split(`
|
|
26
|
-
`).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function ib(e){let t=await un(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Zy});if(t.exitCode===0)return t.stdout.split(`
|
|
27
|
-
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const ab=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],ob=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function sb(e,t){let n=_n(e.meta?.cwd);return{targetApp:fb(e.flags?.targetApp)??t?.appBundleId,metroHost:fb(e.runtime?.metroHost)??`127.0.0.1`,metroPort:pb(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:ub(e,n)}}function cb(e,t={}){let n=db(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 lb(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 ${D(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 ub(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function db(e){let t={...Object.fromEntries([...ab,...ob].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 fb(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function pb(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}const mb=3e3;async function hb(e,t){if(t===`android`){$(e,await Sb());return}if(t===`vega`){$(e,await _b());return}if(t===`harmonyos`){$(e,await gb());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await Db())}async function gb(){let e=await Nb(`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 _b(){let{resolveVegaToolProvider:e}=await import(`./tool-provider2.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:mb}),r=await vb(),i=Pb(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:xb(r)}}}async function vb(){try{return{devices:await Hn({platform:`vega`,target:`tv`}),listedSerials:[]}}catch(e){if(Bn(e))throw e;return{devices:[],listedSerials:yb(e)}}}function yb(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)return[];let t=e.details?.listedSerials;return bb(t)?t:[]}function bb(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function xb(e){return(e.devices.length>0?e.devices.map(e=>e.id):e.listedSerials).join(`, `)||null}async function Sb(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await Mb(e),n=await Nb(`adb`,[`version`]);return n?Cb({license:t,sdkRoot:e,versionLine:n}):Eb(e,t)}function Cb(e){return{id:`toolchain`,status:wb(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${Tb(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 wb(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function Tb(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function Eb(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 Db(){let e=await Nb(`xcodebuild`,[`-version`]);return e?Ob({selectedPath:await Nb(`xcode-select`,[`-p`]),versionLine:e}):jb()}function Ob(e){return{id:`toolchain`,status:kb(e),summary:Ab(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function kb(e){return e.versionLine?`pass`:`info`}function Ab(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 jb(){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 Mb(e){if(!e)return`unknown`;try{return await ca(H.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function Nb(e,t){try{let n=await un(e,t,{allowFailure:!0,timeoutMs:mb});return n.exitCode===0?Pb(n.stdout):void 0}catch{return}}function Pb(e){return e.split(`
|
|
28
|
-
`).map(e=>e.trim()).find(Boolean)}async function Fb(e,t){$(e,await Ib(t))}async function Ib(e){let t=$n({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 er(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 Lb(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==M.doctor)return null;let s=r.get(n),c=sb(t,s),l=Bb(r,n),u=[];if(xy(u,{id:`agent-device`,status:`pass`,summary:`agent-device ${mn()} using ${l}`,evidence:{version:mn(),stateDir:l}},...cb(t,{required:c.remote}),...lb(r,n,s,{remote:c.remote})),c.remote)return Gb(u,c);let d=await Ny(u,t,s);await hb(u,s?.device.platform??d?.platform);let f=await Vb({androidAdbExecutor:i,checks:u,inventory:d,options:c,session:s,stateDir:l,inspectFacts:a,bindDevice:o,req:t});return await zb(u,f??Rb(d)),Gb(u,c,{device:f,includeMetro:!0,inventory:d})}function Rb(e){let t=(e?.devices??[]).filter(e=>O(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function zb(e,t){if(!(!t||!O(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||Pn(t))){if(jn({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await Mn(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}ar(t,{}),jn({type:`command`,status:`progress`,message:`Warming iOS runner build cache in the background (${t.name})...`}),$(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 Bb(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function Vb(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o,inspectFacts:s,bindDevice:c,req:l}=e,u=i?.device??Py(t,n,r.targetApp);return u&&await Hb(t,{androidAdbExecutor:a,device:u,options:r,session:i,inspectFacts:s,bindDevice:c,req:l}),r.shouldProbeMetro&&$(t,await Qy(r.metroHost,r.metroPort,r.kind)),await Fb(t,o),u}async function Hb(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a,inspectFacts:o,bindDevice:s,req:c}=t,l;try{l=await Ub({device:r,req:c,targetApp:i.targetApp,inspectFacts:o,bindDevice:s})}catch(e){l=async()=>{throw e}}await jy(e,{device:r,session:a,targetApp:i.targetApp,listInstalledApps:l}),await wy(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}async function Ub(e){if(e.device.platform!==`harmonyos`)return Wb(e)}async function Wb(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=P(n.flags?.androidDeviceAllowlist),d=await Oc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await kc(l,d,e)}function Gb(e,t,n={}){let r=vy(e);return{ok:!0,data:{status:r,summary:yy(r),kind:t.kind,platform:n.device?D(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:by(e)}}}async function Kb(e){return await Zo({...e,command:`prepare`,use:x})}async function qb(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return F(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=Y(M.prepare,o,s);if(c)return c;let l=await X({session:o,flags:s,ensureReady:!1}),u=await Kb({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:Jb(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:Ln(t)}});return{ok:!0,data:Yb(a,l,Math.max(0,Date.now()-d),f)}}function Jb(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:b}function Yb(e,t,n,r){return{action:e,platform:D(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:Xb(n,r),message:`Prepared Apple runner: ${t.name}`}}function Xb(e,t){let n=Zb(t.buildMs),r=Qb(t.connectMs),i=Qb(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 Zb(e){return e===void 0?void 0:Qb(e)}function Qb(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function $b(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=Y(a,l,u);if(d)return d;let f=await X({session:l,flags:u,ensureReady:!0}),p=Xn(a,f);if(p)return p;l&&ei(t)===`may-invalidate`&&R(l);let m=await Zn(f,a,o,t.flags?.out,{...Mr(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;V(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function ex(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n),o=t.flags??{},s=Y(M.clipboard,a,o);if(s)return s;let c=(t.positionals?.[0]??``).toLowerCase();if(c!==`read`&&c!==`write`)return F(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let l=await X({session:a,flags:o,ensureReady:!0}),u=Xn(M.clipboard,l);if(u)return u;let d=await Zn(l,M.clipboard,t.positionals??[],t.flags?.out,{...Mr(r,t.flags,a?.appBundleId,a?.trace?.outPath)});return V(i,a,t,t.command,d??{}),{ok:!0,data:{platform:D(l),...d??{}}}}const tx=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await Ic({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),nx=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await fl({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),rx=async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o})=>await wd({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,bindDevice:i,appLogAdmissionLedger:a,throwIfCanceled:o}),ix=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 cy({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 ax(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`?F(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await $b({req:t,sessionName:n,logPath:r,sessionStore:i,command:M.keyboard,positionals:t.positionals??[]})}async function ox(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;return await $b({req:t,sessionName:n,logPath:r,sessionStore:i,command:M.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await $i(e.device,n,e.appBundleId,ea)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}const sx={session_list:tx,devices:tx,capabilities:tx,apps:tx,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,inspectFacts:i,bindDevice:a})=>await Lb({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,inspectFacts:i,bindDevice:a}),boot:nx,shutdown:nx,appstate:nx,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>py({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await os({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r})=>await ex({req:e,sessionName:t,logPath:n,sessionStore:r}),keyboard:ax,perf:rx,logs:rx,events:rx,network:rx,audio:rx,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await qb({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Ec,reinstall:Ec,install_source:Ec,release_materialized_paths:async({req:e})=>await Bo({req:e}),push:Ec,"trigger-app-event":ox,open:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,reconcileOrphanedDeviceClaim:o})=>await bs({req:e,sessionName:t,logPath:n,sessionStore:r,openResponse:await Gs({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,reconcileOrphanedDeviceClaim:o})}),replay:ix,test:ix,batch:async({req:e,sessionName:t,invoke:n})=>await Dc(e,t,n),close:async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a,inspectFacts:o,bindDevice:s})=>await sc({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,leaseLifecycleProvider:a,inspectFacts:o,bindDevice:s})};async function cx(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new fi,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=sx[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{cx as handleSessionCommands};
|
|
1
|
+
import{E as e,F as t,O as n,b as r,f as i,l as a,m as o,t as s,x as c,y as l}from"./sdk-contracts.js";import"./capture.js";import{D as u,n as d,r as f,t as p}from"./sdk-batch-runner.js";import{a as m,n as h,t as g}from"./snapshot-diagnostics.js";import{f as _}from"./android-input-ownership.js";import{_ as v,b as y,c as b,d as x,g as S,l as C,m as w,u as T,v as E}from"./sdk-device.js";import{$t as ee,A as D,At as te,Bn as ne,Br as re,F as ie,Fn as ae,Fr as oe,G as se,H as ce,Hr as le,I as ue,J as de,K as fe,L as pe,Ln as me,M as he,N as ge,P as _e,R as ve,Rn as ye,Rr as be,Rt as xe,Sr as Se,U as Ce,Un as we,W as Te,X as Ee,Y as De,_ as Oe,bt as ke,d as Ae,dn as je,dt as Me,er as Ne,fn as Pe,it as Fe,k as Ie,mn as Le,nr as Re,nt as ze,pn as Be,q as Ve,tn as He,tr as Ue,tt as We,u as Ge,un as Ke,ut as qe,w as Je,xr as Ye,xt as Xe,yt as Ze,z as Qe}from"./sdk-batch.js";import{c as $e}from"./scroll-gesture.js";import{a as et,b as tt,f as nt,g as rt,n as it,p as at,r as ot,w as st,y as ct}from"./script.js";import{_ as lt,a as ut,c as O,d as dt,f as ft,g as pt,h as mt,l as ht,m as gt,p as _t,t as vt,u as yt}from"./session-store.js";import{a as bt,c as xt,n as St,o as Ct,r as wt,t as Tt}from"./session-target-evidence.js";import{a as Et,c as Dt,i as Ot,l as kt,n as At,o as jt,r as Mt,s as Nt,t as Pt,u as Ft}from"./format.js";import{A as It,_ as Lt,d as Rt,g as zt,h as Bt,j as Vt,k as Ht,l as Ut,m as Wt,o as Gt,p as Kt,s as qt,u as Jt}from"./parameterized-recorded-fill.js";import{D as Yt,O as Xt,T as Zt,c as Qt,d as $t,k as en}from"./runtime.js";import{$ as tn,A as nn,B as rn,C as an,D as on,F as sn,G as cn,H as ln,I as un,J as dn,K as fn,L as pn,M as mn,N as hn,Q as gn,R as _n,S as vn,T as yn,U as bn,V as xn,W as Sn,X as Cn,Y as wn,Z as Tn,_ as En,_t as Dn,at as On,b as kn,bt as An,c as jn,ct as Mn,d as Nn,et as Pn,f as Fn,g as In,h as Ln,it as Rn,j as zn,k as Bn,l as Vn,lt as Hn,m as Un,n as Wn,nt as Gn,o as Kn,p as qn,q as Jn,r as Yn,t as Xn,tt as k,u as Zn,ut as Qn,v as $n,vt as er,w as tr,x as nr,y as rr,z as ir}from"./device-claim-rule.js";import{n as ar,t as or}from"./catalog.js";import{g as sr,i as cr}from"./observability.js";import{n as A,r as lr}from"./success-text.js";import{i as ur,l as dr,u as fr}from"./app-inventory-contract.js";import{n as pr}from"./app-inventory.js";import{r as mr,t as hr}from"./device.js";import{a as gr,o as _r,r as j}from"./diagnostics.js";import{a as vr,i as yr,r as br}from"./verified-file.js";import{f as xr,s as Sr}from"./exec.js";import{t as Cr}from"./timeouts.js";import"./file.js";import"./diagnostics2.js";import{n as wr,r as Tr}from"./output-path.js";import"./command.js";import{a as Er,i as Dr,n as Or,t as kr}from"./replay-divergence.js";import"./retry.js";import{r as Ar}from"./version.js";import{t as jr}from"./session-paths.js";import{i as Mr,r as Nr}from"./session-artifact-paths.js";import{t as Pr}from"./project-runtime.js";import{r as Fr}from"./rect-center.js";import{o as Ir}from"./android-system-chrome.js";import{t as Lr}from"./keyed-lock.js";import{n as Rr,t as zr}from"./deploy-result-target.js";import{t as Br}from"./keyboard-actions.js";import{a as Vr,i as Hr,n as Ur,o as Wr,r as M}from"./request-cancel.js";import{t as Gr}from"./request.js";import{i as Kr,s as qr}from"./provider-session-ownership.js";import{r as Jr}from"./provider-device-runtime.js";import{i as Yr,s as Xr,t as Zr}from"./device-claim-inspection.js";import{t as Qr}from"./audio-probe-result.js";import{_ as $r,a as ei,b as ti,c as ni,d as ri,f as ii,g as ai,h as oi,i as si,l as ci,m as li,n as ui,o as di,r as fi,s as pi,t as mi,u as hi,v as gi,x as _i}from"./perf-runtime-plan.js";import{i as vi,n as yi}from"./lease-context.js";import{m as bi}from"./screenshot-runtime.js";import{n as N,r as xi}from"./device-isolation.js";import{a as Si,n as Ci,r as wi}from"./device-inventory-context.js";import{n as Ti,r as Ei,t as Di}from"./dispatch-resolve.js";import{a as Oi,i as P}from"./request-runtime-binding.js";import{C as F,E as ki,T as Ai,b as ji,h as I,i as Mi,m as Ni,n as Pi,p as Fi,s as Ii,v as Li}from"./session-snapshot.js";import{r as Ri,t as zi}from"./platform-runtime-apple-resources.js";import{a as Bi,i as Vi,n as Hi,o as Ui}from"./session-routing.js";import{d as L}from"./src8.js";import{i as Wi,n as R,r as Gi}from"./compatibility-policy.js";import{o as Ki,t as qi}from"./snapshot-quality-verdict.js";import{a as Ji,i as z,n as Yi,r as Xi,t as Zi}from"./session-runtime-admission.js";import{t as Qi}from"./semantic-index.js";import{n as $i,r as ea}from"./device-selection-resolver.js";import{n as ta,r as na}from"./doctor-output.js";import{t as ra}from"./record-runtime.js";import{n as ia}from"./gesture-runtime.js";import{i as aa,n as oa,o as sa,r as ca}from"./platform-runtime-open-target.js";import{t as la}from"./snapshot-runtime.js";import{t as ua}from"./app-log-files.js";import B from"node:path";import V,{promises as da}from"node:fs";import{createHash as fa}from"node:crypto";import pa from"node:os";import{fileURLToPath as ma}from"node:url";import{setTimeout as ha}from"node:timers/promises";import ga from"node:vm";function H(e,t){return L({appId:e.appId,env:e.env,generation:e.generation,invalidateObservation:e.invalidateObservation,source:t?.source,cachedObservation:e.cachedObservation,signal:e.signal})}function _a(e){return L({env:e.env,generation:e.generation,cachedObservation:e.cachedObservation,signal:e.signal})}async function va(e,t){let n=Ca(await t.observe({condition:e.condition,timeoutMs:e.timeoutMs},_a(e)),e.generation),r={kind:`selector`,selector:e.condition.selector,visible:n.visible,candidateCount:n.candidateCount,...n.ref?{ref:n.ref}:{}};return{generation:e.generation,matched:ya(e.condition,n),candidateCount:n.candidateCount,evidence:r}}function ya(e,t){return e.kind===`visible`?t.matched&&t.visible:!t.matched||!t.visible}async function ba(e,t,n,r){let i=Ca(await r.resolveTarget({selector:e,...t},H(n,n.command)),n.generation);if(!i.matched||!i.visible||!i.rect)throw Pn(`Maestro target did not resolve to a visible element.`,{selector:e,candidateCount:i.candidateCount});return{kind:`selector`,selector:e,query:{selector:e,...t},...i,rect:i.rect}}function xa(e){let t={kind:`selector`,selector:e.selector,visible:e.visible,candidateCount:e.candidateCount,...e.ref?{ref:e.ref}:{}};return{generation:e.generation,matched:e.matched&&e.visible,candidateCount:e.candidateCount,evidence:t}}function Sa(e){if(!e||typeof e!=`object`)return!1;let t=e;return[`x`,`y`,`width`,`height`].every(e=>typeof t[e]==`number`&&Number.isFinite(t[e]))}function Ca(e,t){return wa(e,t),Ta(e),Ea(e),Da(e),e}function wa(e,t){if(e.generation!==t)throw new l(`COMMAND_FAILED`,`Maestro target evidence generation ${e.generation} does not match ${t}.`)}function Ta(e){if(!Number.isInteger(e.candidateCount)||e.candidateCount<0)throw new l(`COMMAND_FAILED`,`Maestro target evidence has an invalid candidate count.`)}function Ea(e){if(e.rect!==void 0&&!Sa(e.rect)||e.viewport!==void 0&&!Sa(e.viewport))throw new l(`COMMAND_FAILED`,`Maestro target evidence has invalid geometry.`)}function Da(e){if(e.surfaceSignature!==void 0&&typeof e.surfaceSignature!=`string`)throw new l(`COMMAND_FAILED`,`Maestro target evidence has an invalid surface signature.`)}function Oa(e,t,n,r,i,a={}){let o=ka(e,t,n,i,a);if(!o)return;let{start:s,end:c}=Pa(o,n);return{gesture:{from:s,to:c,durationMs:r},viewport:o}}function ka(e,t,n,r,i){let a=n===`up`||n===`down`,o=rn(e,dn(e,r),i),s=o.visibility,c=Tn({visibility:s,matches:e.nodes.filter(e=>oe(e)),platform:r}),l=re(s.viewportRects)??ja(c);if(!l||!be(l))return;let u=c.flatMap(e=>{if(!be(e.rect))return[];let t=Ma(e.rect,l);return!t||(a?t.height<=t.width:t.width<t.height)?[]:[{node:e,viewport:t}]}),d=new Map(u.map(e=>[e.node.index,e]));for(let e of o.resolve(t).indexed){let t=Aa(e,s.nodeByIndex),n=t?d.get(t.index):void 0;if(n)return n.viewport}return u.sort(Na)[0]?.viewport}function Aa(e,t){return oe(e)?e:Se(e,t)}function ja(e){let t;for(let n of e)be(n.rect)&&(!t||n.rect.width*n.rect.height>t.width*t.height)&&(t=n.rect);return t}function Ma(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width)-n,a=Math.min(e.y+e.height,t.y+t.height)-r;return i>0&&a>0?{x:n,y:r,width:i,height:a}:void 0}function Na(e,t){return t.viewport.width*t.viewport.height-e.viewport.width*e.viewport.height}function Pa(e,t){let n=U(e,.5,.5),r=R.scrollUntilVisibleSwipe.nearEdgeFraction,i=R.scrollUntilVisibleSwipe.farEdgeFraction;switch(t){case`up`:return{start:n,end:U(e,.5,i)};case`down`:return{start:n,end:U(e,.5,r)};case`left`:return{start:n,end:U(e,i,.5)};case`right`:return{start:n,end:U(e,r,.5)}}}async function Fa(e,t,n){let r=k(e.duration,`swipe.duration`);if(e.kind===`coordinates`){if(e.start.space!==e.end.space)throw new l(`INVALID_ARGS`,`Maestro swipe endpoints must use the same coordinate space.`);let i=e.start.space===`percent`?await n.resolveGestureViewport(H(t,t.command)):void 0;return{authored:e,gesture:La(await Ia(e.start,t,n,i),await Ia(e.end,t,n,i),r),...i?{viewport:i}:{}}}if(e.kind===`screen`){let i=await n.resolveGestureViewport(H(t,t.command)),{start:a,end:o}=Ra(i,e.direction,n.platform);return{authored:e,gesture:La(a,o,r),viewport:i}}let i=await ba(e.from,{purpose:`swipe`,timeoutMs:`optional`in t.command&&t.command.optional===!0?R.command.optionalTargetLookupTimeoutMs:R.command.targetLookupTimeoutMs},t,n),a=i.viewport??await n.resolveGestureViewport(H(t,t.command)),{start:o,end:s}=za(i,e.direction,a);return{authored:e,gesture:La(o,s,r),target:i,viewport:a}}async function Ia(e,t,n,r){if(e.space===`absolute`)return{x:e.x,y:e.y};let i=r??await n.resolveGestureViewport(H(t,t.command));return{x:i.x+Math.trunc(i.width*e.x/100),y:i.y+Math.trunc(i.height*e.y/100)}}function La(e,t,n){return{from:e,to:t,durationMs:n??R.command.swipeDurationMs}}function Ra(e,t,n){if(t===`left`||t===`right`){let n=$e(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=R.screenSwipe,i=U(e,r.centerFraction,r.nearEdgeFraction),a=U(e,r.centerFraction,r.farEdgeFraction),o=U(e,r.centerFraction,r.downStartFraction),s=U(e,r.centerFraction,r.upStartFraction[n]);return t===`up`?{start:s,end:i}:{start:o,end:a}}function U(e,t,n){return{x:e.x+Math.trunc(e.width*t),y:e.y+Math.trunc(e.height*n)}}function za(e,t,n){let r=Fr(e.rect),i=n.x+Math.trunc(n.width*R.targetSwipe.nearEdgeFraction),a=n.y+Math.trunc(n.height*R.targetSwipe.nearEdgeFraction),o=n.x+Math.trunc(n.width*R.targetSwipe.farEdgeFraction),s=n.y+Math.trunc(n.height*R.targetSwipe.farEdgeFraction);switch(t){case`up`:return{start:r,end:{x:r.x,y:a}};case`down`:return{start:r,end:{x:r.x,y:s}};case`left`:return{start:r,end:{x:i,y:r.y}};case`right`:return{start:r,end:{x:o,y:r.y}}}}const Ba={launchApp:Ga,stopApp:Ga,clearState:Ga,openLink:Ga,tapOn:qa,doubleTapOn:qa,longPressOn:qa,swipe:Qa,inputText:$a,eraseText:$a,scroll:W,scrollUntilVisible:W,hideKeyboard:W,pressKey:W,back:W,waitForAnimationToEnd:W,takeScreenshot:no,runScript:no,assertVisible:ro,assertNotVisible:ro,assertTrue:ro,extendedWaitUntil:ro},Va={launchApp:!0,stopApp:!0,clearState:!0,openLink:!0,tapOn:!0,doubleTapOn:!0,longPressOn:!0,swipe:!0,inputText:!0,eraseText:!0,scroll:!0,scrollUntilVisible:!0,hideKeyboard:!0,pressKey:!0,back:!0,waitForAnimationToEnd:!0,takeScreenshot:!1,runScript:!1,assertVisible:!1,assertNotVisible:!1,assertTrue:!1,extendedWaitUntil:!1};function Ha(e){return Va[e.kind]}async function Ua(e,t){let n=e.command;return await Wa(n,e,t,H(e,n))}function Wa(e,t,n,r){let i=Ba[e.kind];return i(e,t,n,r)}async function Ga(e,t,n,r){switch(e.kind){case`launchApp`:return await G(n.launchApp,Ka(e,t),r,`invalidate`);case`stopApp`:return await G(n.stopApp,{appId:e.appId??t.appId},r,`invalidate`);case`clearState`:return await G(n.clearState,{appId:e.appId??t.appId},r,`invalidate`);case`openLink`:return await G(n.openLink,{link:e.link},r,`invalidate`)}}function Ka(e,t){return L({appId:e.appId??t.appId,stopApp:e.stopApp,clearState:e.clearState,arguments:e.arguments,launchArguments:e.launchArguments})}async function qa(e,t,n,r){switch(e.kind){case`tapOn`:return await Ja(e,t,n,r);case`doubleTapOn`:{let i=await fo(e.target,{purpose:`doubleTap`,timeoutMs:Xa(e)},t,n),a=k(e.delay,`doubleTapOn.delay`)??R.command.repeatDelayMs;return await G(n.doubleTapOn,{target:i,delay:a},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}case`longPressOn`:{let i=await fo(e.target,{purpose:`longPress`,timeoutMs:Xa(e)},t,n);return await G(n.longPressOn,{target:i},r,`invalidate`,i.resolution?xa(i.resolution):void 0)}}}async function Ja(e,t,n,r){let i=await Ya(e,t,n);return await G(n.tapOn,Za(e,i),r,`invalidate`,i.resolution?xa(i.resolution):void 0)}async function Ya(e,t,n){let r={purpose:`tap`,timeoutMs:Xa(e),allowAtomicSelectorDispatch:e.repeat===void 0&&e.delay===void 0,...e.retryTapIfNoChange===!0?{includeSurfaceSignature:!0}:{}};return await fo(e.target,r,t,n)}function Xa(e){return e.optional===!0?R.command.optionalTargetLookupTimeoutMs:R.command.targetLookupTimeoutMs}function Za(e,t){let n=k(e.repeat,`tapOn.repeat`),r=k(e.delay,`tapOn.delay`),i=n===void 0?r:r??R.command.repeatDelayMs;return L({target:t,retryTapIfNoChange:e.retryTapIfNoChange,repeat:n,delay:i})}async function Qa(e,t,n,r){let i=await Fa(e.gesture,t,n);return await G(n.gesture,i.gesture,{...r,...i.viewport?{gestureViewport:i.viewport}:{}},`invalidate`,i.target?xa(i.target):void 0)}async function $a(e,t,n,r){switch(e.kind){case`inputText`:return await G(n.inputText,L({text:e.text,label:e.label}),r,`invalidate`);case`eraseText`:return await G(n.eraseText,L({charactersToErase:k(e.charactersToErase,`eraseText.charactersToErase`)}),r,`invalidate`)}}async function W(e,t,n,r){switch(e.kind){case`scroll`:return await G(n.scroll,{direction:`down`},r,`invalidate`);case`scrollUntilVisible`:return await G(n.scrollUntilVisible,eo(e),r,`invalidate`);case`hideKeyboard`:return await G(n.hideKeyboard,{},r,`invalidate`);case`pressKey`:return await G(n.pressKey,{key:e.key},r,`invalidate`);case`back`:return await G(n.back,{},r,`invalidate`);case`waitForAnimationToEnd`:return await G(n.waitForAnimationToEnd,to(e),r,`preserve`)}}function eo(e){return{selector:e.element,direction:e.direction??`down`,timeoutMs:k(e.timeout,`scrollUntilVisible.timeout`)??R.command.scrollUntilVisibleTimeoutMs,durationMs:Wi(R.command.scrollUntilVisibleSpeed)}}function to(e){return L({timeoutMs:k(e.timeout,`waitForAnimationToEnd.timeout`)})}async function no(e,t,n,r){switch(e.kind){case`takeScreenshot`:return ao(await n.takeScreenshot({path:e.path},r),[],void 0,r.generation);case`runScript`:return await G(n.runScript,L({file:e.file,env:e.env}),r,`preserve`)}}async function ro(e){throw new l(`COMMAND_FAILED`,`Maestro ${e.kind} must be executed by the observation engine.`)}async function G(e,t,n,r,i){let a=io(n,r);return ao(await e(t,a),[],r===`preserve`?i:void 0,a.generation)}function io(e,t){return t===`preserve`?e:(e.invalidateObservation(),{...e,generation:e.generation+1})}function ao(e,t,n,r){let i=e?.observation;return oo(i,r),{...so(n??i),...co(e?.outputEnv),...lo(t,e?.artifactPaths),...uo(e?.data),...e?.visualStabilityReached===void 0?{}:{visualStabilityReached:e.visualStabilityReached}}}function oo(e,t){if(!(!e||t===void 0||e.generation===t))throw new l(`COMMAND_FAILED`,`Maestro operation evidence generation ${e.generation} does not match ${t}.`)}function so(e){return e?{observation:e}:{}}function co(e){return e?{outputEnv:{...e}}:{}}function lo(e,t){let n=[...new Set([...e,...t??[]])];return n.length>0?{artifactPaths:n}:{}}function uo(e){return e&&Object.keys(e).length>0?{data:{...e}}:{}}async function fo(e,t,n,r){if(e.space===`target`){let i=await ba(e.selector,t,n,r);return{authored:e,point:Fr(i.rect),resolution:i}}return{authored:e,point:await Ia(e,n,r)}}function po(e,t,n,r={}){let i=n===`ios`&&r.presentation?ho(r.presentation):void 0,a=i?go(e,t,i):ln(e,t.selector,n);if(!a.parentMatched)return{ok:!1,message:`Maestro childOf parent did not match.`,evidence:bo(t,a.matches,[],void 0)};let{matches:o,ranked:s}=a,c=i?cn(s,t.selector.index):Sn(s,t.selector.index)?.node,l=bo(t,o,s,c);if(!c)return _o(t,o,s,l);let u=i?Sn(i.visibleForSource(c),void 0):null,d=fn(c),f=r.interactiveBounds?u?.rect??d:d??u?.rect;return f?{ok:!0,node:c,rect:f,matches:s.length,dispatchCandidates:n===`ios`&&t.allowAtomicSelectorDispatch&&!mo(t.selector)&&i?vo(d,s,u):0,evidence:l}:_o(t,o,s,l)}const mo=Cn;function ho(e){let t=Ye(e.snapshot.nodes),n=t.nodeByIndex,r=new Map,i=t=>(e.presentedIndexesBySourceIndex.get(t.index)??[]).flatMap(e=>{let t=n.get(e);return t?[t]:[]}),a=e=>{let n=r.get(e.index);if(n)return n;let a=i(e).filter(e=>gn(e,t,`ios`));return r.set(e.index,a),a};return{visibleForSource:a,isVisible:e=>a(e).length>0}}function go(e,t,n){let r=dn(e,`ios`),i=wn(e,{},{orderUnindexed:e=>Jn(e,r)}),a=xn(t.selector,i),o=a.matches.filter(n.isVisible);return{...a,visible:o,clickability:r,ranked:bn(o,t.selector,`ios`,i.visibility,r)}}function _o(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 vo(e,t,n){return t.length===1?e&&n&&n.node.hittable!==!1&&yo(n.rect,e)?1:0:t.length}function yo(e,t){let n=Fr(e),r=Fr(t);return n.x===r.x&&n.y===r.y}function bo(e,t,n,r){return L({selector:e.selector,matched:t.length>0,visible:n.length>0,candidateCount:t.length,ref:r?.ref})}const K={settleTimeoutMs:Gi,retryTapMaxAttempts:R.command.retryTapMaxAttempts,longPressDurationMs:R.command.longPressDurationMs,eraseTextMaxCharacters:R.command.eraseTextMaxCharacters,scrollUntilVisiblePercentage:R.command.scrollUntilVisiblePercentage,animationWaitTimeoutMs:R.command.waitForAnimationToEndTimeoutMs,animationDifferencePercent:R.command.waitForAnimationToEndDifferencePercent,observationPollMs:R.observation.pollIntervalMs};function xo(e,t={}){return{execute:async n=>{let r=H(n,n.command),i=n.command.kind===`waitForAnimationToEnd`;await t.beforeExecute?.({context:r,requiresSettledPredecessor:Ha(n.command)&&!i,visualStabilityBarrier:i});let a=await Ua(n,e);return t.afterExecute?.({context:r,visualStabilityReached:i&&a.visualStabilityReached===!0}),delete a.visualStabilityReached,a},observe:async n=>{let r=await va(n,e);return t.bindObservation?.(r)??r},...t.readMetrics?{readMetrics:t.readMetrics}:{}}}function So(e){throw new l(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Co(e){let t=e.meta?.installSource;if(!t)throw new l(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new l(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new l(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new l(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:So(t)}}function wo(e){let t=Co(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:qr(n,e.meta?.tenantId)},cleanup:()=>{Kr(n)}}}function q(e,t,n){return t||Hn(n)?null:P(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function To(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function J(e){return Qn(e.flags)||!e.session?await Ti(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await Eo(e.session.device)}async function Eo(e){if(Jr(e)||!C(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await zi(e.id))?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Ti(t)}catch(e){if(!(e instanceof l)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Ti({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function Do(e,t){return t?Rn(t,e).length===0:!1}async function Oo(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=wo(t);let n=Mo(t),l=await Ao(a,t.flags),u=await Xi(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await Yi(e.bindDevice)(l,De);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await No({artifact:s,retention:n,req:t,session:a,sessionName:r}),a&&F(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Po(l,s,p,c),h=lr(m,`Installed: ${Rr(m)}`);return O(i,a,t,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Bn(c.materializationId,t.meta?.tenantId).catch(()=>{}),{ok:!1,error:n(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function ko(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new l(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Bn(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:n(e)}}}async function Ao(e,t){let n=jo(t?.platform);if(e&&n&&e.device.platform!==n)throw new l(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${e.device.platform}`);if(!e&&!n)throw new l(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await J({session:e,flags:t})}function jo(e){return e===`ios`||e===`android`?e:void 0}function Mo(e){let t=e.meta?.retainMaterializedPaths===!0,n=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(n!==void 0&&n<=0)throw new l(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...n===void 0?{}:{ttlMs:n}}}async function No(e){if(e.retention.enabled)return await zn({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 Po(e,t,n,r){return C(e)?Fo(t,n,r):Io(t,n,r)}function Fo(e,t,n){let r=t.bundleId??e.bundleId;if(!r)throw new l(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...Ro(n),bundleId:r,...Lo(t,e),launchTarget:t.launchTarget??r}}function Io(e,t,n){let r=t.packageName??t.launchTarget??e.packageName;if(!r)throw new l(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...Ro(n),packageName:r,...Lo(t,e),launchTarget:t.launchTarget??r}}function Lo(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Ro(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function zo(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,a=Bo(t);if(!a.ok)return a.response;let o=q(`runtime port-reverse`,n,t.flags);if(o)return o;let s=await J({session:n,flags:t.flags}),c=await I({device:s,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:Qe});if(c.type===`response`)return c.response;if(c.runtime.owner.kind!==`provider-runtime`||c.runtime.owner.provider!==a.options.provider)return P(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:a.options.provider});let l=await c.runtime.operations.configureProviderPortReverse(a.options);return l?{ok:!0,data:{action:`port-reverse`,...l}}:P(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function Bo(e){let t=Vo(e);if(!t.ok)return t;let n=Ho(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 Vo(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Ho(e){let t=Uo(e.flags?.devicePort),n=Uo(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:P(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Uo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Wo(e){return await I({...e,command:`runtime clear`,use:ue})}async function Go(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await zo({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Ko({...e,session:r.get(n)});if(!qo(i))return P(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await Jo({sessionName:n,sessionStore:r,session:a,current:o,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Yo(n,o):Zo({req:t,sessionName:n,sessionStore:r,session:a,current:o})}async function Ko(e){if(!e.session)return P(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await ia({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=ji(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 qo(e){return e===`set`||e===`show`||e===`clear`}async function Jo(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(Nn(i)&&r?.appBundleId){let e=await Wo({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;F(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Ln(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Yo(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Xo(e){return e?E(e.device):void 0}function Zo(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=Xo(i),s=$n(t.flags?.platform??a?.platform??o);if(!s)return P(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(o!==void 0&&o!==s)return P(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=qn(a,Vn(t.flags,s));return Zn(c)===0?P(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}const Qo=/^[A-Za-z0-9_.:-]{1,64}$/,$o=8192,es=4096;function ts(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new l(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Qo.test(t))throw new l(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new l(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:rs(n,t)}}function ns(e,t,n){let r=E(e),i=is(e);if(!i)throw new l(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${r}.`,{hint:`Set AGENT_DEVICE_${r.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let a=n?JSON.stringify(n):``,o=i.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(a)).replaceAll(`{platform}`,encodeURIComponent(r));if(o.length>es)throw new l(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:o.length,maxLength:es});return o}function rs(e,t){if(e)try{let n=JSON.parse(e);if(!n||typeof n!=`object`||Array.isArray(n))throw new l(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let r=JSON.stringify(n);if(Buffer.byteLength(r,`utf8`)>$o)throw new l(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${$o} bytes`);return n}catch(t){throw t instanceof l?t:new l(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function is(e){return((C(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:T(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function as(e,t,n,r){let{eventName:i,payload:a}=ts([...r]),o=ns(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Fi(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...A(`Triggered app event: ${i}`)}}async function os(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await I({command:`trigger-app-event`,device:t,use:We,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=>as(s,t,e,n)}}function ss(e){let t=(e[0]??`status`).toLowerCase();if(!Br(t))throw new l(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new l(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return cs(t)}function cs(e){return e===`get`?`status`:e===`return`?`enter`:e}const ls={"ime-probe":`android`},us={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ds={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function fs(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Fi(e)}}async function ps(e,t){let n=await I(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ms(e,t){return e.operations.keyboardStatus(fs(t)).then(e=>({platform:ls[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 hs(e,t){let n=await e.operations.keyboardDismiss(fs(t)),r=us[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...A(vs(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...A(`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 gs(e,t){let n=await e.operations.keyboardEnter(fs(t)),r=ds[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...A(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...A(`Keyboard enter pressed`)}}async function _s(e){let t=ss(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ps({command:`keyboard status`,device:n,use:Xe,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ms(e,t)):t===`dismiss`?await ps({command:`keyboard dismiss`,device:n,use:Ze,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>hs(e,t)):await ps({command:`keyboard enter`,device:n,use:ke,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>gs(e,t))}function vs(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ys(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=q(i,l,u);if(d)return d;let f=await J({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&bi(t)===`may-invalidate`&&F(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;O(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function bs(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return P(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function xs(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ys({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={...ji(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function Ss(e){return bs(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await xs({...e,command:ar.keyboard,resolveRuntime:e=>_s(e)})}async function Cs(e){return await xs({...e,command:ar.triggerAppEvent,resolveRuntime:e=>os(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await aa(e.device,n,e.appBundleId,oa)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function ws(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Ts(e,t){let n=t?.subject??`Payload`,r=e.trim();if(!r)throw new l(`INVALID_ARGS`,`${n} cannot be empty`);let i=t?.expandPath?t.expandPath(r,t.cwd):r;try{if(!V.statSync(i).isFile())throw new l(`INVALID_ARGS`,`${n} path is not a file: ${i}`);return{kind:`file`,path:i}}catch(e){if(e instanceof l)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new l(`INVALID_ARGS`,`${n} file is not readable: ${i}`);if(t&&t!==`ENOENT`)throw new l(`COMMAND_FAILED`,`Unable to read ${n} file: ${i}`,{cause:String(e)})}if(ws(r))return{kind:`inline`,text:r};throw new l(`INVALID_ARGS`,`${n} file not found: ${i}`)}async function Es(e){let t=Ts(e,{subject:`Push payload`}),n=t.kind===`inline`?t.text:await Ds(t.path);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw new l(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof l?t:new l(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function Ds(e){try{return await da.readFile(e,`utf8`)}catch(t){let n=t.code;throw n===`ENOENT`?new l(`INVALID_ARGS`,`Push payload file not found: ${e}`):n===`EISDIR`?new l(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):n===`EACCES`||n===`EPERM`?new l(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new l(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function Os(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o=t.flags??{},s=q(n,a,o);if(s)return s;let c=Ps(n,t.positionals??[]);if(!c.ok)return c.response;let l=t.meta?.uploadedArtifactId;try{let s=l?qr(l,t.meta?.tenantId):vt.expandHome(c.appPathInput);if(!V.existsSync(s))return P(`INVALID_ARGS`,`App binary not found: ${s}`);let u=await J({session:a,flags:o}),d=await Xi(e.inspectFacts)(u),f=z(n,d.operations.deployApp);if(f)return f;let p=await Yi(e.bindDevice)(u,de);a&&F(a);let m=await p.operations.deployApp({app:c.app,appPath:s,replaceExisting:n===`reinstall`}),h=As(u,c.app,s,m),g=lr(h,`Installed: ${h.appName??zr(h)}`),_=Ns(a,h);return _&&_!==a&&i.set(r,_),O(i,_,t,n,g),{ok:!0,data:g}}finally{l&&Kr(l)}}async function ks(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=q(`push`,i,a);if(o)return o;let s=t.positionals?.[0]?.trim(),c=t.positionals?.[1]?.trim();if(!s||!c)return P(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let l=await Es(Fs(c,t.meta?.cwd)),u=await J({session:i,flags:a}),d=await Xi(e.inspectFacts)(u),f=z(`push`,d.operations.ensureReady)??z(`push`,d.operations.sendPushNotification);if(f)return f;let p=await Yi(e.bindDevice)(u,Ee);await p.operations.ensureReady({}),i&&F(i);let m=await p.operations.sendPushNotification({appId:s,payload:l}),h=C(u)?lr({platform:`ios`,bundleId:s},`Pushed notification to ${s}`):lr({platform:E(u),package:s,action:m.action,extrasCount:m.extrasCount},`Pushed notification to ${s}`);return O(r,i,t,`push`,h,{positionals:[s,c]}),{ok:!0,data:h}}function As(e,t,n,r){return C(e)?js(t,n,r):Ms(e,t,n,r)}function js(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 Ms(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 Ns(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ps(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:P(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:P(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Fs(e,t){let n=Ts(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>vt.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function Is(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await Os({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await Oo({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await ks({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Ls(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 Rs=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.findSelector.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 zs(e){return Rs.has(e)}const Bs=new Map(Ge.map(e=>[e.name,e]));function Vs(e){let t=new Set;for(let n of e){let e=Hs(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Hs(e){let t=Bs.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(zs)?n:void 0}function Us(e){if(e!==void 0&&e.remainingSteps.length!==0)return Vs(e.remainingSteps)}function Ws(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:vi(e),plannedOperations:Us(e.internal?.executionPlan)}}function Gs(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...A(`Closed: ${t.name}`)}})}function Ks(e,t,n){if(!ft(t))return{kind:`not-armed`};let r=t.actions.length;Gs(e,t,n);let i=Kt(t),a=e.writeSessionLog(t,{force:Jt(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`}:(ht(t),{kind:`aborted`})}function qs(e,t){let r=n(t),i=It(e.scriptPublication??Lt);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Js(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Gs(r,n,t);try{let e=r.writeSessionLog(n,{force:Jt(n,t.flags?.force)});e.written&&Bt(n,e.path);return}catch(e){return Ys(e)}}function Ys(e){let t={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof l?new l(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...t},e.cause):new l(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n(e).message}`,t)}async function Xs(e){let t=e.clearRuntimeHints?ve:pe,n=await Ni({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,pe)};let r=await n.bind(e.device,ve);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Zs(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 Qs(n,a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&Nn(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Ln(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>nn(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Qs(e,t,n,r){let i=t.get(e.name)??e;i.screenRecording&&await n(`recording`,()=>nr({session:i,sessionName:e.name,sessionStore:t})),await n(`app_log`,()=>an({session:e,sessionName:e.name,sessionStore:t})),await n(`audio_probe`,()=>kn({session:e,sessionName:e.name,sessionStore:t})),await n(`perf_capture`,()=>tr({session:e,sessionName:e.name,sessionStore:t})),await n(`platform_snapshot_helper`,()=>yn(e,r))}function $s(e,t){return vn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function ec(e){if(e instanceof l)return e;let t=e instanceof Error?e.message:String(e);return new l(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const tc=(e,t)=>(e.positionals?.length??0)>0||on(t);async function nc(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=ft(n),s=JSON.stringify(t.positionals??[]);if(o&&!dt(n,s)){let e=await ic({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:qs(n,ec(e))};mt(n,s)}let c=Ks(i,n,t);return c.kind===`failed`?{response:qs(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function rc(e){try{return{providerData:await Dn(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 ic(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(tc(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Ws(t,r,n.trace?.outPath)});return}catch(e){return e}}function ac(e,t){if(!e.flags?.saveScript||Rt(t))return;let n=t.scriptPublication;if(n?.kind!==`repair`)throw n===void 0||n.kind===`none`?new l(`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 l(`INVALID_ARGS`,`close --save-script cannot ${n.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function oc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}=e,s=i.get(n);if(!s)return await uc({req:t,logPath:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});ac(t,s);let c=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!c)return P(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new l(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let u=e.platformResourceCleanup,d=await Xs({device:s.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!s.appBundleId&&Nn(i.getRuntimeHints(n)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;if(F(s),t.internal?.closeAppOnly===!0&&c)return await lc({req:t,session:s,logPath:r,lifecycle:d.runtime,app:c});let f=await nc({req:t,session:s,logPath:r,sessionStore:i,lifecycle:d.runtime});if(`response`in f)return f.response;let p=await sc({req:t,session:s,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,lifecycle:d.runtime,clearRuntimeHints:d.clearRuntimeHints,repairArmed:f.repairArmed,platformResourceCleanup:u});return p.kind===`response`?p.response:cc({session:s,repair:f,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:p.shutdownResult,providerData:p.providerData})}async function sc(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 Zs({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:ic,finalizeOrdinaryCloseScript:Js,platformResourceCleanup:e.platformResourceCleanup}),m=await rc({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=$s(r,u),g=d??h;if(g?n.deviceClaim&&j({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await ti(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function cc(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:lr({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...A(c),...o,...s}}}async function lc(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await ic({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...A(`Closed: ${a}`)}}}async function uc(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return P(`SESSION_NOT_FOUND`,`No active session`);let a=await Xs({device:await J({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:Ws(t,n)}),{ok:!0,data:{app:t.positionals[0],...A(`Closed: ${t.positionals[0]}`)}})}function dc(e,t){return e.operations.ensureReady(t)}function fc(e,t,n){return e.operations.listApps({device:t,filter:n})}async function pc(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return mc(t,r);case`devices`:return await gc(t);case`capabilities`:return await wc({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await Ac({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function mc(e,t){let n=Bi(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Ui(e.session,n)).map(e=>hc(e,t))}}}function hc({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:Mr(r),platform:E(t.device),...b(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...b(t.device.platform)&&!T(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function gc(e){try{let t=_c();return{ok:!0,data:{devices:(await yc(e)).map(e=>({...Lc(e),...vc(e,t)}))}}}catch(e){let t=r(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function _c(){let e=new Map;for(let t of Yr({})){let n=t.claim;!n||Zr(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function vc(e,t){let n=t.get(Xr(_i(e)));return n?{claimedBy:n}:{}}async function yc(e){let t=e.flags?.platform;return Cc(await Ci(bc(e,t)),e.flags?.platform,e.flags?.target)}function bc(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:xc(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:Sc(n?.androidDeviceAllowlist)}}function xc(e,t,n){return y({simulatorSetPath:xi(e),platform:t,target:n})}function Sc(e){let t=N(e);return t?Array.from(t).sort():void 0}function Cc(e,t,n){let r=t?e.filter(e=>Rc(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function wc(e){let t=await Ic({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=Tc(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Nc(n,e.inspectFacts);return{ok:!0,data:{device:Lc(n),availableCommands:Oe().filter(e=>e===`appstate`&&r?!0:Oc(e,i))}}}function Tc(e,t,n){return!t||!C(e)&&!T(e)||!Do(n,t)?!1:Ec(t)||Dc(e,t)}function Ec(e){return!!(e.appName||e.appBundleId)}function Dc(e,t){return!!(T(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function Oc(e,t){let n=Ae(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>kc(t,e)))}function kc(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function Ac(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await jc(t,e.providerAppCatalog);if(o)return o;let s=await Ic({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=pr(t.flags?.appsFilter),u=N(t.flags?.androidDeviceAllowlist),d=await Pc({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Fc(await fc(f,await dc(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function jc(e,t){let n=Mc(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,M(e.meta?.requestId))]}}}function Mc(e){let t=yi(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 Nc(e,t){if(t)try{return await t(e)}catch{return}}async function Pc(e){if(!e.inspectFacts)throw new l(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),n=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(n&&!n.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...n.hint?{hint:n.hint}:{}}}};if(!e.bindDevice)throw new l(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,Fe)}}function Fc(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Ic(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=q(t.command,a,o);return s?{response:s}:{device:await J({session:a,flags:o,androidAvdSelection:i})}}function Lc({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:E({platform:r.platform,appleOs:n}),...b(r.platform)&&n?{appleOs:n}:{}}}function Rc(e,t){return v(e,t)}function zc(e){return P(`INVALID_ARGS`,e)}function Bc(e,t,n,r){try{return ca({device:e,surfaceFlag:t,openTarget:n,existingSurface:r})}catch(e){return P(e instanceof l?e.code:`INVALID_ARGS`,String(e.message))}}async function Vc(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await sa({target:n,platform:i.platform,surface:r});return a?zc(a):null}async function Hc(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await sa({target:n,platform:r});return i?zc(i):null}function Uc(e){let t=rr(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:Nn(n),clearRemovedRuntimeHints:En({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Wc(e){let{req:t,logPath:n,surface:r,openTarget:i,existingSession:a,runtime:o,runtimeHintPlan:s,clearRuntimeHints:c,foreground:u}=e;await o.operations.prepareApplicationOpen({target:i,currentAppBundleId:a?.appBundleId,hasExistingSession:a!==void 0,surface:r,deviceHub:t.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:r===`app`&&!!i&&!f(i??``),execution:{startupDeadlineAtMs:Kc(t),requestId:t.meta?.requestId,logPath:n,traceLogPath:a?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:vi(t)}});let{appBundleId:d,appName:p}=await Gc({runtime:o,surface:r,openTarget:i,existingAppBundleId:a?.appBundleId,foreground:u});if(s.clearRemovedRuntimeHints){if(!c)throw new l(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await Fn({replacedStoredRuntime:s.replacedStoredRuntime,previousRuntime:s.previousRuntime,runtime:s.runtime,session:a,clearRuntimeHints:c})}return{type:`details`,details:{appBundleId:d,appName:p,runtime:s.runtime}}}async function Gc(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 Kc(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function qc(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:P(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function Jc(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 la({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}}:Yc(o.data,n.error)}catch(e){return Yc(o.data,n(e))}}function Yc(e,t){return{ok:!0,data:{...e,warnings:[...Xc(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function Xc(e){return!e||!Array.isArray(e.warnings)?[]:e.warnings.filter(e=>typeof e==`string`)}function Zc(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:d,runtime:f,runtimeHintCount:p,sessionReused:m,selection:h}=e,g={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:m,...Qc(h)};return o&&(g.appName=o),s&&(g.appBundleId=s),l&&(g.startup=l),u&&(g.timing=u),f&&p(f)>0&&(g.runtime=f),d&&(g.platform=E(d),g.target=d.target??`mobile`,g.device=d.name,g.id=d.id,g.kind=d.kind,w(d.platform)&&(g.serial=d.id)),d&&C(d)&&(g.device_udid=d.id,g.ios_simulator_device_set=d.simulatorSetPath??null),{...g,...A(`Opened: ${o??s??t}`)}}function Qc(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function $c(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}function el(e){return e.internal?.resolvedSessionScope??Bi(e)}function tl(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){Ut(t,{});return}Rt(n)&&(qt(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 nl(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function rl(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 il(e){let{req:t,sessionName:n,sessionStore:r,logPath:i,device:a,openTarget:o,openPositionals:s,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 al({req:t,sessionName:n,sessionStore:r,device:a,surface:u,sessionAppBundleId:y,appName:l,existingSession:h});if(x.type===`response`)return x.response;let S=x.session??h,C=Date.now(),w=await p.operations.openApplication({target:o,positionals:s,outPath:t.flags?.out,runtimeLaunchUrl:f?.launchUrl,appBundleId:y,surface:u,hasExistingSession:h!==void 0,relaunch:v,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:nl(a,t),stateDir:r.resolveDaemonStateDir(),runtimeHints:Ln(f),applyRuntimeHints:m,execution:Ws(t,i,h?.trace?.outPath)});y=w.appBundleId??y;let T={...w.timing},E=$i(_),ee=o?rl(C,o,y):void 0;if(Hr(t.meta?.requestId)){let e=c();return P(e.code,e.message,e.details)}h&&Li({session:h,command:`open`,positionals:[],flags:void 0});let D=$c({existingSession:S,sessionName:h?.name??Vi(t),sessionScope:h?.sessionScope??el(t),device:a,surface:u,appBundleId:y,appName:l});D.lease=er({req:t,existingLease:h?.lease}),g&&(D.deviceClaim=g),t.runtime!==void 0&&In(r,n,f);let te=r.ensureSessionDir(n),ne=Nr(te,t.meta?.requestId??gr().requestId);T.totalDurationMs=Math.max(0,Date.now()-b),j({level:`info`,phase:`open_timing`,durationMs:T.totalDurationMs,data:T});let re=Zc({sessionName:D.name,sessionStateDir:te,runnerLogPath:Mr(te),requestLogPath:ne,eventLogPath:r.resolveEventLogPath(n),appName:l,appBundleId:y,surface:u,startup:ee,timing:T,device:a,runtime:f,runtimeHintCount:Zn,sessionReused:h!==void 0,selection:E});return tl({session:D,existingSession:h,saveScriptRequested:!!t.flags?.saveScript,responseData:re}),r.set(n,D),r.recordAction(D,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:re}),{ok:!0,data:re}}async function al(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=ol(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 ol(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=$c({existingSession:o,sessionName:o?.name??Vi(t),sessionScope:o?.sessionScope??el(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=er({req:t,existingLease:o?.lease}),s}function sl(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(i)return Hi(t,i.session)?P(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:n.id,deviceName:n.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):On(i,n)}async function cl(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Xn(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Wn(n,r,jn({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await gi({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o})}}async function ll(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=sl({req:t,device:a,sessionStore:i});if(m)return m;let h=await cl({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Yn(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_={mayHaveStarted:!1},v=async()=>await ul({ownership:g,effects:_,sessionName:n,sessionStore:i});try{let e=await Wc({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 il({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 ul(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await ti(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await $r(t);j({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const dl=new Map;async function fl(e){let t=Ve({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Ni({...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,ce)};case`open-apply-runtime-hints`:{let t=await r(e.device,Te);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,se);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,Ce);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function pl(e){let t=Uc(e);if(t.type===`response`)return t;let n=await fl({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 ml(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),a=await qc({req:e.req,hasExistingSession:!!i});if(a.type===`response`)return a.response;let o=a.type===`resolved`?a.req:e.req;if(i){if(o.flags?.saveScript)return P(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let a=o.flags?.relaunch===!0,s=o.positionals?.[0],c=s??(a?i.appName:void 0),l=Bc(i.device,o.flags?.surface,c,i.surface);if(typeof l!=`string`)return l;if(!c&&l===`app`)return zc(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 Vc({shouldRelaunch:a,openTarget:c,surface:l,device:i.device});if(u)return u;let d=await Eo(i.device),f=ea(d);await o.internal?.retainDeviceExecutionLock?.(d.id);let p=await pl({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;F(i);let g=await Wc({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 il({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 zc(`open --relaunch requires an app argument.`);let l=await Hc({shouldRelaunch:s,openTarget:c,platform:o.flags?.platform===`android`?`android`:void 0});if(l)return l;let u=await Ei(o.flags??{},Mn(c)),d=u.device;await o.internal?.retainDeviceExecutionLock?.(d.id);let f=Bc(d,o.flags?.surface,c);if(typeof f!=`string`)return f;let p=await Vc({shouldRelaunch:s,openTarget:c,surface:f,device:d});if(p)return p;let m=await pl({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 Lr(dl,d.id,async()=>await ll({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 hl(e){let t=await ml(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Jc({...e,inspectFacts:Xi(e.inspectFacts),bindDevice:Yi(e.bindDevice),openResponse:t})}const gl=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,_l=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function vl(e){return t=>P(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function yl(e){if(e)return e;throw new l(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function bl(e){if(e)return e;throw new l(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function xl(e){return e.available?null:P(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function Sl(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function Cl(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),a=t.flags??{},o=a.platform;if(!i&&To(a)){let e=o===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return P(`SESSION_NOT_FOUND`,e)}let s=q(`appstate`,i,a);if(s)return s;let c=b(i?.device.platform)&&Do(a,i),l=o===`ios`,u=o===`macos`;if(l&&!c)return P(`SESSION_NOT_FOUND`,gl);if(u&&!c)return P(`SESSION_NOT_FOUND`,_l);if(c&&i){let e=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(T(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:E(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=T(i.device)?`macOS`:`iOS`;return P(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:E(i.device),appName:e??`unknown`,appBundleId:i.appBundleId,source:`session`,surface:i.surface??`app`,...C(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let d=await J({session:i,flags:a});if(C(d))return P(`SESSION_NOT_FOUND`,gl);if(T(d))return P(`SESSION_NOT_FOUND`,_l);let f=await I({command:`appstate`,device:d,use:ze,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>P(`UNSUPPORTED_OPERATION`,d.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(f.type===`response`)return f.response;let p=f.runtime;await p.operations.ensureReady({serial:a.serial,androidSerialAllowlist:Tl(a.androidDeviceAllowlist)});let m=await p.operations.appState();return{ok:!0,data:{platform:E(d),package:m.package,activity:m.activity}}}async function wl(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command===`boot`){let a=i.get(n),o=t.flags??{},s=q(t.command,a,o);if(s)return s;let c=N(o.androidDeviceAllowlist),l=c?[...c].sort():void 0,u=te({headless:o.headless===!0}),d;try{d=await J({session:a,flags:o,androidAvdSelection:`include-stopped`})}catch(e){let t=r(e);if(u.kind===`boot-target-headless`&&!Sl(o.device,a?.device)&&t.code===`DEVICE_NOT_FOUND`)return P(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(o.target&&(d.target??`mobile`)!==o.target)return P(`DEVICE_NOT_FOUND`,`No ${d.platform} device found matching --target ${o.target}.`);let f=await Ni({command:`boot`,device:d,required:u.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:vl(u.kind===`boot-target-headless`)});if(f.type===`response`)return f.response;let p={serial:o.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,...b(d.platform)&&d.appleOs?{appleOs:d.appleOs}:{}}}}if(t.command===`shutdown`){let r=i.get(n),a=t.flags??{},o=q(t.command,r,a);if(o)return o;let s=await J({flags:a,session:r,androidAvdSelection:`include-stopped`}),c=xl((await yl(e.inspectFacts)(s)).operations.shutdownTarget);if(c)return c;if(r&&r.device.platform===s.platform&&r.device.id===s.id)return P(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind});let l=await(await bl(e.bindDevice)(s,xe)).operations.shutdownTarget();return l.success?{ok:!0,data:{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l,...b(s.platform)&&s.appleOs?{appleOs:s.appleOs}:{}}}:P(l.error?.code??`COMMAND_FAILED`,El(l),{platform:E(s),target:s.target??`mobile`,device:s.name,id:s.id,kind:s.kind,shutdown:l})}return t.command===`appstate`?await Cl({req:t,sessionName:n,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function Tl(e){let t=N(e);return t?[...t].sort():void 0}function El(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function Dl(e){let t=yr(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=V.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{V.closeSync(t)}}function Ol(e,t){ua(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=br(e);try{V.writeFileSync(r,n,`utf8`)}finally{V.closeSync(r)}}function kl(e){let t=B.dirname(e),n=B.basename(e);V.existsSync(t)||V.mkdirSync(t,{recursive:!0});let r=vr(e);try{V.fsyncSync(r)}finally{V.closeSync(r)}let i=0;for(let e of V.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{V.unlinkSync(B.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function Al(e){return hi.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function jl(e){try{return await Ml(e)}catch(e){return{ok:!1,error:n(e)}}}async function Ml(e){let t=Nl(e);if(!t.ok)return t;let n=t.session,r=he(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 Pl(a,o);let c=ge({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 Fl(e,n,r,c.use);case`capture-status`:return await Il(e,n);case`capture-stop`:return await Ll(e,n)}}function Nl(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:P(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Pl(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return P(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Fl(e,t,n,r){if(t.audioProbe){await ni({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return P(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),a=pi.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),o=pi.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:a,device:t.device}),s=B.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 di({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 Il(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Rl()};let r=await n.handle.status();return r.state===`stopped`&&await ni({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Ll(e,t){return t.audioProbe?{ok:!0,data:await ni({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Rl()}}function Rl(){return Qr({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 zl(e){let t=e.sessionStore.get(e.sessionName);if(!t)return P(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(sr(e.req.positionals?.[0]))throw new l(`INVALID_ARGS`,cr);ou(e.req);let n=mi({positionals:e.req.positionals,kind:cu(e.req.flags?.kind),outPath:cu(e.req.flags?.out)}),r=ui(n);if(r.kind===`capture-stop`)return Bl(e,await Wl(e,t,r.request));let i=await Zi({device:t.device,plan:r,inspectFacts:e.inspectFacts});return i.admitted?Bl(e,await Vl(e,t,i)):z(`perf`,i.fact)??P(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:n(e)}}}function Bl(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return O(e.sessionStore,n,e.req,`perf`,tu(t.data)?{...t.data}:{}),t}async function Vl(e,t,n){let{device:r,plan:i}=Ji(n),a=Yi(e.bindDevice);switch(i.kind){case`frames`:return{ok:!0,data:Xl(t,await(await a(r,i.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:nu(t,await(await a(r,i.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:ru(t,await(await a(r,i.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:i.request.kind,outPath:i.request.outPath?vt.expandHome(i.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:B.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Hl(e,t,await a(r,i.use),i.request);case`profile-report`:{let n=await a(r,i.use),o=t.lastPerfProfile,s=i.request.tracePath??o?.outPath;if(!s)throw new l(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new l(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let c=au(e,i.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await n.operations.perfProfileReport({appId:t.appBundleId,kind:i.request.kind,tracePath:vt.expandHome(s,e.req.meta?.cwd),outPath:c,template:i.request.template??(o?.kind===`xctrace`?o.template:void 0),profile:o})}}}}}async function Hl(e,t,n,r){if(t.perfCapture)return P(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return P(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,a=au(e,r.outPath,i),o=ei.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=ei.createNextFence({admissionLedger:Ul(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 fi({admissionLedger:Ul(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 Ul(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new l(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Wl(e,t,n){let r=t.perfCapture;if(!r)return P(`INVALID_ARGS`,`no active native perf capture`);let i=Yl(r.handle.inspect(),n);if(i)return P(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(vt.expandHome(n.outPath,e.req.meta?.cwd));let a=await si({session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Gl(a),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:a}}function Gl(e){if(Kl(e)||ql(e))return e;throw new l(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Kl(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function ql(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Jl(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Jl(e,t){return t.every(t=>typeof e[t]==`string`)}function Yl(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 Xl(e,t){return{...iu(e),metrics:{fps:Zl(t.metric,e)},sampling:{fps:t.sampling}}}function Zl(e,t){if(!tu(e)||e.available!==!0)return e;let n=Ql(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Ql(e,t){let n=$l(t.windowStartedAt),r=$l(t.windowEndedAt)??$l(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:eu(e)})).slice(-12)}function $l(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function eu(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function tu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function nu(e,t){return{...iu(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function ru(e,t){return{...iu(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function iu(e){return{session:e.name,platform:E(e.device),device:e.device.name,deviceId:e.device.id}}function au(e,t,n){return t?vt.expandHome(t,e.req.meta?.cwd):B.join(e.sessionStore.ensureSessionDir(e.sessionName),`${su()}-${n}`)}function ou(e){let t=e.positionals?.[0]?.toLowerCase(),n=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||n!==`snapshot`))throw new l(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function su(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function cu(e){return typeof e==`string`&&e.length>0?e:void 0}const lu=[`dump`,`log`],uu=`network requires ${lu.join(` or `)}`,du=`network include mode must be one of: ${s.join(`, `)}`,fu=2048;async function pu(e){let t=e.sessionStore.get(e.sessionName);if(!t)return P(`SESSION_NOT_FOUND`,`network requires an active session`);try{let n=mu(e.bindDevice),r=(await n(t.device,Ie)).facts.networkDump;if(!r.available)return yu(r.hint);let i=hu(e.req);if(!i.ok)return i;let a=D({action:i.action,include:i.include}),o=await n(t.device,a.use),s=t.appLog?.handle.inspect();return bu(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:fu,maxScanLines:4e3}),i,!!t.appLog,s?.state)}catch(e){return{ok:!1,error:n(e)}}}function mu(e){if(e)return e;throw new l(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function hu(e){let t=gu(e);if(!t.ok)return t;let n=_u(e);if(!n.ok)return n;let r=vu(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function gu(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return lu.includes(t)?{ok:!0,action:t}:P(`INVALID_ARGS`,uu)}function _u(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?P(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function vu(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return P(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return s.includes(r)?{ok:!0,include:r}:P(`INVALID_ARGS`,du)}function yu(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function bu(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:fu,maxScanLines:e.entries.length},notes:e.notes}}}function xu(e,t){let n=li(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[Su(e.appLogFailure)]:Cu(n.state)}}function Su(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Cu(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 wu(e,t){return Re([...e,...t.notes??[]])}async function Tu(e){let{req:t}=e;return t.command===`perf`?await zl({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?Du(e):t.command===`events`?await Eu(e):t.command===`network`?await pu(e):t.command===`audio`?await jl(zu(e)):null}async function Eu(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 Du(e){let{req:t,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return P(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let n=Bu({...e,session:a}),r=(await n.bindDevice(a.device,_e)).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=Au(ie({action:t.positionals?.[0],restart:!!t.flags?.restart,marker:t.positionals?.slice(1).join(` `)}),a);return`ok`in i?i:await Ou(n,i)}catch(e){return{ok:!1,error:n(e)}}}async function Ou(e,t){switch(t.kind){case`path`:return ju(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Mu(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await ku(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Lu(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Nu(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Pu(e)}}async function ku(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Iu(e,t.appBundleId,n.owner,n.operations.appLogStart):await Fu(e,t.appBundleId,n.owner,n.operations.appLogStart)}function Au(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):P(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function ju(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=Dl(a),s=xu(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 Mu(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=xu(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:wu(t.notes,o)}}}function Nu(e,t,n){let r=n.resolveAppLogPath(t);return Ol(r,e),{ok:!0,data:{path:r,marked:!0}}}function Pu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return P(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=kl(r.resolveAppLogPath(n));return ri({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function Fu(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await ii({session:i,sessionName:a,sessionStore:o,resourcePath:ai.resolvePath(o.resolveSessionDir(a))});let s=kl(o.resolveAppLogPath(a)),c=await Ru(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Iu(e,t,n,r){let{session:i}=e;return i.appLog?P(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Ru(e,t,r,n)}async function Lu(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return P(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await ii({session:t,sessionName:n,sessionStore:r,resourcePath:ai.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Ru(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=ai.resolvePath(o.resolveSessionDir(a));try{let l=Al({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 ci({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:oi({session:i,sessionName:a,sessionStore:o,error:e})}}}function zu(e){if(!e.bindDevice||!e.inspectFacts)throw new l(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new l(`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 Bu(e){if(!e.bindDevice)throw new l(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new l(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}function Vu(e){let t=Hu(e),n=Ne(t);return fa(`sha256`).update(n,`utf8`).digest(`hex`)}function Hu(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)=>Uu(e,n[t]??null,r?.[t]??null))}}function Uu(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 Wu(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=Gu({from:r,digest:i,planDigest:n,actionCount:t,pendingRecordAndHeal:a,sessionActionsLength:o});return s?{ok:!1,message:s}:{ok:!0,value:r-1}}function Gu(e){let{from:t,digest:n,planDigest:r,actionCount:i,pendingRecordAndHeal:a,sessionActionsLength:o}=e,s=[()=>Ku({from:t,actionCount:i,pendingRecordAndHeal:a}),()=>qu({from:t,pendingRecordAndHeal:a,sessionActionsLength:o}),()=>Ju(n,r)];for(let e of s){let t=e();if(t)return t}}function Ku(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 qu(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 Ju(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 Yu(e,t){let n=e.trimStart()[0];if(n===`{`||n===`[`)throw new l(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let r=it(e),i=ot(e),a=Vu({actions:r.actions,actionLines:r.actionLines,actionSourcePaths:r.actionSourcePaths,metadata:{platform:t?.platform??et(r.actions)??i.platform,target:t?.target??i.target}}),o=r.actions.length;return{actions:r.actions,actionLines:r.actionLines,actionSourcePaths:r.actionSourcePaths,metadata:i,planDigest:a,resolveEntryIndex:e=>Wu(e,o,a)}}function Xu(e){let{recorded:t,isSelectorWait:n}=e;return n?t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`deferred-landmark`,landmark:t}:{kind:`skip`}}function Zu(e){let{recorded:t,token:n}=e;return n===void 0||!n.startsWith(`@`)&&Pe(`positional`,[n]).kind!==`expression`?{kind:`skip`}:t.verification===`unverifiable`?{kind:`recorded-unverifiable`}:{kind:`verify`,token:n}}function Qu(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 $u(e,t,n){let{observed:r,expectedStructural:i,observedStructural:a}=t,o=Qu(i,a);return{matchCount:n,observed:r,mismatches:[...r?ye(e,r):[],...o?[o]:[]],causeMessage:`Dispatch resolution (with occlusion/visibility guards) resolved a different element than pre-action verification isolated; the action was not sent.`}}function ed(e,t){let{matchCount:n,observed:r,observedAncestry:i}=t;return{matchCount:n,observed:r,mismatches:r?[...ye(e,r),...me(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 td(e,t,n,r,i,a){if(n.targetEvidences)return nd(e,t,n,r,i,a);let o=n.targetEvidence;if(!o)return Y(e,n,r,i,a);let s=e.beginTargetVerification(n,r,i);if(s.kind===`inactive`)return Y(e,n,r,i,a);if(s.kind===`post-resolution`){let c=Xu({recorded:o,isSelectorWait:s.isSelectorWait});switch(c.kind){case`skip`:return Y(e,n,r,i,a);case`recorded-unverifiable`:return{status:`failed`,failure:await e.buildRecordedUnverifiableFailure(n,i,a,t)};case`deferred-landmark`:return id(e,t,n,r,i,a,{kind:`landmark`,landmark:c.landmark})}}let c=Zu({recorded:o,token:s.token});if(c.kind===`skip`)return Y(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,rd(u),a,t)};let d=e.classifyTarget({action:n,index:i,token:l,nodes:u.nodes});return d.verified?id(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 nd(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 Y(e,n,r,i,a);let d=Zu({recorded:o[c],token:u.token});if(d.kind===`skip`)return Y(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,rd(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 id(e,t,n,r,i,a,{kind:`targets`,guards:{source:s.source,destination:s.destination}})}function rd(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 Y(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 id(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=ad(n,o,s);if(!c)return{status:`failed`,failure:s.plainFailure};let l=od(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 ad(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 od(e,t,n){return n.status===`guard-mismatch`?$u(e,n.evidence,t):ed(e,n.evidence)}async function sd(e,t){let{actions:n,entryIndex:r,keepSession:i}=e,a=Ot(e.varSources),o=[],s=[],c=dd(n),l=0;for(let u=r;u<n.length;u+=1){let r=n[u];if(!ud(r)||(t.armStep(),u===c&&(i||t.isRepairArmed())))continue;if(l+=1,t.onStep){let e=t.describeStepValue(r);t.onStep(fd(u,n.length,r,e))}let d=Ft(r,a,ld(e,u)),f=Et(a),p=t.diagnosticsMarker(),m=await td(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:cd(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 cd(e,t){return t.length===0?e:[...new Set([...e,...t])]}function ld(e,t){return{file:e.actionSourcePaths?.[t]??e.resolvedPath,line:e.actionLines[t]??1}}function ud(e){return!!(e&&e.command!==`replay`)}function dd(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(ud(n))return n.command===`close`?t:void 0}}function fd(e,t,n,r){return{index:e+1,total:t,command:n.command,...r===void 0?{}:{value:r}}}function pd(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:pt(e),pendingRecordAndHeal:e.pendingRecordAndHeal}},armStep(e){n.update(t=>{yt(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:md(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){pt(r())!==void 0&&n.update(lt)},markCompleteIfArmed(){pt(r())!==void 0&&n.update(gt)},markSessionHeldIfArmed(e){if(e.ok||!_t(r()))return e;let t=Dr(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&&gd(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{hd({session:t,...e})})}}}}function md(e){let t=B.dirname(e),n=B.basename(e,B.extname(e));return B.join(t,`${n}.healed.ad`)}function hd(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=_d({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function gd(e){e.pendingRecordAndHeal=void 0}function _d(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 vd(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=Pe(`positional`,r);return i.kind!==`expression`||i.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:i.expression,selectorTimeout:n}}function yd(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),rt(e.command)){let n=bd(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=Pe(`is`,[...e.positionals]);n.kind===`expression`&&t.push(n.expression)}if(e.command===`wait`){let{selectorExpression:n}=vd([...e.positionals]);n&&t.push(n)}return Re(t).filter(e=>e.trim().length>0)}function bd(e){let t=e.positionals;if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&xd(n)?t.slice(0,-1):t}function xd(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Sd(e){let t=Cd({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 Cd(e){let{failedIndex:t,actions:n,planDigest:r,repairHint:i,sessionExists:a}=e,o=i===`record-and-heal`?t+1:t,s=wd({failedIndex:t,actions:n,repairHint:i,sessionExists:a});return{allowed:!0,from:o,planDigest:r,...s===void 0?{}:{alternateFrom:s}}}function wd(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 Td(e){let{kind:t,targetEvidence:n,capture:r}=e;if(t===`identity-mismatch`)return`caution`;if(t===`identity-unverifiable`||!n||r.state!==`available`||!Ed(n))return`manual`;let i=Dd(n,r.nodes);return t===`selector-miss`?i?`record-and-heal`:`state-repair`:i?`record-and-heal`:`manual`}function Ed(e){return e.ancestry.length>0||e.scrollRegion!==void 0&&Od(e.scrollRegion)}function Dd(e,t){let n=Xt(t),r=Ad(e.ancestry,n,t),i=e.scrollRegion;return i&&Od(i)?r&&kd(i,n,t):r}function Od(e){return e.id!==void 0||e.label!==void 0}function kd(e,t,n){return n.some(n=>Ct(St(n,t),e))}function Ad(e,t,n){return e.length===0?n.length>0:n.some(n=>{let r=Yt(n,t,e.length);return!r.broken&&ne(r.chain,e)})}const jd=new WeakMap;function Md(e){return{store:t=>Nd(e,t),finalize:(t,n)=>Pd({...e,evidence:t,projection:n})}}function Nd(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Mi(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 jd.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ai(a),refFrame:ki(a)}),{evidence:s,refsGeneration:o}}function Pd(e){let t=jd.get(e.evidence);jd.delete(e.evidence);let n=Id(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Fd(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Ld(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Pi(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Fd(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&&Ai(n)===t.runtimeRevision&&ki(n)===t.refFrame}function Id(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 Ld(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Rd(e){let{sessionStore:n,observationStore:r,sessionName:i,divergence:a,responseLevel:o}=e,s,c,l=kr({divergence:a,level:o,writeOverflowArtifact:e=>{let r=t(e),i=Vd(n,r);return`artifactPath`in i&&(s=r,c=i.artifactPath),i}}),u=(s??l).screen;if(u.state!==`available`||u.refs.length===0)return e.evidence&&Md({sessionStore:r,sessionName:i,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.state===`available`?u.refsGeneration:void 0,refs:[]}),l;if(!e.evidence)return Bd(c),zd(l,`missing-evidence`);let d=Md({sessionStore:r,sessionName:i,...e.signal?{signal:e.signal}:{}}).finalize(e.evidence,{refsGeneration:u.refsGeneration,refs:u.refs.map(e=>e.ref)});return d.published===!0?l:(Bd(c),zd(l,d.reason))}function zd(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 Bd(e){if(e)try{V.unlinkSync(e)}catch{}}function Vd(e,t){try{let n=B.join(e.ensureSessionDir(),`replay-divergence`);V.mkdirSync(n,{recursive:!0});let r=`${Date.now()}-step${t.step.index}.json`,i=B.join(n,r);return V.writeFileSync(i,`${JSON.stringify(t,null,2)}\n`),{artifactPath:i}}catch{return{artifactUnavailable:!0}}}const Hd={id:0,"role-label":1,label:2,other:3};function Ud(e){let t=new Map;for(let n of e){let e=t.get(n.nodeIndex);(!e||Wd(n.basis)<Wd(e.basis))&&t.set(n.nodeIndex,n)}return[...t.values()].sort((e,t)=>Wd(e.basis)-Wd(t.basis)||e.nodeIndex-t.nodeIndex)}function Wd(e){return Hd[e]}async function Gd(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,_=Or(p),v={code:t.code,message:_(t.message),...t.hint?{hint:_(t.hint)}:{}},y=o?await Jd({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=Qd(y,_),x=y.state===`available`&&o?rf({action:n,session:o,nodes:y.nodes,sanitize:_}):[],S=Td({kind:`action-failure`,targetEvidence:n.targetEvidence,capture:Kd(y)}),C=Sd({failedIndex:r+1,actions:m,planDigest:h,repairHint:S,resumeStamper:u});return Rd({sessionStore:c,observationStore:l,sessionName:s,divergence:{version:1,kind:`action-failure`,step:{index:r+1,source:{path:_(i),line:a}},action:_(nt(n)),cause:v,screen:b,suggestions:x.slice(0,5),suggestionCount:x.length,resume:C,repairHint:S},responseLevel:f,evidence:y.state===`available`?y.evidence:void 0,...g?{signal:g}:{}})}function Kd(e){return e.state===`available`?{state:`available`,nodes:e.nodes}:{state:`unavailable`}}const qd=[300,500,800,1200,2e3,3e3,4e3];async function Jd(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,retryLaunchRace:o=!1}=e,s=Xd(a),c=Date.now()+12e3,l=await Yd({session:t,sessionName:n,observationStore:r,logPath:i,flags:s});if(!o)return l.observation;for(let e of qd){if(l.observation.state===`available`||!l.retryable)break;let a=c-Date.now();if(a<=0)break;await Cr(Math.min(e,a)),l=await Yd({session:t,sessionName:n,observationStore:r,logPath:i,flags:s})}return l.observation}async function Yd(e){let{session:t,sessionName:n,observationStore:r,logPath:i,flags:a}=e;try{let e=(await Ii({device:t.device,session:t,flags:a,logPath:i})).snapshot;if(qi(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=Md({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:Ir(e)}}}function Xd(e){return{snapshotInteractiveOnly:Zd(e)}}function Zd(e){return!af(e.command)||of(e).requiresRect}function Qd(e,t){if(e.state===`unavailable`)return{state:`unavailable`,reason:t(e.reason),hint:t(e.hint)};let{refs:n,truncated:r}=nf(e.nodes,t,e.appBundleId);return{state:`available`,refsGeneration:e.refsGeneration,refs:n,...r?{truncated:!0}:{}}}function $d(e){return!!dr(e,fr(e.type??`Element`))||e.hittable===!0}function ef(e,t){return t!==void 0&&e.bundleId!==void 0&&e.bundleId!==t&&e.hittable===!0}function tf(e,t){let n=Zt(e,t),r=e.filter(e=>e.ref&&!n.has(e.ref)&&$d(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=>ef(e,t)),...o.filter(e=>!ef(e,t))],c=s.slice(0,20);return{nodes:c,truncated:s.length>c.length}}function nf(e,t,n){let{nodes:r,truncated:i}=tf(e,n);return{refs:r.map(e=>{let n=fr(e.type??`Element`),r=dr(e,n);return{ref:e.ref,role:t(n),...r?{label:t(r)}:{}}}),truncated:i}}function rf(e){let{action:t,session:n,nodes:r,sanitize:i}=e;if(!af(t.command))return[];let a=yd(t);return a.length===0?[]:sf({candidates:a,nodes:r,session:n,action:t,matching:of(t),sanitize:i})}function af(e){return rt(e)||[`fill`,`get`,`is`,`wait`].includes(e)}function of(e){let t=rt(e.command);return{requiresRect:t||e.command===`fill`,allowDisambiguation:t||e.command===`fill`||e.command===`get`&&e.positionals?.[0]===`text`}}function sf(e){let{candidates:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=[];for(let e of t){let t=cf({candidate:e,nodes:n,session:r,action:i,matching:a,sanitize:o});t&&s.push(t)}return Ud(s).map(e=>e.suggestion)}function cf(e){let{candidate:t,nodes:n,session:r,action:i,matching:a,sanitize:o}=e,s=Le(t,n,{platform:r.device.platform,requireRect:a.requiresRect,allowDisambiguation:a.allowDisambiguation});if(s)return{suggestion:lf({node:s.node,nodes:n,session:r,action:i,basis:s.basis,sanitize:o}),basis:s.basis,nodeIndex:s.node.index}}function lf(e){let{node:t,nodes:n,session:r,action:i,basis:a,sanitize:o}=e,s=Ke(t,r.device.platform,{action:i.command===`fill`?`fill`:rt(i.command)?`click`:`get`,nodes:n}),c=fr(t.type??`Element`),l=dr(t,c);return{selector:o(s.join(` || `)),basis:a,...t.ref?{ref:t.ref}:{},role:o(c),...l?{label:o(l)}:{}}}function uf(e){return{...e,hint:e.hint??pf(e.details,`hint`),diagnosticId:e.diagnosticId??pf(e.details,`diagnosticId`),logPath:e.logPath??pf(e.details,`logPath`)}}function df(e){let{error:t,action:n,step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c}=e;return ff({error:t,actionLabel:nt(n),action:n.command,positionals:ut(n)??[],step:r,replayPath:i,artifactPaths:a,snapshotDiagnostics:o,divergence:s,scrubVars:c})}function ff(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:Er(`Replay failed at step ${a} (${n}): ${t.message}`,u),hint:t.hint===void 0?void 0:Er(t.hint,u),diagnosticId:t.diagnosticId,logPath:t.logPath,...t.retriable===void 0?{}:{retriable:t.retriable},...t.supportedOn===void 0?{}:{supportedOn:t.supportedOn},details:{...hf(t.details),replayPath:o,step:a,action:r,positionals:i,artifactPaths:s,...c?{snapshotDiagnostics:c}:{},divergence:l}}}}function pf(e,t){let n=e?.[t];return typeof n==`string`&&n.length>0?n:void 0}const mf=[`reason`,`recovery`,`retriable`,`supportedOn`];function hf(e){if(!e)return{};let t={};for(let n of mf)e[n]!==void 0&&(t[n]=e[n]);return t}async function gf(e){return await _f({...e,snapshotDiagnostics:m(e.snapshotDiagnosticSamples)})}async function _f(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=vf(t.error.details?.replaySource),y=uf(t.error),b=await Gd({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:M(u.meta?.requestId)});return df({error:y,action:n,step:r+1,replayPath:i,artifactPaths:s,snapshotDiagnostics:c,divergence:b,scrubVars:l})}function vf(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 yf(e,n){if(e)try{V.appendFileSync(e,`${JSON.stringify(t(n))}\n`)}catch(t){j({level:`warn`,phase:`replay_trace_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}}async function bf(e){let{req:t,sessionName:r,action:i,resolved:a,filePath:o,line:s,step:c,sourcePath:u,tracePath:d,invoke:f}=e,p=Date.now();yf(d,{type:`replay_action_start`,ts:new Date(p).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,positionals:ut(a)??[]});let m;try{m=await Sf({req:t,sessionName:r,resolved:a,sourceAction:i,invoke:f})}catch(e){if(!(e instanceof l))throw e;m={ok:!1,error:n(e)}}let h=Date.now();return yf(d,{type:`replay_action_stop`,ts:new Date(h).toISOString(),replayPath:o,...u?{sourcePath:u}:{},line:s,step:c,command:a.command,ok:m.ok,durationMs:h-p,resultTiming:m.ok?wf(m.data):void 0,errorCode:m.ok?void 0:m.error.code}),xf(m,u??o,s)}function xf(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 Sf(e){let{req:t,sessionName:n,resolved:r,sourceAction:i,invoke:a}=e,o=Tf(t.flags,r.flags),s=i.command===`fill`?Vt(Gt(i)):void 0;return s&&(o.recordAs=s),await a(Cf({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??Bi(t)}:{}}},r))}function Cf(e,t){let n=t.positionals??[];return t.command===`gesture`?{...e,command:t.command,positionals:[],input:tt(n,e.flags?.pointerCount)}:t.command===`swipe`?{...e,command:t.command,positionals:[],input:st(n,{count:e.flags?.count,pauseMs:e.flags?.pauseMs,pattern:e.flags?.pattern})}:{...e,command:t.command,positionals:n}}function wf(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 Tf(e,t){return p(e,{...t??{}})}function Ef(e){return Nf(e.ok?Of(e.data):Df(e.error.details?.artifactPaths))}function Df(e){return Array.isArray(e)?e.filter(Mf):[]}function Of(e){return e?[jf(e.path),jf(e.outPath),...kf(e.artifacts)].filter(Mf):[]}function kf(e){return Array.isArray(e)?e.map(Af).filter(Mf):[]}function Af(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;return jf(t.localPath)??jf(t.path)}function jf(e){return typeof e==`string`?e:void 0}function Mf(e){return typeof e==`string`}function Nf(e){return[...new Set(e.filter(Pf))]}function Pf(e){try{return V.statSync(e).isFile()}catch{return!1}}function Ff(e){let{recorded:t,token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}=e,c=If({token:n,nodes:r,platform:i,refLabel:a,requireRect:o,allowDisambiguation:s}),l=Xt(r),u=ae(t),d=en(c.matchedNodes,l,u,t.ancestry),f=d.filter(e=>wt(r,e)===t.sibling),p=d.filter(e=>Ct(St(e,l),t.scrollRegion)),m=bt(p)[t.viewportOrder]?.ref,h=xt({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,...zf({classification:h,matchCount:c.matchedNodes.length,winnerNode:g,identitySet:d,byIndex:l,recorded:t})}}function If(e){let{token:t,nodes:n,platform:r,refLabel:i,requireRect:a,allowDisambiguation:o}=e;return t.startsWith(`@`)?Lf(n,t,i,a):Rf(n,t,r,a,o)}function Lf(e,t,n,r){let a=e=>e!==null&&(!r||!!e.rect),s=o(t),c=s?i(e,s):null;if(a(c))return{matchedNodes:[c],winnerRef:c.ref};let l=n?$t(e,n):null;return a(l)?{matchedNodes:[l],winnerRef:l.ref}:{matchedNodes:[],winnerRef:``}}function Rf(e,t,n,r,i){let a=Be(t,e,{platform:n,requireRect:r,allowDisambiguation:i});return a.kind===`resolved`?{matchedNodes:[...a.matchedNodes],winnerRef:a.winner.ref}:{matchedNodes:[...a.matchedNodes],winnerRef:``}}function zf(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?Bf(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?Bf(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?Bf(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 Bf(e,t,n){let r=Tt(t),i=Yt(t,n,Math.max(e.ancestry.length,1)).chain;return[...ye(e,r),...me(e.ancestry,i)].slice(0,5)}function Vf(e,t){let n=e.positionals??[];if(e.command===`gesture`){let e=ct(n);return e?e[t??`source`]:void 0}if(e.command===`get`)return n[1];if(e.command===`is`){let e=Pe(`is`,n);return e.kind===`expression`?e.expression:void 0}if(!rt(e.command)&&e.command!==`fill`)return;let r=n[0];if(r!==void 0&&!(Uf(r)&&Uf(n[1])))return r}function Hf(e){let t=e.result?.refLabel;return typeof t==`string`&&t.length>0?t:void 0}function Uf(e){return e!==void 0&&e.trim().length>0&&!Number.isNaN(Number(e))}function Wf(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=Or(p),_={classification:t.kind,...t.matchCount===void 0?{}:{matchCount:t.matchCount},recorded:ep(ae(n),g),...t.observed?{observed:ep(t.observed,g)}:{},mismatches:t.mismatches.slice(0,5).map(e=>g(e)),candidates:t.candidateNodes.slice(0,5).map(e=>tp(e,g))},v=Td({kind:t.kind,targetEvidence:n,capture:t.repairCapture}),y=Sd({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(nt(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=Rd({sessionStore:u,observationStore:e.observationStore,sessionName:l,divergence:b,responseLevel:f,evidence:t.publicationEvidence,...e.signal?{signal:e.signal}:{}});return df({error:{code:t.causeCode,message:t.causeMessage},action:r,step:i,replayPath:s,artifactPaths:c,divergence:x,scrubVars:p})}function Gf(e,t,n){let r=Or(e.scrubVars);return Wf(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:Qd(n,r),publicationEvidence:Yf(n),repairCapture:Kd(n)})}async function Kf(e){let{session:t,sessionName:n,observationStore:r,logPath:i,action:a,unavailableHint:o}=e;return t?await Jd({session:t,sessionName:n,observationStore:r,logPath:i,action:a}):{state:`unavailable`,reason:`no-session`,hint:o}}async function qf(e,t){return Gf(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 Kf({...t,unavailableHint:`The session closed before a screen could be captured to verify the recorded target evidence.`}))}async function Jf(e,t,n){return Gf(e,t,await Kf({...n,unavailableHint:`The session closed before a post-failure screen could be captured.`}))}function Yf(e){return e.state===`available`?e.evidence:void 0}function Xf(e){let{action:t,resolvedAction:n,sessionStore:r,targetRole:i}=e,a=r.get();return a?Je(t.command)===`post-resolution`?{kind:`post-resolution`,isSelectorWait:He(n.positionals??[])?.kind===`selector`}:{kind:`pre-dispatch`,token:Vf(n,i),platform:a.device.platform}:{kind:`inactive`}}function Zf(e){let{recorded:t,token:n,action:r,nodes:i,platform:a}=e,o=of(r),s=Ff({recorded:t,token:n,nodes:i,platform:a,refLabel:Hf(r),requireRect:o.requiresRect,allowDisambiguation:o.allowDisambiguation});return s.verified?{verified:!0,guard:{expected:{identity:Tt(s.winnerNode),structural:we(s.winnerNode,i)},matchCount:s.matchCount}}:{verified:!1,kind:s.kind,matchCount:s.matchCount,observed:s.observedNode?Tt(s.observedNode):void 0,candidateNodes:s.candidateNodes,mismatches:s.mismatches,causeCode:s.causeCode,causeMessage:s.causeMessage}}function Qf(e){return!e.ok&&e.error.details?.reason===`replay_target_guard_mismatch`}function $f(e){return!e.ok&&e.error.details?.reason===Qt}function ep(e,t){return{...e.id===void 0?{}:{id:t(e.id)},role:t(e.role),...e.label===void 0?{}:{label:t(e.label)}}}function tp(e,t){let n=fr(e.type??`Element`),r=dr(e,n);return{...e.ref?{ref:e.ref}:{},role:t(n),...r?{label:t(r)}:{}}}function np(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 rp(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 ip(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 ap(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 op(e){return{...e?.targetRole===`source`||e?.targetRole===`destination`?{targetRole:e.targetRole}:{},observed:rp(e?.observed),expectedStructural:ap(e?.expectedStructural),observedStructural:ap(e?.observedStructural)}}function sp(e){return{matchCount:typeof e?.matchCount==`number`?e.matchCount:void 0,observed:rp(e?.observed),observedAncestry:ip(e?.observedAncestry)}}function cp(e,t){return{kind:e.error.code,message:e.error.message,artifactPaths:t}}function lp(e,t,n){let r=cp(e,n);return(t?.kind===`target`||t?.kind===`targets`)&&Qf(e)?{status:`guard-mismatch`,evidence:op(e.error.details),plainFailure:r,artifactPaths:n}:t?.kind===`landmark`&&$f(e)?{status:`landmark-mismatch`,evidence:sp(e.error.details),plainFailure:r,artifactPaths:n}:{status:`failed`,failure:r}}function up(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,cp(dp(e),Ef(e)));return{runtime:{beginTargetVerification(e,n,r,i){return Xf({action:e,resolvedAction:n,sessionStore:t.sessionStore,targetRole:i})},async captureObservation(e,n,r){let i=t.observationStore.get(),a=i?await Jd({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 Zf({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 bf({req:np(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,Ef(l).forEach(e=>r.add(e));let u=[...r];return l.ok?{status:`ok`,artifactPaths:u}:lp(l,s,u)},async buildRecordedUnverifiableFailure(e,n,r,i){let a=await qf(c(e,n,r,i),{session:t.observationStore.get(),sessionName:t.sessionName,observationStore:t.observationStore,logPath:t.logPath,action:e});return l(a)},async buildTargetBindingFailure(e,t,n,r,i){let a=s??{state:`unavailable`,reason:`observation-missing`,hint:`No capture was recorded before this target-binding failure.`},o=Gf(c(e,t,r,i),n,a);return l(o)},async buildPostDispatchTargetBindingFailure(e,n,r,i,a){let o=await Jf(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=dp(o),u=await fp(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=>pp(e),onStep:i,diagnosticsMarker:()=>hp(t.sessionStore),diagnosticsSince:e=>gp(t.sessionStore,e)},readLastResponse:()=>o}}function dp(e){return e&&!e.ok?e:P(`COMMAND_FAILED`,`replay step reported failure with no recorded response`)}async function fp(e,t,n,r,i,a,o,s){let c=t=>e.coordinator.markSessionHeldIfArmed(t);return mp(i)?c(i):c(await gf({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 pp(e){let t=e.positionals??[],n=je(t[0]);if(n)return n;if(t.length!==0)return t.join(` `)}function mp(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 hp(e){return e.get()?.snapshotDiagnostics?.samples.length??0}function gp(e,t){return e.get()?.snapshotDiagnostics?.samples.slice(t)??[]}function _p(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o={AD_SESSION:n,AD_FILENAME:vp(t,i)};return bp(o,`AD_PLATFORM`,a.platform??r.platform),bp(o,`AD_TARGET`,a.target??r.target),bp(o,`AD_DEVICE`,a.device),bp(o,`AD_DEVICE_ID`,yp(a)),xp(o,`AD_SHARD_INDEX`,a.shardIndex),xp(o,`AD_SHARD_COUNT`,a.shardCount),bp(o,`AD_ARTIFACTS`,a.artifactsDir),o}function vp(e,t){let n=e.meta?.cwd??process.cwd();return B.relative(n,t)||t}function yp(e){return typeof e.serial==`string`?e.serial:e.udid}function bp(e,t,n){typeof n==`string`&&n.length>0&&(e[t]=n)}function xp(e,t,n){typeof n==`number`&&(e[t]=String(n))}const Sp=3e4,Cp=1e3;function wp(e){let{scriptPath:t,env:r,publicNetworkOnly:i}=e,a=V.readFileSync(t,`utf8`),o=Object.create(null);try{ga.runInNewContext(a,Tp(r,o,i),{filename:t,timeout:Sp})}catch(e){let r=n(e);throw new l(r.code,`Maestro runScript failed: ${r.message}`,u({...r.details??{},hint:r.hint,diagnosticId:r.diagnosticId,logPath:r.logPath,retriable:r.retriable,supportedOn:r.supportedOn,scriptPath:t}),e instanceof Error?e:void 0)}return Mp(o,t),Object.fromEntries(Object.entries(o).map(([e,t])=>[`output.${e}`,Np(t)]))}function Tp(e,t,n){return{...e,output:t,json:Ep,http:{post:(e,t)=>Op(`POST`,e,n,t)}}}function Ep(e){if(typeof e!=`string`)throw new l(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new l(`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,Dp)}catch(t){throw new l(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,Cp)},t instanceof Error?t:void 0)}}function Dp(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Op(e,t,n,r){let i=xr(process.execPath,kp(),{stdin:JSON.stringify(jp(e,t,r,n)),timeoutMs:Sp,allowFailure:!0});if(i.exitCode!==0)throw new l(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${Pp(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(n){throw new l(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:i.stdout.slice(0,Cp),stderr:i.stderr.slice(0,Cp)},n instanceof Error?n:void 0)}}function kp(){let e=Ap(import.meta.url);if(!e)throw new l(`COMMAND_FAILED`,`Maestro runScript http helper entrypoint is unavailable; rebuild the package`);return e.endsWith(`.ts`)?[`--experimental-strip-types`,e]:[e]}function Ap(e){try{let t=ma(e),n=B.extname(t)||`.js`;return[B.join(B.dirname(t),`run-script-http-child`+n),B.join(B.dirname(t),`internal`,`run-script-http-child`+n)].find(e=>V.existsSync(e))??null}catch{return null}}function jp(e,t,n,r){return{method:e,url:t,headers:n?.headers??{},body:n?.body??``,publicNetworkOnly:r}}function Mp(e,t){for(let n of Object.keys(e))if(n.includes(`.`))throw new l(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${n}`,{scriptPath:t,key:n})}function Np(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function Pp(e){let t=e.trim();return t.length>0?t.slice(0,Cp):`request process exited without stderr`}async function Fp(e){return await Ip(`tap`,async t=>{let n=B.join(t,`before.png`),r=B.join(t,`after.png`),i=await Rp(e,n);return await e.run({matchesCurrent:async()=>{if(!(!i||!await Rp(e,r)))return await Lp(n,r,e.signal,`tap`)}})})}async function Ip(e,t){let n=await da.mkdtemp(B.join(pa.tmpdir(),`agent-device-maestro-${e}-`));try{return await t(n)}finally{try{await da.rm(n,{recursive:!0,force:!0})}catch{}}}async function Lp(e,t,n,r){try{let[i,a]=await Promise.all([da.readFile(e),da.readFile(t)]);X(n);let o=await Ki(i,a,`Maestro screenshot`);return X(n),zp(o,r)}catch(e){Vp(e,n),j({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:r,result:`error`,error:e instanceof Error?e.message:String(e)}});return}}async function Rp(e,t){try{return await da.rm(t,{force:!0}),X(e.signal),await e.capture(t),X(e.signal),!0}catch(t){return Vp(t,e.signal),!1}}function zp(e,t){if(e.status!==`compared`)return Bp(t,e.status,e),!1;let n=e.differencePercent<=K.animationDifferencePercent;return Bp(t,n?`stable`:`changed`,e),n}function Bp(e,t,n){j({level:`debug`,phase:`maestro_screenshot_compare`,data:{purpose:e,result:t,first:n.first,second:n.second,...`differencePercent`in n?{differencePercent:n.differencePercent}:{}}})}function Vp(t,n){if(n?.aborted||e(t))throw c()}function X(e){if(e?.aborted)throw c()}async function Hp(e){Wp(e.timeoutMs),X(e.signal);let t=e.now()+e.timeoutMs;return await Ip(`animation`,async n=>{let r=B.join(n,`first.png`),i=B.join(n,`second.png`);for(;;){if(X(e.signal),await Up(e,r,i))return!0;if(e.now()>=t)return!1}})}async function Up(e,t,n){let r=[await Rp(e,t),await Rp(e,n)];return!r[0]||!r[1]?!1:await Lp(t,n,e.signal,`animation`)===!0}function Wp(e){if(!Number.isFinite(e)||e<0)throw new l(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a non-negative number.`)}const Gp=K.observationPollMs;async function Kp(e,t){for(;;){Z(e.context.signal);try{return await e.snapshot(e.context)}catch(n){if(!cm(n)||(Z(e.context.signal),!await om(e.dependencies,t,Gp,e.context.signal)))throw n}}}function qp(e){return Jp({...e,mode:e.query.purpose===`swipe`?`swipe`:`tap`})}function Jp(e){let t=Ri(e.snapshot),n=e.platform===`ios`?Qi(e.snapshot.nodes):void 0,r=n?{...e.snapshot,nodes:a(n.nodes)}:e.snapshot;return $p(po(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 Yp(e){sm(e.timeoutMs,`observation`);let t,n=e.dependencies.now()+e.timeoutMs;for(;;){Z(e.context.signal);let r=await Kp(e,n),i=Jp({query:{selector:e.condition.selector},context:e.context,snapshot:r,platform:e.platform,mode:`observe`});if(t=i,ya(e.condition,i))return i;if(e.dependencies.now()>=n)break;await om(e.dependencies,n,Gp,e.context.signal)}return Z(e.context.signal),dm(t)}async function Xp(e){sm(e.timeoutMs,`scrollUntilVisible`);let t=e.dependencies.now()+e.timeoutMs,n,r;for(;;){Z(e.context.signal);let i=r??await Kp(e,t);if(r=void 0,n=Jp({query:{selector:e.selector},context:e.context,snapshot:i,platform:e.platform,mode:`observe`}),n.visiblePercentage===K.scrollUntilVisiblePercentage)return n;if(e.dependencies.now()>=t)break;let a=t-e.dependencies.now();a>0&&(r=await e.scroll(a,i))}return Z(e.context.signal),dm(n)}async function Zp(e){sm(e.timeoutMs,`waitForAnimationToEnd`);let t=e.dependencies.now()+e.timeoutMs,n=e.initialSnapshot??await Kp(e,t),r=lm(n);for(;;){Z(e.context.signal),await om(e.dependencies,t,Gp,e.context.signal);let i=await Kp(e,t),a=lm(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 Qp(e){return e?{x:0,y:0,width:e.referenceWidth,height:e.referenceHeight}:void 0}function $p(e,t,n,r,i,a,o){if(!e.ok){let t=Qp(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=tm({query:i,platform:a,mode:o,dispatchCandidates:e.dispatchCandidates}),c=Qp(r);return{generation:n,matched:!0,visible:!0,...c?{visiblePercentage:em(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:lm(t)}:{}}}function em(e,t){return!be(e)||!be(t)?0:le(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 tm(e){let{query:t,platform:n,mode:r,dispatchCandidates:i}=e;if(!(!nm(t,n,r)||i!==1))return rm(t.selector)}function nm(e,t,n){return t===`ios`&&n===`tap`&&e.allowAtomicSelectorDispatch===!0&&!mo(e.selector)}function rm(e){let t=Object.entries(e).filter(([,e])=>e!==void 0);if(t.length!==1)return;let[n,r]=t[0];if(!im(n)||typeof r!=`string`)return;let i=tn(r)?.trim();return i?{key:n,value:i}:void 0}function im(e){return e===`id`||e===`label`||e===`text`}async function am(e,t,n){try{await e.sleep(t,n)}catch(e){throw n?.aborted?c():e}Z(n)}async function om(e,t,n,r){let i=t-e.now();return i<=0?!1:(await am(e,Math.min(n,i),r),!0)}function Z(e){if(e?.aborted)throw c()}function sm(e,t){if(!Number.isFinite(e)||e<0)throw new l(`INVALID_ARGS`,`${t} timeout must be a non-negative number.`)}function cm(e){return e instanceof l&&e.details?.retriable===!0}function lm(e){return fa(`sha256`).update(JSON.stringify([...e.nodes].sort((e,t)=>e.index-t.index).map(e=>({index:e.index,parentIndex:e.parentIndex,identifier:e.identifier??``,label:e.label??``,value:e.value??``,enabled:e.enabled??!1,selected:e.selected??!1,focused:e.focused??!1,bounds:um(e.rect)})))).digest(`hex`)}function um(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 dm(e){if(e)return e;throw new l(`COMMAND_FAILED`,`Maestro observation completed without a snapshot result.`)}function fm(e){return e.kind===`clearState`?_m(e):pm(e)?mm(e):Tm(e)?Em(e):ym(e)}function pm(e){return e.kind===`launchApp`||e.kind===`stopApp`||e.kind===`openLink`}function mm(e){switch(e.kind){case`launchApp`:return hm(e);case`stopApp`:return gm(e);case`openLink`:return vm(e)}}function hm(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 gm(e){return{command:`close`,positionals:e.appId?[e.appId]:[],internal:{closeAppOnly:!0}}}function _m(e){return{command:`settings`,positionals:e.appId?[`clear-app-state`,e.appId]:[`clear-app-state`]}}function vm(e){return{command:`open`,positionals:e.appId?[e.appId,e.link]:[e.link],...e.prewarmRunner?{flags:{maestro:{prewarmRunnerBeforeOpen:!0}}}:{}}}function ym(e){switch(e.kind){case`gestureViewport`:return{command:`runtime`,positionals:[`gesture-viewport`]};case`typeText`:return{command:`type`,positionals:[e.text]};case`clickSelector`:return bm(e);case`clickPoint`:return xm(e);case`swipe`:return Sm(e);case`scroll`:return Cm(e);case`pressKey`:return wm(e)}}function bm(e){return{command:`click`,positionals:[`${e.selector.key}=${JSON.stringify(e.selector.value)}`],flags:{...e.options,maestro:{allowNonHittableCoordinateFallback:!0,expectedTapPoint:e.expectedPoint}}}}function xm(e){return{command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.options}}}function Sm(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 Cm(e){return{command:`scroll`,positionals:[e.direction],...e.durationMs===void 0?{}:{input:{direction:e.direction,durationMs:e.durationMs}},flags:{postGestureStabilization:!1}}}function wm(e){return e.key===`back`||e.key===`home`?{command:e.key,positionals:[]}:{command:`keyboard`,positionals:[e.key]}}function Tm(e){return e.kind===`screenshot`||e.kind===`snapshot`}function Em(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 Dm(e,t){let n=fm(t),{input:r,flags:i,internal:a,...o}=e.baseReq,s=Om(i,n.flags??{}),c=u({...a,...n.internal,...t.kind===`snapshot`?{observationOnly:!0}:{}}),d=await e.invoke(u({...o,command:n.command,positionals:n.positionals,input:n.input,flags:s,internal:Object.keys(c).length>0?c:void 0}));if(!d.ok)throw Pm(d);if(t.kind===`gestureViewport`){let e=d.data?.viewport;if(typeof e!=`object`||!e||![`x`,`y`,`width`,`height`].every(t=>typeof e[t]==`number`))throw new l(`COMMAND_FAILED`,`runtime gesture-viewport returned no valid viewport.`);return e}return d.data}function Om(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 km(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 Am(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 jm(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 Mm(e,t,n){if(B.isAbsolute(e))return e;let r=t.source?.path??n;if(!r)throw new l(`INVALID_ARGS`,`Maestro runScript file paths require a source path.`);return B.resolve(B.dirname(r),e)}function Nm(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}function Pm(e){let t=e.error,n=u({...t.details??{},hint:t.hint??Fm(t.details,`hint`),diagnosticId:t.diagnosticId??Fm(t.details,`diagnosticId`),logPath:t.logPath??Fm(t.details,`logPath`),retriable:t.retriable??Im(t.details,`retriable`),supportedOn:t.supportedOn??Fm(t.details,`supportedOn`)});return new l(t.code,t.message,Object.keys(n).length?n:void 0)}function Fm(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Im(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function Lm(e){let t,n,r,i,a,o=0,s=0,c=async n=>{s+=1;let r=await Dm(e,{kind:`snapshot`});if(!r||!Array.isArray(r.nodes))throw new l(`COMMAND_FAILED`,`Maestro snapshot did not return node data.`);let i=_(r,r);return t={generation:n.generation,snapshot:i},i};return{capture:async e=>{if(n?.generation===e.generation){let r=n.snapshot;return n=void 0,t={generation:e.generation,snapshot:r},r}return n=void 0,await c(e)},bindObservation:e=>{if(t?.generation!==e.generation)return e;let n=`maestro-observation-${++o}`;return t.observationIdentity=n,{...e,identity:n}},reuseObservation:e=>{if(e.cachedObservation?.generation===e.generation&&e.cachedObservation.identity!==void 0&&t?.generation===e.generation&&e.cachedObservation.identity===t.observationIdentity)return t.snapshot},readMetrics:()=>({hierarchyCaptures:s}),invalidate:e=>{r=t?.generation===e-1?{generation:e,snapshot:t.snapshot}:void 0,t=void 0,n=void 0},requireStability:e=>{a=e,i=r?.generation===e?r:void 0,r=void 0,n=void 0},consumeStabilityFromVisualWait:e=>{if(a!==void 0){if(a!==e.generation)throw new l(`COMMAND_FAILED`,`Maestro stability generation ${a} does not match ${e.generation}.`);a=void 0,i=void 0,r=void 0,n=void 0}},prime:(e,t)=>{n={generation:e,snapshot:t}},settlePending:async r=>{if(a===void 0)return;if(a!==r.generation)throw new l(`COMMAND_FAILED`,`Maestro stability generation ${a} does not match ${r.generation}.`);let o=t?.generation===r.generation?t.snapshot:i?.snapshot,s=await Zp({timeoutMs:K.settleTimeoutMs,context:r,snapshot:c,dependencies:e.dependencies,...o?{initialSnapshot:o}:{}});return a=void 0,i=void 0,n={generation:r.generation,snapshot:s.snapshot},s}}}async function Rm(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 Kp({context:n,snapshot:r.capture,dependencies:i.dependencies},a);let c=qp({query:t,context:n,snapshot:o,platform:i.platform});if(Wm(c,s))return c;if(o=void 0,!s){if(e>=a)return c;await om(i.dependencies,a,Gp,n.signal)}}}async function zm(e,t,n,r,i,a){let o=async()=>await Hm(e,t,r,i,a.click);if(!a.retryIfNoChange){try{await o()}finally{t.requireStability(i.generation)}return}if(e.platform===`ios`){await Fp({signal:i.signal,capture:async t=>{n.screenshotCaptures+=1,await Dm(e,{kind:`screenshot`,path:t,stabilize:!1,captureBackend:`runner`})},run:async o=>await Bm(e,t,n,r,i,a.click,o)});return}await Bm(e,t,n,r,i,a.click)}async function Bm(e,t,n,r,i,a,o){let s=async()=>await Hm(e,t,r,i,a),c=r.resolution?.surfaceSignature??(o?void 0:lm(await t.capture(i))),l=async()=>{let r=await Zp({timeoutMs:K.settleTimeoutMs,context:i,snapshot:t.capture,dependencies:e.dependencies});return r.settled?n.settleLatches+=1:n.settleTimeouts+=1,r};try{let e=await Vm({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 Vm(e){await e.dispatch();let t=await e.settle(),n=1;for(;(e.baselineSignature===void 0||t.signature===e.baselineSignature)&&n<K.retryTapMaxAttempts&&!(e.screenshotBaseline&&await e.screenshotBaseline.matchesCurrent()!==!0);)e.onRetry(),await e.dispatch(),n+=1,t=await e.settle();return t}async function Hm(e,t,n,r,i){let a=n.resolution,o=a?.dispatchSelector;if(o&&n.point){t.invalidate(r.generation);try{await Gm(e,o,n.point,i);return}catch(n){if(!Km(n))throw n;let o=await Rm({input:a.query,context:r,snapshots:t,options:e,allowObservationReuse:!1});if(!Um(o))throw n;t.invalidate(r.generation),await qm(e,Fr(o.rect),i);return}}t.invalidate(r.generation),await qm(e,n.point,i)}function Um(e){return e.matched&&e.visible&&e.rect!==void 0}function Wm(e,t){return Um(e)?!t||e.dispatchSelector!==void 0:!1}async function Gm(e,t,n,r){j({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`selector`,selectorKey:t.key,expectedPoint:n}}),await Dm(e,{kind:`clickSelector`,selector:t,expectedPoint:n,options:r})}function Km(e){let t=r(e);return t.code===`AMBIGUOUS_MATCH`||t.code===`ELEMENT_NOT_FOUND`||t.code===`ELEMENT_OFFSCREEN`||t.details?.reason===ur.selectorNotFound}async function qm(e,t,n){if(!t)throw new l(`COMMAND_FAILED`,`Maestro target did not resolve to a point.`);j({level:`debug`,phase:`maestro_tap_dispatch`,data:{kind:`point`,point:t}}),await Dm(e,{kind:`clickPoint`,point:t,options:n})}function Jm(e){let t=Lm(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),Dm(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)=>{_r(n),await s({kind:`typeText`,text:n},i);let a=await Zp({timeoutMs:K.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 Rm({input:n,context:r,snapshots:t,options:e}),observe:async(n,r)=>await Yp({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=[...km(e.arguments),...km(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 zm(e,t,n,r.target,i,{click:{count:r.repeat,intervalMs:r.delay},retryIfNoChange:r.retryTapIfNoChange===!0}),doubleTapOn:async(t,n)=>{await o(()=>qm(e,t.target.point,u({doubleTap:!0,intervalMs:t.delay})),n,`deferred`)},longPressOn:async(t,n)=>{await o(()=>qm(e,t.target.point,{holdMs:K.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??K.eraseTextMaxCharacters),t),scroll:async(e,t)=>{await s({kind:`scroll`,direction:e.direction},t,`deferred`)},scrollUntilVisible:async(n,r)=>{let a=await Xp({selector:n.selector,direction:n.direction,timeoutMs:n.timeoutMs,context:r,snapshot:t.capture,dependencies:e.dependencies,platform:i,scroll:async(a,o)=>{let c=Oa(o,n.selector,n.direction,n.durationMs,i);return await s(c?{kind:`swipe`,...c}:{kind:`scroll`,direction:n.direction,durationMs:n.durationMs},r),(await Zp({timeoutMs:Math.min(K.settleTimeoutMs,a),context:r,snapshot:t.capture,dependencies:e.dependencies})).snapshot}});if(a.visiblePercentage!==K.scrollUntilVisiblePercentage)throw Pn(`Maestro scrollUntilVisible target did not become visible.`,{selector:n.selector,timeoutMs:n.timeoutMs});return{observation:t.bindObservation(Am(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 Hp({timeoutMs:t.timeoutMs??K.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:jm(await a({kind:`screenshot`,path:e.path}))}),runScript:async(t,n)=>({outputEnv:wp({scriptPath:Mm(t.file,n,e.sourcePath),publicNetworkOnly:e.baseReq.internal?.publicNetworkOnly===!0,env:{...n.env,...t.env?Nm(t.env):{}}})})},snapshots:t,readMetrics:()=>({...t.readMetrics(),...n}),recordSettle:r}}function Ym(e){let{operations:t,snapshots:n,readMetrics:r,recordSettle:i}=Jm(e);return xo(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 Xm(e){let{filePath:t,tracePath:n,onStep:r}=e,i=new Map;return{actionStarted:e=>{i.set(e.stepIndex,e),Zm(()=>eh(r,e)),Zm(()=>th(n,t,e))},actionCompleted:e=>{let r=Qm(i,e.stepIndex);Zm(()=>nh(n,t,$m(r,e),!0))},actionFailed:e=>{let r=Qm(i,e.stepIndex);Zm(()=>nh(n,t,$m(r,e),!1))}}}function Zm(e){try{e()}catch{}}function Qm(e,t){let n=e.get(t);return e.delete(t),n}function $m(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 eh(e,t){e?.({index:t.stepIndex,total:t.stepTotal,command:t.action,...t.value?{value:t.value}:{}})}function th(e,t,n){yf(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 nh(e,t,n,r){let i=rh(n);yf(e,{type:`replay_action_stop`,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,ok:r,durationMs:n.durationMs,...Object.keys(i).length>0?{resultTiming:i}:{},...!r&&`error`in n&&n.error instanceof l?{errorCode:n.error.code}:{}})}function rh(e){let t=`data`in e?e.data:void 0,n=ih(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 ih(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function ah(e,t){return pn(e,t)}function oh(e,t){let n={command:e.action,...e.value?{value:e.value}:{}};return{command:{kind:e.action},source:e.source,progress:n,action:{command:uh(e.action),positionals:dh(e.action,e.value),flags:t.flags??{}}}}async function sh(e){let{failure:t,replayPath:n,req:r,sessionName:i,sessionStore:a,observationStore:o,logPath:s}=e,c=M(r.meta?.requestId),l=oh(t,r),u=uf(e.error),d=[...t.redactions],f=Or(d),p={...u,message:f(u.message),...u.hint?{hint:f(u.hint)}:{}},m=o.get(),h=m?await Jd({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?ch({failure:t,action:l.action,session:m,nodes:h.nodes,sanitize:f}):[],_=[t.action,lh(t.value)].filter(Boolean).join(` `),v=Rd({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:Qd(h,f),suggestions:g.slice(0,5),suggestionCount:g.length,resume:t.resume,repairHint:Td({kind:`action-failure`,targetEvidence:void 0,capture:Kd(h)})},responseLevel:r.meta?.responseLevel,evidence:h.state===`available`?h.evidence:void 0,...c?{signal:c}:{}});return ff({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 ch(e){let t={createdAt:Date.now(),nodes:e.nodes};return Ud(ah(e.failure,t).map(({node:e,basis:t})=>({node:e,nodeIndex:e.index,basis:t}))).map(({node:t,basis:n})=>lf({node:t,nodes:e.nodes,session:e.session,action:e.action,basis:n,sanitize:e.sanitize}))}function lh(e){return!e||e===`<text>`?e??``:at(e)}function uh(e){return e===`tapOn`||e===`doubleTapOn`?`click`:e===`longPressOn`?`longpress`:e===`assertVisible`||e===`assertNotVisible`||e===`extendedWaitUntil`||e===`scrollUntilVisible`?`wait`:e}function dh(e,t){return!t||e===`inputText`?[]:[t]}function fh(e){let{command:t,outcome:n,startedAt:r,snapshotStart:i}=e,{session:{name:a,store:o}}=t,s=mh(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:hh(c,Date.now()-r)}}}async function ph(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 sh({error:f,failure:d,replayPath:r,req:o,sessionName:s,sessionStore:c,observationStore:l,logPath:u,snapshotDiagnostics:mh(c,i.snapshotStart)}):{ok:!1,error:f}}function mh(e,t){let n=e.get()?.snapshotDiagnostics?.samples.slice(t)??[];return m(n)}function hh(e,t){return`Replayed ${e} ${e===1?`step`:`steps`} in ${(t/1e3).toFixed(1)}s`}async function gh(e){let{request:t}=e,n=t.flags?.replayScriptSource;if(!n)return P(`INVALID_ARGS`,sn);if(t.flags?.saveScript!==void 0)return P(`INVALID_ARGS`,`Maestro YAML does not support --save-script; ADR 0012 repair recording applies only to .ad scripts.`);let r=Date.now(),i={snapshotStart:0};try{return await _h({command:e,bundle:n,startedAt:r,state:i})}catch(t){return await ph({command:e,replayPath:n.entry,state:i,outcome:{ok:!1,error:t}})}}async function _h(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 vh({command:t,bundle:n}),d=Th({req:a,invoke:l,device:u.device,platform:u.platform,runtimeHints:u.runtimeHints,sourcePath:u.filePath});i.snapshotStart=o.get()?.snapshotDiagnostics?.samples.length??0;let f=await _n(u.flow,d,{defaults:u.defaults,env:u.env,platform:u.platform,target:u.target,runtimeHints:u.runtimeHints,signal:u.signal,from:a.flags?.replayFrom,planDigest:a.flags?.replayPlanDigest,readSource:e=>un(n,e),observer:Xm({filePath:u.filePath,tracePath:s,onStep:c})});return f.ok?fh({outcome:f,command:t,startedAt:r,snapshotStart:i.snapshotStart}):await ph({command:t,replayPath:n.entry,state:i,outcome:f})}async function vh(e){let{command:t,bundle:n}=e,{request:r,session:{name:i,store:a}}=t,o=n.entry,s=ir(un(n,o),o),c=a.lookup(),l=c?.session;c&&Gn(c,r.flags);let u=await yh({req:r,sessionStore:a,sessionName:i,session:l,flow:s});return{filePath:o,flow:s,...u,defaults:Ch({req:r,sessionName:i,filePath:o,platform:u.platform,target:u.target}),env:wh(r),signal:M(r.meta?.requestId)}}async function yh(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 Ti(t.flags??{},mn(a.appTarget,o))),c=Ah(t,s),l=xh({req:t,sessionStore:n,sessionName:r,device:s,platform:c});return await bh({req:t,sessionStore:n,sessionName:r,device:s,platform:c,target:jh(t,s),runtimeHints:l,flow:a})}async function bh(e){if(e.device||!Sh(e.runtimeHints))return e;let t=await Ti(e.req.flags??{},mn(e.flow.appTarget,e.platform));return{device:t,platform:e.platform,target:jh(e.req,t),runtimeHints:xh({req:e.req,sessionStore:e.sessionStore,sessionName:e.sessionName,device:t,platform:e.platform})}}function xh(e){return Un({req:e.req,sessionStore:{getRuntimeHints:t=>t===e.sessionName?e.sessionStore.getRuntimeHints():void 0},sessionName:e.sessionName,device:e.device,platform:e.platform})}function Sh(e){return e?.metroPort!==void 0&&e.metroHost===void 0&&e.bundleUrl===void 0}function Ch(e){return{..._p({req:e.req,sessionName:e.sessionName,metadata:{},resolvedPath:e.filePath}),AD_PLATFORM:e.platform,AD_TARGET:e.target}}function wh(e){return{...jt(kt(e.flags?.replayShellEnv)),...Nt(Dt(e.flags?.replayEnv))}}function Th(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 Ym({baseReq:u({...f,flags:Eh(r,i,t.flags),runtime:a}),invoke:n,platform:i,sourcePath:o,dependencies:{now:Date.now,sleep:async(e,t)=>{await ha(e,void 0,{signal:t})}}})}function Eh(e,t,n){if(!e)return Dh(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 Dh(e,t){let n={platform:e,target:t?.target??`mobile`,noRecord:!0};return t?.device&&(n.device=t.device),e===`android`?Oh(n,t):kh(n,t)}function Oh(e,t){return t?.serial&&(e.serial=t.serial),t?.androidDeviceAllowlist&&(e.androidDeviceAllowlist=t.androidDeviceAllowlist),e}function kh(e,t){return t?.udid&&(e.udid=t.udid),t?.iosSimulatorDeviceSet&&(e.iosSimulatorDeviceSet=t.iosSimulatorDeviceSet),e}function Ah(e,t){let n=e.flags?.platform;if(n===`android`||n===`ios`)return n;if(t?.platform===`android`)return`android`;if(t?.platform===`apple`&&t.appleOs===`ios`)return`ios`;throw new l(`INVALID_ARGS`,`Maestro replay requires --platform android|ios or an active mobile session.`)}function jh(e,t){return typeof e.flags?.target==`string`?e.flags.target:t?.target??`mobile`}async function Mh(e){let{resolved:t,keepSession:n,coordinator:r,command:i}=e,{request:a}=i;if(Mt(t,a.flags?.replayBackend)===`maestro`)return n?P(`INVALID_ARGS`,`--keep-session is supported only for native .ad replay; Maestro YAML owns its lifecycle.`):r.view()?.repairBoundary===void 0?await gh(i):P(`INVALID_ARGS`,`This session has an active .ad --save-script repair run; finish it with replay --from or close before running Maestro YAML.`)}function Nh(e){let{req:t,sessionName:n,sessionStore:r,tracePath:i,resolved:a,script:o,coordinator:s}=e,c=Ph(t);if(c)return{ok:!1,response:c};let{manifest:l,replayReq:u}=Fh(t,o),{metadata:d,actions:f,actionLines:p,actionSourcePaths:m,planDigest:h}=l,g=r.get(),_=Ih({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:Rh({req:t,replayReq:u,sessionName:n,resolved:a,metadata:d}),actionTracePath:i??g?.trace?.outPath}}:{ok:!1,response:_.response}}function Ph(e){if(e.flags?.replayBackend&&e.flags.replayBackend!==`maestro`)return P(`INVALID_ARGS`,`Unsupported replay backend "${e.flags.replayBackend}".`)}function Fh(e,t){let n=Yu(t,{platform:e.flags?.platform,target:e.flags?.target});return{manifest:n,replayReq:Lh({...e,flags:hn(e.flags,n.actions)},n.metadata)}}function Ih(e){let{req:t,coordinator:n,manifest:r,preEntrySession:i}=e,a=r.resolveEntryIndex({from:t.flags?.replayFrom,digest:t.flags?.replayPlanDigest,pendingRecordAndHeal:n.view()?.pendingRecordAndHeal,sessionActionsLength:i?.actions.length??0});return a.ok?{ok:!0,value:a.value}:{ok:!1,response:P(`INVALID_ARGS`,a.message)}}function Lh(e,t){return!t.platform&&!t.target?e:{...e,flags:zh(e.flags,t)}}function Rh(e){let{req:t,replayReq:n,sessionName:r,resolved:i,metadata:a}=e;return{builtins:_p({req:n,sessionName:r,metadata:a,resolvedPath:i}),fileEnv:a.env,shellEnv:jt(kt(t.flags?.replayShellEnv)),cliEnv:Nt(Dt(t.flags?.replayEnv))}}function zh(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 Bh(e){let{req:t,entryIndex:n,sessionStore:r,sourcePath:i,coordinator:a}=e,o=Vh({entryIndex:n,sessionStore:r,coordinator:a});return o?{ok:!1,response:o}:(Wh({req:t,coordinator:a}),Uh({req:t,sessionStore:r,sourcePath:i,coordinator:a}))}function Vh(e){let t=Gh(e);if(t)return t;if(e.entryIndex>0&&!e.sessionStore.get())return Oi()}function Hh(e){let{saveScript:t,force:n,preRunState:r,sourcePath:i}=e;return t&&r.kind===`authoring`?P(`INVALID_ARGS`,`replay --save-script cannot re-arm an ordinary recording in terminal/active state ${r.status}. Close this session and use a fresh one for repair authoring.`):Kh({saveScript:t,liveForce:n,persistedForce:Ht(r)||void 0,sourcePath:i,existingSaveScriptPath:It(r)})}function Uh(e){let{req:t,sessionStore:n,sourcePath:r,coordinator:i}=e,a=n.get(),{saveScript:o,force:s}=t.flags??{},c=Hh({saveScript:o,force:s,preRunState:a?.scriptPublication??Lt,sourcePath:r});return c?{ok:!1,response:c}:(i.demoteForRerunIfArmed(),{ok:!0,armSaveScript:qh({saveScript:o,force:s,coordinator:i,sourcePath:r})})}function Wh(e){let{req:t,coordinator:n}=e;n.clearCorrectiveWatermarkIfExpected(t.flags?.replayFrom),t.flags?.saveScript&&n.clearTombstone()}function Gh(e){let{entryIndex:t,coordinator:n}=e;if(!(t>0)&&n.view()?.repairBoundary!==void 0)return P(`INVALID_ARGS`,`This session has an active --save-script repair run; continue it with replay --from <n> --plan-digest <sha256>, or finish with close, before starting a fresh full replay.`)}function Kh(e){let{saveScript:t,liveForce:n,persistedForce:r,sourcePath:i,existingSaveScriptPath:a}=e;if(!t)return;let o=typeof t==`string`?jr(t):a??md(i);if(!(n||r&&o===a)&&V.existsSync(o))return P(`COMMAND_FAILED`,`A file already exists at ${o}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`)}function qh(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 Jh(e){let{request:t,session:{name:n,logPath:i,store:a,mutationStore:o,observationStore:s},tracePath:c,onStep:l,invoke:u}=e,d=t.flags?.replayScriptSource;if(!d)return P(`INVALID_ARGS`,sn);let f=Date.now(),p=t.flags?.replayKeepSession===!0,m=``,h=new Set,g=pd({sessionStore:a,mutationStore:o});try{if(m=d.entry,Pt(m)&&t.flags?.replayBackend!==`maestro`)return P(`INVALID_ARGS`,At(`replay`,m));let r=await Mh({resolved:m,keepSession:p,coordinator:g,command:e});if(r)return r;let o=Nh({req:t,sessionName:n,sessionStore:a,tracePath:c,resolved:m,script:un(d,m),coordinator:g});if(!o.ok)return o.response;let{replayReq:_,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,entryIndex:S,varSources:C,actionTracePath:w}=o.value,T=Bh({req:t,entryIndex:S,sessionStore:a,sourcePath:m,coordinator:g});if(!T.ok)return T.response;let{runtime:E,readLastResponse:ee}=up({ctx:{replayReq:_,sessionName:n,sessionStore:a,observationStore:s,logPath:i,resolved:m,actions:v,actionLines:y,actionSourcePaths:b,planDigest:x,actionTracePath:w,responseLevel:t.meta?.responseLevel,invoke:u,signal:M(t.meta?.requestId),coordinator:g},req:t,artifactPaths:h,onStep:l,armSaveScript:T.armSaveScript}),D=await sd({actions:v,entryIndex:S,keepSession:p,actionLines:y,actionSourcePaths:b,resolvedPath:m,varSources:C},E);return D.status===`failed`?ee()??P(`COMMAND_FAILED`,`replay step failed with no recorded response`):Yh({startedAt:f,sessionName:n,sessionStore:a,replayed:D.replayed,artifactPaths:D.artifactPaths,snapshotDiagnosticSamples:D.snapshotDiagnosticSamples,armSaveScript:T.armSaveScript,coordinator:g,keepSession:p})}catch(e){let t=r(e);return P(t.code,t.message,h.size>0?{artifactPaths:[...h]}:void 0)}}function Yh(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=Zh({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:Xh(i,Date.now()-t)}}}function Xh(e,t){let n=(t/1e3).toFixed(1);return`Replayed ${e} ${e===1?`step`:`steps`} in ${n}s`}function Zh(e){let{keepSession:t,sessionName:n,completedSession:r,artifactPaths:i}=e;if(!(!t||r))return P(`COMMAND_FAILED`,`Replay completed but --keep-session could not preserve session "${n}". Run the script again after checking which action closed the session.`,i.length>0?{artifactPaths:[...i]}:void 0)}function Qh(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=B.resolve(n??`.`,t??`.agent-device/test-artifacts`);return B.join(i,r)}function $h(e,t){let n=t?B.relative(t,e):B.basename(e),r=n.length===0||n.startsWith(`..`)?B.basename(e):n;return Ue(r.toLowerCase().replaceAll(/[\\/]+/g,`__`).replaceAll(/[^a-z0-9._-]+/g,`-`))||`test`}function eg(e,t){V.mkdirSync(t,{recursive:!0}),rg(e,t)}function tg(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=ng(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=>B.basename(e)).join(`, `)}`);let d=B.join(o,`result.txt`),f=`${u.join(`
|
|
2
|
+
`)}\n`;V.writeFileSync(d,f),s||V.writeFileSync(B.join(o,`failure.txt`),f)}function ng(e,t){let n=[],r=new Map;for(let i of e){if(!ag(i))continue;let e=ig(B.basename(i),r),a=B.join(t,e);B.resolve(i)!==B.resolve(a)&&V.copyFileSync(i,a),n.push(a)}return n}function rg(e,t){let n=B.join(t,`replay.ad`);if(V.copyFileSync(e,n),B.extname(e).toLowerCase()===`.ad`)return;let r=B.join(t,B.basename(e));B.resolve(r)!==B.resolve(n)&&V.copyFileSync(e,r)}function ig(e,t){let n=B.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 ag(e){try{return V.statSync(e).isFile()}catch{return!1}}function og(e){let{platformFilter:t,discoverSources:n}=e,r=n(),i=[];for(let e of r){let{path:n,manifest:r}=e,a={kind:`run`,path:n,title:r.title,manifest:r};if(!t){i.push(a);continue}let o=r.device.platform;if(o.kind===`caller-bound`){i.push(a);continue}if(o.kind===`unspecified`){i.push({kind:`skip`,path:n,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${t}`});continue}fg(t,o.value)&&i.push(a)}if(i.filter(e=>e.kind===`run`).length===0){let e=t?` for --platform ${t}`:``;throw new l(`INVALID_ARGS`,`No replay tests matched${e}.`)}return i}function sg(e,t,n,r,i=0){let a=B.basename(n,B.extname(n)),o=Ue(a.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`));return`${e}:test:${t}:${r+1}${o?`-${o}`:``}:attempt-${i+1}`}function cg(e){let t=e?.trim()||`${process.pid}-${Date.now().toString(36)}`;return Ue(t.toLowerCase().replaceAll(/[^a-z0-9]+/g,`-`))||`suite`}function lg(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,B.basename(r),`attempt`,a+1].join(`:`)}function ug(e,t){return typeof e==`number`?e:t}function dg(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function fg(e,t){return e===`apple`?b(t):t===e}function pg(e){return{status:`failed`,error:e.error,artifactPaths:e.artifactPaths??[],infrastructure:e.infrastructure??!1,...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}const mg=2e3;async function hg(e){let{filePath:t,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,onStep:d,runReplay:f,cleanupSession:p,finalizeAttempt:m,emitDiagnostic:h,bindAttemptCancellation:g}=e,_=g({attemptId:i,parentAttemptId:a}),v=new Set,y,b=!1,x,S=Date.now(),C=Sg({artifactsDir:l,artifactPaths:v,filePath:t,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),w=f({filePath:t,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:v,tracePath:C,appendTimingEvent:e=>Q(C,e),shard:u,onStep:d}).catch(e=>pg({error:n(e)})).finally(()=>{_.release()});try{x=typeof o==`number`?await Promise.race([w,new Promise(e=>{y=setTimeout(()=>{b=!0,_.cancel(),e(Cg(o,[...v]))},o)})]):await w,Q(C,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:x.status===`passed`,timedOut:b,durationMs:Date.now()-S,errorCode:x.status===`passed`?void 0:x.error.code})}finally{y&&clearTimeout(y),b&&(await _g(w)||(x=bg(x),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:mg}}),vg({replayPromise:w,cleanupSession:p,sessionName:r,requestId:i,emitDiagnostic:h})));let e=await yg({finalizeAttempt:m,sessionName:r,artifactPaths:v,artifactsDir:l,tracePath:C,emitDiagnostic:h});x?.status===`passed`&&e&&(x=xg(x,`Replay test finalization failed: ${e.error.message}`));let t=Date.now();try{Q(C,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-t})}catch(e){let i=n(e);Q(C,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-t,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}}),x=gg(x,i,v)}}return x??pg({error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}})}function gg(e,t,n){return e?.status===`failed`?{...e,infrastructure:!0}:pg({error:t,artifactPaths:[...n],infrastructure:!0})}async function _g(e){return await Promise.race([e.then(()=>!0),ha(mg).then(()=>!1)])}async function vg(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 yg(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}}),pg({error:t})}}function bg(e){return!e||e.status===`passed`?e:{...e,infrastructure:!0,error:{...e.error,details:{...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0}}}}function xg(e,t){return{...e,warnings:[...e.warnings,t]}}function Sg(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=B.join(t,`replay-timing.ndjson`);return V.mkdirSync(B.dirname(l),{recursive:!0}),V.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&&V.appendFileSync(e,`${JSON.stringify(t)}\n`)}function Cg(e,t=[]){return pg({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 wg(e){let t=Tg(e),n=await Eg(e,t);return{result:Mg(e,t,n),infrastructure:n.finalOutcome?.status===`failed`&&n.finalOutcome.infrastructure}}function Tg(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:B.join(i,...a?[`shard-${a.shardIndex+1}`]:[],$h(t.path,n)),maxAttempts:r+1}}async function Eg(e,t){Og(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!e.isCanceled();r+=1){let i=await Dg(e,t,r);if(kg(n,i),Ag(e,i.outcome,r))break;jg(e,t,i)}return n}async function Dg(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=sg(i,a,r.path,o,n),h=B.join(t.testArtifactsDir,`attempt-${f}`);eg(r.path,h);let g=lg({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,...Ig(d)},v=await hg({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 tg({outcome:v,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{outcome:v,sessionName:m,attempt:f,durationMs:y}}function Og(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:sg(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Ig(c)})}function kg(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 Ag(e,t,n){return t.status===`passed`||e.isCanceled()||t.infrastructure||n>=e.retries}function jg(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,...Ig(e.shard)})}function Mg(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalOutcome?.status===`passed`?Ng(e,t,n,r):Pg(e,t,n,r)}function Ng(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,...Ig(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}:{},...Fg(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function Pg(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,...Ig(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}:{},...Fg(s)}}function Fg(e){return Ig(e)}function Ig(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Lg(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 Rg(e){let{request:t,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l,discoverSources:u,resolveShardTargets:d}=e,f=t.sessionName;if(t.inputs.length===0)return{status:`failed`,error:{code:`INVALID_ARGS`,message:`test requires at least one path or glob`}};try{let e=Date.now(),r=await zg(t,u,d);Ug(r,o);let p=r.shardPlan?Wg({entries:r.entries,total:r.total,emitProgress:o}):[];return r.shardPlan?p.push(...await Gg({shards:r.shardPlan.shards,sessionName:f,suiteInvocationId:r.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:r.suiteArtifactsDir,suiteTotal:r.total,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})):p.push(...await Yg({discoveryEntries:r.entries,sessionName:f,suiteInvocationId:r.suiteInvocationId,cwd:t.cwd,requestId:t.requestId,request:t,suiteArtifactsDir:r.suiteArtifactsDir,suiteTotal:r.total,runReplay:n,cleanupSession:i,finalizeAttempt:a,emitProgress:o,isCanceled:s,emitDiagnostic:c,bindAttemptCancellation:l})),{status:`completed`,data:Qg(r.total,p,Date.now()-e,r.suiteArtifactsDir)}}catch(e){let t=r(e);return{status:`failed`,error:{code:t.code,message:t.message}}}}async function zg(e,t,n){let r=Bg(e,t),i=Vg(r),a=r.length-i.length,o=cg(e.requestId),s=await Lg(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:Hg(e,o),total:s?.total??r.length}}function Bg(e,t){return og({platformFilter:e.platformFilter,discoverSources:t})}function Vg(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Hg(e,t){return Qh({artifactsDir:typeof e.artifactsDir==`string`?e.artifactsDir:void 0,cwd:e.cwd,suiteInvocationId:t})}function Ug(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 Wg(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 Gg(e){return(await Promise.allSettled(e.shards.map(async t=>await qg({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Kg(r,e.sessionName,t.reason)]:[]})}function Kg(e,t,r){let i=n(r);return{file:e.entries[0]?.entry.path??`shard-${e.shardIndex+1}`,session:Jg(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 qg(e){let{shard:t,sessionName:n}=e;return await Xg({...e,entries:t.entries,sessionName:Jg(n,t),shard:t})}function Jg(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Yg(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 wg({entry:v,sessionName:n,suiteInvocationId:r,caseIndex:_-1,cwd:i,requestId:a,retries:dg(o.retries,v.manifest.attemptDefaults?.retries),timeoutMs:ug(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 Xg(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 wg({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:dg(o.retries,t.manifest.attemptDefaults?.retries),timeoutMs:ug(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 Qg(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 $g(e,t){return()=>e.map(e=>e_(e,t))}function e_(e,t){let n=e.entry,r=un(e,n),i=Mt(n,t)===`maestro`,a=ot(r);return{path:n,manifest:{...i?{title:ir(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 t_(e){return async t=>(await i_(e,t)).map(n_)}function n_(e){if(e.platform===`web`||!x(e))throw new l(`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 r_(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 i_(e,t){let n=c_(e),r=o_(await Ci(a_(e)),n,e);if(r.length<t)throw new l(`DEVICE_NOT_FOUND`,`test sharding requires ${s_(t)}, but only ${r.length} matched`);return r.slice(0,t)}function a_(e){let t=N(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:y({simulatorSetPath:xi(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function o_(e,t,n){return t.length>0?l_(e,t,n):e.filter(e=>u_(e,n)).sort(p_)}function s_(e){return`${e} device${e===1?``:`s`}`}function c_(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function l_(e,t,n){return t.map(t=>{let r=f_(t),i=e.find(e=>d_(e,n)&&(e.id===t||f_(e.name)===r));if(!i)throw new l(`DEVICE_NOT_FOUND`,`No shard device matched ${t}`);return i})}function u_(e,t){return!d_(e,t)||!x(e)?!1:e.booted!==!1}function d_(e,t){return!(!v(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function f_(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function p_(e,t){return e.id.localeCompare(t.id)}function m_(e){let t=h_(e?.shardAll,`--shard-all`),n=h_(e?.shardSplit,`--shard-split`);if(t!==void 0&&n!==void 0)throw new l(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(t!==void 0)return{mode:`all`,count:t};if(n!==void 0)return{mode:`split`,count:n}}function h_(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new l(`INVALID_ARGS`,`${t} requires a positive integer`);return e}}const g_=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 __(e){return g_.has(e.toUpperCase())}const v_=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function y_(e){if(!(`ok`in e)&&e.status===`failed`&&e.infrastructure===!0)return!0;let t=b_(e);return t?x_(t.details)||S_(t.code,t.message):!1}function b_(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function x_(e){if(e?.recovery===`runner_recycle_budget_exhausted`)return!0;let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`||Kn(t)?!0:t?__(t):!1}function S_(e,t){let n=`${e}\n${t}`.toLowerCase();return v_.some(e=>n.includes(e))}function C_(e){if(!e.ok)return{status:`failed`,error:e.error,artifactPaths:E_(e.error.details?.artifactPaths),infrastructure:y_(e),...D_(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:T_(t?.warnings),artifactPaths:E_(t?.artifactPaths),...D_(t?.snapshotDiagnostics)}}function w_(e){if(!e||e.ok)return;let t=C_(e);return t.status===`failed`?t:void 0}function T_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function E_(e){return[...new Set(T_(e))]}function D_(e){let t=h(e);return t?{snapshotDiagnostics:t}:{}}const O_=1e3,k_=3e3;function A_(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await j_(e)}}async function j_(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=Tr(o.device.platform),c=i?B.join(i,`recording${s}`):wr(o.device.platform);N_(a,{type:`video_recording_start`,session:n,videoPath:c}),j({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:c}}),e.video.throwIfCanceled();let l=await e.video.record(P_({req:t,sessionName:n,phase:`start`,outputPath:c}));if(!l.ok)return N_(a,{type:`video_recording_start_failed`,session:n,videoPath:c,errorCode:l.error.code}),l;let u=Date.now();return await Cr(O_),N_(a,{type:`video_preroll_done`,session:n,durationMs:Date.now()-u,requestedDurationMs:O_}),j({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-u,data:{session:n,requestedDurationMs:O_}}),l}async function M_(e){let{req:t,sessionName:n,sessionStore:r,artifactPaths:i,appendTimingEvent:a}=e;if(t.flags?.recordVideo!==!0||!r.get()?.screenRecording)return;N_(a,{type:`video_tail_start`,session:n,requestedDurationMs:k_});let o=Date.now();await Cr(k_);let s=Date.now(),c=await e.video.record(P_({req:t,sessionName:n,phase:`stop`}));return Ef(c).forEach(e=>i.add(e)),N_(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}),j({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-s,data:{session:n,ok:c.ok,tailDurationMs:s-o}}),c}function N_(e,t){e({...t,ts:new Date().toISOString()})}function P_(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 F_=[{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.`}],I_=({attemptId:e,parentAttemptId:t})=>{Wr(e);let n=L_(e,t);return{cancel:()=>Vr(e),release:()=>{n(),Ur(e)}}};function L_(e,t){if(!t||t===e)return()=>{};let n=M(t);if(!n)return()=>{};let r=()=>{Vr(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}function R_(e){let{platform:t,target:n,artifactsDir:r,shard:i,sourceBundle:a}=e,o=z_(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0&&a===void 0?o:r_({...o??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r},...a===void 0?{}:{replayScriptSource:a}},i)}function z_(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 B_(e){let{request:t,session:{name:n,logPath:i},createSession:a,invoke:o,cleanupSession:s,video:c}=e;if(t.flags?.recordVideo===!0&&c===void 0)return P(`COMMAND_FAILED`,`Screen-recording runtime is not configured for replay video capture`);let l=t.flags??{};for(let e of F_)if(e.requested(l))return P(`INVALID_ARGS`,e.message);let u,d;try{u=U_(t,n),d=H_(t)}catch(e){let t=r(e);return P(t.code,t.message)}let f=new Map(d.map(e=>[e.entry,e])),p=await Rg({request:u,emitProgress:Gr,isCanceled:()=>Hr(t.meta?.requestId),emitDiagnostic:j,bindAttemptCancellation:I_,runReplay:async({filePath:e,sessionName:n,platform:r,target:s,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,appendTimingEvent:m,shard:h,onStep:g})=>{let _=e=>(d&&Ef(e).forEach(e=>d.add(e)),e),v=R_({parentFlags:t.flags,platform:r,target:s,artifactsDir:u,shard:h,sourceBundle:f.get(e)}),y=a(n,i),b=c?{req:t,sessionName:n,sessionStore:y.store,artifactsDir:u,appendTimingEvent:m,video:c}:void 0,x=b?A_(b):void 0;return C_(await Jh({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 j_(b):void 0;return t&&!t.ok?t:_(await o(e))}}))},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:r,appendTimingEvent:o})=>{if(c)return w_(await M_({req:t,sessionName:e,sessionStore:a(e,i).store,artifactsDir:r,appendTimingEvent:o,artifactPaths:n,video:c}))},discoverSources:$g(d,t.flags?.replayBackend),resolveShardTargets:t_(t.flags),cleanupSession:s});return p.status===`completed`?{ok:!0,data:V_(p.data,t)}:P(p.error.code,p.error.message)}function V_(e,t){let n=t.meta?.clientArtifactPaths?.artifactsDir,r=e.artifactsDir;if(!n||!r)return e;let i=B.join(n,B.basename(r)),a=e=>e===r||e.startsWith(r+B.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 V.existsSync(r)?{...o,artifacts:[{field:`artifactsDir`,artifactType:`test-artifacts`,path:r,localPath:n,fileName:B.basename(r)}]}:o}function H_(e){let t=e.flags?.replayScriptSources;if(!t)throw new l(`INVALID_ARGS`,sn);return t}function U_(e,t){let n=e.flags??{},r=e.meta?.cwd,i=G_(n.artifactsDir);return{inputs:e.positionals??[],sessionName:t,cwd:r,requestId:e.meta?.requestId,platformFilter:n.platform,artifactsDir:i===void 0?void 0:jr(i,r),failFast:n.failFast===!0,retries:W_(n.retries),timeoutMs:W_(n.timeoutMs),shard:m_(n)}}function W_(e){return typeof e==`number`?e:void 0}function G_(e){return typeof e==`string`?e:void 0}function K_(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 ra({req:q_(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function q_(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 J_=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await Jh({request:e,session:X_(t,n,r),invoke:a??i}),Y_=async({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,invoke:a,invokeReplayAction:o,bindDevice:s,inspectFacts:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new l(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=K_({sessionStore:r,bindDevice:s,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await B_({request:e,session:X_(t,n,r),createSession:(e,t)=>X_(e,t,r),invoke:o??a,cleanupSession:async t=>await Z_({req:e,sessionName:t,logPath:n,sessionStore:r,leaseRegistry:i,inspectFacts:c,bindDevice:s,platformResourceCleanup:h}),...g?{video:g}:{}})};function X_(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 Z_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e;if(!i.get(n))return;let a=await oc({req:{token:t.token,session:n,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:n,logPath:r,sessionStore:i,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!a.ok)throw new l(a.error.code,a.error.message,{...a.error.details??{},...a.error.hint?{hint:a.error.hint}:{}})}function Q_(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command!==or.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return nv(new l(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let i=r.get(n);if(!i)return nv(new l(`SESSION_NOT_FOUND`,`No active session "${n}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let a=tv(i);if(a)return nv(a);let o=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!o)return nv(new l(`INVALID_ARGS`,`session save-script path cannot be empty.`));zt(i,{explicitPath:o,liveForce:t.flags?.force});let s=r.writeSessionLog(i,{force:Jt(i,t.flags?.force),publication:`active`});return s.written?(Wt(i,s.path),{ok:!0,data:{session:i.name,savedScript:s.path,actionCount:s.actionCount,...A(`Published script: ${s.path}`)}}):nv(s.error??new l(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function $_(e){if(ft(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Rt(e)?void 0:`not-armed`}const ev={repair:()=>new l(`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 l(`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 l(`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 l(`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 tv(e){let t=$_(e);return t?ev[t]():void 0}function nv(e){return{ok:!1,error:n(e)}}function rv(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function iv(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Fi(e)}}async function av(e,t,n){if(n.length!==1)throw new l(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(iv(t))}}async function ov(e,t,n){if(n.length<2)throw new l(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let r=n.slice(1).join(` `),i={...iv(t),text:r};return await e.operations.writeClipboard(i),{action:`write`,textLength:Array.from(r).length,...A(`Clipboard updated`)}}async function sv(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await I({command:`clipboard`,device:t,use:qe,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>av(n,e,r)}}let o=await I({command:`clipboard`,device:t,use:Me,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>ov(s,e,r)}}async function cv(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=i.get(n),c=t.flags??{},l=q(ar.clipboard,s,c);if(l)return l;let u=t.positionals??[],d=rv(u);if(!d)return P(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let f=await J({session:s,flags:c}),p=await sv({device:f,action:d,positionals:u,inspectFacts:a,bindDevice:o});if(!p.ok)return p.response;let m=await p.execute(ji(r,t.flags,s?.appBundleId,s?.trace?.outPath));return O(i,s,t,t.command,m),{ok:!0,data:{platform:E(f),...m}}}function lv(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function uv(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function dv(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function fv(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),Gr({type:`command`,status:`progress`,message:pv(t)})}function pv(e){return[na(e),...ta(e)].join(`
|
|
3
|
+
`)}async function mv(e,t){let{device:r,targetApp:i,session:a,listInstalledApps:o}=t;if(i)try{let t=o?hv(i,await o(`all`))?.id:void 0;if(!t){$(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${E(r)}.`,evidence:{requested:i,platform:E(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 ${E(r)} --all`,evidence:{code:i.code,message:i.message}})}}function hv(e,t){let n=e.trim().toLowerCase(),r=t.find(e=>e.id.toLowerCase()===n||e.name.toLowerCase()===n);if(r)return r;let i=t.filter(e=>e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n));if(i.length===1)return i[0];throw i.length>1?new l(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:i.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new l(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function gv(e,t,r){let i=vv(t,r);try{let t=await bv(i),n=yv(t.devices,i);return $(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:wv(n,i,t.failures),hint:n.length===0?Dv(t.failures):void 0,command:n.length===0?Mv(i):void 0,evidence:Nv(n,t.failures)}),n.length>0&&xv(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 _v(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:E(e),id:e.id,name:e.name}))}})}function vv(e,t){let n=e.flags??{};return Di({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 yv(e,t){return e.filter(e=>S(e,t,{includeExplicitSelectors:!0}))}async function bv(e){if(e.platform)return{devices:await Ci(e),failures:[]};let t=[],n=[];for(let r of hr)try{t.push(...await Ci({...e,platform:r}))}catch(e){n.push(Cv(r,e))}return{devices:t,failures:n}}function xv(e,t){for(let n of t)$(e,Sv(n))}function Sv(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Av(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Av(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Cv(e,t){let r=n(t);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function wv(e,t,n){if(e.length===0)return n.length>0?`No ${Tv(t)} devices found; ${Ev(n)}.`:`No ${Tv(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Tv(t)} ${jv(e.length,`device`)} available; ${r} booted`,a=Ov(e,t);return a?`${i} (${a}).`:`${i}.`}function Tv(e){let t=e.platform?Av(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Ev(e){return e.slice(0,2).map(e=>`${Av(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Dv(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Ov(e,t){if(t.platform||t.target)return;let n=mr(e),r=kv();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 kv(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Av(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 jv(e,t){return e===1?t:`${t}s`}function Mv(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Nv(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 Pv=1500;async function Fv(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 Iv(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Lv(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 Iv(e,t,n){try{return await(n.resolveProcessInfo??Rv)(e,t)}catch{return}}function Lv(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 Rv(e,t){if(!zv(e))return;let n=await Bv(t);if(n!==void 0)return{pid:n,cwd:await Vv(n)}}function zv(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Bv(e){let t=await Sr(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Pv});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 Vv(e){let t=await Sr(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Pv});if(t.exitCode===0)return t.stdout.split(`
|
|
5
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Hv=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Uv=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Wv(e,t){let n=Pr(e.meta?.cwd);return{targetApp:Yv(e.flags?.targetApp)??t?.appBundleId,metroHost:Yv(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Xv(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:qv(e,n)}}function Gv(e,t={}){let n=Jv(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 Kv(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${E(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function qv(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Jv(e){let t={...Object.fromEntries([...Hv,...Uv].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 Yv(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Xv(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Zv(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==ar.doctor)return null;let s=Qv(e.hostDiagnostics),c=r.get(n),l=Wv(t,c),u=ty(r,n),d=[];if(fv(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${Ar()} using ${u}`,evidence:{version:Ar(),stateDir:u}},...Gv(t,{required:l.remote}),...Kv(r,n,c,{remote:l.remote})),l.remote)return oy(d,l);let f=$v(l,u,i),p=await gv(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&$(d,m);let h=await ny({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??ey(p);if(g){let e=await s.warmupCheck(g,f);e&&$(d,e)}return oy(d,l,{device:h,includeMetro:!0,inventory:p})}function Qv(e){if(!e)throw new l(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function $v(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>Jr(e),emitProgress:e=>Gr({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await wi(e),shouldPropagateInventoryProbeError:Si,transportOverrides:Object.freeze({androidAdb:n})})}function ey(e){let t=(e?.devices??[]).filter(e=>C(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function ty(e,t){let n=B.dirname(e.resolveSessionDir(t));return B.basename(n)===`sessions`?B.dirname(n):n}async function ny(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??_v(t,i,a.targetApp);return u&&await ry(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&$(t,await Fv(a.metroHost,a.metroPort,a.kind)),fv(t,...await r.ambientChecks(n)),u}async function ry(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await iy({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await mv(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),fv(e,...await r.deviceChecks(i,n))}async function iy(e){if(e.device.platform!==`harmonyos`)return ay(e)}async function ay(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,Fe),u=N(n.flags?.androidDeviceAllowlist),d=await dc(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await fc(l,d,e)}function oy(e,t,n={}){let r=lv(e);return{ok:!0,data:{status:r,summary:uv(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:dv(e)}}}async function sy(e){return await I({...e,command:`prepare`,use:fe})}async function cy(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=t.positionals?.[0]??``;if(a!==`ios-runner`)return P(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let o=i.get(n),s=t.flags??{},c=q(ar.prepare,o,s);if(c)return c;let l=await J({session:o,flags:s}),u=await sy({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:ly(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:vi(t)}});return{ok:!0,data:uy(a,l,Math.max(0,Date.now()-d),f)}}function ly(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:ee}function uy(e,t,n,r){return{action:e,platform:E(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:dy(n,r),message:`Prepared Apple runner: ${t.name}`}}function dy(e,t){let n=fy(t.buildMs),r=py(t.connectMs),i=py(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 fy(e){return e===void 0?void 0:py(e)}function py(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const my=e=>pc(e),hy=e=>hl({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),gy=e=>oc({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}),_y=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await wl({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),vy=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await Tu({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),yy={session_list:my,devices:my,capabilities:my,apps:my,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Zv({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:_y,shutdown:_y,appstate:_y,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Q_({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Go({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 cv({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:Ss,perf:vy,logs:vy,events:vy,network:vy,audio:vy,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await cy({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:Is,reinstall:Is,install_source:Is,release_materialized_paths:async({req:e})=>await ko({req:e}),push:Is,"trigger-app-event":Cs,open:hy,replay:J_,test:Y_,batch:async({req:e,sessionName:t,invoke:n})=>await Ls(e,t,n),close:gy};async function by(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new An,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}=e,w=yy[t.command];return w?await w({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:S,platformResourceCleanup:C}):null}export{by as handleSessionCommands};
|