agent-device 0.20.10 → 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.10.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.10.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.10.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 +16 -8
- 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 +106 -103
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +6 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +63 -91
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +72 -155
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +74 -78
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +17 -9
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +42 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +185 -461
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +98 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +224 -164
- 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 +1 -0
- 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+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 +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-contract.js +1 -0
- package/dist/src/alert-runtime.js +1 -0
- package/dist/src/android-adb.d.ts +27 -19
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -0
- package/dist/src/android-system-chrome.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/api.js +11 -0
- package/dist/src/app-catalog.js +1 -0
- package/dist/src/app-deployment-resolution.js +2 -0
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory-contract.js +1 -0
- package/dist/src/app-inventory.js +1 -0
- package/dist/src/app-launch.js +2 -0
- package/dist/src/app-lifecycle-facade.js +1 -0
- package/dist/src/app-lifecycle.js +3 -6
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-lifecycle3.js +1 -0
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime.js +1 -4
- package/dist/src/app-log-runtime2.js +4 -0
- package/dist/src/app-parsers.js +4 -0
- package/dist/src/app-resolution-cache.js +1 -0
- package/dist/src/app-resolution-facade.js +1 -0
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +1 -2
- package/dist/src/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 +69 -50
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +4 -6
- package/dist/src/click-button.js +1 -0
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +255 -231
- package/dist/src/clipboard.js +1 -0
- package/dist/src/code-signature-cache.js +1 -0
- package/dist/src/code-signature.js +1 -0
- package/dist/src/color.js +1 -0
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/command.js +1 -0
- package/dist/src/compatibility-policy.js +1 -0
- package/dist/src/config.js +1 -1
- package/dist/src/config2.js +1 -0
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -0
- package/dist/src/daemon-process.js +1 -0
- package/dist/src/daemon-registration.js +1 -0
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +2 -2
- package/dist/src/debug-symbols-facade.js +5 -0
- package/dist/src/deploy-result-target.js +1 -0
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -0
- package/dist/src/device-input-state.d.ts +190 -3
- package/dist/src/device-inventory-context.js +1 -0
- package/dist/src/device-isolation.js +1 -0
- package/dist/src/device-release.js +1 -0
- package/dist/src/device-rotation.js +1 -0
- package/dist/src/device-selection-resolver.js +1 -0
- package/dist/src/device-session.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +3 -2
- package/dist/src/diagnostics.js +3 -0
- package/dist/src/diagnostics2.js +1 -0
- package/dist/src/dispatch-resolve.js +1 -0
- package/dist/src/doctor-facade.js +1 -0
- package/dist/src/doctor-output.js +1 -0
- package/dist/src/doctor.js +1 -0
- package/dist/src/doctor2.js +1 -0
- package/dist/src/doctor3.js +1 -0
- package/dist/src/durable-resource.js +1 -0
- package/dist/src/entities.js +1 -1
- package/dist/src/error.js +2 -0
- package/dist/src/exec.js +1 -0
- package/dist/src/file.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/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 +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -4
- package/dist/src/input-actions2.js +2 -1
- package/dist/src/install-artifact-facade.js +1 -0
- package/dist/src/install-source-network-transport.js +1 -0
- package/dist/src/install-source.d.ts +3 -10
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -0
- package/dist/src/interaction-ref-policy.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -0
- package/dist/src/interactor-types.js +1 -0
- package/dist/src/interactor.js +6 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +1 -2
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +2 -4
- package/dist/src/internal/png-worker.d.ts +4 -4
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.d.ts +4 -0
- package/dist/src/internal/run-script-http-child.js +1 -0
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/inventory.js +4 -4
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/inventory6.js +1 -1
- package/dist/src/ios-client.js +16 -0
- package/dist/src/ios-snapshot-acquisition.js +1 -0
- package/dist/src/ios-snapshot-adapter.js +1 -0
- package/dist/src/ios-snapshot-planning.js +1 -0
- package/dist/src/ios-snapshot-runtime.js +1 -0
- package/dist/src/json.js +1 -0
- package/dist/src/keyboard-actions.js +1 -0
- package/dist/src/launch-console.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-scope.js +1 -0
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +1610 -7
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -0
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/macos-facade.js +1 -0
- package/dist/src/managed-device-scope.js +1 -0
- package/dist/src/mechanics.js +19 -0
- package/dist/src/metro.d.ts +4 -2
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/multitouch-support.js +1 -0
- package/dist/src/numeric.js +1 -0
- package/dist/src/observability.js +1 -1
- package/dist/src/observation.js +2 -0
- package/dist/src/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 -0
- package/dist/src/process-exit.js +1 -1
- package/dist/src/process.js +1 -0
- package/dist/src/provider-device-runtime.js +1 -0
- package/dist/src/provider-session-ownership.js +2 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/proxy.js +2 -2
- package/dist/src/react-native-overlay.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/rect-center.js +1 -0
- package/dist/src/register-builtins.js +1 -0
- package/dist/src/registry.js +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 +127 -41
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +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 +472 -144
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -0
- package/dist/src/server.js +4 -4
- package/dist/src/session-allocation.js +1 -0
- package/dist/src/session-artifact-paths.js +1 -0
- package/dist/src/session-paths.js +1 -0
- package/dist/src/session-repair-tombstone.js +1 -0
- package/dist/src/session-routing.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -0
- package/dist/src/session-snapshot.js +1 -0
- package/dist/src/session-store.js +4 -0
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session2.js +5 -27
- package/dist/src/settings.js +1 -0
- package/dist/src/shared.js +2 -2
- package/dist/src/simctl-facade.js +1 -0
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-facade.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -0
- package/dist/src/snapshot-diagnostics.js +1 -0
- package/dist/src/snapshot-process.js +1 -0
- package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -0
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-scope.js +1 -1
- package/dist/src/snapshot-state.js +1 -0
- package/dist/src/snapshot.js +1 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -0
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +1 -2
- package/dist/src/src4.js +1 -1
- package/dist/src/src5.js +1 -0
- package/dist/src/src6.js +1 -0
- package/dist/src/src7.js +2 -0
- package/dist/src/src8.js +115 -0
- package/dist/src/startup-recovery-fence.js +1 -0
- package/dist/src/status-markers.js +1 -0
- package/dist/src/string-enum.js +1 -1
- package/dist/src/success-text.js +1 -0
- package/dist/src/surface-snapshot.js +1 -0
- package/dist/src/surface-snapshot2.js +1 -0
- package/dist/src/takeover.js +5 -0
- package/dist/src/tool-provider-facade.js +1 -0
- package/dist/src/tool-provider.js +4 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/toolchain-probe.js +2 -0
- package/dist/src/touch-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 +56 -34
- package/server.json +9 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
- package/dist/src/appearance.js +0 -1
- package/dist/src/apps.js +0 -5
- package/dist/src/audio-probe.js +0 -1
- package/dist/src/cli-grammar.js +0 -1
- package/dist/src/command-catalog.js +0 -1
- package/dist/src/debug-symbols.js +0 -5
- package/dist/src/device-input-state.js +0 -2
- package/dist/src/device-ready.js +0 -1
- package/dist/src/dispatch.js +0 -1
- package/dist/src/handler-utils.js +0 -1
- package/dist/src/helper-package-install.js +0 -1
- package/dist/src/host-process.js +0 -3
- package/dist/src/ime-lifecycle.js +0 -2
- package/dist/src/ime-recovery-marker.js +0 -1
- package/dist/src/input-actions3.js +0 -1
- package/dist/src/install-artifact.js +0 -1
- package/dist/src/install-artifact2.js +0 -1
- package/dist/src/interaction-common.js +0 -1
- package/dist/src/interaction-runtime.js +0 -1
- package/dist/src/interaction-snapshot.js +0 -1
- package/dist/src/manifest.js +0 -1
- package/dist/src/method-scope.js +0 -1
- package/dist/src/png-resize.js +0 -1
- package/dist/src/process-lock.js +0 -1
- package/dist/src/runner-lease.js +0 -1
- package/dist/src/runner-sequence.js +0 -1
- package/dist/src/script-source-bundle.js +0 -16
- package/dist/src/sdk-android-adb.d.ts +0 -245
- package/dist/src/sdk-android-adb.js +0 -4
- package/dist/src/sdk.js +0 -1
- package/dist/src/setting-state.js +0 -1
- package/dist/src/shell-quote.js +0 -1
- package/dist/src/snapshot-session.js +0 -1
- package/dist/src/timing-safe-equal.js +0 -1
- package/dist/src/unsupported-interactor.js +0 -1
- package/dist/src/verdict.js +0 -1
- /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
package/dist/src/runtime.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)}function
|
|
3
|
-
`).toLowerCase(),n=O(e,Ct),r=O(e,Et),i=O(e,xt,Ot),a=O(e,St),o=_t(t),s=vt(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:bt({text:t,hasReactNativeStackFrame:o,hasOverlayControl:yt(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function mt(e){let t=Mt(e.dismissNodes);if(t)return Ft(t,It(t));let n=Lt(e.collapsedNodes.filter(kt));return n?.rect?{action:`close-collapsed-banner`,point:Ht(n),rect:n.rect,ref:n.ref,label:k(n)}:null}function ht(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function gt(e){return it.test(e)}function _t(e){return at.some(t=>t.test(e))}function vt(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function yt(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function bt(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(gt(e.text)||e.hasReactNativeStackFrame)}function xt(e){let t=e?.trim().toLowerCase();return t?st.some(e=>t.includes(e))||ot.some(e=>e.test(t)):!1}function St(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Ct(e){return D(e)||wt(e)||Tt(e)}function D(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function wt(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function Tt(e){return ct.has(e)}function Et(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function Dt(e){return/^!,\s+/.test(e)}function Ot(e){return!e.rect||e.rect.height<=180}function kt(e){let t=k(e)?.trim().toLowerCase()??``;return(St(t)||Dt(t))&&jt(e)}function At(e){return e?e.x<=1&&e.y<=1&&e.width>=300&&e.height>=600:!1}function jt(e){return e.rect?e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180:!1}function O(e,t,n=()=>!0){let r=[];for(let i of e)i.ref&&n(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&r.push(i);return r}function Mt(e){return Rt(e,Pt)}function Nt(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Pt(e){return[Bt(Nt(e)),Bt(e.hittable),-(e.rect?ee(e.rect):1/0)]}function Ft(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:o(e.rect),rect:e.rect,ref:e.ref,label:k(e)}}function It(e){let t=k(e)?.trim().toLowerCase();return t&&D(t)?`dismiss`:`close`}function Lt(e){return Rt(e,zt)}function Rt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>Vt(t(n),t(e)))[0]??null}function zt(e){return[Bt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Bt(e){return+(e===!0)}function Vt(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function Ht(e){if(!e.rect)throw Error(`Collapsed React Native warning node must have rect`);let t=Math.min(e.rect.height,52),n=Math.min(36,Math.max(18,t*.45));return{x:Math.round(Ut(e.rect.x+e.rect.width-n,e.rect.x+1,e.rect.x+e.rect.width-1)),y:Math.round(e.rect.y+t/2)}}function Ut(e,t,n){return Math.min(n,Math.max(t,e))}function k(e){return e.label??e.value??e.identifier}function Wt(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}const A=[0,187,255,255];function Gt(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||Kt(e,n.rect)}function Kt(e,t){let n=qt(t);if(n==null)return;let r=M(n.x,0,e.width-1),i=M(n.y,0,e.height-1),a=M(n.right,0,e.width-1),o=M(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)j(e,n,i+t,A),j(e,n,o-t,A);for(let n=i;n<=o;n+=1)j(e,r+t,n,A),j(e,a-t,n,A)}}function qt(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function j(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function M(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}const Jt=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function Yt(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!Qt(t,a,e))continue;let c=0,l=Zt(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=Xt({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function Xt(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of Jt){let o=s+e.x,u=c+e.y;if(!$t(o,u,i,a))continue;let d=u*i+o;Qt(t,n,d)&&(l=Zt(r,n,l,d))}return l}function Zt(e,t,n,r){return t[r]=1,e[n]=r,n+1}function Qt(e,t,n){return e[n]===1&&t[n]!==1}function $t(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function en(e,t){return e.flatMap(e=>tn(e,t.baseline.width,t.baseline.height)?nn(e,t,ln(t.baseline.height)):[e])}function tn(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=cn(n)&&r>=t*.35}function nn(e,t,n){let r=sn(e,on(an(rn(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>un(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function rn(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function an(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function on(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function sn(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function cn(e){return Math.max(48,Math.round(e*.07))}function ln(e){return Math.max(24,Math.round(e*.03))}function un(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=dn(t,a),fn(i,e,t,a,r.baseline,r.current))}return i}function dn(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function fn(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const pn=2.5;function mn(e){let t=hn(e);return en(t.length<=2e3?vn(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>xn(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function hn(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return Yt({mask:t,width:i,height:a,hooks:{create:e=>gn(e,i),visit:(e,t)=>_n(e,t,i,n,r)}})}function gn(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function _n(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}function vn(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>yn(e,r,t));if(!e){n.push({...r});continue}bn(e,r)}return n}function yn(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function bn(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function xn(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=Sn(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=Sn(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Fe({x:F(r.x/n.width),y:F(r.y/n.height),width:F(r.width/n.width),height:F(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:F(e.differentPixels/n.differentPixels),densityPercentage:F(e.differentPixels/s),shape:Tn(r,n.width,n.height),size:En(s,n.totalPixels),location:Cn(i,n.width,n.height),averageBaselineColorHex:Dn(a),averageCurrentColorHex:Dn(o),baselineLuminance:Math.round(N(a)),currentLuminance:Math.round(N(o)),dominantChange:wn(a,o)}}function Sn(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function Cn(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function wn(e,t){let n=N(t)-N(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function Tn(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*pn?`horizontal-band`:e.height>=e.width*pn?`vertical-band`:`compact`}function En(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function N(e){return e.r*.2126+e.g*.7152+e.b*.0722}function Dn(e){return`#${P(e.r)}${P(e.g)}${P(e.b)}`}function P(e){return e.toString(16).padStart(2,`0`)}function F(e){return Math.round(e*100*100)/100}const On=255*Math.sqrt(3);async function kn(e,t,n={}){await An(e,`Baseline image not found`),await An(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([E.readFile(e),E.readFile(t)]),[o,s]=await Promise.all([$e(i,`baseline screenshot`),$e(a,`current screenshot`)]);jn(o.width,o.height,`baseline screenshot`,n.maxPixels),jn(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await Mn(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*On,{diffData:d,diffMask:f,differentPixels:p}=await et({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?mn({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new Qe.PNG({width:o.width,height:o.height});e.data=d,Gt(e,m),await E.mkdir(rt.dirname(r),{recursive:!0}),await E.writeFile(r,await nt(e))}else await Mn(n.outputPath);let ee=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:ee,match:p===0}}async function An(e,n){try{await E.access(e)}catch{throw new t(`INVALID_ARGS`,`${n}: ${e}`)}}function jn(e,n,r,i){if(i==null||i<=0)return;let a=e*n;if(!(a<=i))throw new t(`INVALID_ARGS`,`${r} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${i}`)}async function Mn(e){if(e)try{await E.unlink(e)}catch(e){if(!Nn(e,`ENOENT`))throw e}}function Nn(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function Pn(e,t){return e.map(e=>{let n=Fn(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function Fn(e,t){let n=In(e.rect);return t.map(t=>{let r=t.overlayRect,i=Le(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:Ln(i/In(r)),regionCoveragePercentage:Ln(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function In(e){return e.width*e.height}function Ln(e){return Math.round(e*100*100)/100}async function I(e,n,r){if(n.kind===`path`&&!e.policy.allowLocalInputPaths)throw new t(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(n,r)}catch(e){throw s(e)}}async function L(e,n,r){if(n?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new t(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(n,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:n?.kind===`downloadableArtifact`?n.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw s(e)}}async function Rn(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw s(e)}}const zn=async(e,n)=>{if(!n.baseline)throw new t(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let r=Bn(n.threshold),i=n.current??{kind:`live`};if(n.overlayRefs&&!qn(i))throw new t(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let a=await I(e,n.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),o,s,c,l=[];try{let t;qn(i)?(s=await Vn(e,n),t=s.path):(o=await I(e,i,{usage:`diff screenshot current`,field:`current`}),t=o.path),c=n.out?await L(e,n.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await kn(a.path,t,{threshold:r,outputPath:c?.path,maxPixels:e.policy.maxImagePixels});qn(i)&&(u=await Hn(e,n,c?.path,u,l));let d=u.diffPath?await c?.publish():void 0;return d&&l.push(d),u.diffPath||await c?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await c?.cleanup?.(),e}finally{await a.cleanup?.(),await o?.cleanup?.(),await s?.cleanup?.()}};function Bn(e){if(e==null||e===``)return .1;let n=Number(e);if(Number.isNaN(n)||n<0||n>1)throw new t(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return n}async function Vn(e,t){let n=await Rn(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await Un(e,t,n.path,Wn(t))}catch(e){throw await n.cleanup(),e}return n}async function Hn(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await Kn(n),r;let a=await L(e,Gn(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await Un(e,t,a.path,{overlayRefs:!0,...Wn(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:Pn(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function Un(e,n,r,i={}){if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,signal:n.signal??e.signal,metadata:n.metadata},r,i)??{}}function Wn(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Gn(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:R(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:R(e.out.clientPath)}:{},...e.out.fileName?{fileName:R(e.out.fileName)}:{}}}function R(e){let t=rt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function Kn(e){try{await E.unlink(R(e))}catch(e){if(!Jn(e,`ENOENT`))throw e}}function qn(e){return e.kind===`live`}function Jn(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const Yn=async(e,n)=>{if(!e.backend.captureScreenshot)throw new t(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);l(n);let r=await L(e,n.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),i;try{await e.backend.captureScreenshot({session:n.session,requestId:n.requestId,appId:n.appId,appBundleId:n.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},r.path,{fullscreen:n.fullscreen,overlayRefs:n.overlayRefs,pixelDensity:n.pixelDensity,stabilize:n.stabilize,normalizeStatusBar:n.normalizeStatusBar,surface:n.surface}),n.scale!==void 0&&await tt(r.path,n.scale),i=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...i?{artifacts:[i]}:{},...w(`Saved screenshot: ${r.path}`)}};function Xn(e,t){return[...$n(e),...Zn(e),...tr(e),...nr(e,t)]}function Zn(e){let t=e.customActions;if(!t)return[];let n=[];return t.blocked?n.push(`Custom actions were not read: an earlier accessibility read is still hung, so this capture skipped the read pass instead of queueing behind it. No element’s actions list is authoritative here. Reads resume once that call returns.`):t.read<t.candidates&&n.push(`Custom actions were read for ${t.read} of ${t.candidates} merged elements, on-screen ones first; the remaining ${t.candidates-t.read} were not read, so an absent actions list on those is not evidence that they have none. Scroll them into view and re-run to read them.`),t.truncated>0&&n.push(`${t.truncated} element(s) published more custom actions than are shown; those lists are clipped to the first 8 names, and long names are shortened.`),n}function Qn(e){return`Detected an overly complex or slow accessibility tree. Fell back to the ${e} snapshot backend. It is OK to continue; use --json to inspect snapshotQuality.reason if you need recovery details.`}function $n(e){return e.state===`recovered`?e.reasonCode===`deferred`||e.reasonCode===`requested-backend`?[]:[Qn(e.backend)]:e.state===`sparse`?[`No snapshot backend could read this screen`+(e.reason?` (${e.reason})`:``)+`. Its refs and selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`,...er(e)]:[]}function er(e){return e.reasonCode===`sparse-tree`?[`This screen publishes no accessibility content at all; assistive technologies see the same empty tree, so it is worth flagging as an app accessibility bug rather than only an automation limitation.`]:[]}function tr(e){return e.effectiveDepth===void 0?[]:[`Some deeper accessibility nodes were omitted; this tree is capped at depth ${e.effectiveDepth}. Re-run with --depth ${e.effectiveDepth} --scope <container> only if you need deeper content.`]}function nr(e,t){let n=[];for(let r of e.collapsedLeafIndexes??[]){let e=t.find(e=>e.index===r);if(!e)continue;let i=e.identifier?` (${e.identifier})`:``;n.push(`@${e.ref} [${e.type??`element`}]${i} merges many labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`)}return n}function rr(e){let{nodes:t,backend:n,snapshotRaw:i}=e;if(i||!r(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let a=Je(t),o=new Set;return a.hiddenCount>0&&o.add(`offscreen-nodes`),a.nodes.some(e=>e.hiddenContentAbove)&&o.add(`scroll-hidden-above`),a.nodes.some(e=>e.hiddenContentBelow)&&o.add(`scroll-hidden-below`),{partial:o.size>0,visibleNodeCount:a.nodes.length,totalNodeCount:t.length,reasons:[...o]}}const ir=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function ar(e){return e?.systemSurfaceOnly===!0?ir:void 0}function or(e,t){return e.presentationKey?e:{...e,presentationKey:i(t)}}function sr(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!cr(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!lr(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function cr(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function lr(e,t){return e.truncated===t.truncated?JSON.stringify(ur(e.nodes))===JSON.stringify(ur(t.nodes)):!1}function ur(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints,actions:e.actions}))}const dr=async(e,t)=>{let n=await pr(e,t),r=sr({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});return await e.sessions.set(hr(t.session,n)),{nodes:n.snapshot.nodes,truncated:n.snapshot.truncated??!1,visibility:rr({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...u({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...gr(n)}},fr=async(e,t)=>{let n=await pr(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=hr(t.session,n);if(!i){let t=Pe(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=ue(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function pr(e,n){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=n.session??`default`,i=await e.sessions.get(r),a=await e.backend.captureSnapshot({session:r,requestId:n.requestId,appId:i?.appId,appBundleId:i?.appBundleId,signal:n.signal??e.signal,metadata:n.metadata},{interactiveOnly:n.interactiveOnly,depth:n.depth,scope:n.scope,raw:n.raw,customActions:n.customActions}),o=or(mr(a,e),n),s=c(a),l=Re(e);return{snapshot:o,result:a,session:i,annotations:s,warnings:_r({result:a,annotations:s,snapshot:o,options:n,session:i,capturedAt:o.createdAt??l,runtimeNow:l})}}function mr(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:Re(t)}}function hr(e,t){let n=t.session?.name??e??`default`;return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function gr(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function _r(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...Xn(e.annotations.quality,e.snapshot.nodes)),t.push(...xr(e)),e.annotations.quality||(t.push(...yr(e)),t.push(...br(e.snapshot.nodes)));let n=lt(e.snapshot.nodes);n&&t.push(n);let r=vr(e.annotations);r&&t.push(r);let i=Sr(e);return i&&t.push(i),t.push(...Er(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function vr(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return ir}function yr(e){return e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1||e.snapshot.nodes[0]?.type!==`Application`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]}function br(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function xr(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function Sr(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&Cr(t,e.snapshot)&&wr(t,e.capturedAt,e.runtimeNow)&&Dr(t.nodes.length,e.snapshot.nodes.length))return Tr}function Cr(e,t){return e.presentationKey===void 0||t.presentationKey===void 0?!0:e.presentationKey===t.presentationKey}function wr(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const Tr=`Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.`;function Er(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`y`:`ies`}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:e.reason===`sharp-drop`?[Tr]:[]}function Dr(e,t){return e<12?!1:t<=Math.floor(e*.2)}const Or={screenshot:Yn,diffScreenshot:zn,snapshot:dr,diffSnapshot:fr},kr=new WeakMap;function Ar(e,t){Mr(e)&&kr.set(e,t)}function jr(e){return Mr(e)?kr.get(e):void 0}function Mr(e){return typeof e==`object`&&!!e||typeof e==`function`}const Nr=async(e,t)=>await Lr(e,t,`press`),Pr=async(e,t)=>await Lr(e,t,`click`),Fr=async(e,n)=>{if(!n.text)throw new t(`INVALID_ARGS`,`fill requires text`);let r=fe(n),i=r.needsPreActionBaseline?null:await Br(e,n);if(i)return i;let a=await he(e,n,{action:`fill`,requireInteractive:!0,pipeline:S.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.fill)throw new t(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let o=Rr(a),s=`node`in a?a.node?.type??``:``,c=s!==``&&le(s,e.backend.platform),l=n.allowNonHittableCoordinateFallback===!0&&`node`in a&&a.node?.hittable===!1,u=C(await e.backend.fill(b(e,n),o,n.text,{delayMs:n.delayMs,allowNonHittableCoordinateFallback:l})),d=s&&!c?`fill target ${Hr(a)} resolved to "${s}", attempting fill anyway.`:void 0;return await Te(e,n,a,{...a,text:n.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},r)},Ir=async(e,n)=>{let r=n.text;if(!r)throw new t(`INVALID_ARGS`,`type requires text`);let i=Ur(r);if(i)throw new t(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});if(!e.backend.typeText)throw new t(`UNSUPPORTED_OPERATION`,`type is not supported by this backend`);let a=x(n.delayMs??0,`delay-ms`,0,1e4),o=C(await e.backend.typeText(b(e,n),r,{delayMs:a}));return{kind:`text`,text:r,delayMs:a,...o?{backendResult:o}:{},...w(`Typed ${Array.from(r).length} chars`)}};async function Lr(e,n,r){let i=fe(n),a=i.needsPreActionBaseline?null:await zr(e,n,r);if(a)return a;let o=await he(e,n,{action:r,requireInteractive:!0,pipeline:S.promotedTarget,captureEvidenceBaseline:i.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget,preresolvedTarget:n.preresolvedTarget});if(!e.backend.tap)throw new t(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let s=Rr(o),c;try{c=await e.backend.tap(b(e,n),s,{button:n.button,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap})}catch(e){throw Ar(e,o),e}let l=C(c);return await Te(e,n,o,{...o,...l?{backendResult:l}:{}},i)}function Rr(e){if(!e.point)throw new t(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function zr(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Vr(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await Ce(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Br(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await Ce(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Vr(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function Hr(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function Ur(e){return Wt(e)}function z(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Wr=S.wait.poll.defaultTimeoutMs;function B(e,t,n,r){let i=we(r),a=n??i.defaultTimeoutMs,o=V(e),s=Yr(),c=()=>Math.max(0,a-(V(e)-o));return{capture:async n=>{let r=!1,i=await pe(e,t,c(),async e=>await s.attempt(async()=>{let t=await n(e);return r=!0,t}));return i.timedOut?{timedOut:!0,deadline:s.readableCaptures()===0?`capture-stalled`:`capture-truncated`}:(r&&s.recordReadableCapture(),i)},hasTimeRemaining:()=>c()>0,failureEvidence:()=>({timeoutMs:a,readableCaptures:s.readableCaptures(),waitedMs:V(e)-o}),rethrowIfNeverReadable:s.rethrowIfNeverReadable,sleepUntilNextPoll:async()=>await Xr(e,t,Math.min(i.intervalMs,c())),timeoutMs:a,waitedMs:()=>V(e)-o}}function Gr(e,n){return new t(`COMMAND_FAILED`,e,{reason:T.captureStalled,captureStalled:!0,...n,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Kr(e,n){return new t(`COMMAND_FAILED`,e,{reason:T.deadlineExceeded,captureTruncated:!0,...n})}function qr(e,n){return new t(`COMMAND_FAILED`,e,{reason:T.targetAbsent,...n})}function Jr(e,t,n){let r=t.failureEvidence();return n===`capture-stalled`?Gr(e,r):n===`capture-truncated`?Kr(e,r):(t.rethrowIfNeverReadable(),r.readableCaptures===0?Gr(e,r):qr(e,r))}function Yr(){let e=0,t;return{attempt:async e=>{try{return await e()}catch(e){if(!re(e))throw e;t=e;return}},recordReadableCapture:()=>{e+=1},readableCaptures:()=>e,rethrowIfNeverReadable:()=>{if(e===0&&t!==void 0)throw t}}}function V(e){return e.clock?.now()??Date.now()}async function Xr(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}function Zr(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Qr(e){let r=async(r,i)=>{if(i.target.kind===`sleep`)return await Xr(r,i,i.target.durationMs),{kind:`sleep`,waitedMs:i.target.durationMs};if(i.target.kind===`ref`){let o=await e.requireSnapshot(r,i.session),s=a(i.target.ref);if(!s)throw new t(`INVALID_ARGS`,`Invalid ref: ${i.target.ref}`);let c=n(o.snapshot.nodes,s),l=c?ke(c,o.snapshot.nodes):void 0;if(!l)throw new t(`COMMAND_FAILED`,`Ref ${i.target.ref} not found or has no label`);return await ti(e,r,i,l,i.target.timeoutMs)}if(i.target.kind===`selector`)return await $r(e,r,i,i.target.selector,i.target.timeoutMs,i.target.recordedLandmark);if(i.target.kind===`stable`)return await ri(e,r,i,i.target.quietMs,i.target.timeoutMs);let o=d(i.target.text);if(!o.ok)throw new t(o.code,o.message);return await ti(e,r,i,i.target.text,i.target.timeoutMs)};return{waitCommand:r,waitForTextCommand:async(e,n)=>{let i=await r(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(i.kind!==`text`)throw new t(`COMMAND_FAILED`,`waitForText returned non-text result`);return i}}}async function $r(e,n,r,i,a,o){let s=B(n,r,a,S.wait),c=z(),l,u;for(;s.hasTimeRemaining();){let t=await s.capture(async t=>await e.captureSnapshot(n,{...r,signal:t},{updateSession:!0,includeHiddenContentHints:!1,...c}));if(t.timedOut){u=t.deadline;break}let a=t.value;if(a){let e=a.snapshot.nodes,t=Zr(await v(S.wait,e,i,{platform:n.backend.platform}));if(t){let n=ei(e,t,o);if(n.kind===`satisfied`)return{kind:`selector`,selector:t.selector,waitedMs:s.waitedMs(),node:n.node,preActionNodes:e};l=n.evidence}}await s.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new t(`COMMAND_FAILED`,`wait matched selector ${i} but no candidate carried the recorded landmark identity`,{reason:be,...l}):Jr(`wait timed out for selector: ${i}`,s,u)}function ei(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=Ie(e),a=ve(t.matchedNodes,i,te(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:p(r),observedAncestry:ye(r,i,Math.max(n.ancestry.length,1)).chain}}}async function ti(e,t,n,r,i){let a=B(t,n,i,S.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>t.backend.findText?(await t.backend.findText(ii(t,{...n,signal:i}),r)).found:await ni(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw Jr(`wait timed out for text: ${r}`,a,o)}async function ni(e,t,n,r){return!!ge((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}async function ri(e,n,r,i,a){let o=a??Wr,s=i??e.stable.defaultQuietMs,c=await e.stable.capture(n,r,{quietMs:s,timeoutMs:o});if(!c.settled)throw new t(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:T.stableTimeout,...c.stalled?{captureStalled:!0}:{},quietMs:s,timeoutMs:o,captures:c.captures,nodeCount:c.nodeCount,...c.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:c.waitedMs,captures:c.captures,nodeCount:c.nodeCount,...c.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}function ii(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const ai=Qr({captureSnapshot:_,requireSnapshot:de,stable:{defaultQuietMs:500,tinyTreeHint:Ee,tinyTreeNodeCount:5,capture:me}}),oi=ai.waitCommand,si=ai.waitForTextCommand,ci=async(e,n)=>{let r=n.locator??`any`;if(!n.query)throw new t(`INVALID_ARGS`,se);if(n.action===`wait`)return await mi(e,n,r);if(n.action===`list`)return await hi(e,n,r);let{capture:i,match:a}=await gi(e,n,r);if(!a)throw new t(`COMMAND_FAILED`,`find did not match any element`);if(n.action===`exists`)return{kind:`found`,found:!0};let o=`@${a.ref}`;return n.action===`get_attrs`?{kind:`attrs`,ref:o,node:a}:{kind:`text`,ref:o,text:await Ue(e,i,a),node:a}},H=async(e,t)=>{if(t.target.kind===`ref`){let n=await de(e,t.session),r=Oe(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});xe(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=f(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await Ue(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await _i(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?S.readText:S.readUnique,hooks:{onResolved:(e,n)=>xe(e,n,t.expectedResolvedTarget,`get`)}}),r=f(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await Ue(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},li=async(e,n)=>{let r=await H(e,{...n,property:`text`,target:n.target});if(r.kind!==`text`)throw new t(`COMMAND_FAILED`,`getText returned non-text result`);return r},ui=async(e,n)=>{let r=await H(e,{...n,property:`attrs`,target:n.target});if(r.kind!==`attrs`)throw new t(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return r},di=async(e,n)=>{let r=ie(n.predicate);if(!r.ok)throw new t(r.code,r.message,{hint:r.hint});let i=r.predicate;if(i===`text`&&!n.expectedText)throw new t(`INVALID_ARGS`,m);let a=n.selector,o=await _(e,n,{updateSession:!0,...z(i)});if(i===`exists`){let n=await v(S.readAny,o.snapshot.nodes,a,{platform:e.backend.platform});if(n.kind!==`target`)throw new t(`COMMAND_FAILED`,g(a,[],{unique:!1}),{hint:h([])});return{predicate:i,pass:!0,selector:n.selector,matches:n.matches,selectorChain:ae(a)}}let s=await v(S.readUnique,o.snapshot.nodes,a,{platform:e.backend.platform},{onResolved:(e,t)=>xe(e,t,n.expectedResolvedTarget,`is`)});if(s.kind!==`target`)throw new t(`COMMAND_FAILED`,g(a,[],{unique:!0}),{command:`is`,reason:`selector_not_found`,predicate:i,selector:a,hint:h([])});let c=s,l=oe({predicate:i,node:c.node,nodes:o.snapshot.nodes,expectedText:n.expectedText,platform:e.backend.platform});if(!l.pass)throw new t(`COMMAND_FAILED`,`is ${i} failed for selector ${c.selector}: ${l.details}`,{command:`is`,reason:`predicate_failed`,predicate:i,selector:c.selector,predicateDetails:l.details});return{predicate:i,pass:!0,selector:c.selector,...i===`text`?{text:l.actualText}:{},selectorChain:ae(a),node:c.node,preActionNodes:o.snapshot.nodes}},fi=async(e,t)=>await di(e,{...t,predicate:`visible`,selector:t.target.selector}),pi=async(e,t)=>await di(e,{...t,predicate:`hidden`,selector:t.target.selector});async function mi(e,t,n){let r=B(e,t,t.timeoutMs,S.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await gi(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw Jr(`find wait timed out`,r,i)}async function hi(e,t,n){let r=ne(n,t.query),i=await _(e,t,{updateSession:!0,...z()});if(Ye(i.snapshot.snapshotQuality))throw De(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?Ae(S.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:ce(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function gi(e,t,n,r){let i=ne(n,t.query),a=await _(e,t,{updateSession:!0,scope:_e(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...z()});if(Ye(a.snapshot.snapshotQuality))throw De(a.snapshot.snapshotQuality);if(i){let t=await v(S.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:ce(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function _i(e,n,r,i){let a=await _(e,{...n,session:r},{updateSession:!0,...z()}),o=await v(i.policy,a.snapshot.nodes,i.selector,{platform:e.backend.platform},i.hooks);if(o.kind!==`target`)throw new t(`COMMAND_FAILED`,g(i.selector,[],{unique:!0}),{hint:h([])});return{capture:a,node:o.node,selector:o.selector,ref:`@${o.node.ref}`}}const vi=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Se(e,n,n.gesture.intent);let r=await Me(e,n),i=Ge(n.gesture,r,e.backend.platform),a=C(await e.backend.performGesture(b(e,n),i)),o=bi(i.pointers,0),s=bi(i.pointers,-1);return{kind:n.gesture.intent,durationMs:i.durationMs,pointerCount:i.topology===`single`?1:2,from:o,to:s,...a?{backendResult:a}:{},...w(xi(n.gesture,o,s))}},yi=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await Ne(e,{...t,gesture:n}):await vi(e,{...t,gesture:n})};function bi(e,n){let r=e.map(e=>n===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(r.some(e=>e===void 0))throw new t(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let i=r;return{x:i.reduce((e,t)=>e+t.x,0)/i.length,y:i.reduce((e,t)=>e+t.y,0)/i.length}}function xi(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const U={find:ci,get:H,getText:li,getAttrs:ui,is:di,isVisible:fi,isHidden:pi,wait:oi,waitForText:si},W={click:Pr,press:Nr,fill:Fr,typeText:Ir,focus:je,longPress:He,hover:ze,scroll:Ve,gesture:yi,settleObservation:Be};function Si(e){return{find:t=>U.find(e,t),get:t=>U.get(e,t),getText:(t,n={})=>U.getText(e,{...n,target:t}),getAttrs:(t,n={})=>U.getAttrs(e,{...n,target:t}),is:t=>U.is(e,t),isVisible:(t,n={})=>U.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>U.isHidden(e,{...n,target:t}),wait:t=>U.wait(e,t),waitForText:(t,n={})=>U.waitForText(e,{...n,text:t})}}function Ci(e){return{click:(t,n={})=>W.click(e,{...n,target:t}),press:(t,n={})=>W.press(e,{...n,target:t}),fill:(t,n,r={})=>W.fill(e,{...r,target:t,text:n}),typeText:(t,n={})=>W.typeText(e,{...n,text:t}),focus:(t,n={})=>W.focus(e,{...n,target:t}),longPress:(t,n={})=>W.longPress(e,{...n,target:t}),hover:(t,n={})=>W.hover(e,{...n,target:t}),scroll:t=>W.scroll(e,t),gesture:t=>W.gesture(e,t),settleObservation:t=>W.settleObservation(e,t)}}function G(e,t){if(e!==void 0)return K(e,t)}function K(e,n){let r=e?.trim();if(!r)throw new t(`INVALID_ARGS`,`${n} must be a non-empty string`);return r}const wi=async(e,n={})=>{if(!e.backend.listDevices)throw new t(`UNSUPPORTED_OPERATION`,`admin.devices is not supported by this backend`);return{kind:`adminDevices`,devices:await e.backend.listDevices(b(e,n),n.filter)}},Ti=async(e,n={})=>{if(!e.backend.bootDevice)throw new t(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let r=Pi(n.target),i=C(await e.backend.bootDevice(b(e,n),r));return{kind:`deviceBooted`,...r?{target:r}:{},...i?{backendResult:i}:{},...w(`Booted device`)}},Ei=async(e,n={})=>{if(!e.backend.shutdownDevice)throw new t(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let r=Pi(n.target),i=C(await e.backend.shutdownDevice(b(e,n),r));return{kind:`deviceShutdown`,...r?{target:r}:{},...i?{backendResult:i}:{},...w(`Shutdown device`)}},Di=async(e,t)=>await q(e,t,`install`),Oi=async(e,t)=>await q(e,t,`reinstall`),ki=async(e,t)=>await q(e,t,`installFromSource`);async function q(e,n,r){let i=r===`reinstall`?`reinstallApp`:`installApp`,a=e.backend[i];if(!a)throw new t(`UNSUPPORTED_OPERATION`,`admin.${r} is not supported by this backend`);let o=`app`in n&&n.app!==void 0?K(n.app,`app`):void 0;if(r!==`installFromSource`&&!o)throw new t(`INVALID_ARGS`,`admin.${r} requires app`);let s=b(e,n),c=await Ai(e,s,n.source);try{let t=await a.call(e.backend,s,{...o?{app:o}:{},source:c.source});return Fi(r,o,c.source,t)}finally{await c.cleanup?.()}}async function Ai(e,t,n){let r=await ji(e,Mi(n));try{return{source:Mi(e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function ji(e,t){if(t.kind===`url`)return{source:t};let n=await I(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function Mi(e){if(!e||typeof e!=`object`)throw new t(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:K(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:K(e.id,`source.id`)};if(e.kind===`url`){let t=K(e.url,`source.url`);return Ni(t),{kind:`url`,url:t}}throw new t(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function Ni(e){let n;try{n=new URL(e)}catch{throw new t(`INVALID_ARGS`,`Invalid install source URL: ${e}`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new t(`INVALID_ARGS`,`Install source URL must use http or https`)}function Pi(e){if(!e)return;let t=G(e.id,`target.id`),n=G(e.name,`target.name`),r={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...e.headless===void 0?{}:{headless:e.headless}};return Object.keys(r).length>0?r:void 0}function Fi(e,t,n,r){let i=C(r),a=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,o=J(r,`appName`),s=J(r,`appId`),c=J(r,`bundleId`),l=J(r,`packageName`),u=J(r,`launchTarget`),d=J(r,`installablePath`),f=J(r,`archivePath`);return{kind:a,...t?{app:t}:{},source:n,...s?{appId:s}:{},...o?{appName:o}:{},...c?{bundleId:c}:{},...l?{packageName:l}:{},...u?{launchTarget:u}:{},...d?{installablePath:d}:{},...f?{archivePath:f}:{},...i?{backendResult:i}:{},...w(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${o??u??t??Ii(n)}`)}}function J(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function Ii(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const Li=/^[A-Za-z0-9_.:-]{1,64}$/,Ri=async(e,n)=>{if(!e.backend.openApp)throw new t(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let r=Wi(n),i=C(await e.backend.openApp(Y(e,n),r,{launchArgs:n.launchArgs,relaunch:n.relaunch}));return{kind:`appOpened`,target:r,relaunch:n.relaunch===!0,...i?{backendResult:i}:{},...w(`Opened: ${Ki(r)}`)}},zi=async(e,n={})=>{if(!e.backend.closeApp)throw new t(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let r=G(n.app,`app`),i=C(await e.backend.closeApp(Y(e,n),r));return{kind:`appClosed`,...r?{app:r}:{},...i?{backendResult:i}:{},...w(r?`Closed: ${r}`:`Closed app`)}},Bi=async(e,n={})=>{if(!e.backend.listApps)throw new t(`UNSUPPORTED_OPERATION`,`apps.list is not supported by this backend`);return{kind:`appsList`,apps:await e.backend.listApps(Y(e,n),Xe(n.filter))}},Vi=async(e,n)=>{if(!e.backend.getAppState)throw new t(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let r=K(n.app,`app`);return{kind:`appState`,app:r,state:await e.backend.getAppState(Y(e,n),r)}},Hi=async(e,n)=>{if(!e.backend.pushFile)throw new t(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let r=K(n.app,`app`),i=await qi(e,n.input);try{let t=C(await e.backend.pushFile(Y(e,n),i.backendInput,r));return{kind:`appPushed`,app:r,inputKind:i.inputKind,...t?{backendResult:t}:{},...w(`Pushed to ${r}`)}}finally{await i.cleanup?.()}},Ui=async(e,n)=>{if(!e.backend.triggerAppEvent)throw new t(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let r=Ji(n.name);Yi(n.payload,`apps.triggerEvent payload for "${r}"`);let i=C(await e.backend.triggerAppEvent(Y(e,n),{name:r,...n.payload?{payload:n.payload}:{}}));return{kind:`appEventTriggered`,name:r,...n.payload?{payload:n.payload}:{},...i?{backendResult:i}:{},...w(`Triggered app event: ${r}`)}};function Wi(e){let n=G(e.app,`app`),r=G(e.appId,`appId`),i=G(e.bundleId,`bundleId`),a=G(e.packageName,`packageName`),o=G(e.url,`url`),s=G(e.activity,`activity`),c={...n?{app:n}:{},...r?{appId:r}:{},...i?{bundleId:i}:{},...a?{packageName:a}:{},...o?{url:o}:{},...s?{activity:s}:{}};if(!Gi(c))throw new t(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return c}function Gi(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function Ki(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function qi(e,n){if(!n||typeof n!=`object`)throw new t(`INVALID_ARGS`,`apps.push requires an input`);if(n.kind===`json`)return Xi(n.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:n.payload},inputKind:`json`};let r=await I(e,n,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:r.path},inputKind:`file`,...r.cleanup?{cleanup:r.cleanup}:{}}}function Ji(e){let n=K(e,`name`);if(!Li.test(n))throw new t(`INVALID_ARGS`,`Invalid apps.triggerEvent name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});return n}function Yi(e,t){e!==void 0&&Xi(e,t,8192)}function Xi(e,n,r){if(Zi(e,n),Buffer.byteLength(Qi(e,n),`utf8`)>r)throw new t(`INVALID_ARGS`,`${n} exceeds ${r} bytes`)}function Zi(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a JSON object`)}function Qi(e,n){try{let r=JSON.stringify(e);if(typeof r!=`string`)throw new t(`INVALID_ARGS`,`${n} must be JSON-serializable`);return r}catch{throw new t(`INVALID_ARGS`,`${n} must be JSON-serializable`)}}function Y(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const $i={open:Ri,close:zi,list:Bi,state:Vi,push:Hi,triggerEvent:Ui},ea={devices:wi,boot:Ti,shutdown:Ei,install:Di,reinstall:Oi,installFromSource:ki};function ta(e){return{...y($i,e),list:(t={})=>$i.list(e,{...t,filter:Ze(t.filter)})}}const na=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,ra=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function ia(e){let t=!1,n=e;return n=n.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,n)=>(t=!0,`${String(n)}=[REDACTED]`)),n=n.replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,n,r,i)=>(t=!0,`${String(n)}[REDACTED]${String(i)}`)),n=n.replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(ra,()=>(t=!0,`[REDACTED]`)),n=oa(n,()=>{t=!0}),{value:n,redacted:t}}function aa(e){try{let t=new URL(e),n=sa(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function oa(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=aa(e);return n?(n.redacted&&t(),n.value):e}):e}function sa(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))na.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const X=2048,ca=4096,la=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function ua(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=Q(e.message,ca),r=_a(e.metadata);return t||=n.redacted||r.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:n.value??``,...e.source?{source:e.source}:{},...r.value?{metadata:r.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function da(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?ma(e.url):void 0,i=t===`headers`||t===`all`?pa(e.requestHeaders):void 0,a=t===`headers`||t===`all`?pa(e.responseHeaders):void 0,o=t===`body`||t===`all`?ha(e.requestBody):void 0,s=t===`body`||t===`all`?ha(e.responseBody):void 0,c=_a(e.metadata);return n||=(r?.redacted??!1)||(i?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...r?{url:r.value}:{},...e.status===void 0?{}:{status:e.status},...e.durationMs===void 0?{}:{durationMs:e.durationMs},...i?.value?{requestHeaders:i.value}:{},...a?.value?{responseHeaders:a.value}:{},...o?.value===void 0?{}:{requestBody:o.value},...s?.value===void 0?{}:{responseBody:s.value},...c.value?{metadata:c.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:n,...e.notes?{notes:e.notes}:{}}}function fa(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=Q(e.message,ca),r=_a(e.metadata);return t||=n.redacted||r.redacted,{name:e.name,...e.value===void 0?{}:{value:e.value},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...n.value===void 0?{}:{message:n.value},...r.value?{metadata:r.value}:{}}}),...e.startedAt?{startedAt:e.startedAt}:{},...e.endedAt?{endedAt:e.endedAt}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function pa(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(la.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=Q(i,X);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function ma(e){return aa(e)??Q(e,X)}function ha(e){return e===void 0?{redacted:!1}:ga(e)??Q(e,X)}function ga(e){try{let t=Z(JSON.parse(e),ia);return va(JSON.stringify(t.value),X,t.redacted)}catch{return}}function _a(e){return Z(e,e=>Q(e,X))}function Z(e,t){if(e===void 0)return{redacted:!1};if(typeof e==`string`)return t(e);if(!e||typeof e!=`object`)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let r=Z(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(la.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=Z(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function Q(e,t){if(e===void 0)return{redacted:!1};let n=ia(e);return va(n.value,t,n.redacted)}function va(e,t,n){if(e===void 0)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}const ya=async(e,n={})=>{if(!e.backend.readLogs)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return ua(await e.backend.readLogs(await Sa(e,n),Ca(n)))},ba=async(e,n={})=>{if(!e.backend.dumpNetwork)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let r=wa(n);return da(await e.backend.dumpNetwork(await Sa(e,n),r),r.include??`summary`)},xa=async(e,n={})=>{if(!e.backend.measurePerf)throw new t(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return fa(await e.backend.measurePerf(await Sa(e,n),Ta(n)))};async function Sa(e,t){let n=b(e,t),r=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??r?.appId?{appId:t.appId??r?.appId}:{},...t.appBundleId??r?.appBundleId?{appBundleId:t.appBundleId??r?.appBundleId}:{}}}function Ca(e){return{...Ea(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:ka(e.levels,`levels`)},...e.search===void 0?{}:{search:K(e.search,`search`)},...e.source===void 0?{}:{source:K(e.source,`source`)}}}function wa(e){return{...Ea(e,25,200,`network limit`),include:Oa(e.include)}}function Ta(e){return{...Da(e),...e.sampleMs===void 0?{}:{sampleMs:x(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:ka(e.metrics,`metrics`,20)}}}function Ea(e,t,n,r){return{...Da(e),...e.cursor===void 0?{}:{cursor:K(e.cursor,`cursor`)},limit:e.limit===void 0?t:x(e.limit,r,1,n)}}function Da(e){return{...e.since===void 0?{}:{since:K(e.since,`since`)},...e.until===void 0?{}:{until:K(e.until,`until`)}}}function Oa(e){if(e===void 0)return`summary`;if(e===`summary`||e===`headers`||e===`body`||e===`all`)return e;throw new t(`INVALID_ARGS`,`network include must be summary, headers, body, or all`)}function ka(e,n,r=50){if(!Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be an array of strings`);if(e.length>r)throw new t(`INVALID_ARGS`,`${n} must contain at most ${r} entries`);return e.map((e,t)=>K(e,`${n}[${t}]`))}const Aa={logs:ya,network:ba,perf:xa},ja=async(e,n)=>{let r=Ia(n.action,`record`),i=r===`start`?e.backend.startRecording:e.backend.stopRecording;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`record ${r} is not supported by this backend`);let a=n.out?await L(e,n.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let t=Na(n,a?.path);return La(r,await i.call(e.backend,b(e,n),t),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}},Ma=async(e,n)=>{let r=Ia(n.action,`trace`),i=r===`start`?e.backend.startTrace:e.backend.stopTrace;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`trace ${r} is not supported by this backend`);let a=n.out?await L(e,n.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let t={...a?.path?{outPath:a.path}:{}};return Ra(r,await i.call(e.backend,b(e,n),t),await a?.publish())}catch(e){throw await a?.cleanup?.(),e}};function Na(e,t){let n={};t&&(n.outPath=t);let r=Pa(e.fps);r!==void 0&&(n.fps=r);let i=Fa(e.quality);return i!==void 0&&(n.quality=i),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function Pa(e){return e===void 0?void 0:x(e,`fps`,1,60)}function Fa(e){if(e===void 0)return;let n=We(e);if(n===void 0)throw new t(`INVALID_ARGS`,`quality must be one of: medium, high (legacy numeric values 5-10 are accepted)`);return n}function Ia(e,n){if(e===`start`||e===`stop`)return e;throw new t(`INVALID_ARGS`,`${n} action must be start or stop`)}function La(e,t,n){return{...typeof t.path==`string`?{path:t.path}:{},...typeof t.telemetryPath==`string`?{telemetryPath:t.telemetryPath}:{},...typeof t.warning==`string`?{warning:t.warning}:{},...za(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function Ra(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...za(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function za(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...w(e===`start`?r.startMessage:r.stopMessage)}}const Ba={record:ja,trace:Ma},Va=async(e,n={})=>{if(!e.backend.pressBack)throw new t(`UNSUPPORTED_OPERATION`,`system.back is not supported by this backend`);let r=n.mode??`in-app`;if(r!==`in-app`&&r!==`system`)throw new t(`INVALID_ARGS`,`system.back mode must be in-app or system`);let i=C(await e.backend.pressBack(b(e,n),{mode:r}));return{kind:`systemBack`,mode:r,...i?{backendResult:i}:{},...w(`Back`)}},Ha=async(e,n={})=>{if(!e.backend.pressHome)throw new t(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let r=C(await e.backend.pressHome(b(e,n)));return{kind:`systemHome`,...r?{backendResult:r}:{},...w(`Home`)}},Ua=async(e,n)=>{if(!e.backend.pressTvRemote)throw new t(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let r=Ke(n.button),i=n.durationMs===void 0?void 0:x(n.durationMs,`durationMs`,0,1e4),a=C(await e.backend.pressTvRemote(b(e,n),{button:r,...i===void 0?{}:{durationMs:i}}));return{kind:`tvRemotePressed`,button:r,...i===void 0?{}:{durationMs:i},...a?{backendResult:a}:{},...w(`Pressed TV remote ${r}`)}},Wa=async(e,n)=>{if(!e.backend.setOrientation)throw new t(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let r=Xa(n.orientation),i=C(await e.backend.setOrientation(b(e,n),r));return{kind:`systemOrientationSet`,orientation:r,...i?{backendResult:i}:{},...w(`Rotated to ${r}`)}},Ga=async(e,n={})=>{if(!e.backend.setKeyboard)throw new t(`UNSUPPORTED_OPERATION`,`system.keyboard is not supported by this backend`);let r=n.action??`status`;if(!qe(r))throw new t(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let i=await e.backend.setKeyboard(b(e,n),{action:r}),a=C(i),o=ao(i)?i:{};return r===`enter`||r===`return`?Qa(o,a):r===`dismiss`?$a(r,o,a):to(r,o,a)},Ka=async(e,n)=>{if(n.action===`read`){if(!e.backend.getClipboard)throw new t(`UNSUPPORTED_OPERATION`,`system.clipboard read is not supported by this backend`);let r=await e.backend.getClipboard(b(e,n));return{kind:`clipboardText`,action:`read`,text:typeof r==`string`?r:r.text}}if(n.action!==`write`)throw new t(`INVALID_ARGS`,`system.clipboard action must be read or write`);if(!e.backend.setClipboard)throw new t(`UNSUPPORTED_OPERATION`,`system.clipboard write is not supported by this backend`);if(typeof n.text!=`string`)throw new t(`INVALID_ARGS`,`system.clipboard write requires text`);let r=C(await e.backend.setClipboard(b(e,n),n.text));return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(n.text).length,...r?{backendResult:r}:{},...w(`Clipboard updated`)}},qa=async(e,n={})=>{if(!e.backend.openSettings)throw new t(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let r=G(n.target,`target`),i=C(await e.backend.openSettings(b(e,n),r));return{kind:`settingsOpened`,...r?{target:r}:{},...i?{backendResult:i}:{},...w(r?`Opened settings: ${r}`:`Opened settings`)}},Ja=async(e,n={})=>{if(!e.backend.handleAlert)throw new t(`UNSUPPORTED_OPERATION`,`system.alert is not supported by this backend`);let r=n.action??`get`;if(r!==`get`&&r!==`accept`&&r!==`dismiss`&&r!==`wait`)throw new t(`INVALID_ARGS`,`system.alert action must be get, accept, dismiss, or wait`);let i=n.timeoutMs===void 0?void 0:x(n.timeoutMs,`timeoutMs`,0,12e4);return Za(r,await e.backend.handleAlert(b(e,n),r,{timeoutMs:i}))},Ya=async(e,n={})=>{if(!e.backend.openAppSwitcher)throw new t(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let r=C(await e.backend.openAppSwitcher(b(e,n)));return{kind:`appSwitcherOpened`,...r?{backendResult:r}:{},...w(`Opened app switcher`)}};function Xa(e){switch(e){case`portrait`:case`portrait-upside-down`:case`landscape-left`:case`landscape-right`:return e;default:throw new t(`INVALID_ARGS`,`system.orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right`)}}function Za(e,t){return e===`get`?no(t):e===`wait`?ro(t):io(e,t)}function Qa(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...w(`Keyboard enter pressed`)}}function $a(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...w(eo(t))}}function eo(e){return e.dismissed===!1?`Keyboard already hidden`:e.mechanism===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`}function to(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function no(e){if(e.kind!==`alertStatus`)throw new t(`COMMAND_FAILED`,`system.alert get returned an invalid backend result`);return{kind:`alertStatus`,action:`get`,alert:e.alert}}function ro(e){if(e.kind!==`alertWait`)throw new t(`COMMAND_FAILED`,`system.alert wait returned an invalid backend result`);return{kind:`alertWait`,action:`wait`,alert:e.alert,...e.waitedMs===void 0?{}:{waitedMs:e.waitedMs},...e.timedOut===void 0?{}:{timedOut:e.timedOut},...w(e.alert?`Alert visible`:`Alert wait timed out`)}}function io(e,n){if(n.kind!==`alertHandled`)throw new t(`COMMAND_FAILED`,`system.alert ${e} returned an invalid backend result`);return{kind:`alertHandled`,action:e,handled:n.handled,...n.alert?{alert:n.alert}:{},...n.button?{button:n.button}:{},...w(n.handled?`Alert ${e}ed`:`No alert handled`)}}function ao(e){return!!(e&&typeof e==`object`)}const oo={back:Va,home:Ha,orientation:Wa,keyboard:Ga,clipboard:Ka,settings:qa,alert:Ja,appSwitcher:Ya,tvRemote:Ua};function so(e){return{capture:y(Or,e),selectors:Si(e),interactions:Ci(e),system:y(oo,e),apps:ta(e),admin:y(ea,e),recording:y(Ba,e),observability:y(Aa,e)}}var co=e({createAgentDevice:()=>lo,createMemorySessionStore:()=>uo,localCommandPolicy:()=>po,restrictedCommandPolicy:()=>mo});function lo(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??uo(),policy:e.policy??mo(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...so(t)}}function uo(e=[]){let t=new Map(e.map(e=>[e.name,$(e)]));return{get:e=>$(t.get(e)),set:e=>{t.set(e.name,$(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>$(e))}}function $(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:fo(e.metadata)}:{}}}function fo(e){try{return structuredClone(e)}catch{return{...e}}}function po(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function mo(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}export{ar as a,ut as c,D as d,Et as f,jr as i,dt as l,po as n,Qn as o,co as r,Wt as s,lo as t,ft as u};
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{E as t,b as n,d as r,f as i,m as a,u as o,v as s,y as c}from"./sdk-contracts.js";import{m as l}from"./capture.js";import{r as u,t as d}from"./snapshot-capture-annotations.js";import{f,l as p,n as m}from"./android-input-ownership.js";import{Bn as h,Cn as g,Dr as _,Er as v,Fn as y,Gn as ee,Hn as b,In as te,Lr as ne,Mn as re,Nn as ie,Nr as ae,On as oe,Or as se,Pn as ce,Pr as le,Sn as ue,Tn as de,Tr as fe,Un as pe,Vn as me,Vr as he,_n as ge,an as _e,bn as ve,cr as ye,gn as be,gr as xe,hn as x,jr as S,kr as Se,lr as Ce,rr as we,ur as Te,xr as C,yn as Ee,zn as De}from"./sdk-batch.js";import{n as Oe}from"./snapshot-scope.js";import{r as ke}from"./recording-export-quality.js";import"./scroll-gesture.js";import{n as w}from"./success-text.js";import{a as Ae,c as je,d as Me,f as Ne,i as Pe,l as Fe,n as Ie,o as Le,r as Re,t as ze,u as Be}from"./app-inventory-contract.js";import{n as Ve,t as He}from"./mobile-snapshot-semantics.js";import{a as Ue,i as We,o as Ge,r as Ke}from"./scroll-command.js";import{n as qe,r as Je}from"./app-inventory.js";import{a as Ye,n as Xe,o as Ze,t as Qe}from"./react-native-overlay.js";import{r as $e}from"./tv-remote.js";import{i as T,n as E,t as et}from"./rect-center.js";import{a as tt,n as nt,t as rt}from"./gesture-plan.js";import{n as it,o as at,r as ot}from"./android-system-chrome.js";import{t as st}from"./keyboard-actions.js";import{a as ct}from"./png-worker-contract.js";import{a as lt,c as ut,l as dt,n as ft,s as pt,t as mt}from"./snapshot-quality-verdict.js";import{n as ht}from"./ios-snapshot-acquisition.js";import gt from"node:path";import{promises as D}from"node:fs";import{createHash as _t}from"node:crypto";function vt(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function yt(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=b(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function bt(e,t,n,r){return e.filter(e=>{if(!me(b(e),n))return!1;let i=yt(e,t,Math.max(r.length,1));return!i.broken&&h(i.chain,r)})}const xt=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,St=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],Ct=new Set([`x`,`×`,`✕`,`✖`,`⨯`]);function wt(e){if(Tt(e).detected)return[`Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.`,`Run: agent-device react-native dismiss-overlay`,`The command verifies the overlay is gone. Run agent-device snapshot -i afterward only when you need fresh refs for the next action.`].join(`
|
|
2
|
+
`)}function Tt(e){let t=Et(e),n=t.detected?Dt(t):null;return{detected:t.detected,dismissNodes:t.dismissNodes,minimizeNodes:t.minimizeNodes,collapsedNodes:t.collapsedNodes,primaryAction:n}}function Et(e){let t=e.map(Ot).join(`
|
|
3
|
+
`).toLowerCase(),n=Vt(e,Ft),r=Vt(e,Ze),i=Vt(e,Xe,zt),a=Vt(e,Pt),o=At(t),s=jt(t);return{dismissNodes:n,minimizeNodes:r,collapsedNodes:i,detected:Nt({text:t,hasReactNativeStackFrame:o,hasOverlayControl:Mt(t,n,r),hasControllessRedBoxText:s,collapsedNodes:i,openDebuggerWarningNodes:a})}}function Dt(e){let t=Ht(e.dismissNodes);if(t)return Gt(t,Kt(t));let n=qt(e.collapsedNodes.filter(Bt));return n?.rect?{action:`close-collapsed-banner`,point:Qt(n),rect:n.rect,ref:n.ref,label:en(n)}:null}function Ot(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function kt(e){return xt.test(e)}function At(e){return St.some(t=>t.test(e))}function jt(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function Mt(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function Nt(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(kt(e.text)||e.hasReactNativeStackFrame)}function Pt(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function Ft(e){return Ye(e)||It(e)||Lt(e)}function It(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function Lt(e){return Ct.has(e)}function Rt(e){return/^!,\s+/.test(e)}function zt(e){return!e.rect||e.rect.height<=180}function Bt(e){let t=en(e)?.trim().toLowerCase()??``;return(Pt(t)||Rt(t))&&Qe(e)}function Vt(e,t,n=()=>!0){let r=[];for(let i of e)i.ref&&n(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&r.push(i);return r}function Ht(e){return Jt(e,Wt)}function Ut(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function Wt(e){return[Xt(Ut(e)),Xt(e.hittable),-(e.rect?he(e.rect):1/0)]}function Gt(e,t){if(!e.rect)throw Error(`React Native overlay target node must have rect`);return{action:t,point:r(e.rect),rect:e.rect,ref:e.ref,label:en(e)}}function Kt(e){let t=en(e)?.trim().toLowerCase();return t&&Ye(t)?`dismiss`:`close`}function qt(e){return Jt(e,Yt)}function Jt(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>Zt(t(n),t(e)))[0]??null}function Yt(e){return[Xt(e.hittable),e.rect?.width??0,e.rect?.y??0]}function Xt(e){return+(e===!0)}function Zt(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function Qt(e){if(!e.rect)throw Error(`Collapsed React Native warning node must have rect`);let t=Math.min(e.rect.height,52),n=Math.min(36,Math.max(18,t*.45));return{x:Math.round($t(e.rect.x+e.rect.width-n,e.rect.x+1,e.rect.x+e.rect.width-1)),y:Math.round(e.rect.y+t/2)}}function $t(e,t,n){return Math.min(n,Math.max(t,e))}function en(e){return e.label??e.value??e.identifier}const tn=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),nn={strippedIndexes:new Set,refs:new Set};function rn(e){let t=new Set(e.filter(e=>S(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return nn;let n=new Map(e.map(e=>[e.index,e])),r=ln(e,n,t),i=new Set(r),a=_n(e,n,r);for(let t of ln(e,n,a))i.add(t);for(let o of an(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function an(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=sn(t,n,r);if(o.size===0)return a;let s=cn(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&on(n,t,o)&&a.add(n.index);return a}function on(e,t,n){if(!e.rect)return!1;let r=vn(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function sn(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=vn(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function cn(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function ln(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)yn(i,t,n)&&r.add(i.index);return r}function un(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(it(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(ot(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function dn(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(m).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:fn(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?nn:{strippedIndexes:o,refs:s}}function fn(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&un(e,t)).map(e=>e.index))}function pn(e,t){let n=rn(e),r=dn(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function mn(e,t){let{strippedIndexes:n}=pn(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function hn(e,t){return pn(e,t).refs}function gn(e){return rn(e).refs}function _n(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||S(n.type??``)!==`keyboard`)continue;let i=vn(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>tn.has(S(e.type??``))&&!n.has(e.index)&&yn(e,t,a))&&r.delete(i)}return r}function vn(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(S(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function yn(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function O(e,t,n,r){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>r)throw new c(`INVALID_ARGS`,`${t} must be an integer between ${n} and ${r}`);return e}function bn(e,t,n){let r=Number(e[0]),i=Number(e[1]);if(Number.isNaN(r)||Number.isNaN(i))throw new c(`INVALID_ARGS`,t,n);return{x:r,y:i}}function k(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function A(e){return e&&typeof e==`object`?e:void 0}const xn=[0,187,255,255];function Sn(e,t){for(let n of t)n.rect.width<4||n.rect.height<4||Cn(e,n.rect)}function Cn(e,t){let n=wn(t);if(n==null)return;let r=En(n.x,0,e.width-1),i=En(n.y,0,e.height-1),a=En(n.right,0,e.width-1),o=En(n.bottom,0,e.height-1);for(let t=0;t<2;t+=1){for(let n=r;n<=a;n+=1)Tn(e,n,i+t,xn),Tn(e,n,o-t,xn);for(let n=i;n<=o;n+=1)Tn(e,r+t,n,xn),Tn(e,a-t,n,xn)}}function wn(e){let t=e.x+e.width-1,n=e.y+e.height-1;return[e.x,e.y,e.width,e.height,t,n].every(Number.isFinite)?{x:e.x,y:e.y,right:t,bottom:n}:null}function Tn(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let i=(n*e.width+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function En(e,t,n){return Number.isFinite(e)?Math.min(Math.max(e,t),n):t}function Dn(e){return e}function On(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),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}const kn=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function An(e){let{mask:t,width:n,height:r,hooks:i}=e,a=new Uint8Array(t.length),o=new Int32Array(t.length),s=[];for(let e=0;e<t.length;e+=1){if(!Nn(t,a,e))continue;let c=0,l=Mn(o,a,0,e),u=i.create(e);for(;c<l;){let e=o[c];c+=1,i.visit(u,e),l=jn({mask:t,visited:a,queue:o,queueEnd:l,width:n,height:r,pixelIndex:e})}s.push(u)}return s}function jn(e){let{mask:t,visited:n,queue:r,width:i,height:a,pixelIndex:o}=e,s=o%i,c=Math.floor(o/i),l=e.queueEnd;for(let e of kn){let o=s+e.x,u=c+e.y;if(!Pn(o,u,i,a))continue;let d=u*i+o;Nn(t,n,d)&&(l=Mn(r,n,l,d))}return l}function Mn(e,t,n,r){return t[r]=1,e[n]=r,n+1}function Nn(e,t,n){return e[n]===1&&t[n]!==1}function Pn(e,t,n,r){return e>=0&&e<n&&t>=0&&t<r}function Fn(e,t){return e.flatMap(e=>In(e,t.baseline.width,t.baseline.height)?Ln(e,t,Un(t.baseline.height)):[e])}function In(e,t,n){let r=e.maxX-e.minX+1;return e.maxY-e.minY+1>=Hn(n)&&r>=t*.35}function Ln(e,t,n){let r=Vn(e,Bn(zn(Rn(e,t.diffMask,t.baseline.width)),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),n);if(r.length<=1)return[e];let i=r.map(([n,r])=>Wn(e,n,r,t)).filter(e=>e!==null);return i.length>1?i:[e]}function Rn(e,t,n){let r=[];for(let i=e.minY;i<=e.maxY;i+=1){let a=0;for(let r=e.minX;r<=e.maxX;r+=1)t[i*n+r]===1&&(a+=1);r.push(a)}return r}function zn(e){return e.map((t,n)=>{let r=0,i=0,a=Math.max(0,n-3),o=Math.min(e.length-1,n+3);for(let t=a;t<=o;t+=1)r+=e[t],i+=1;return Math.round(r/i)})}function Bn(e,t){let n=[],r=null;for(let i=0;i<e.length;i+=1){if(e[i]<=t){r??=i;continue}r!==null&&(i-r>=6&&n.push([r,i-1]),r=null)}return r!==null&&e.length-r>=6&&n.push([r,e.length-1]),n}function Vn(e,t,n){let r=[],i=e.minY;for(let[a,o]of t){let t=e.minY+Math.round((a+o)/2);t-i+1<n||e.maxY-t<n||(r.push([i,t]),i=t+1)}return r.push([i,e.maxY]),r}function Hn(e){return Math.max(48,Math.round(e*.07))}function Un(e){return Math.max(24,Math.round(e*.03))}function Wn(e,t,n,r){let i=null;for(let a=t;a<=n;a+=1)for(let t=e.minX;t<=e.maxX;t+=1){let e=a*r.baseline.width+t;r.diffMask[e]===1&&(i??=Gn(t,a),Kn(i,e,t,a,r.baseline,r.current))}return i}function Gn(e,t){return{minX:e,minY:t,maxX:e,maxY:t,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Kn(e,t,n,r,i,a){let o=t*4;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=i.data[o],e.baselineGreen+=i.data[o+1],e.baselineBlue+=i.data[o+2],e.currentRed+=a.data[o],e.currentGreen+=a.data[o+1],e.currentBlue+=a.data[o+2]}const qn=2.5;function Jn(e){let t=Yn(e);return Fn(t.length<=2e3?Qn(t,12):t,e).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(n!==0)return n;let r=e.minY-t.minY;return r===0?e.minX-t.minX:r}).slice(0,8).map((t,n)=>tr(t,n+1,{width:e.baseline.width,height:e.baseline.height,totalPixels:e.totalPixels,differentPixels:e.differentPixels}))}function Yn(e){let{diffMask:t,baseline:n,current:r}=e,{width:i,height:a}=n;return An({mask:t,width:i,height:a,hooks:{create:e=>Xn(e,i),visit:(e,t)=>Zn(e,t,i,n,r)}})}function Xn(e,t){let n=e%t,r=Math.floor(e/t);return{minX:n,minY:r,maxX:n,maxY:r,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}}function Zn(e,t,n,r,i){let a=t%n,o=Math.floor(t/n),s=t*4;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}function Qn(e,t){let n=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return n===0?e.minX-t.minX:n})){let e=n.find(e=>$n(e,r,t));if(!e){n.push({...r});continue}er(e,r)}return n}function $n(e,t,n){return e.minX-n<=t.maxX&&t.minX-n<=e.maxX&&e.minY-n<=t.maxY&&t.minY-n<=e.maxY}function er(e,t){e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e.differentPixels+=t.differentPixels,e.baselineRed+=t.baselineRed,e.baselineGreen+=t.baselineGreen,e.baselineBlue+=t.baselineBlue,e.currentRed+=t.currentRed,e.currentGreen+=t.currentGreen,e.currentBlue+=t.currentBlue}function tr(e,t,n){let r={x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1},i={x:Math.round(e.minX+r.width/2),y:Math.round(e.minY+r.height/2)},a=nr(e.baselineRed,e.baselineGreen,e.baselineBlue,e.differentPixels),o=nr(e.currentRed,e.currentGreen,e.currentBlue,e.differentPixels),s=r.width*r.height;return{index:t,rect:r,normalizedRect:Dn({x:j(r.x/n.width),y:j(r.y/n.height),width:j(r.width/n.width),height:j(r.height/n.height)}),differentPixels:e.differentPixels,shareOfDiffPercentage:j(e.differentPixels/n.differentPixels),densityPercentage:j(e.differentPixels/s),shape:ar(r,n.width,n.height),size:or(s,n.totalPixels),location:rr(i,n.width,n.height),averageBaselineColorHex:cr(a),averageCurrentColorHex:cr(o),baselineLuminance:Math.round(sr(a)),currentLuminance:Math.round(sr(o)),dominantChange:ir(a,o)}}function nr(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function rr(e,t,n){let r=e.x<t/3?`left`:e.x>t*2/3?`right`:`center`,i=e.y<n/3?`top`:e.y>n*2/3?`bottom`:`middle`;return r===`center`&&i===`middle`?`center`:`${i}-${r}`}function ir(e,t){let n=sr(t)-sr(e);return Math.abs(n)>=12?n>0?`brighter`:`darker`:Math.max(Math.abs(t.r-e.r),Math.abs(t.g-e.g),Math.abs(t.b-e.b))>=12?`color-shift`:`mixed`}function ar(e,t,n){return e.width>=t*.55&&e.height>=n*.12?`large-area`:e.width>=e.height*qn?`horizontal-band`:e.height>=e.width*qn?`vertical-band`:`compact`}function or(e,t){let n=e/t;return n>=.04?`large`:n>=.01?`medium`:`small`}function sr(e){return e.r*.2126+e.g*.7152+e.b*.0722}function cr(e){return`#${lr(e.r)}${lr(e.g)}${lr(e.b)}`}function lr(e){return e.toString(16).padStart(2,`0`)}function j(e){return Math.round(e*100*100)/100}const ur=255*Math.sqrt(3);async function dr(e,t,n={}){await fr(e,`Baseline image not found`),await fr(t,`Current screenshot not found`);let r=n.outputPath,[i,a]=await Promise.all([D.readFile(e),D.readFile(t)]),[o,s]=await Promise.all([ut(i,`baseline screenshot`),ut(a,`current screenshot`)]);pr(o.width,o.height,`baseline screenshot`,n.maxPixels),pr(s.width,s.height,`current screenshot`,n.maxPixels);let c=n.threshold??.1;if(o.width!==s.width||o.height!==s.height){let e=o.width*o.height;return await mr(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:o.width,height:o.height},actual:{width:s.width,height:s.height}}}}let l=o.width*o.height,u=c*ur,{diffData:d,diffMask:f,differentPixels:p}=await pt({baselineData:o.data,currentData:s.data,width:o.width,height:o.height,maxColorDistance:u}),m=p>0?Jn({diffMask:f,baseline:o,current:s,totalPixels:l,differentPixels:p}):[];if(p>0&&r){let e=new ct.PNG({width:o.width,height:o.height});e.data=d,Sn(e,m),await D.mkdir(gt.dirname(r),{recursive:!0}),await D.writeFile(r,await dt(e))}else await mr(n.outputPath);let h=l>0?Math.round(p/l*100*100)/100:0;return{...p>0&&r?{diffPath:r}:{},...m.length>0?{regions:m}:{},totalPixels:l,differentPixels:p,mismatchPercentage:h,match:p===0}}async function fr(e,t){try{await D.access(e)}catch{throw new c(`INVALID_ARGS`,`${t}: ${e}`)}}function pr(e,t,n,r){if(r==null||r<=0)return;let i=e*t;if(!(i<=r))throw new c(`INVALID_ARGS`,`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function mr(e){if(e)try{await D.unlink(e)}catch(e){if(!hr(e,`ENOENT`))throw e}}function hr(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function gr(e,t){return e.map(e=>{let n=_r(e,t);return n.length>0?{...e,currentOverlayMatches:n}:e})}function _r(e,t){let n=he(e.rect);return t.map(t=>{let r=t.overlayRect,i=On(e.rect,r);return i<=0?null:{ref:t.ref,...t.label?{label:t.label}:{},rect:r,overlayCoveragePercentage:vr(i/he(r)),regionCoveragePercentage:vr(i/n)}}).filter(e=>e!==null).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return n===0?t.overlayCoveragePercentage-e.overlayCoveragePercentage:n}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage}))}function vr(e){return Math.round(e*100*100)/100}async function yr(e,t,r){if(t.kind===`path`&&!e.policy.allowLocalInputPaths)throw new c(`INVALID_ARGS`,`Local ${r.field??`input`} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,r)}catch(e){throw n(e)}}async function M(e,t,r){if(t?.kind===`path`&&!e.policy.allowLocalOutputPaths)throw new c(`INVALID_ARGS`,`Local output paths are not allowed by command policy`);try{return await e.artifacts.reserveOutput(t,{...r,visibility:r.visibility??`client-visible`,requestedClientPath:t?.kind===`downloadableArtifact`?t.clientPath??r.requestedClientPath:r.requestedClientPath})}catch(e){throw n(e)}}async function br(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw n(e)}}const xr=async(e,t)=>{if(!t.baseline)throw new c(`INVALID_ARGS`,`diff screenshot requires a baseline image`);let n=Sr(t.threshold),r=t.current??{kind:`live`};if(t.overlayRefs&&!Ar(r))throw new c(`INVALID_ARGS`,`diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs`);let i=await yr(e,t.baseline,{usage:`diff screenshot baseline`,field:`baseline`}),a,o,s,l=[];try{let c;Ar(r)?(o=await Cr(e,t),c=o.path):(a=await yr(e,r,{usage:`diff screenshot current`,field:`current`}),c=a.path),s=t.out?await M(e,t.out,{field:`diffPath`,ext:`.png`,artifactType:`screenshot-diff`}):void 0;let u=await dr(i.path,c,{threshold:n,outputPath:s?.path,maxPixels:e.policy.maxImagePixels});Ar(r)&&(u=await wr(e,t,s?.path,u,l));let d=u.diffPath?await s?.publish():void 0;return d&&l.push(d),u.diffPath||await s?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await s?.cleanup?.(),e}finally{await i.cleanup?.(),await a?.cleanup?.(),await o?.cleanup?.()}};function Sr(e){if(e==null||e===``)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new c(`INVALID_ARGS`,`--threshold must be a number between 0 and 1`);return t}async function Cr(e,t){let n=await br(e,{prefix:`agent-device-diff-current`,ext:`.png`});try{await Tr(e,t,n.path,Er(t))}catch(e){throw await n.cleanup(),e}return n}async function wr(e,t,n,r,i){if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await kr(n),r;let a=await M(e,Dr(t,n),{field:`currentOverlayPath`,ext:`.png`,artifactType:`screenshot`});try{let n=await Tr(e,t,a.path,{overlayRefs:!0,...Er(t)}),o=await a.publish();return o&&i.push(o),{...r,currentOverlayPath:n.path??a.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:gr(r.regions,n.overlayRefs)}:{}}}catch(e){throw await a.cleanup?.(),e}}async function Tr(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new c(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function Er(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function Dr(e,t){if(e.currentOverlayOut)return e.currentOverlayOut;if(e.out?.kind===`path`)return{kind:`path`,path:Or(t??e.out.path)};if(e.out?.kind===`downloadableArtifact`)return{kind:`downloadableArtifact`,...e.out.clientPath?{clientPath:Or(e.out.clientPath)}:{},...e.out.fileName?{fileName:Or(e.out.fileName)}:{}}}function Or(e){let t=gt.extname(e);return`${t?e.slice(0,-t.length):e}.current-overlay${t||`.png`}`}async function kr(e){try{await D.unlink(Or(e))}catch(e){if(!jr(e,`ENOENT`))throw e}}function Ar(e){return e.kind===`live`}function jr(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}const Mr=async(e,t)=>{if(!e.backend.captureScreenshot)throw new c(`UNSUPPORTED_OPERATION`,`screenshot is not supported by this backend`);l(t);let n=await M(e,t.out,{field:`path`,ext:`.png`,artifactType:`screenshot`}),r;try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,pixelDensity:t.pixelDensity,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),t.scale!==void 0&&await lt(n.path,t.scale),r=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...r?{artifacts:[r]}:{},...w(`Saved screenshot: ${n.path}`)}};function Nr(e,t){let n=Be(e.type??`Element`),r=Fe(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o,e.actions?JSON.stringify(e.actions):``].join(`|`)}function Pr(e,t,n={}){let r=Lr(Ir(e,n),Ir(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Fr(e,t={}){return Ir(e,t).length}function Ir(e,t){return t.flatten?e.map(e=>({text:Me(e,0,!1),comparable:Nr(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):je(e).map(e=>({text:e.text,comparable:Nr(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Lr(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=zr(a,i,s)?N(a,i+1):N(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return Rr(o,e,t,n,r)}}return[]}function Rr(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=zr(i,c,r)?c+1:c-1,u=N(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function zr(e,t,n){return t===-n||t!==n&&N(e,t-1)<N(e,t+1)}function N(e,t){return e.get(t)??0}function Br(e,t){return[...Ur(e),...Vr(e),...Gr(e),...Kr(e,t)]}function Vr(e){let t=e.customActions;if(!t)return[];let n=[];return t.blocked?n.push(`Custom actions were not read: an earlier accessibility read is still hung, so this capture skipped the read pass instead of queueing behind it. No element’s actions list is authoritative here. Reads resume once that call returns.`):t.read<t.candidates&&n.push(`Custom actions were read for ${t.read} of ${t.candidates} merged elements, on-screen ones first; the remaining ${t.candidates-t.read} were not read, so an absent actions list on those is not evidence that they have none. Scroll them into view and re-run to read them.`),t.truncated>0&&n.push(`${t.truncated} element(s) published more custom actions than are shown; those lists are clipped to the first 8 names, and long names are shortened.`),n}function Hr(e){return`Detected an overly complex or slow accessibility tree. Fell back to the ${e} snapshot backend. It is OK to continue; use --json to inspect snapshotQuality.reason if you need recovery details.`}function Ur(e){return e.state===`recovered`?e.reasonCode===`deferred`||e.reasonCode===`requested-backend`?[]:e.reasonCode===`presentation-failed`?[`Agent Device could not safely present the captured accessibility tree and fell back to the ${e.backend} snapshot backend. This is an Agent Device runner bug, not an app accessibility-tree issue. Use screenshot as visual truth and report snapshotQuality.reason with the screenshot.`]:[Hr(e.backend)]:e.state===`sparse`?[`No snapshot backend could read this screen`+(e.reason?` (${e.reason})`:``)+`. Its refs and selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`,...Wr(e)]:[]}function Wr(e){return e.reasonCode===`sparse-tree`?[`This screen publishes no accessibility content at all; assistive technologies see the same empty tree, so it is worth flagging as an app accessibility bug rather than only an automation limitation.`]:[]}function Gr(e){return e.effectiveDepth===void 0?[]:[`Some deeper accessibility nodes were omitted; this tree is capped at depth ${e.effectiveDepth}. Re-run with --depth ${e.effectiveDepth} --scope <container> only if you need deeper content.`]}function Kr(e,t){let n=[];for(let r of e.collapsedLeafIndexes??[]){let e=t.find(e=>e.index===r);if(!e)continue;let i=e.identifier?` (${e.identifier})`:``;n.push(`@${e.ref} [${e.type??`element`}]${i} merges many labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`)}return n}function qr(e){let{nodes:t,backend:n,snapshotRaw:r}=e;if(r||!s(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let i=He(t),a=new Set;return i.hiddenCount>0&&a.add(`offscreen-nodes`),i.nodes.some(e=>e.hiddenContentAbove)&&a.add(`scroll-hidden-above`),i.nodes.some(e=>e.hiddenContentBelow)&&a.add(`scroll-hidden-below`),{partial:a.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:t.length,reasons:[...a]}}const Jr=`A system surface (notification shade, quick settings, or another system overlay) covers the app, so this snapshot shows that surface. Interact with it or dismiss it (press back or swipe up) to reach app content.`;function Yr(e){return e?.systemSurfaceOnly===!0?Jr:void 0}function P(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function F(e){return e.clock?.now()??Date.now()}async function Xr(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Zr(e,t){return e.presentationKey?e:{...e,presentationKey:o(t)}}function Qr(e){let{previous:t,current:n,options:r,identity:i}=e;if(r.forceFull===!0||r.raw===!0||!t||t.comparisonSafe===!1||n.comparisonSafe===!1||!$r(t,n,i)||!t.presentationKey||t.presentationKey!==n.presentationKey||!ei(t,n))return;let a=r.scope?.trim();return{ageMs:Math.max(0,n.createdAt-t.createdAt),nodeCount:n.nodes.length,...r.interactiveOnly===!0?{interactiveOnly:!0}:{},...a?{scope:a}:{}}}function $r(e,t,n){return!(e.backend&&t.backend&&e.backend!==t.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)}function ei(e,t){return e.truncated===t.truncated&&JSON.stringify(ti(e.nodes))===JSON.stringify(ti(t.nodes))}function ti(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints,actions:e.actions}))}const ni=async(e,t)=>{let n=await ii(e,t),r=Qr({previous:n.session?.snapshot,current:n.snapshot,options:t,identity:{previousAppBundleId:n.session?.appBundleId,currentAppBundleId:n.result.appBundleId??n.session?.appBundleId}});await e.sessions.set(oi(t.session,n));let i=ci(n.snapshot);return f(n.snapshot,{nodes:n.snapshot.nodes,...i===void 0?{}:{truncated:i},visibility:qr({nodes:n.snapshot.nodes,backend:n.snapshot.backend,snapshotRaw:t.raw}),...d({...n.annotations,warnings:n.warnings}),...r?{unchanged:r}:{},...n.result.snapshotDiagnostics?{snapshotDiagnostics:n.result.snapshotDiagnostics}:{},...si(n)})},ri=async(e,t)=>{let n=await ii(e,t),r=t.interactiveOnly===!0,i=n.session?.snapshot,a=oi(t.session,n);if(!i){let t=Fr(n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=Pr(i.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(a),{mode:`snapshot`,baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function ii(e,t){if(!e.backend.captureSnapshot)throw new c(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let n=t.session??`default`,r=await e.sessions.get(n),i=await e.backend.captureSnapshot({session:n,requestId:t.requestId,appId:r?.appId,appBundleId:r?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw,customActions:t.customActions}),a=ai(i,e),o=f(a,Zr(a,t)),s=u(i),l=F(e);return{snapshot:o,result:i,session:r,annotations:s,warnings:li({result:i,annotations:s,snapshot:o,options:t,session:r,capturedAt:o.createdAt??l,runtimeNow:l})}}function ai(e,t){return e.snapshot?e.snapshot:{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,createdAt:F(t)}}function oi(e,t){let n=t.session?.name??e??`default`;return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function si(e){let t=e.result.appName??e.session?.appName,n=e.result.appBundleId??e.session?.appBundleId;return{...t||n?{appName:t??n}:{},...n?{appBundleId:n}:{}}}function ci(e){return e.truncated===void 0?e.backend!==`xctest`||e.producer===void 0?!1:ht(e.producer)===`unavailable`&&void 0:e.truncated}function li(e){let t=[...e.annotations.warnings??[]];e.annotations.quality&&t.push(...Br(e.annotations.quality,e.snapshot.nodes)),t.push(...mi(e)),e.annotations.quality||(t.push(...di(e)),t.push(...pi(e.snapshot.nodes)));let n=wt(e.snapshot.nodes);n&&t.push(n);let r=ui(e.annotations);r&&t.push(r);let i=hi(e);return i&&t.push(i),t.push(...yi(e.annotations.freshness,e.snapshot.backend)),Array.from(new Set(t))}function ui(e){if(e.androidSnapshot?.systemSurfaceOnly===!0)return Jr}function di(e){if(e.snapshot.backend!==`xctest`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length!==1)return[];let t=e.snapshot.nodes[0];return fi(t)?e.snapshot.producer===`appium-source`?[`Appium page source exposed only the application root. Descendants may be absent from the acquired hierarchy; use snapshot --raw to inspect the source and verify the app accessibility tree.`]:e.snapshot.producer!==void 0&&e.snapshot.producer!==`apple-runner`?[]:[`iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known.`]:[]}function fi(e){return e?S(e.type??``)===`application`:!1}function pi(e){let t=new Set(e.map(e=>e.parentIndex).filter(e=>e!==void 0));return e.filter(e=>t.has(e.index)||(e.type?.toLowerCase()??``).includes(`text`)?!1:(e.label??``).split(`, `).length>10).map(e=>{let t=(e.label??``).split(`, `).length,n=e.identifier?` (${e.identifier})`:``;return`@${e.ref} [${e.type??`element`}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})}function mi(e){let t=e.annotations.analysis;if(e.snapshot.backend!==`android`||e.options.interactiveOnly!==!0||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return typeof e.options.depth==`number`&&typeof t.maxDepth==`number`&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}function hi(e){let t=e.session?.snapshot;if(!e.annotations.freshness&&t&&gi(t,e.snapshot)&&_i(t,e.capturedAt,e.runtimeNow)&&bi(t.nodes.length,e.snapshot.nodes.length))return vi}function gi(e,t){return e.presentationKey===void 0||t.presentationKey===void 0||e.presentationKey===t.presentationKey}function _i(e,t,n){return[t,n].some(t=>{let n=t-e.createdAt;return n>=0&&n<=2e3})}const vi=`Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.`;function yi(e,t){return!e?.staleAfterRetries||t!==`android`?[]:e.reason===`stuck-route`?[`Recent ${e.action} was followed by a nearly identical snapshot after ${e.retryCount} automatic retr${e.retryCount===1?`y`:`ies`}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:e.reason===`sharp-drop`?[vi]:[]}function bi(e,t){return e<12?!1:t<=Math.floor(e*.2)}const xi={screenshot:Mr,diffScreenshot:xr,snapshot:ni,diffSnapshot:ri},Si={defaultTimeoutMs:1e4,intervalMs:300},I={promotedTarget:{resolution:x.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:x.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:x.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:x.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:x.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:x.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:x.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Si},wait:{resolution:x.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:Si},readList:{resolution:x.readList,occlusion:`ignore`},findAct:{resolution:x.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`},cropTarget:{resolution:x.cropTarget,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`}},Ci=new WeakMap;function wi(e,t){Ei(e)&&Ci.set(e,t)}function Ti(e){return Ei(e)?Ci.get(e):void 0}function Ei(e){return typeof e==`object`&&!!e||typeof e==`function`}function Di(e){let t=Buffer.alloc(16);for(let n of e)ki(t,Oi(n));return{digest:`ax1:${_t(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Oi(e){return _t(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function ki(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function L(e){let{digest:t,nodeCount:n}=Di(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Ai(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Ai(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function ji(e,t,n,r){let i=n.ambiguity;if(i===`first-match`||i===`reject-candidates`){let a=ve(e,t,{...r,requireRect:n.requireRect});return!a||a.matchedNodes.length===0?{kind:`none`}:i===`first-match`?Ni(a):a.matchedNodes.length>1?Mi(a):Ni(a)}let a=ue(e,t,{...r,...be({ambiguity:i,requireRect:n.requireRect})});return a.firstMatch?a.resolution?{kind:`resolved`,resolution:a.resolution,matchedNodes:a.firstMatch.matchedNodes}:Mi(a.firstMatch):{kind:`none`}}function Mi(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Ni(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function Pi(e,t,n){let r=ve(e,xe(t),n);return r?{...r,selector:r.selector.raw}:null}function Fi(e,t,n,r){let i=ji(e,xe(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}const Ii=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function Li(e){return[e.type,e.role,e.subrole].map(e=>S(e??``)).some(e=>e===`tab`||Ii.some(t=>e.includes(t)))}function Ri(e,t){let n=t[0];if(!n)return{kind:`ambiguous`,candidates:t};let r=Qi(e);if(!zi(t,r.nodesByIndex))return{kind:`ambiguous`,candidates:t};let i=Wi(e,n,r).node;for(let n of t.slice(1))if(Wi(e,n,r).node.index!==i.index)return{kind:`ambiguous`,candidates:t};return{kind:`equivalent`,node:i}}function zi(e,t){for(let n=0;n<e.length;n+=1)for(let r=n+1;r<e.length;r+=1){let i=e[n],a=e[r];if(!Bi(i,a,t)&&!Bi(a,i,t))return!1}return!0}function Bi(e,t,n){let r=t,i=new Set;for(;r.parentIndex!==void 0&&!i.has(r.index);){if(i.add(r.index),r.parentIndex===e.index)return!0;let t=n.get(r.parentIndex);if(!t)return!1;r=t}return!1}function Vi(e,t){if(!t?.rect||!e.rect||!fe(e))return!1;let n=e.rect,r=t.rect;return n.x===r.x&&n.y===r.y&&n.width===r.width&&n.height===r.height}function Hi(e,t){return Wi(e,t)}function Ui(e){let t=Qi(e);return n=>Wi(e,n,t)}function Wi(e,t,n){return p(t)?{node:t,reason:`covered`}:Gi(e,t,n)??Ki(t)??qi(e,t,n)??{node:t,reason:`original`}}function Gi(e,t,n){let r=Yi(e,t,n);return r?.rect&&T(r.rect)?{node:r,reason:`same-rect-descendant`}:null}function Ki(e){return Li(e)&&e.rect&&T(e.rect)?{node:e,reason:`semantic-target`}:null}function qi(e,t,n){let r=Ji(e,t,n);return!r?.rect||p(r)||!T(r.rect)?null:Xi(t,r,e,n)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}}function Ji(e,t,n){if(t.hittable)return t;let r=e=>e.hittable===!0;return n?le(e,t,n.nodesByIndex,e=>r(e)?e:null):ae(e,t,r)}function Yi(e,t,n){let r=E(t.rect);if(!r)return null;let i=t,a=new Set;for(;!a.has(i.ref);){a.add(i.ref);let t=(n?n.childrenByParentIndex.get(i.index)??[]:e.filter(e=>e.parentIndex===i.index)).filter(e=>{if(!e.hittable||p(e))return!1;let t=E(e.rect);return t?et(t,r):!1});if(t.length!==1)break;i=t[0]}return i===t?null:i}function Xi(e,t,n,r){let i=E(e.rect),a=E(t.rect);if(!i||!a)return!1;if(Zi(t)&&!et(i,a))return!0;let o=v(n,i,r?.viewportRootRects);return!o||!$i(a,o)?!1:!et(i,a)}function Zi(e){let t=S(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function Qi(e){let t=new Map,n=new Map,r=[];for(let i of e){if(t.set(i.index,i),typeof i.parentIndex==`number`){let e=n.get(i.parentIndex);e?e.push(i):n.set(i.parentIndex,[i])}if(fe(i)){let e=E(i.rect);e&&r.push(e)}}return{nodesByIndex:t,childrenByParentIndex:n,viewportRootRects:r}}function $i(e,t){let n=On(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}async function R(e,t,n,r,i={}){let a=Fi(na(e,t),n,e.resolution,r);if(a.kind===`none`)return{kind:`none`};if(a.kind===`ambiguous`)return{kind:`ambiguous`,selector:a.selector,selectorIndex:a.selectorIndex,matchedNodes:a.matchedNodes};let o=a.resolution,s=await ta(e,t,o.node,i);return s.kind===`occluded`?{kind:`occluded`,node:s.node,selector:o.selector}:{kind:`target`,node:s.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:o.matches,matchedNodes:a.matchedNodes}}function ea(e,t,n,r){let i=na(e,t);return{candidates:i,list:Pi(i,n,{...r,requireRect:e.resolution.requireRect})}}async function ta(e,t,n,r={}){r.onResolved?.(n,t);let i=ra(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||p(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await ia(e,t,i.node,r)}}function na(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!p(e)):t}function ra(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=Hi(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&Vi(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function ia(e,t,n,r){if(e.offscreen!==`refuse`)return n;if(!r.offscreen)throw Error(`selector pipeline row declares an off-screen refusal but this route supplies no refusal shape`);return await r.offscreen(n,t)}function aa(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function oa(e){return e.hittable===!0||Li(e)}function sa(e,t){let n=te(b(e),t);return n.id!==void 0||n.label!==void 0?!1:ce(e.value)===null}function ca(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function la(e,t){let n=vt(t);return t.filter(t=>t.index!==e.index&&ca(t,e,n)).sort((e,t)=>e.index-t.index)}function ua(e,t){let n=T(e.rect);return!n||!t.rect?!1:ne(t.rect,n.x,n.y)}function da(e,t){if(!sa(e,t))return e;let n=la(e,t);if(n.some(oa))return e;let r=n.find(e=>b(e).label!==void 0);return!r||!ua(r,e)?e:r}function fa(e,t){return e.find(e=>Oe(e,t))??null}function z(e,t){let n=_(e);return n&&Se(n)?n:pa(e,t)}function pa(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=_(e);if(!t||!Se(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function ma(e){return e===`text`||e===`label`||e===`any`}function ha(e,t,n,r){if(!(r||e===`web`))return ma(t)?n:void 0}function ga(e){return new c(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function _a(e,t){let n=t??`default`,r=await e.sessions.get(n);if(!r)throw new c(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let i=r.refFrameSnapshot??r.snapshot;if(!i)throw new c(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:n,session:r,snapshot:i}}async function B(e,t,n={updateSession:!0}){let r=e.backend.captureSnapshot;if(!r)throw new c(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i),o=va(await r(P(e,t),{interactiveOnly:n.interactiveOnly??!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects,...n.preferredBackend?{preferredBackend:n.preferredBackend}:{},...n.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:n.includeHiddenContentHints}}),e);return(t.signal??e.signal)?.throwIfAborted(),n.updateSession&&a&&!mt(o.snapshotQuality)&&await e.sessions.set({...a,snapshot:o}),{sessionName:i,session:a,snapshot:o}}function va(e,t){return e.snapshot?ya(e.snapshot,e):{nodes:e.nodes??[],truncated:e.truncated,backend:e.backend,...e.quality?{snapshotQuality:e.quality}:{},createdAt:F(t)}}function ya(e,t){let n={...e};return t.truncated===!0||n.truncated===!0?n.truncated=!0:t.truncated!==void 0&&(n.truncated=t.truncated),t.quality&&n.snapshotQuality===void 0&&(n.snapshotQuality=t.quality),n}async function ba(e,t,n){if(e.backend.readText){let r=await e.backend.readText(P(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return Ne(n)}function xa(e,t,n){let r=a(t);if(!r)throw new c(`INVALID_ARGS`,n.invalidRefMessage);let o=i(e,r)??(n.fallbackLabel.length>0?fa(e,n.fallbackLabel):null);if(!o)throw new c(`COMMAND_FAILED`,n.notFoundMessage);return{ref:r,node:o}}function Sa(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Ca(e,t,n={}){let r=E(t.rect),i=T(r??void 0);if(!r||!i)return{kind:`invalid`};let a=wa(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?Ea(e,t):null,r),s=o?Da(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function wa(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>Ta(e,t,r)).filter(Li).flatMap(e=>{let t=E(e.rect);if(!t||et(t,n))return[];let r=Ea(t,n);return r&&r.width>0&&r.height>0?[{ref:e.ref,index:e.index,rect:r}]:[]}).sort((e,t)=>e.index-t.index)}function Ta(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`&&!r.has(i.index);){if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Ea(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),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?null:{x:n,y:r,width:i-n,height:a-r}}function Da(e,t,n,r){let i=Ma(e),a=Aa(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=Aa(t.y,t.height,n.y,r.flatMap(({rect:e})=>[e.y,e.y+e.height]),i);return a.flatMap(a=>o.flatMap(o=>{let s={x:Math.round(a),y:Math.round(o)};if(!ne(t,s.x,s.y))return[];let c=Oa(s,e,n,r,i);return c?[c]:[]})).sort(ka)[0]?.point??null}function Oa(e,t,n,r,i){let a=ja(e,t,r);return a.parentEdge<i||a.competitor<12?null:{point:e,distanceSquared:(e.x-n.x)**2+(e.y-n.y)**2,clearance:Math.min(a.parentEdge,a.competitor)}}function ka(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function Aa(e,t,n,r,i){let a=e+i,o=e+t-i;if(a>o)return[];let s=[...new Set([e,e+t,...r])].sort((e,t)=>e-t),c=new Set([n,a,o]);for(let e of r)c.add(e-12),c.add(e+12);for(let e=1;e<s.length;e+=1)c.add((s[e-1]+s[e])/2);return[...c].filter(e=>e>=a&&e<=o).sort((e,t)=>e-t)}function ja(e,t,n){let r=Math.min(e.x-t.x,t.x+t.width-e.x,e.y-t.y,t.y+t.height-e.y),i=1/0;for(let{rect:t}of n){let n=e.x<t.x?t.x-e.x:Math.max(0,e.x-(t.x+t.width)),r=e.y<t.y?t.y-e.y:Math.max(0,e.y-(t.y+t.height));i=Math.min(i,Math.max(n,r))}return{parentEdge:r,competitor:i}}function Ma(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}const V={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,runnerRestartExhausted:`wait_runner_restart_exhausted`,targetAbsent:`wait_target_absent`,targetPresent:`wait_target_present`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},Na=`replay_target_guard_mismatch`,Pa=V.landmarkIdentityMismatch;function Fa(e,t,n,r){let{candidates:i,list:a}=ea(r,e,t,{platform:n}),o=a?.matchedNodes??[];if(!a||o.length===0)return null;let s=[{selector:a.selector,matches:o.length}];if(o.length===1)return{node:o[0],selector:a.selector,selectorIndex:a.selectorIndex,matches:1,diagnostics:s};let l=Ri(i,o);if(l.kind===`ambiguous`)throw new c(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${a.selector}`,{selector:a.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>Me(e,0,!1))});return{node:l.node,selector:a.selector,selectorIndex:a.selectorIndex,matches:o.length,diagnostics:s,disambiguation:{matchCount:o.length,tiebreak:`structural-equivalence`,alternatives:o.filter(e=>e.index!==l.node.index)}}}function Ia(e,t,n,r,i){if(!n)return;let a=b(e),o=pe(e,t);if(!(De(a,n.identity)&&ee(o,n.structural)))throw new c(`COMMAND_FAILED`,`${r} resolved to a different element than replay verification isolated; the action was not sent`,{reason:Na,observed:a,observedStructural:o,expected:n.identity,expectedStructural:n.structural,...i?{targetRole:i}:{}})}async function H(e,t,n){return await ao(e,t,n.action),t.target.kind===`point`?await Ra(e,t,t.target,n):t.target.kind===`ref`?await Ha(e,t,t.target,n):await Ua(e,t,t.target,n)}async function La(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=C(i.snapshot.nodes).resolveViewport(a);if(!o)return;let s={x:n.x,y:n.y};if(!ne(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function Ra(e,t,n,r){let i=await La(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await za(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function za(e,t){try{return(await io(e,t,!0)).snapshot.nodes}catch{return}}function Ba(e,t){let n=a(e.ref);if(!n)throw new c(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let r=a(t.ref),i=t.node.ref?a(t.node.ref):null;if(r!==n||i!==n||!t.nodes.includes(t.node))throw new c(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{nodes:t.nodes,resolved:Ja(n,t.node,`exact`)}}async function Va(e,t,n){let r=await so(e,t,n);return{nodes:r.snapshot.nodes,resolved:r.resolved}}async function Ha(e,t,n,r){let{nodes:i,resolved:o}=r.preresolvedTarget?Ba(n,r.preresolvedTarget):await Va(e,t,n),s=await to({policy:r.pipeline,nodes:i,node:o.node,action:r.action,label:`Ref ${n.ref}`,hooks:{onResolved:(e,t)=>Ga(e,t,r),offscreen:async(i,a)=>await mo(e,t,i,a,n.ref,r)}});return{kind:`ref`,point:uo(s,i,{invalidMessage:`Ref ${n.ref} not found or has invalid bounds`,blockedTargetLabel:`Ref ${n.ref}`,blockedTargetDetails:{ref:`@${a(n.ref)??s.ref}`}}),target:{kind:`ref`,ref:`@${o.ref}`},...Qa(e,s,i,r.action,o.resolution)}}async function Ua(e,t,n,r){let i=n.selector,a=await io(e,t,r.requireInteractive),o=Fa(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive&&(a=await io(e,t,!1),o=Fa(a.snapshot.nodes,i,e.backend.platform,r.pipeline)),!o||!o.node.rect)throw await Wa({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let s=o,c=await to({policy:r.pipeline,nodes:a.snapshot.nodes,node:s.node,action:r.action,label:`Selector ${s.selector}`,hooks:{onResolved:(e,t)=>Ga(e,t,r),offscreen:async(n,i)=>await po(e,t,n,i,s.selector,r)}});return{kind:`selector`,point:uo(c,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}}),target:{kind:`selector`,selector:o.selector},...Qa(e,c,a.snapshot.nodes,r.action,Xa(o,a.snapshot.nodes))}}async function Wa(e){let{runtime:t,nodes:n,selectorExpression:r,action:i,resolved:a}=e,o=await R(I.coveredDiagnosis,n,r,{platform:t.backend.platform});if(o.kind===`occluded`)return no({label:`Selector ${o.selector}`,node:o.node,action:i,selector:o.selector});let s=a?.diagnostics??[];return new c(`COMMAND_FAILED`,Ee(r,s,{unique:!0}),{reason:Pe.selectorNotFound,hint:g(s)})}function Ga(e,t,n){Ia(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const Ka={source:`ref`,phase:`pre-action`,kind:`exact`},qa={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function Ja(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Ka:qa}}const Ya={source:`runtime`,phase:`pre-action`,kind:`unique`};function Xa(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:Za(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>Za(e,t))}:Ya}function Za(e,t){let n=S(e.type??``),r=z(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Sa(n,256)}:{},...r===void 0?{}:{label:Sa(r,256)}}}function Qa(e,t,n,r,i){return{node:t,selectorChain:ie(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:z(t,n),...eo(t,r),preActionNodes:n,resolution:i,...$a(e,t,n,r)}}function $a(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=da(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:ie(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:z(i,n)}}}function eo(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}async function to(e){let t=await ta(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw no({label:e.label,node:t.node,action:e.action});return t.node}function no(e){return new c(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${ro(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function ro(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;case`hover`:return`be hovered`;default:return`be tapped`}}async function io(e,t,n){if(!e.backend.captureSnapshot)throw new c(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let r=t.session??`default`,i=await e.sessions.get(r);if(!i)throw new c(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=await e.backend.captureSnapshot(P(e,t),{interactiveOnly:n,includeRects:!0}),o=a.snapshot??{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:F(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function ao(e,t,n){if(e.backend.platform!==`macos`)return;let r=await oo(e,t);if((r===`desktop`||r===`menubar`)&&(r!==`menubar`||n!==`click`&&n!==`press`))throw new c(`UNSUPPORTED_OPERATION`,`${n} is not supported on macOS ${r} sessions yet. Open an app session to act, or use the ${r} surface to inspect.`)}async function oo(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function so(e,t,n){let{session:r,snapshot:i}=await _a(e,t.session),a=n.fallbackLabel??``,o=lo(i.nodes,n.ref,{fallbackLabel:a});if(!o)throw new c(`COMMAND_FAILED`,`Ref ${n.ref} not found or has no bounds`,{hint:ge});return co({session:r,frameTree:i,target:n,fallbackLabel:a,authorized:o})}function co(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=lo(o.nodes,r.ref,{fallbackLabel:i});return s&&De(b(a.node),b(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function lo(e,t,n){let r=a(t);if(!r)throw new c(`INVALID_ARGS`,`Invalid ref: ${t}`);let o=i(e,r);if(fo(o))return Ja(r,o,`exact`);let s=n.fallbackLabel.length>0?fa(e,n.fallbackLabel):null;return fo(s)?Ja(r,s,`label-fallback`):null}function uo(e,t,n){let r=C(t),i=Ca(t,e,{bounds:[r.resolveEffectiveViewport(e),e.rect?r.resolveViewport(e.rect):null].filter(e=>e!==null)});if(i.kind===`resolved`)return i.point;throw i.kind===`invalid`?new c(`COMMAND_FAILED`,n.invalidMessage):new c(`COMMAND_FAILED`,`${n.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...n.blockedTargetDetails,competitorRefs:i.competitorRefs.slice(0,5).map(e=>`@${e}`),competitorCount:i.competitorRefs.length,hint:`Tap the specific interactive child you intend, or use a more specific selector. Every safely tappable region of the parent belongs to one of its child controls.`})}function fo(e){return e?T(e.rect)!==null:!1}async function po(e,t,n,r,i,{action:a}){return await vo(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${ho(e)} in small steps, retrying ${a} with the same selector after each (it re-resolves against a fresh snapshot). A single large scroll can overshoot the target; a short bounded gesture pan lands it more reliably. If it is inside a closed drawer or another tab, open that container first.`})}async function mo(e,t,n,r,i,{action:o}){return await vo(e,t,n,r,{message:`Ref ${i} is off-screen and not safe to ${o}`,details:{reason:`offscreen_ref`,ref:a(i)},hint:e=>`${ho(e)} in small steps (a single large scroll can overshoot; a short bounded gesture pan lands it more reliably), then retry ${o} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function ho(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function go(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||a(n.ref)===null)return{};let o=lo(i,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!o)return{};let s=I.resolvedTarget,c=await to({policy:s,nodes:i,node:o.node,action:r,label:`Ref ${n.ref}`,hooks:{offscreen:async(i,a)=>await mo(e,t,i,a,n.ref,{action:r,pipeline:s})}});return{...eo(c,r),node:c,preActionNodes:i}}async function _o(e,t,n,r,i){let a=await go(e,t,n,r),o=A(await i(P(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:Ka,...a,...o?{backendResult:o}:{}}}async function vo(e,t,n,r,i){let a=C(r),o=n.rect?a.resolveEffectiveViewport(n):null;if(!n.rect||!o||a.isVisibleOnScreen(n))return n;let s=a.resolveViewport(n.rect),l=await e.backend.confirmOffscreenTargetVisible?.(P(e,t),n,s);if(l)return{...n,rect:l};let u=Ve(n,a);throw new c(`COMMAND_FAILED`,i.message,{...i.details,rect:n.rect,viewport:o,...u?{scrollDirection:u}:{},hint:i.hint(u)})}async function yo(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0,error:e};throw e}finally{clearTimeout(c)}}function bo(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?xo(e.nodes):e.nodes).map(wo);return n.sort((e,t)=>Eo(e).localeCompare(Eo(t))),{captureBackend:t,nodes:n}}function xo(e){let t=C(e);return e.filter(e=>fe(e)||t.isVisibleOnScreen(e))}function So(e,t){return!e||e.captureBackend!==t.captureBackend||e.nodes.length!==t.nodes.length?!1:e.nodes.every((e,n)=>{let r=t.nodes[n];if(!r||e.identity!==r.identity)return!1;if(!e.rect||!r.rect)return e.rect===r.rect;let i=e.rect,a=r.rect;return[`x`,`y`,`width`,`height`].every(e=>Math.abs(Math.round(i[e])-Math.round(a[e]))<=1)})}function Co(e,t){if(!e||e.nodes.length===0||t.nodes.length===0)return!1;let n=new Map;for(let t of e.nodes)n.set(t.identity,(n.get(t.identity)??0)+1);let r=0;for(let e of t.nodes){let t=n.get(e.identity)??0;t!==0&&(r+=1,n.set(e.identity,t-1))}return r/Math.max(e.nodes.length,t.nodes.length)<.5}function wo(e){return{identity:`${e.type??``}#${To(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function To(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Eo(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Do=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Oo(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=F(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=ft(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;F(e)<o;){let c=await Fo(e,t,o-F(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:F(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=ko(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=bo(c.snapshot);_=jo({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=ft(c.snapshot.snapshotQuality);let y=F(e),ee=No({resetRequested:n.resetBudgetOnPrivateAxRecovery,alreadyReset:s,verdict:c.snapshot.snapshotQuality,nowMs:y,timeoutMs:i,deadlineMs:o});if(ee!==void 0){s=!0,o=ee,g=y,p=v,m=c.snapshot.nodes.length;let t=Po({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Xr(e,t);continue}if(!So(p,v))p=v,m=c.snapshot.nodes.length,g=y;else if(f>=2&&y-g>=_)return{settled:!0,stalled:!1,waitedMs:y-a,captures:f,nodeCount:m,lastCapture:h};let b=Po({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(b<=0)break;await Xr(e,b)}return{settled:!1,stalled:!1,waitedMs:F(e)-a,captures:f,nodeCount:m,lastCapture:h}}function ko(e,t,n){if(!e||!t||!Ao(t.backend,n))return;let r=t.nodes.some(fe),i=e.length<=5;if(!(!r&&!i))return bo({...t,nodes:e})}function Ao(e,t){return e===`xctest`||e===void 0&&t===`ios`}function jo(e){return e.requestedQuietMs<500||!Co(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function Mo(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function No(e){if(!(e.resetRequested!==!0||e.alreadyReset||!Mo(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Po(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function Fo(e,t,n,r){let i=await yo(e,t,n,async n=>await B(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Io=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,Lo=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function Ro(e,t,n){return await Bo(e,t,{...n,baselineNodes:await Uo(e,t,n.resolved),actionPoint:n.resolved.point})}const zo=async(e,t)=>(await Bo(e,t,t)).observation;async function Bo(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await Vo(e,t,n,a,await Oo(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0,broadTransitionBaselineNodes:n.baselineNodes}))}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}async function Vo(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?Lo:Io}};let{stored:o,session:s}=await ns(e,t,i.lastCapture),c=i.lastCapture.snapshot.nodes;return{observation:{...a,...i.settled&&o?Yo(n.baselineNodes,c,n.actionPoint,s?.appBundleId):{},...ts(i,o,c.length)},settledNodes:c}}function Ho(e,t){if(!e)return;let n=L(e),r=t!==void 0&&n.digest!==L(t).digest;return{...n,changedFromBefore:r}}async function Uo(e,t,n){let r=await e.sessions.get(t.session??`default`);return Wo(n,r)??Go(n)??Ko(r)}function Wo(e,t){if(e.kind===`ref`)return qo(t?.refFrameSnapshot?.nodes)}function Go(e){if(`preActionNodes`in e)return qo(e.preActionNodes)}function Ko(e){return e?.refFrameSnapshot?.nodes??e?.snapshot?.nodes??[]}function qo(e){return e?.length?e:void 0}function Jo(e,t,n){let r=Pr(mn(e,n),mn(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=es(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function Yo(e,t,n,r){let i=Jo(e,t,r);return{diff:i,...Xo(i,t,n,r)}}function Xo(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=hn(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!Zo(o.get(e),n))?{}:$o(t,i,r)}function Zo(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const Qo=new Set([`application`,`window`]);function $o(e,t,n){let r=hn(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!Qo.has(Be(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=Be(e.type??`Element`),n=Fe(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function es(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function ts(e,t,n){return e.stalled?{hint:Lo}:e.settled?t?n<5?{hint:Do}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted and its refs/selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`}:{hint:Io}}async function ns(e,t,n){if(mt(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function rs(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function is(e,t,n,r,i){let a=await as(e,t,n,i);return ss({...r,...a})}async function as(e,t,n,r){if(r.settle!==void 0){let i=await Ro(e,t,{...r.settle,resolved:n}),a=r.verify?Ho(i.settledNodes,`preActionNodes`in n?n.preActionNodes:void 0):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await os(e,t,n);return i?{evidence:i}:{}}async function os(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=L((await io(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==L(r).digest;return{...n,changedFromBefore:i}}catch{return}}function ss(e){let t=e;if(t.targetHittable!==!1||!cs(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function cs(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}async function ls(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=await i(r),{analyzeScrollEdgeState:a}=await import(`./selection.js`),o=a(e,t,n);return r&&o.emptySnapshot?await ls({edge:t,target:n,captureNodes:i}):o}catch(e){throw fs(t,r,e)}}async function us(e){let{edge:t,captureState:n,scroll:r}=e,i=await n();i.scope&&(i=await n(i.scope));let a=0,o;for(;i.canScroll;){if(a>=40)throw new c(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{hint:`The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state.`});o=await r(),a+=1,i=await n(i.scope)}return{passes:a,result:o}}function ds(e,t,n,r,i){return t&&n===0?`Already at ${t}; no hidden content ${t===`bottom`?`below`:`above`} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:i===void 0?r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`:`Scrolled ${e} by ${i}px`}function fs(e,t,n){return t?new c(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},n):new c(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},n)}function ps(e,t){let n=C(e),r=e.filter(n.isVisibleInEffectiveViewport).map(e=>e.rect).filter(ms),i=r.length>0?r:e.map(e=>e.rect).filter(ms);if(i.length===0)throw new c(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let a=Math.min(...i.map(e=>e.x)),o=Math.min(...i.map(e=>e.y)),s=Math.max(...i.map(e=>e.x+e.width)),l=Math.max(...i.map(e=>e.y+e.height));return{x:a,y:o,width:s-a,height:l-o}}function ms(e){return!!(e&&e.width>0&&e.height>0)}async function hs(e,t){return await e.backend.resolveGestureViewport?.(P(e,t))||ps((await io(e,t,!1)).snapshot.nodes,`gesture`)}const gs=async(e,t)=>{let n=await H(e,t,{action:`focus`,requireInteractive:!0,pipeline:I.resolvedTarget});if(!e.backend.focus)throw new c(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let r=U(n),i=A(await e.backend.focus(P(e,t),r));return{...n,...i?{backendResult:i}:{},...w(`Focused (${r.x}, ${r.y})`)}},_s=async(e,t)=>{let n=rs(t),r=await H(e,t,{action:`longPress`,requireInteractive:!0,pipeline:I.promotedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new c(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let i=t.durationMs===void 0?void 0:O(t.durationMs,`durationMs`,0,12e4),a=U(r),o=A(await e.backend.longPress(P(e,t),a,{durationMs:i}));return await is(e,t,r,{...r,...i===void 0?{}:{durationMs:i},...o?{backendResult:o}:{},...w(`Long pressed (${a.x}, ${a.y})`)},n)},vs=async(e,t)=>{let n=rs(t),r=n.needsPreActionBaseline?null:await ys(e,t);if(r)return r;let i=await H(e,t,{action:`hover`,requireInteractive:!1,pipeline:I.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.hover)throw new c(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let a=U(i),o=A(await e.backend.hover(P(e,t),a));return await is(e,t,i,{...i,...o?{backendResult:o}:{},...w(`Hovered (${a.x}, ${a.y})`)},n)};async function ys(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await _o(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const bs=async(e,t)=>{if(!e.backend.performGesture)throw new c(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await ao(e,t,`drag`);let n=await hs(e,t),r=await xs(e,t,`source`),i=await xs(e,t,`destination`),a=rt({from:U(r),to:U(i),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},n),o=A(await e.backend.performGesture(P(e,t),a)),{start:s,end:l}=tt(a);return{kind:`drag`,durationMs:a.durationMs,pointerCount:1,from:s,to:l,targets:{source:Ss(r),destination:Ss(i)},recording:Cs(r,i),...o?{backendResult:o}:{},...w(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function xs(e,t,n){let r=t.gesture[n];return await H(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:I.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Ss(e){if(e.kind===`point`||!e.resolution)throw new c(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function Cs(e,t){let n=ws(e),r=ws(t),i=Ts(e),a=Ts(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function ws(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Ts(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preActionNodes))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preActionNodes}}const Es=async(e,t)=>{if(!e.backend.scroll)throw new c(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let n=Os(t.direction),r=Ms(t.amount,`scroll amount`),i=Ps(t.pixels,`scroll pixels`),a=Ue(t.durationMs);Ke({amount:r,pixels:i},`scroll accepts either amount or pixels, not both`);let o=await Ds(e,t),s=o.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:U(o)},l=e.backend.scroll,u=Ge({...r===void 0?{}:{amount:r},...i===void 0?{}:{pixels:i},...a===void 0?{}:{durationMs:a}},n.edge),d=async()=>await l(P(e,t),s,{direction:n.direction,...u}),f,p=0;if(n.edge){let r=n.edge,i=ks(o),a=await us({edge:r,captureState:async n=>await As(e,t,r,i,n),scroll:d});f=a.result,p=a.passes}else f=await d(),p=1;let m=A(f),h=We(m);return{...o,direction:n.direction,...n.edge?{edge:n.edge,passes:p}:{},...r===void 0?{}:{amount:r},...i===void 0?{}:{pixels:i},...h===void 0?{}:{durationMs:h},...m?{backendResult:m}:{},...w(ds(n.direction,n.edge,p,r,i))}};async function Ds(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await ao(e,t,`scroll`),{kind:`viewport`}):await H(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,pipeline:I.resolvedTarget})}function Os(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:js(e,`scroll direction`)}}function ks(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function U(e){if(!e.point)throw new c(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function As(e,t,n,r,i){if(!e.backend.captureSnapshot)throw new c(`UNSUPPORTED_OPERATION`,`scroll ${n} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:a}=e.backend;return await ls({edge:n,target:r,scope:i,captureNodes:async n=>{let r=await a(P(e,t),{scope:n});return r.snapshot?.nodes??r.nodes??[]}})}function js(e,t){switch(e){case`up`:case`down`:case`left`:case`right`:return e;default:throw new c(`INVALID_ARGS`,`${t} must be up, down, left, or right`)}}function Ms(e,t){return e===void 0?void 0:Ns(e,t)}function Ns(e,t){if(!Number.isFinite(e)||e<=0)throw new c(`INVALID_ARGS`,`${t} must be a positive number`);return e}function Ps(e,t){if(e!==void 0){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new c(`INVALID_ARGS`,`${t} must be a positive integer`);return e}}const Fs=async(e,t)=>await Rs(e,t,`press`),Is=async(e,t)=>await Rs(e,t,`click`),Ls=async(e,t)=>{if(typeof t.text!=`string`)throw new c(`INVALID_ARGS`,`fill requires text`);let n=rs(t),r=n.needsPreActionBaseline?null:await Vs(e,t);if(r)return r;let i=await H(e,t,{action:`fill`,requireInteractive:!0,pipeline:I.resolvedTarget,captureEvidenceBaseline:n.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.fill)throw new c(`UNSUPPORTED_OPERATION`,`fill is not supported by this backend`);let a=zs(i),o=`node`in i?i.node?.type??``:``,s=o!==``&&se(o,e.backend.platform),l=t.allowNonHittableCoordinateFallback===!0&&`node`in i&&i.node?.hittable===!1,u=A(await e.backend.fill(P(e,t),a,t.text,{delayMs:t.delayMs,allowNonHittableCoordinateFallback:l})),d=o&&!s?`fill target ${Us(i)} resolved to "${o}", attempting fill anyway.`:void 0;return await is(e,t,i,{...i,text:t.text,...d?{warning:d}:{},...u?{backendResult:u}:{}},n)};async function Rs(e,t,n){let r=rs(t),i=r.needsPreActionBaseline?null:await Bs(e,t,n);if(i)return i;let a=await H(e,t,{action:n,requireInteractive:!0,pipeline:I.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget,preresolvedTarget:t.preresolvedTarget});if(!e.backend.tap)throw new c(`UNSUPPORTED_OPERATION`,`tap is not supported by this backend`);let o=zs(a),s;try{s=await e.backend.tap(P(e,t),o,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap})}catch(e){throw wi(e,a),e}let l=A(s);return await is(e,t,a,{...a,...l?{backendResult:l}:{}},r)}function zs(e){if(!e.point)throw new c(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Bs(e,t,n){if(n!==`click`||t.target.kind!==`ref`||!e.backend.tapTarget||Hs(t)||t.expectedResolvedTarget)return null;let{tapTarget:r}=e.backend;return await _o(e,t,t.target,n,async(e,t)=>await r(e,t))}async function Vs(e,t){if(t.target.kind!==`ref`||!e.backend.fillTarget||t.expectedResolvedTarget)return null;let{fillTarget:n}=e.backend;return{...await _o(e,t,t.target,`fill`,async(e,r)=>await n(e,r,t.text,{delayMs:t.delayMs})),text:t.text}}function Hs(e){return e.count!==void 0||e.intervalMs!==void 0||e.holdMs!==void 0||e.jitterPx!==void 0||e.doubleTap!==void 0||e.button!==void 0&&e.button!==`primary`}function Us(e){return e.target?.kind===`ref`?e.target.ref:e.target?.kind===`selector`?e.target.selector:`point`}function W(e){return{includeRects:e===`visible`||e===`hidden`,interactiveOnly:!1}}const Ws=I.wait.poll.defaultTimeoutMs;function Gs(e,t,n,r,i={}){let a=aa(r),o=n??a.defaultTimeoutMs,s=K(e),c=$s(i.isUnreadableError),l=[],u={},d=()=>Math.max(0,o-(K(e)-s));return{capture:async n=>{let r=!1,i=K(e)-s,a=t=>l.push({startedMs:i,durationMs:K(e)-s-i,outcome:t}),o=await yo(e,t,d(),async e=>await c.attempt(async()=>{let t=await n(e);return r=!0,t}));if(!o.timedOut)return r&&c.recordReadableCapture(),a(r?`readable`:`unreadable`),o;let f=Qs(o.error);return a(f?`runner-restart`:`deadline`),u=f??{},{timedOut:!0,deadline:f===void 0?c.readableCaptures()===0?`capture-stalled`:`capture-truncated`:`runner-restart-exhausted`}},hasTimeRemaining:()=>d()>0,failureEvidence:()=>({timeoutMs:o,readableCaptures:c.readableCaptures(),captures:l.length,polls:Ks(l),waitedMs:K(e)-s,...u}),preserveUnreadableOnStall:i.preserveUnreadableOnStall,rethrowIfNeverReadable:c.rethrowIfNeverReadable,sleepUntilNextPoll:async()=>await ec(e,t,Math.min(a.intervalMs,d())),timeoutMs:o,waitedMs:()=>K(e)-s}}function Ks(e){return e.length<=30?[...e]:[...e.slice(0,5),...e.slice(-25)]}function qs(e,t){return new c(`COMMAND_FAILED`,e,{reason:V.captureStalled,captureStalled:!0,...t,retriable:!0,hint:`No readable snapshot capture completed before the wait timeout. Retry, or use screenshot to inspect the current surface.`})}function Js(e,t){return new c(`COMMAND_FAILED`,e,{reason:V.runnerRestartExhausted,waitRunnerRestartExhausted:!0,...t,retriable:!0,hint:`An iOS runner restart consumed the wait timeout before a readable snapshot completed. Inspect the diagnostics log for the runner invalidation/restart sequence, then retry.`})}function Ys(e,t){return new c(`COMMAND_FAILED`,e,{reason:V.deadlineExceeded,captureTruncated:!0,...t})}function Xs(e,t){return new c(`COMMAND_FAILED`,e,{reason:V.targetAbsent,...t})}function Zs(e,t,n){let r=t.failureEvidence();return n===`runner-restart-exhausted`?Js(e,r):n===`capture-stalled`?(t.preserveUnreadableOnStall&&t.rethrowIfNeverReadable(),qs(e,r)):n===`capture-truncated`?Ys(e,r):(t.rethrowIfNeverReadable(),r.readableCaptures===0?qs(e,r):Xs(e,r))}function Qs(e){if(!(e instanceof c))return;let t=e.details;if(t?.runnerRestarted===!0)return{runnerRestarted:!0,...G(t,`runnerRestartReason`),...G(t,`runnerRestartCommand`),...G(t,`runnerRestartCommandId`),...G(t,`runnerInvalidatedSessionId`),...G(t,`runnerRestartSessionId`),...G(t,`logPath`),...G(t,`diagnosticId`)}}function G(e,t){let n=e?.[t];return typeof n==`string`?{[t]:n}:{}}function $s(e=at){let t=0,n;return{attempt:async t=>{try{return await t()}catch(t){if(!e(t))throw t;n=t;return}},recordReadableCapture:()=>{t+=1},readableCaptures:()=>t,rethrowIfNeverReadable:()=>{if(t===0&&n!==void 0)throw n}}}function K(e){return e.clock?.now()??Date.now()}async function ec(e,t,n){let r=[t.signal,e.signal].filter(e=>e!==void 0);for(let e of r)e.throwIfAborted();if(n<=0)return!1;if(e.clock){await e.clock.sleep(n);for(let e of r)e.throwIfAborted();return!0}return await new Promise((e,t)=>{let i=r.length>0?AbortSignal.any(r):void 0,a=()=>i?.removeEventListener(`abort`,s),o=setTimeout(()=>{a(),e()},n),s=()=>{clearTimeout(o),a(),t(i?.reason)};i?.addEventListener(`abort`,s,{once:!0}),o.unref()}),!0}async function tc(e,t,n){let r=await R(I.readAny,e.nodes,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[];return{selector:r.kind===`target`||r.kind===`ambiguous`?r.selector:t,observation:Le(e,i)}}async function nc(e,t,n){let r=await tc(e,t,n),i=r.observation;if(i.kind!==`absent`)throw Ie(r.selector,i);return{predicate:`absent`,pass:!0,selector:t,matches:i.matches}}async function rc(e,t,n,r,i){let a=Ae(n);if(a)throw ze(a,`wait`);let o=Gs(t,n,i,I.wait,{isUnreadableError:ac,preserveUnreadableOnStall:!0}),s=W(),c,l;for(;o.hasTimeRemaining();){let i=await o.capture(async i=>{try{let{observation:a}=await tc((await e.captureSnapshot(t,{...n,signal:i},{updateSession:!0,includeHiddenContentHints:!1,...s})).snapshot,r,t.backend.platform);if(a.kind===`sparse`||a.kind===`truncated`)throw Ie(r,a,`wait`);return a}catch(e){throw at(e)?Re(r,e,`wait`):e}});if(i.timedOut){l=i.deadline;break}let a=i.value;if(a?.kind===`absent`)return{kind:`absent`,waitedMs:o.waitedMs()};a?.kind===`present`&&(c=a),await o.sleepUntilNextPoll()}throw l===`runner-restart-exhausted`?Zs(`wait absent timed out for selector: ${r}`,o,l):c?ic(r,c,o.failureEvidence()):Zs(`wait absent timed out for selector: ${r}`,o,l)}function ic(e,t,n){let r=t.matches!==1;return new c(`COMMAND_FAILED`,`wait absent timed out for selector ${e}: ${t.matches} match${r?`es`:``} remain`,{reason:V.targetPresent,selector:e,...n,matches:t.matches,firstMatch:t.firstMatch})}function ac(e){if(!(e instanceof c))return!1;let t=e.details;return t?.command===`wait`&&t.predicate===`absent`&&(t.observation===`sparse`||t.observation===`truncated`||t.observation===`unreadable`)}function oc(e){if(e.kind===`ambiguous`||e.kind===`target`)return{selector:e.selector,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}async function sc(e,t,n,r,i,a){let o=Gs(t,n,i,I.wait),s=W(),l,u;for(;o.hasTimeRemaining();){let i=await o.capture(async r=>await e.captureSnapshot(t,{...n,signal:r},{updateSession:!0,includeHiddenContentHints:!1,...s}));if(i.timedOut){u=i.deadline;break}let c=i.value;if(c){let e=c.snapshot.nodes,n=oc(await R(I.wait,e,r,{platform:t.backend.platform}));if(n){let t=cc(e,n,a);if(t.kind===`satisfied`)return{kind:`selector`,selector:n.selector,waitedMs:o.waitedMs(),node:t.node,preActionNodes:e};l=t.evidence}}await o.sleepUntilNextPoll()}throw u!==`capture-stalled`&&l?new c(`COMMAND_FAILED`,`wait matched selector ${r} but no candidate carried the recorded landmark identity`,{reason:Pa,...o.failureEvidence(),...l}):Zs(`wait timed out for selector: ${r}`,o,u)}function cc(e,t,n){let r=t.matchedNodes[0];if(!n)return{kind:`satisfied`,node:r};let i=vt(e),a=bt(t.matchedNodes,i,y(n),n.ancestry)[0];return a?{kind:`satisfied`,node:a}:{kind:`identity-mismatch`,evidence:{matchCount:t.matchedNodes.length,observed:b(r),observedAncestry:yt(r,i,Math.max(n.ancestry.length,1)).chain}}}async function lc(e,t,n,r,i){let a=i??Ws,o=r??e.stable.defaultQuietMs,s=await e.stable.capture(t,n,{quietMs:o,timeoutMs:a});if(!s.settled)throw new c(`COMMAND_FAILED`,`wait timed out waiting for a stable UI`,{reason:V.stableTimeout,...s.stalled?{captureStalled:!0}:{},quietMs:o,timeoutMs:a,captures:s.captures,nodeCount:s.nodeCount,...s.stalled?{hint:`A snapshot capture stalled past the wait timeout, so no settle verdict is available. The UI may still be readable: retry, or use screenshot to inspect the surface.`}:{}});return{kind:`stable`,waitedMs:s.waitedMs,captures:s.captures,nodeCount:s.nodeCount,...s.nodeCount<e.stable.tinyTreeNodeCount?{hint:e.stable.tinyTreeHint}:{}}}async function uc(e,t,n,r,i){let a=Gs(t,n,i,I.wait),o;for(;a.hasTimeRemaining();){let i=await a.capture(async i=>await dc(e,t,{...n,signal:i},r));if(i.timedOut){o=i.deadline;break}if(i.value)return{kind:`text`,text:r,waitedMs:a.waitedMs()};await a.sleepUntilNextPoll()}throw Zs(`wait timed out for text: ${r}`,a,o)}async function dc(e,t,n,r){return t.backend.findText&&(await t.backend.findText(pc(t,n),r)).found?!0:await fc(e,t,n,r)}async function fc(e,t,n,r){return!!fa((await e.captureSnapshot(t,n,{updateSession:!0,includeHiddenContentHints:!1})).snapshot.nodes,r)}function pc(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function mc(e){let t=async(t,n)=>{switch(n.target.kind){case`sleep`:return await ec(t,n,n.target.durationMs),{kind:`sleep`,waitedMs:n.target.durationMs};case`ref`:return await hc(e,t,n,n.target.ref,n.target.timeoutMs);case`selector`:return await sc(e,t,n,n.target.selector,n.target.timeoutMs,n.target.recordedLandmark);case`absent`:return await rc(e,t,n,n.target.selector,n.target.timeoutMs);case`stable`:return await lc(e,t,n,n.target.quietMs,n.target.timeoutMs);case`text`:return await gc(e,t,n,n.target.text,n.target.timeoutMs);default:return _c(n.target)}};return{waitCommand:t,waitForTextCommand:async(e,n)=>{let r=await t(e,{...n,target:{kind:`text`,text:n.text,timeoutMs:n.timeoutMs}});if(r.kind!==`text`)throw new c(`COMMAND_FAILED`,`waitForText returned non-text result`);return r}}}async function hc(e,t,n,r,o){let s=await e.requireSnapshot(t,n.session),l=a(r);if(!l)throw new c(`INVALID_ARGS`,`Invalid ref: ${r}`);let u=i(s.snapshot.nodes,l),d=u?z(u,s.snapshot.nodes):void 0;if(!d)throw new c(`COMMAND_FAILED`,`Ref ${r} not found or has no label`);return await uc(e,t,n,d,o)}async function gc(e,t,n,r,i){let a=ye(r);if(!a.ok)throw new c(a.code,a.message);return await uc(e,t,n,a.text,i)}function _c(e){throw Error(`Unsupported wait target: ${String(e)}`)}const vc=mc({captureSnapshot:B,requireSnapshot:_a,stable:{defaultQuietMs:500,tinyTreeHint:Do,tinyTreeNodeCount:5,capture:Oo}}),yc=vc.waitCommand,bc=vc.waitForTextCommand,xc=async(e,t)=>{let n=t.locator??`any`;if(!t.query)throw new c(`INVALID_ARGS`,de);if(t.action===`wait`)return await Tc(e,t,n);if(t.action===`list`)return await Ec(e,t,n);let{capture:r,match:i}=await Dc(e,t,n);if(!i)throw new c(`COMMAND_FAILED`,`find did not match any element`);if(t.action===`exists`)return{kind:`found`,found:!0};let a=`@${i.ref}`;return t.action===`get_attrs`?{kind:`attrs`,ref:a,node:i}:{kind:`text`,ref:a,text:await ba(e,r,i),node:i}},Sc=async(e,t)=>{if(t.target.kind===`ref`){let n=await _a(e,t.session),r=xa(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??``,invalidRefMessage:`get text requires a ref like @e2`,notFoundMessage:`Ref ${t.target.ref} not found`});Ia(r.node,n.snapshot.nodes,t.expectedResolvedTarget,`get`);let i=ie(r.node,e.backend.platform,{action:`get`,nodes:n.snapshot.nodes}),a={kind:`ref`,ref:`@${r.ref}`},o=n.snapshot.nodes;return t.property===`attrs`?{kind:`attrs`,target:a,node:r.node,selectorChain:i,preActionNodes:o}:{kind:`text`,target:a,text:await ba(e,n,r.node),node:r.node,selectorChain:i,preActionNodes:o}}let n=await Oc(e,t,t.session??`default`,{selector:t.target.selector,policy:t.property===`text`?I.readText:I.readUnique,hooks:{onResolved:(e,n)=>Ia(e,n,t.expectedResolvedTarget,`get`)}}),r=ie(n.node,e.backend.platform,{action:`get`,nodes:n.capture.snapshot.nodes});if(t.property===`attrs`)return{kind:`attrs`,target:{kind:`selector`,selector:n.selector},node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes};let i=await ba(e,n.capture,n.node);return{kind:`text`,target:{kind:`selector`,selector:n.selector},text:i,node:n.node,selectorChain:r,preActionNodes:n.capture.snapshot.nodes}},Cc=async(e,t)=>{let n=await Sc(e,{...t,property:`text`,target:t.target});if(n.kind!==`text`)throw new c(`COMMAND_FAILED`,`getText returned non-text result`);return n},wc=async(e,t)=>{let n=await Sc(e,{...t,property:`attrs`,target:t.target});if(n.kind!==`attrs`)throw new c(`COMMAND_FAILED`,`getAttrs returned non-attrs result`);return n};async function Tc(e,t,n){let r=Gs(e,t,t.timeoutMs,I.findWait),i;for(;r.hasTimeRemaining();){let a=await r.capture(async r=>await Dc(e,{...t,signal:r},n,{includeHiddenContentHints:!1}));if(a.timedOut){i=a.deadline;break}if(a.value?.match)return{kind:`found`,found:!0,waitedMs:r.waitedMs()};await r.sleepUntilNextPoll()}throw Zs(`find wait timed out`,r,i)}async function Ec(e,t,n){let r=re(n,t.query),i=await B(e,t,{updateSession:!0,...W()});if(mt(i.snapshot.snapshotQuality))throw ga(i.snapshot.snapshotQuality);return{kind:`list`,matches:(r?ea(I.readList,i.snapshot.nodes,r,{platform:e.backend.platform}).list?.matchedNodes??[]:oe(i.snapshot.nodes,n,t.query,{}).matches).map(e=>({ref:`@${e.ref}`,node:e}))}}async function Dc(e,t,n,r){let i=re(n,t.query),a=await B(e,t,{updateSession:!0,scope:ha(e.backend.platform,n,t.query,i),includeHiddenContentHints:r?.includeHiddenContentHints,...W()});if(mt(a.snapshot.snapshotQuality))throw ga(a.snapshot.snapshotQuality);if(i){let t=await R(I.readAny,a.snapshot.nodes,i,{platform:e.backend.platform});return{capture:a,match:t.kind===`target`?t.node:void 0}}return{capture:a,match:oe(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0]}}async function Oc(e,t,n,r){let i=await B(e,{...t,session:n},{updateSession:!0,...W()}),a=await R(r.policy,i.snapshot.nodes,r.selector,{platform:e.backend.platform},r.hooks);if(a.kind!==`target`)throw new c(`COMMAND_FAILED`,Ee(r.selector,[],{unique:!0}),{hint:g([])});return{capture:i,node:a.node,selector:a.selector,ref:`@${a.node.ref}`}}const kc=async(e,t)=>{let n=Ce(t.predicate);if(!n.ok)throw new c(n.code,n.message,{hint:n.hint});let r=n.predicate;if(r===`absent`){let e=Ae(t);if(e)throw ze(e)}if(r===`text`&&!t.expectedText)throw new c(`INVALID_ARGS`,we);let i=t.selector,a=await Ac(e,t,r,i);return r===`exists`?await jc(e,a,i):r===`absent`?await nc(a.snapshot,i,e.backend.platform):await Mc(e,t,a,r,i)};async function Ac(e,n,r,i){try{return await B(e,n,{updateSession:!0,...W(r)})}catch(e){throw r!==`absent`||t(e)?e:Re(i,e)}}async function jc(e,t,n){let r=await R(I.readAny,t.snapshot.nodes,n,{platform:e.backend.platform});if(r.kind!==`target`)throw new c(`COMMAND_FAILED`,Ee(n,[],{unique:!1}),{hint:g([])});return{predicate:`exists`,pass:!0,selector:r.selector,matches:r.matches,selectorChain:_e(n)}}async function Mc(e,t,n,r,i){let a=await R(I.readUnique,n.snapshot.nodes,i,{platform:e.backend.platform},{onResolved:(e,n)=>Ia(e,n,t.expectedResolvedTarget,`is`)});if(a.kind!==`target`)throw new c(`COMMAND_FAILED`,Ee(i,[],{unique:!0}),{command:`is`,reason:Pe.selectorNotFound,predicate:r,selector:i,hint:g([])});let o=Te({predicate:r,node:a.node,nodes:n.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!o.pass)throw new c(`COMMAND_FAILED`,`is ${r} failed for selector ${a.selector}: ${o.details}`,{command:`is`,reason:Pe.predicateFailed,predicate:r,selector:a.selector,predicateDetails:o.details});return{predicate:r,pass:!0,selector:a.selector,...r===`text`?{text:o.actualText}:{},selectorChain:_e(i),node:a.node,preActionNodes:n.snapshot.nodes}}const Nc=async(e,t)=>await kc(e,{...t,predicate:`visible`,selector:t.target.selector}),Pc=async(e,t)=>await kc(e,{...t,predicate:`hidden`,selector:t.target.selector}),Fc=async(e,t)=>{if(!e.backend.performGesture)throw new c(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await ao(e,t,t.gesture.intent);let n=await hs(e,t),r=nt(t.gesture,n,e.backend.platform),i=A(await e.backend.performGesture(P(e,t),r)),a=Lc(r.pointers,0),o=Lc(r.pointers,-1);return{kind:t.gesture.intent,durationMs:r.durationMs,pointerCount:r.topology===`single`?1:2,from:a,to:o,...i?{backendResult:i}:{},...w(Rc(t.gesture,a,o))}},Ic=async(e,t)=>{let n=t.gesture;return n.intent===`drag`?await bs(e,{...t,gesture:n}):await Fc(e,{...t,gesture:n})};function Lc(e,t){let n=e.map(e=>t===0?e.samples[0]?.point:e.samples.at(-1)?.point);if(n.some(e=>e===void 0))throw new c(`COMMAND_FAILED`,`Gesture plan did not contain endpoint samples.`);let r=n;return{x:r.reduce((e,t)=>e+t.x,0)/r.length,y:r.reduce((e,t)=>e+t.y,0)/r.length}}function Rc(e,t,n){switch(e.intent){case`pan`:{let r=`preset`in e?t:e.origin,i=`preset`in e?{x:n.x-t.x,y:n.y-t.y}:e.delta;return`Panned (${r.x}, ${r.y}) by (${i.x}, ${i.y})`}case`fling`:return`direction`in e?`Flung ${e.direction}`:`Flung`;case`pinch`:return`Pinched to scale ${e.scale}`;case`rotate`:return`Rotated gesture ${e.degrees} degrees`;case`transform`:return`Requested transform gesture by (${e.delta.x}, ${e.delta.y}), scale ${e.scale}, rotate ${e.degrees} degrees`}}const q={find:xc,get:Sc,getText:Cc,getAttrs:wc,is:kc,isVisible:Nc,isHidden:Pc,wait:yc,waitForText:bc},J={click:Is,press:Fs,fill:Ls,focus:gs,longPress:_s,hover:vs,scroll:Es,gesture:Ic,settleObservation:zo};function zc(e){return{find:t=>q.find(e,t),get:t=>q.get(e,t),getText:(t,n={})=>q.getText(e,{...n,target:t}),getAttrs:(t,n={})=>q.getAttrs(e,{...n,target:t}),is:t=>q.is(e,t),isVisible:(t,n={})=>q.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>q.isHidden(e,{...n,target:t}),wait:t=>q.wait(e,t),waitForText:(t,n={})=>q.waitForText(e,{...n,text:t})}}function Bc(e){return{click:(t,n={})=>J.click(e,{...n,target:t}),press:(t,n={})=>J.press(e,{...n,target:t}),fill:(t,n,r={})=>J.fill(e,{...r,target:t,text:n}),focus:(t,n={})=>J.focus(e,{...n,target:t}),longPress:(t,n={})=>J.longPress(e,{...n,target:t}),hover:(t,n={})=>J.hover(e,{...n,target:t}),scroll:t=>J.scroll(e,t),gesture:t=>J.gesture(e,t),settleObservation:t=>J.settleObservation(e,t)}}function Y(e,t){if(e!==void 0)return X(e,t)}function X(e,t){let n=e?.trim();if(!n)throw new c(`INVALID_ARGS`,`${t} must be a non-empty string`);return n}const Vc=async(e,t={})=>{if(!e.backend.listDevices)throw new c(`UNSUPPORTED_OPERATION`,`admin.devices is not supported by this backend`);return{kind:`adminDevices`,devices:await e.backend.listDevices(P(e,t),t.filter)}},Hc=async(e,t={})=>{if(!e.backend.bootDevice)throw new c(`UNSUPPORTED_OPERATION`,`admin.boot is not supported by this backend`);let n=Qc(t.target),r=A(await e.backend.bootDevice(P(e,t),n));return{kind:`deviceBooted`,...n?{target:n}:{},...r?{backendResult:r}:{},...w(`Booted device`)}},Uc=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new c(`UNSUPPORTED_OPERATION`,`admin.shutdown is not supported by this backend`);let n=Qc(t.target),r=A(await e.backend.shutdownDevice(P(e,t),n));return{kind:`deviceShutdown`,...n?{target:n}:{},...r?{backendResult:r}:{},...w(`Shutdown device`)}},Wc=async(e,t)=>await qc(e,t,`install`),Gc=async(e,t)=>await qc(e,t,`reinstall`),Kc=async(e,t)=>await qc(e,t,`installFromSource`);async function qc(e,t,n){let r=n===`reinstall`?`reinstallApp`:`installApp`,i=e.backend[r];if(!i)throw new c(`UNSUPPORTED_OPERATION`,`admin.${n} is not supported by this backend`);let a=`app`in t&&t.app!==void 0?X(t.app,`app`):void 0;if(n!==`installFromSource`&&!a)throw new c(`INVALID_ARGS`,`admin.${n} requires app`);let o=P(e,t),s=await Jc(e,o,t.source);try{let t=await i.call(e.backend,o,{...a?{app:a}:{},source:s.source});return $c(n,a,s.source,t)}finally{await s.cleanup?.()}}async function Jc(e,t,n){let r=await Yc(e,Xc(n));try{return{source:Xc(e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function Yc(e,t){if(t.kind===`url`)return{source:t};let n=await yr(e,t,{usage:`admin.install`,field:`source`});return{source:{kind:`path`,path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function Xc(e){if(!e||typeof e!=`object`)throw new c(`INVALID_ARGS`,`install source is required`);if(e.kind===`path`)return{kind:`path`,path:X(e.path,`source.path`)};if(e.kind===`uploadedArtifact`)return{kind:`uploadedArtifact`,id:X(e.id,`source.id`)};if(e.kind===`url`){let t=X(e.url,`source.url`);return Zc(t),{kind:`url`,url:t}}throw new c(`INVALID_ARGS`,`install source kind must be path, uploadedArtifact, or url`)}function Zc(e){let t;try{t=new URL(e)}catch{throw new c(`INVALID_ARGS`,`Invalid install source URL: ${e}`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new c(`INVALID_ARGS`,`Install source URL must use http or https`)}function Qc(e){if(!e)return;let t=Y(e.id,`target.id`),n=Y(e.name,`target.name`),r={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...e.headless===void 0?{}:{headless:e.headless}};return Object.keys(r).length>0?r:void 0}function $c(e,t,n,r){let i=A(r),a=e===`reinstall`?`appReinstalled`:e===`installFromSource`?`appInstalledFromSource`:`appInstalled`,o=Z(r,`appName`),s=Z(r,`appId`),c=Z(r,`bundleId`),l=Z(r,`packageName`),u=Z(r,`launchTarget`),d=Z(r,`installablePath`),f=Z(r,`archivePath`);return{kind:a,...t?{app:t}:{},source:n,...s?{appId:s}:{},...o?{appName:o}:{},...c?{bundleId:c}:{},...l?{packageName:l}:{},...u?{launchTarget:u}:{},...d?{installablePath:d}:{},...f?{archivePath:f}:{},...i?{backendResult:i}:{},...w(`${e===`reinstall`?`Reinstalled`:`Installed`}: ${o??u??t??el(n)}`)}}function Z(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function el(e){return e.kind===`path`?e.path:e.kind===`uploadedArtifact`?e.id:e.url}const tl=/^[A-Za-z0-9_.:-]{1,64}$/,nl=async(e,t)=>{if(!e.backend.openApp)throw new c(`UNSUPPORTED_OPERATION`,`apps.open is not supported by this backend`);let n=cl(t),r=A(await e.backend.openApp(Q(e,t),n,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:`appOpened`,target:n,relaunch:t.relaunch===!0,...r?{backendResult:r}:{},...w(`Opened: ${ul(n)}`)}},rl=async(e,t={})=>{if(!e.backend.closeApp)throw new c(`UNSUPPORTED_OPERATION`,`apps.close is not supported by this backend`);let n=Y(t.app,`app`),r=A(await e.backend.closeApp(Q(e,t),n));return{kind:`appClosed`,...n?{app:n}:{},...r?{backendResult:r}:{},...w(n?`Closed: ${n}`:`Closed app`)}},il=async(e,t={})=>{if(!e.backend.listApps)throw new c(`UNSUPPORTED_OPERATION`,`apps.list is not supported by this backend`);return{kind:`appsList`,apps:await e.backend.listApps(Q(e,t),qe(t.filter))}},al=async(e,t)=>{if(!e.backend.getAppState)throw new c(`UNSUPPORTED_OPERATION`,`apps.state is not supported by this backend`);let n=X(t.app,`app`);return{kind:`appState`,app:n,state:await e.backend.getAppState(Q(e,t),n)}},ol=async(e,t)=>{if(!e.backend.pushFile)throw new c(`UNSUPPORTED_OPERATION`,`apps.push is not supported by this backend`);let n=X(t.app,`app`),r=await dl(e,t.input);try{let i=A(await e.backend.pushFile(Q(e,t),r.backendInput,n));return{kind:`appPushed`,app:n,inputKind:r.inputKind,...i?{backendResult:i}:{},...w(`Pushed to ${n}`)}}finally{await r.cleanup?.()}},sl=async(e,t)=>{if(!e.backend.triggerAppEvent)throw new c(`UNSUPPORTED_OPERATION`,`apps.triggerEvent is not supported by this backend`);let n=fl(t.name);pl(t.payload,`apps.triggerEvent payload for "${n}"`);let r=A(await e.backend.triggerAppEvent(Q(e,t),{name:n,...t.payload?{payload:t.payload}:{}}));return{kind:`appEventTriggered`,name:n,...t.payload?{payload:t.payload}:{},...r?{backendResult:r}:{},...w(`Triggered app event: ${n}`)}};function cl(e){let t=Y(e.app,`app`),n=Y(e.appId,`appId`),r=Y(e.bundleId,`bundleId`),i=Y(e.packageName,`packageName`),a=Y(e.url,`url`),o=Y(e.activity,`activity`),s={...t?{app:t}:{},...n?{appId:n}:{},...r?{bundleId:r}:{},...i?{packageName:i}:{},...a?{url:a}:{},...o?{activity:o}:{}};if(!ll(s))throw new c(`INVALID_ARGS`,`apps.open requires app, appId, bundleId, packageName, url, or activity`);return s}function ll(e){return!!(e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity)}function ul(e){return e.app??e.appId??e.bundleId??e.packageName??e.url??e.activity??`app`}async function dl(e,t){if(!t||typeof t!=`object`)throw new c(`INVALID_ARGS`,`apps.push requires an input`);if(t.kind===`json`)return ml(t.payload,`apps.push JSON payload`,8192),{backendInput:{kind:`json`,payload:t.payload},inputKind:`json`};let n=await yr(e,t,{usage:`apps.push`,field:`input`});return{backendInput:{kind:`file`,path:n.path},inputKind:`file`,...n.cleanup?{cleanup:n.cleanup}:{}}}function fl(e){let t=X(e,`name`);if(!tl.test(t))throw new c(`INVALID_ARGS`,`Invalid apps.triggerEvent name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});return t}function pl(e,t){e!==void 0&&ml(e,t,8192)}function ml(e,t,n){if(hl(e,t),Buffer.byteLength(gl(e,t),`utf8`)>n)throw new c(`INVALID_ARGS`,`${t} exceeds ${n} bytes`)}function hl(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new c(`INVALID_ARGS`,`${t} must be a JSON object`)}function gl(e,t){try{let n=JSON.stringify(e);if(typeof n!=`string`)throw new c(`INVALID_ARGS`,`${t} must be JSON-serializable`);return n}catch{throw new c(`INVALID_ARGS`,`${t} must be JSON-serializable`)}}function Q(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}const _l={open:nl,close:rl,list:il,state:al,push:ol,triggerEvent:sl},vl={devices:Vc,boot:Hc,shutdown:Uc,install:Wc,reinstall:Gc,installFromSource:Kc};function yl(e){return{...k(_l,e),list:(t={})=>_l.list(e,{...t,filter:Je(t.filter)})}}const bl=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,xl=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function Sl(e){let t=!1,n=e;return n=n.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,n)=>(t=!0,`${String(n)}=[REDACTED]`)),n=n.replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,n,r,i)=>(t=!0,`${String(n)}[REDACTED]${String(i)}`)),n=n.replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),n=n.replaceAll(xl,()=>(t=!0,`[REDACTED]`)),n=wl(n,()=>{t=!0}),{value:n,redacted:t}}function Cl(e){try{let t=new URL(e),n=Tl(t);return(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`,n=!0),{value:t.toString(),redacted:n}}catch{return}}function wl(e,t){return/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(e)?e.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let n=Cl(e);return n?(n.redacted&&t(),n.value):e}):e}function Tl(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))bl.test(n)&&(e.searchParams.set(n,`[REDACTED]`),t=!0);return t}const El=2048,Dl=4096,Ol=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function kl(e){let t=e.redacted===!0;return{kind:`diagnosticsLogs`,entries:e.entries.map(e=>{let n=$(e.message,Dl),r=Il(e.metadata);return t||=n.redacted||r.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:n.value??``,...e.source?{source:e.source}:{},...r.value?{metadata:r.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function Al(e,t){let n=e.redacted===!0;return{kind:`diagnosticsNetwork`,entries:e.entries.map(e=>{let r=e.url?Nl(e.url):void 0,i=t===`headers`||t===`all`?Ml(e.requestHeaders):void 0,a=t===`headers`||t===`all`?Ml(e.responseHeaders):void 0,o=t===`body`||t===`all`?Pl(e.requestBody):void 0,s=t===`body`||t===`all`?Pl(e.responseBody):void 0,c=Il(e.metadata);return n||=(r?.redacted??!1)||(i?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...r?{url:r.value}:{},...e.status===void 0?{}:{status:e.status},...e.durationMs===void 0?{}:{durationMs:e.durationMs},...i?.value?{requestHeaders:i.value}:{},...a?.value?{responseHeaders:a.value}:{},...o?.value===void 0?{}:{requestBody:o.value},...s?.value===void 0?{}:{responseBody:s.value},...c.value?{metadata:c.value}:{}}}),...e.nextCursor?{nextCursor:e.nextCursor}:{},...e.timeWindow?{timeWindow:e.timeWindow}:{},...e.backend?{backend:e.backend}:{},redacted:n,...e.notes?{notes:e.notes}:{}}}function jl(e){let t=e.redacted===!0;return{kind:`diagnosticsPerf`,metrics:e.metrics.map(e=>{let n=$(e.message,Dl),r=Il(e.metadata);return t||=n.redacted||r.redacted,{name:e.name,...e.value===void 0?{}:{value:e.value},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...n.value===void 0?{}:{message:n.value},...r.value?{metadata:r.value}:{}}}),...e.startedAt?{startedAt:e.startedAt}:{},...e.endedAt?{endedAt:e.endedAt}:{},...e.backend?{backend:e.backend}:{},redacted:t,...e.notes?{notes:e.notes}:{}}}function Ml(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,i]of Object.entries(e))if(Ol.test(r))n[r]=`[REDACTED]`,t=!0;else{let e=$(i,El);n[r]=e.value??``,t||=e.redacted}return{value:n,redacted:t}}function Nl(e){return Cl(e)??$(e,El)}function Pl(e){return e===void 0?{redacted:!1}:Fl(e)??$(e,El)}function Fl(e){try{let t=Ll(JSON.parse(e),Sl);return Rl(JSON.stringify(t.value),El,t.redacted)}catch{return}}function Il(e){return Ll(e,e=>$(e,El))}function Ll(e,t){if(e===void 0)return{redacted:!1};if(typeof e==`string`)return t(e);if(!e||typeof e!=`object`)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let r=Ll(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[i,a]of Object.entries(e)){if(Ol.test(i)){r[i]=`[REDACTED]`,n=!0;continue}let e=Ll(a,t);r[i]=e.value,n||=e.redacted}return{value:r,redacted:n}}function $(e,t){if(e===void 0)return{redacted:!1};let n=Sl(e);return Rl(n.value,t,n.redacted)}function Rl(e,t,n){if(e===void 0)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}const zl=async(e,t={})=>{if(!e.backend.readLogs)throw new c(`UNSUPPORTED_OPERATION`,`diagnostics.logs is not supported by this backend`);return kl(await e.backend.readLogs(await Hl(e,t),Ul(t)))},Bl=async(e,t={})=>{if(!e.backend.dumpNetwork)throw new c(`UNSUPPORTED_OPERATION`,`diagnostics.network is not supported by this backend`);let n=Wl(t);return Al(await e.backend.dumpNetwork(await Hl(e,t),n),n.include??`summary`)},Vl=async(e,t={})=>{if(!e.backend.measurePerf)throw new c(`UNSUPPORTED_OPERATION`,`diagnostics.perf is not supported by this backend`);return jl(await e.backend.measurePerf(await Hl(e,t),Gl(t)))};async function Hl(e,t){let n=P(e,t),r=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??r?.appId?{appId:t.appId??r?.appId}:{},...t.appBundleId??r?.appBundleId?{appBundleId:t.appBundleId??r?.appBundleId}:{}}}function Ul(e){return{...Kl(e,100,500,`logs limit`),...e.levels===void 0?{}:{levels:Yl(e.levels,`levels`)},...e.search===void 0?{}:{search:X(e.search,`search`)},...e.source===void 0?{}:{source:X(e.source,`source`)}}}function Wl(e){return{...Kl(e,25,200,`network limit`),include:Jl(e.include)}}function Gl(e){return{...ql(e),...e.sampleMs===void 0?{}:{sampleMs:O(e.sampleMs,`sampleMs`,100,6e4)},...e.metrics===void 0?{}:{metrics:Yl(e.metrics,`metrics`,20)}}}function Kl(e,t,n,r){return{...ql(e),...e.cursor===void 0?{}:{cursor:X(e.cursor,`cursor`)},limit:e.limit===void 0?t:O(e.limit,r,1,n)}}function ql(e){return{...e.since===void 0?{}:{since:X(e.since,`since`)},...e.until===void 0?{}:{until:X(e.until,`until`)}}}function Jl(e){if(e===void 0)return`summary`;if(e===`summary`||e===`headers`||e===`body`||e===`all`)return e;throw new c(`INVALID_ARGS`,`network include must be summary, headers, body, or all`)}function Yl(e,t,n=50){if(!Array.isArray(e))throw new c(`INVALID_ARGS`,`${t} must be an array of strings`);if(e.length>n)throw new c(`INVALID_ARGS`,`${t} must contain at most ${n} entries`);return e.map((e,n)=>X(e,`${t}[${n}]`))}const Xl={logs:zl,network:Bl,perf:Vl},Zl=async(e,t)=>{let n=nu(t.action,`record`),r=n===`start`?e.backend.startRecording:e.backend.stopRecording;if(!r)throw new c(`UNSUPPORTED_OPERATION`,`record ${n} is not supported by this backend`);let i=t.out?await M(e,t.out,{field:`path`,ext:`.mp4`,artifactType:`screen-recording`}):void 0;try{let a=$l(t,i?.path);return ru(n,await r.call(e.backend,P(e,t),a),await i?.publish())}catch(e){throw await i?.cleanup?.(),e}},Ql=async(e,t)=>{let n=nu(t.action,`trace`),r=n===`start`?e.backend.startTrace:e.backend.stopTrace;if(!r)throw new c(`UNSUPPORTED_OPERATION`,`trace ${n} is not supported by this backend`);let i=t.out?await M(e,t.out,{field:`outPath`,ext:`.trace`,artifactType:`trace-log`}):void 0;try{let a=i?.path?{outPath:i.path}:{};return iu(n,await r.call(e.backend,P(e,t),a),await i?.publish())}catch(e){throw await i?.cleanup?.(),e}};function $l(e,t){let n={};t&&(n.outPath=t);let r=eu(e.fps);r!==void 0&&(n.fps=r);let i=tu(e.quality);return i!==void 0&&(n.quality=i),e.hideTouches!==void 0&&(n.showTouches=e.hideTouches!==!0),n}function eu(e){return e===void 0?void 0:O(e,`fps`,1,60)}function tu(e){if(e===void 0)return;let t=ke(e);if(t===void 0)throw new c(`INVALID_ARGS`,`quality must be one of: medium, high (legacy numeric values 5-10 are accepted)`);return t}function nu(e,t){if(e===`start`||e===`stop`)return e;throw new c(`INVALID_ARGS`,`${t} action must be start or stop`)}function ru(e,t,n){return{...typeof t.path==`string`?{path:t.path}:{},...typeof t.telemetryPath==`string`?{telemetryPath:t.telemetryPath}:{},...typeof t.warning==`string`?{warning:t.warning}:{},...au(e,t,n,{startKind:`recordingStarted`,stopKind:`recordingStopped`,startMessage:`Recording started`,stopMessage:`Recording stopped`})}}function iu(e,t,n){return{...typeof t.outPath==`string`?{outPath:t.outPath}:{},...au(e,t,n,{startKind:`traceStarted`,stopKind:`traceStopped`,startMessage:`Trace started`,stopMessage:`Trace stopped`})}}function au(e,t,n,r){return{kind:e===`start`?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...w(e===`start`?r.startMessage:r.stopMessage)}}const ou={record:Zl,trace:Ql},su=async(e,t={})=>{if(!e.backend.pressBack)throw new c(`UNSUPPORTED_OPERATION`,`system.back is not supported by this backend`);let n=t.mode??`in-app`;if(n!==`in-app`&&n!==`system`)throw new c(`INVALID_ARGS`,`system.back mode must be in-app or system`);let r=A(await e.backend.pressBack(P(e,t),{mode:n}));return{kind:`systemBack`,mode:n,...r?{backendResult:r}:{},...w(`Back`)}},cu=async(e,t={})=>{if(!e.backend.pressHome)throw new c(`UNSUPPORTED_OPERATION`,`system.home is not supported by this backend`);let n=A(await e.backend.pressHome(P(e,t)));return{kind:`systemHome`,...n?{backendResult:n}:{},...w(`Home`)}},lu=async(e,t)=>{if(!e.backend.pressTvRemote)throw new c(`UNSUPPORTED_OPERATION`,`system.tvRemote is not supported by this backend`);let n=$e(t.button),r=t.durationMs===void 0?void 0:O(t.durationMs,`durationMs`,0,1e4),i=A(await e.backend.pressTvRemote(P(e,t),{button:n,...r===void 0?{}:{durationMs:r}}));return{kind:`tvRemotePressed`,button:n,...r===void 0?{}:{durationMs:r},...i?{backendResult:i}:{},...w(`Pressed TV remote ${n}`)}},uu=async(e,t)=>{if(!e.backend.setOrientation)throw new c(`UNSUPPORTED_OPERATION`,`system.orientation is not supported by this backend`);let n=gu(t.orientation),r=A(await e.backend.setOrientation(P(e,t),n));return{kind:`systemOrientationSet`,orientation:n,...r?{backendResult:r}:{},...w(`Rotated to ${n}`)}},du=async(e,t={})=>{if(!e.backend.setKeyboard)throw new c(`UNSUPPORTED_OPERATION`,`system.keyboard is not supported by this backend`);let n=t.action??`status`;if(!st(n))throw new c(`INVALID_ARGS`,`system.keyboard action must be status, get, dismiss, enter, or return`);let r=await e.backend.setKeyboard(P(e,t),{action:n}),i=A(r),a=Tu(r)?r:{};return n===`enter`||n===`return`?vu(a,i):n===`dismiss`?yu(n,a,i):xu(n,a,i)},fu=async(e,t)=>{if(t.action===`read`){if(!e.backend.getClipboard)throw new c(`UNSUPPORTED_OPERATION`,`system.clipboard read is not supported by this backend`);let n=await e.backend.getClipboard(P(e,t));return{kind:`clipboardText`,action:`read`,text:typeof n==`string`?n:n.text}}if(t.action!==`write`)throw new c(`INVALID_ARGS`,`system.clipboard action must be read or write`);if(!e.backend.setClipboard)throw new c(`UNSUPPORTED_OPERATION`,`system.clipboard write is not supported by this backend`);if(typeof t.text!=`string`)throw new c(`INVALID_ARGS`,`system.clipboard write requires text`);let n=A(await e.backend.setClipboard(P(e,t),t.text));return{kind:`clipboardUpdated`,action:`write`,textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...w(`Clipboard updated`)}},pu=async(e,t={})=>{if(!e.backend.openSettings)throw new c(`UNSUPPORTED_OPERATION`,`system.settings is not supported by this backend`);let n=Y(t.target,`target`),r=A(await e.backend.openSettings(P(e,t),n));return{kind:`settingsOpened`,...n?{target:n}:{},...r?{backendResult:r}:{},...w(n?`Opened settings: ${n}`:`Opened settings`)}},mu=async(e,t={})=>{if(!e.backend.handleAlert)throw new c(`UNSUPPORTED_OPERATION`,`system.alert is not supported by this backend`);let n=t.action??`get`;if(n!==`get`&&n!==`accept`&&n!==`dismiss`&&n!==`wait`)throw new c(`INVALID_ARGS`,`system.alert action must be get, accept, dismiss, or wait`);let r=t.timeoutMs===void 0?void 0:O(t.timeoutMs,`timeoutMs`,0,12e4);return _u(n,await e.backend.handleAlert(P(e,t),n,{timeoutMs:r}))},hu=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new c(`UNSUPPORTED_OPERATION`,`system.appSwitcher is not supported by this backend`);let n=A(await e.backend.openAppSwitcher(P(e,t)));return{kind:`appSwitcherOpened`,...n?{backendResult:n}:{},...w(`Opened app switcher`)}};function gu(e){switch(e){case`portrait`:case`portrait-upside-down`:case`landscape-left`:case`landscape-right`:return e;default:throw new c(`INVALID_ARGS`,`system.orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right`)}}function _u(e,t){return e===`get`?Su(t):e===`wait`?Cu(t):wu(e,t)}function vu(e,t){return{kind:`keyboardEnterPressed`,action:`enter`,state:e,...t?{backendResult:t}:{},...w(`Keyboard enter pressed`)}}function yu(e,t,n){return{kind:`keyboardDismissed`,action:e,state:t,...n?{backendResult:n}:{},...w(bu(t))}}function bu(e){return e.dismissed===!1?`Keyboard already hidden`:e.mechanism===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`}function xu(e,t,n){return{kind:`keyboardState`,action:e,state:t,...n?{backendResult:n}:{}}}function Su(e){if(e.kind!==`alertStatus`)throw new c(`COMMAND_FAILED`,`system.alert get returned an invalid backend result`);return{kind:`alertStatus`,action:`get`,alert:e.alert}}function Cu(e){if(e.kind!==`alertWait`)throw new c(`COMMAND_FAILED`,`system.alert wait returned an invalid backend result`);return{kind:`alertWait`,action:`wait`,alert:e.alert,...e.waitedMs===void 0?{}:{waitedMs:e.waitedMs},...e.timedOut===void 0?{}:{timedOut:e.timedOut},...w(e.alert?`Alert visible`:`Alert wait timed out`)}}function wu(e,t){if(t.kind!==`alertHandled`)throw new c(`COMMAND_FAILED`,`system.alert ${e} returned an invalid backend result`);return{kind:`alertHandled`,action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...w(t.handled?`Alert ${e}ed`:`No alert handled`)}}function Tu(e){return!!(e&&typeof e==`object`)}const Eu={back:su,home:cu,orientation:uu,keyboard:du,clipboard:fu,settings:pu,alert:mu,appSwitcher:hu,tvRemote:lu};function Du(e){return{capture:k(xi,e),selectors:zc(e),interactions:Bc(e),system:k(Eu,e),apps:yl(e),admin:k(vl,e),recording:k(ou,e),observability:k(Xl,e)}}var Ou=e({createAgentDevice:()=>ku,createMemorySessionStore:()=>Au,localCommandPolicy:()=>Nu,restrictedCommandPolicy:()=>Pu});function ku(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??Au(),policy:e.policy??Pu(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...Du(t)}}function Au(e=[]){let t=new Map(e.map(e=>[e.name,ju(e)]));return{get:e=>ju(t.get(e)),set:e=>{t.set(e.name,ju(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>ju(e))}}function ju(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:Mu(e.metadata)}:{}}}function Mu(e){try{return structuredClone(e)}catch{return{...e}}}function Nu(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,...e}}function Pu(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,...e}}export{O as C,yt as D,Tt as E,vt as O,bn as S,hn as T,L as _,ds as a,Yr as b,Pa as c,fa as d,ea as f,Vi as g,Ui as h,ls as i,bt as k,V as l,ta as m,Nu as n,us as o,R as p,Ou as r,Na as s,ku as t,z as u,Ti as v,gn as w,Hr as x,I as y};
|