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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{t}from"./timeouts.js";import{t as n}from"./tool-provider2.js";function r(){return process.env.WAYLAND_DISPLAY||process.env.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let i=null;async function a(){let t=n();if(i?.provider===t)return i;let a=r();if(a===`wayland`){if(await t.whichCommand(`ydotool`))return i={tool:`ydotool`,display:a,provider:t},i;throw new e(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await t.whichCommand(`xdotool`))return i={tool:`xdotool`,display:a,provider:t},i;throw new e(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const o=1e4;async function s(...e){await n().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:o})}async function c(...e){await n().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:o})}function l(){return n().input}async function u(e,t){let{tool:n}=await a();n===`xdotool`?await s(`mousemove`,`--sync`,String(e),String(t)):await c(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function d(e,t){let n=l();if(n){await n.key(e,t);return}let{tool:r}=await a();r===`xdotool`?await s(`key`,`--clearmodifiers`,e):await c(`key`,...t)}async function f(e,t,n,r){await u(e,t);let{tool:i}=await a();i===`xdotool`?await s(`click`,n):await c(`click`,r)}async function p(e,t,n,r,i){let a=l();if(a){await a.click(e,t,n);return}await f(e,t,r,i)}async function m(e,t){await p(e,t,`primary`,`1`,`0xC0`)}async function h(e,t){await p(e,t,`secondary`,`3`,`0xC1`)}async function g(e,t){await p(e,t,`middle`,`2`,`0xC2`)}async function _(e,t){let n=l();if(n){await n.doubleClick(e,t);return}let{tool:r}=await a();await u(e,t),r===`xdotool`?await s(`click`,`--repeat`,`2`,`1`):(await c(`click`,`0xC0`),await c(`click`,`0xC0`))}async function v(e,n,r=800){let i=l();if(i){await i.longPress(e,n,r);return}let{tool:o}=await a();await u(e,n),o===`xdotool`?(await s(`mousedown`,`1`),await t(r),await s(`mouseup`,`1`)):(await c(`click`,`--down`,`0xC0`),await t(r),await c(`click`,`--up`,`0xC0`))}async function y(e,t){await m(e,t)}async function b(e,n,r,i,o=300){let d=l();if(d){await d.drag(e,n,r,i,o);return}let{tool:f}=await a();await u(e,n),f===`xdotool`?(await s(`mousedown`,`1`),await s(`mousemove`,`--sync`,String(r),String(i)),await t(o),await s(`mouseup`,`1`)):(await c(`click`,`--down`,`0xC0`),await c(`mousemove`,`--absolute`,`-x`,String(r),`-y`,String(i)),await t(o),await c(`click`,`--up`,`0xC0`))}async function x(e,t){let n=l();if(n)return await n.scroll(e,t),C(t);let{tool:r}=await a(),i=5;if(t?.pixels==null?t?.amount!=null&&(i=Math.max(1,Math.round(5*(t.amount/.6)))):i=r===`xdotool`?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)),r===`xdotool`){let n=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await S(i,t?.durationMs,async e=>{await s(`click`,`--repeat`,String(e),n)})}else e===`up`||e===`down`?await S(i,t?.durationMs,async t=>{await c(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await S(i,t?.durationMs,async t=>{await c(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return C(t)}async function S(e,n,r){if(n===void 0||n<=0||e<=1){await r(e);return}let i=n/Math.max(1,e-1);for(let n=0;n<e;n+=1)await r(1),n<e-1&&await t(i)}function C(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function w(e,t=0){let n=l();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await a();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await s(...n)}else await c(`type`,`--`,e)}async function T(e,n,r,i=0){await m(e,n),await t(100),await d(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await t(50),await w(r,i)}export{_ as doubleClickLinux,T as fillLinux,y as focusLinux,v as longPressLinux,g as middleClickLinux,m as pressLinux,h as rightClickLinux,x as scrollLinux,d as sendKey,b as swipeLinux,w as typeLinux};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./manifest.js";import{n as t,r as n}from"./install-source2.js";import r from"node:path";async function i(e,r){let i=e.kind===`url`&&t(e.url),s=await n({source:e,isInstallablePath:(e,t)=>t.isFile()&&a(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||i,signal:r?.signal});try{let e=r?.resolveIdentity===!1?{}:await o(s.installablePath,r?.signal);return{archivePath:s.archivePath,installablePath:s.installablePath,packageName:e.packageName,cleanup:s.cleanup}}catch(e){throw await s.cleanup(),e}}function a(e){let t=r.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function o(t,n){let i=r.extname(t).toLowerCase();return i!==`.apk`&&i!==`.aab`?{}:{packageName:await e(t,n)}}export{i as prepareAndroidInstallArtifact};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{r as t}from"./byte-limit-stream.js";import{a as n,c as r,n as i,o as a,r as o,s}from"./install-source2.js";import{t as c}from"./plist.js";import l from"node:path";import{promises as u}from"node:fs";import d from"node:os";async function f(e,t){return await r(async()=>await p(e,t))}async function p(t,n){if(t.kind===`url`&&!i(t.url))throw new e(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:t,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:t.kind!==`url`||i(t.url),signal:n?.signal}),a;try{a=await h(r.installablePath,n);let e=a,t=await m(e.installPath,n?.signal);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function m(e,t){let n=l.join(e,`Info.plist`),[r,i,a]=await Promise.all([c(n,`CFBundleIdentifier`,t),c(n,`CFBundleDisplayName`,t),c(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function h(e,t){return e.toLowerCase().endsWith(`.ipa`)?await g(e,t):{installPath:e,cleanup:async()=>{}}}async function g(r,i){let o=await u.mkdtemp(l.join(d.tmpdir(),`agent-device-ios-ipa-`)),c=async()=>{await u.rm(o,{recursive:!0,force:!0})};try{let d=l.join(o,`extracted`),f=a()+1;await t({archivePath:r,outputRoot:d,type:`zip`,budget:n(),depth:f,signal:i?.signal}),s(f);let p=l.join(d,`Payload`),m=(await u.readdir(p,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:l.join(p,e.name),bundleName:e.name.replace(/\.app$/i,``)})),h=m[0];if(h!==void 0&&m.length===1)return{installPath:h.installPath,cleanup:c};if(m.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await _(m,i?.signal);let g=i?.appIdentifierHint?.trim();if(g){let t=v(m,g);if(t)return{installPath:t.installPath,cleanup:c};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload and none matched "${g}". Available bundles: ${m.map(y).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${m.map(y).join(`, `)}`)}catch(e){throw await c(),e}}async function _(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await m(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function v(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function y(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{f as prepareIosInstallArtifact,m as readIosBundleInfo};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as e,P as t,Q as n,R as r}from"./screenshot-result.js";import{i}from"./session-target-evidence.js";import{A as a}from"./sdk-android-adb.js";import{a as o}from"./input-actions.js";import{At as s,kt as c,ot as l,st as u}from"./internal/daemon.js";async function d(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a}=e,s=t.screenRecording?.handle;if(!s)return;let c=s.inspect().touchReferenceFrame;if(c)return c;if(t.device.platform===`android`){let e=await o(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return s.setTouchReferenceFrame(n),n}let l=u(t.snapshot);if(l)return s.setTouchReferenceFrame(l),l;let d=u(await a(t,n,r,i,{interactiveOnly:!0}));return d&&s.setTouchReferenceFrame(d),d}async function f(e){try{return await d(e)}catch(t){a({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:e.session.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function p(e){return u({nodes:e,createdAt:0})}function m(e){let{session:t,sessionStore:r,command:a,positionals:o,actionCommand:u=a,retryPositionals:d,flags:f,result:p,responseData:m,recordedTarget:_,recordedTargets:v,scheduleInteractionOutcomeRetry:y=!0,actionStartedAt:b,actionFinishedAt:x,androidFreshnessBaseline:S}=e,C=s(f),[w,T]=g({command:a,positionals:o,flags:C,result:p,responseData:m}),E=n(t)&&_?i(_):void 0,D=n(t)&&v?h(v):void 0;return r.recordAction(t,{command:a,positionals:o,flags:C??{},result:w,...E?{targetEvidence:E}:{},...D?{targetEvidences:D}:{}}),c({session:t,command:a,action:u,positionals:d??o,flags:f,scheduleOutcomeRetry:y,androidFreshnessBaseline:S}),l(t,u,o,w,C??{},b,x),{ok:!0,data:T}}function h(e){let t=i(e.source),n=i(e.destination);return t&&n?{source:t,destination:n}:void 0}function g(n){if(n.command!==`fill`||typeof n.flags?.recordAs!=`string`)return[n.result,n.responseData];let i=r({ts:0,command:`fill`,positionals:n.positionals,flags:n.flags,result:n.result}),a=e(n.flags.recordAs);return[t(n.result,i,a),t(n.responseData,i,a)]}export{p as n,f as r,m as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{_ as t}from"./sdk-device.js";import{i as n}from"./mobile-snapshot-semantics.js";import{t as r}from"./runtime.js";import{j as i}from"./runner-disposal.js";import{i as a,n as o,r as s,t as c}from"./dispatch.js";import{n as l}from"./provider.js";import{bt as u,ft as d,gt as f}from"./internal/daemon.js";import{a as p,b as m,f as h,m as g,u as _}from"./selector-runtime.js";import{a as v}from"./snapshot-session.js";async function y(e){let{session:t,node:r,rootViewport:i,requestOptions:a}=e,o=_(r);if(!o)return null;let s;try{s=await p(t,o,a)}catch{return null}if(!s.found||!s.node?.rect)return null;let c={rect:s.node.rect,hittable:s.node.hittable===!0};return n(c,i)?c.rect:null}function b(t){let n=t.sessionStore.get(t.sessionName);if(!n)throw new e(`SESSION_NOT_FOUND`,a);return r({backend:x({...t,session:n}),...v(`interaction commands`,{plural:!0}),sessions:d({sessionName:t.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:t.req.internal?.findResolvedTarget!==void 0},setRecord:e=>{e.snapshot&&(f(n,e.snapshot),t.sessionStore.set(t.sessionName,n))}}),signal:i(t.req.meta?.requestId)})}function x(e){let{req:n,session:r}=e,i=S(r);return{platform:t(r.device),captureSnapshot:async(t,i)=>({snapshot:await e.captureSnapshotForSession(r,n.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,preferredBackend:i?.preferredBackend,includeRects:i?.includeRects===!0,signal:t.signal})}),resolveGestureViewport:async()=>e.pairedGestureViewport??await s(r.device,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)),confirmOffscreenTargetVisible:h(r,{skipPendingPostGestureStabilization:!1})?async(t,i,a)=>await y({session:r,node:i,rootViewport:a,requestOptions:g({req:n,logPath:e.logPath,traceLogPath:r.trace?.outPath})}):void 0,tap:async(t,i)=>(u(r),C(await c(r.device,`press`,[String(i.x),String(i.y)],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),tapTarget:i?.clickRef?async(e,t)=>(u(r),await i.clickRef?.(t.ref),{ref:m(t.ref)}):void 0,fill:async(t,i,a,o)=>(u(r),C(await c(r.device,`fill`,[String(i.x),String(i.y),a],n.flags?.out,{...e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath),allowNonHittableCoordinateFallback:o?.allowNonHittableCoordinateFallback}))),fillTarget:i?.fillRef?async(e,t,n,a)=>(u(r),await i.fillRef?.(t.ref,n,a),{ref:m(t.ref),text:n,delayMs:a?.delayMs??0}):void 0,longPress:async(t,i,a)=>(u(r),C(await c(r.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),hoverTarget:i?.hoverRef?async(e,t)=>(u(r),await i.hoverRef?.(t.ref),{ref:m(t.ref)}):void 0,hover:async(t,i)=>(u(r),C(await c(r.device,`hover`,[String(i.x),String(i.y)],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),performGesture:async(t,i)=>(u(r),C(await o(r.device,i,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),typeText:async(t,i)=>(u(r),C(await c(r.device,`type`,[i],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath))))}}function S(e){if(e.device.platform!==`web`)return;let t=l();return t.clickRef||t.fillRef||t.hoverRef?t:void 0}function C(e){return e&&typeof e==`object`?e:void 0}export{b as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./verdict.js";import{gt as t,wt as n}from"./internal/daemon.js";import{t as r}from"./backend-snapshot-options.js";async function i(i,a,o,s,c){let l={...a??{},...r(c)},u=s(l,i.appBundleId,i.trace?.outPath),{snapshot:d}=await n({device:i.device,session:i,flags:l,outPath:l.out,logPath:u.logPath??``,includeRects:c.includeRects,androidFreshnessMode:c.androidFreshnessMode,signal:c.signal});return e(d.snapshotQuality)||(t(i,d),o.set(i.name,i)),d}export{i as t};
|
package/dist/src/manifest.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t}from"./sdk-android-adb.js";import{t as n}from"./sdk.js";import r from"node:path";import{TextDecoder as i}from"node:util";import a from"node:fs/promises";const o=new i(`utf-16le`);let s;async function c(e,t){for(let n of[`AndroidManifest.xml`,`base/manifest/AndroidManifest.xml`]){let r=await l(e,n,t);if(!r)continue;let i=u(r);if(i)return i}return await y(e,t)}async function l(t,n,r){try{let i=await e(`unzip`,[`-p`,t,n],{allowFailure:!0,binaryStdout:!0,signal:r});return i.exitCode!==0||!i.stdoutBuffer||i.stdoutBuffer.length===0?void 0:i.stdoutBuffer}catch{r?.throwIfAborted();return}}function u(e){return e.subarray(0,Math.min(e.length,128)).toString(`utf8`).trimStart().startsWith(`<`)?d(e.toString(`utf8`)):f(e)}function d(e){return e.match(/<manifest\b[^>]*\bpackage\s*=\s*["']([^"']+)["']/i)?.[1]}function f(e){if(e.length<8||e.readUInt16LE(0)!==3)return;let t;for(let n=e.readUInt16LE(2);n+8<=e.length;){let r=e.readUInt16LE(n),i=e.readUInt16LE(n+2),a=e.readUInt32LE(n+4);if(a<=0||n+a>e.length)return;if(r===1)t=m(e.subarray(n,n+a));else if(r===258&&t){let r=p(e,n,i,t);if(r)return r}n+=a}}function p(e,t,n,r){if(n<36||t+n>e.length||r[e.readUInt32LE(t+20)]!==`manifest`)return;let i=e.readUInt16LE(t+24),a=e.readUInt16LE(t+26),o=e.readUInt16LE(t+28),s=t+i;for(let t=0;t<o;t+=1){let n=s+t*a;if(n+20>e.length)return;if(r[e.readUInt32LE(n+4)]!==`package`)continue;let i=e.readUInt32LE(n+8);if(i!==4294967295)return r[i];let o=e.readUInt8(n+15),c=e.readUInt32LE(n+16);return o===3?r[c]:void 0}}function m(e){if(e.length<28)return[];let t=e.readUInt32LE(8),n=e.readUInt32LE(16),r=e.readUInt32LE(20),i=(n&256)!=0,a=[];for(let n=0;n<t;n+=1){let t=28+n*4;if(t+4>e.length)return a;let o=r+e.readUInt32LE(t);a.push(i?h(e,o):g(e,o))}return a}function h(e,t){let[,n]=_(e,t),[r,i]=_(e,t+n),a=t+n+i;return e.subarray(a,a+r).toString(`utf8`)}function g(e,t){let[n,r]=v(e,t),i=t+r;return o.decode(e.subarray(i,i+n*2))}function _(e,t){let n=e.readUInt8(t);if(!(n&128))return[n,1];let r=e.readUInt8(t+1);return[(n&127)<<8|r,2]}function v(e,t){let n=e.readUInt16LE(t);if(!(n&32768))return[n,2];let r=e.readUInt16LE(t+2);return[(n&32767)<<16|r,4]}async function y(t,n){n?.throwIfAborted();let r=await b();if(!r)return;let i=await e(r,[`dump`,`badging`,t],{allowFailure:!0,signal:n});if(i.exitCode===0)return i.stdout.match(/package:\s+name='([^']+)'/)?.[1]}async function b(){if(s!==void 0)return s??void 0;try{for(let e of n()){let n=r.join(e,`build-tools`);try{let e=(await a.readdir(n)).sort((e,t)=>t.localeCompare(e,void 0,{numeric:!0}));for(let i of e){let e=r.join(n,i,`aapt`);if(r.isAbsolute(e)&&await t(e))return s=e,e}}catch{}}}catch{}s=null}export{c as t};
|
package/dist/src/method-scope.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e,t){return new Proxy(e,{get(e,n,r){let i=Reflect.get(e,n,r);return typeof i==`function`?(...n)=>t(async()=>await i.apply(e,n)):i}})}export{e as t};
|
package/dist/src/png-resize.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,_ as t}from"./sdk-contracts.js";import{b as n}from"./location-coordinates.js";import{A as r}from"./sdk-android-adb.js";import{a as i,i as a,n as o,r as s,t as c}from"./png-worker-contract.js";import l from"node:path";import u,{promises as d}from"node:fs";import{fileURLToPath as f}from"node:url";import{Worker as p}from"node:worker_threads";function m(e,t){try{let n=f(e),r=l.extname(n)||`.js`;return[l.join(l.dirname(n),`${t}${r}`),l.join(l.dirname(n),`internal`,`${t}${r}`)].find(e=>u.existsSync(e))??null}catch{return null}}var h=class extends Error{};let g=null,_=!1,v=!1,y=0;const b=new Map;function x(e){_=!0,!v&&(v=!0,r({level:`warn`,phase:`png_worker_unavailable`,data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function S(n){let r=b.get(n.id);r&&(b.delete(n.id),T(),n.ok?r.resolve(n.result):r.reject(new t(e(n.error.code),n.error.message,n.error.details)))}function C(e,t){g===e&&(x(t.message),g=null,e.terminate().catch(()=>{}),w(new h(`PNG worker failed: ${t.message}`)))}function w(e){let t=[...b.values()];b.clear();for(let n of t)n.reject(e)}function T(){g&&(b.size>0?g.ref():g.unref())}function E(){if(_)return null;if(g)return g;let e=m(import.meta.url,`png-worker`);if(!e)return x(`worker entry module not found next to the current module`),null;try{let t=new p(e,{execArgv:e.endsWith(`.ts`)?[`--experimental-strip-types`]:[]});return t.on(`message`,S),t.on(`error`,e=>{C(t,e)}),t.on(`exit`,e=>{C(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),g=t,t}catch(e){return x(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}function D(e){let t=E();if(!t)return Promise.reject(new h(`PNG worker is unavailable`));y+=1;let n=y;return new Promise((r,i)=>{b.set(n,{resolve:r,reject:i}),T();try{t.postMessage({...e,id:n})}catch(e){b.delete(n),T(),i(new h(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}async function O(e,t){try{return await D(e)}catch(e){if(e instanceof h)return t();throw e}}function k(){E()}async function A(){let e=g;g=null,w(new h(`PNG worker terminated`)),e&&await e.terminate()}async function j(e,t){let n=await O({kind:`decode`,png:e,label:t},()=>{let n=a(e,t);return{kind:`decode`,width:n.width,height:n.height,data:n.data}}),r=new i.PNG({width:n.width,height:n.height});return r.data=c(n.data),r}async function M(e){return c((await O({kind:`encode`,width:e.width,height:e.height,data:e.data},()=>({kind:`encode`,png:i.PNG.sync.write(e)}))).png)}async function N(e,t,n){let{kind:r,...i}=await O({kind:`rgb-difference`,firstPng:e,secondPng:t,label:n},()=>({kind:`rgb-difference`,...o(a(e,n),a(t,n))}));return i}async function P(e){let{kind:t,...n}=await O({kind:`diff-pixels`,...e},()=>({kind:`diff-pixels`,...s(e)}));return{...n,diffData:c(n.diffData)}}async function F(e,r){let{min:i,max:a}=n;if(!Number.isFinite(r)||r<i||r>a)throw new t(`INVALID_ARGS`,`Screenshot scale must be between ${i} and ${a}`);if(r===1)return;let o=await j(await d.readFile(e),`screenshot`),s=Math.max(1,Math.round(o.width*r)),c=Math.max(1,Math.round(o.height*r));await d.writeFile(e,await M(L(o,s,c)))}async function I(e,n,r){if(!Number.isInteger(n)||n<1||!Number.isInteger(r)||r<1)throw new t(`INVALID_ARGS`,`Screenshot resize dimensions must be positive integers`);let i=await j(await d.readFile(e),`screenshot`);i.width===n&&i.height===r||await d.writeFile(e,await M(L(i,n,r)))}function L(e,t,n){let r=new i.PNG({width:t,height:n});for(let i=0;i<n;i+=1){let a=i*e.height/n,o=(i+1)*e.height/n;for(let n=0;n<t;n+=1){let s=n*e.width/t,c=(n+1)*e.width/t,l=0,u=0,d=0,f=0,p=0;for(let t=Math.floor(a);t<Math.ceil(o);t+=1){let n=Math.min(t+1,o)-Math.max(t,a);for(let r=Math.floor(s);r<Math.ceil(c);r+=1){let i=n*(Math.min(r+1,c)-Math.max(r,s)),a=(t*e.width+r)*4;l+=(e.data[a]??0)*i,u+=(e.data[a+1]??0)*i,d+=(e.data[a+2]??0)*i,f+=(e.data[a+3]??0)*i,p+=i}}let m=(i*r.width+n)*4;r.data[m]=Math.round(l/p),r.data[m+1]=Math.round(u/p),r.data[m+2]=Math.round(d/p),r.data[m+3]=Math.round(f/p)}}return r}export{j as a,A as c,P as i,F as n,M as o,N as r,k as s,I as t};
|
package/dist/src/process-lock.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{t}from"./timeouts.js";import{t as n}from"./owner-identity.js";import r from"node:path";import i from"node:fs";async function a(n){let{lockDirPath:a,owner:c}=n,u=r.join(a,`owner.json`),d=Date.now()+(n.timeoutMs??3e4),f=n.pollMs??100,p=n.ownerGraceMs??5e3,m=n.description??`process lock`;for(i.mkdirSync(r.dirname(a),{recursive:!0});Date.now()<d;)try{i.mkdirSync(a),o(u,c);let e=!1;return async()=>{e||(e=!0,i.rmSync(a,{recursive:!0,force:!0}))}}catch(e){let n=e;if(n.code!==`EEXIST`)throw n;if(s(a,u,p))continue;await t(f)}throw new e(`COMMAND_FAILED`,`Timed out waiting for ${m}`,{lockDirPath:a,...l(a,u)})}function o(e,t){let n=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(n,JSON.stringify(t),`utf8`),i.renameSync(n,e)}function s(e,t,n){let r=null;try{r=i.statSync(e)}catch{return!0}let a=c(t);return a?u(a)?!1:(i.rmSync(e,{recursive:!0,force:!0}),!0):Date.now()-r.mtimeMs<n?!1:(i.rmSync(e,{recursive:!0,force:!0}),!0)}function c(e){try{return JSON.parse(i.readFileSync(e,`utf8`))}catch{return null}}function l(e,t){let r=Date.now(),a=c(t),o;try{o=Math.max(0,Math.round(r-i.statSync(e).mtimeMs))}catch{}return{...o===void 0?{}:{lockAgeMs:o},...a?{ownerPid:a.pid,ownerStartTime:a.startTime,ownerAgeMs:Math.max(0,Math.round(r-a.acquiredAtMs)),ownerLiveness:n({owner:a})}:{}}}function u(e){let t=n({owner:e});return t!==`owner-process-dead`&&t!==`owner-process-reused`}export{a as t};
|
package/dist/src/runner-lease.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{A as n}from"./sdk-android-adb.js";import{c as r,n as i,s as a}from"./host-process.js";import{t as o}from"./owner-identity.js";import{t as s}from"./process-lock.js";import c from"node:path";import l from"node:crypto";import u from"node:fs";import d from"node:os";var f=e({RUNNER_OWNER_START_TIME:()=>m,RUNNER_OWNER_TOKEN:()=>h,buildDetachedRunnerLease:()=>N,buildRunnerLease:()=>_,cleanupOwnedRunnerLease:()=>P,cleanupRunnerLeasesForOwner:()=>F,prepareRunnerLeaseForStartup:()=>S,readStaleRunnerLease:()=>M,releaseRunnerLease:()=>I,setRunnerLeaseOwnerStateDir:()=>v,verifyLeaseRunnerPidIdentity:()=>Z,withRunnerLeaseLock:()=>y,writeRunnerLease:()=>L});const p=process.pid,m=r(process.pid),h=$(p,m);let g;function _(e){return{schemaVersion:1,deviceId:e.deviceId,ownerToken:h,ownerPid:p,ownerStartTime:m,ownerStateDir:E(),sessionId:e.sessionId,runnerPid:e.runnerPid??null,runnerStartTime:e.runnerPid?r(e.runnerPid):null,port:e.port,xctestrunPath:e.xctestrunPath,jsonPath:e.jsonPath,createdAtMs:Date.now()}}function v(e){g=e?.trim()||void 0}async function y(e,t){let n=await s({lockDirPath:`${z(e)}.lock`,owner:{pid:p,startTime:m,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await n()}}function b(e){try{return U(JSON.parse(u.readFileSync(z(e),`utf8`)),e)}catch{return null}}function x(e){if(!e)return{type:`empty`};if(e.ownerToken===h)return{type:`owned`,lease:e};let t=o({owner:{pid:e.ownerPid,startTime:e.ownerStartTime},...e.ownerStateDir?{stateDir:e.ownerStateDir}:{}});return t!==`live`&&t!==`unknown`?{type:`stale`,lease:e,staleReason:t}:{type:`busy`,lease:e}}async function S(e,n,r){let i=x(b(e));if(i.type===`empty`){await n.cleanupRunnerXcodebuildProcesses(e,void 0);return}if(i.type===`busy`){if(C(i.lease)){await Y(i.lease,`same-state-dir`,n);return}if(w(i.lease,r)){await Y(i.lease,`logical-lease-takeover`,n);return}throw new t(`COMMAND_FAILED`,r?`iOS runner for ${e} is busy after device lease admission`:`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,logicalLeaseContext:r,ownerPid:i.lease.ownerPid,ownerStartTime:i.lease.ownerStartTime,ownerStateDir:i.lease.ownerStateDir,ownerToken:i.lease.ownerToken,sessionId:i.lease.sessionId,hint:D(i.lease,r)})}await Y(i.lease,i.type,n)}function C(e){let t=E();return!t||!e.ownerStateDir?!1:c.resolve(t)===c.resolve(e.ownerStateDir)}function w(e,t){return!t||t.leaseProvider!==`proxy`||!t.leaseId||!t.clientId?!1:T(t.deviceKey,e.deviceId)}function T(e,t){if(!e)return!1;if(e===t)return!0;let[,,n]=e.split(`:`,3);return n===t}function E(){return g||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}function D(e,t){let n=O(e),r=k(e);return t?[r,n,`The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission.`,`Retry after the owning session closes or after the five-minute inactivity lease expires.`].join(` `):[r,n,`If the runner is still active, wait for it to finish. Do not run prepare ios-runner from another daemon/client to recover this.`].join(` `)}function O(e){let t=`Runner owner: PID ${e.ownerPid}`;return e.ownerStateDir?`${t} with AGENT_DEVICE_STATE_DIR=${e.ownerStateDir}`:`${t}.`}function k(e){return e.ownerStateDir?`If it is stuck, stop the owning agent-device daemon for ${A(`AGENT_DEVICE_STATE_DIR`,e.ownerStateDir)} and retry.`:`If it is stuck, stop the owning agent-device daemon and retry.`}function A(e,t){return`${e}=${j(t)}`}function j(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function M(e){let t=x(b(e));return t.type===`stale`&&(t.staleReason===`owner-process-dead`||t.staleReason===`owner-process-reused`)?t.lease:null}function N(e){return{...e,ownerToken:`detached-${e.ownerToken}`}}async function P(e,t){let n=x(b(e));n.type===`owned`&&await Y(n.lease,`owned`,t)}async function F(e,t){if(!Number.isInteger(e.pid)||e.pid<=0)return;let n=V(e);await Promise.all(n.map(async e=>{await Y(e,`owned`,t)}))}function I(e){e&&R({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function L(e){let t=z(e.deviceId);u.mkdirSync(c.dirname(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;u.writeFileSync(n,JSON.stringify(e,null,2),`utf8`),u.renameSync(n,t)}function R(e){let t=b(e.deviceId);if(t&&!(e.ownerToken&&t.ownerToken!==e.ownerToken)&&!(e.sessionId&&t.sessionId!==e.sessionId))try{u.unlinkSync(z(e.deviceId))}catch{}}function z(e){return c.join(B(),`${ee(e)}.json`)}function B(){let e=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim();return e?c.resolve(e):c.join(d.homedir(),`.agent-device`,`apple-runner`,`leases`)}function V(e){let t,n=B();try{t=u.readdirSync(n,{withFileTypes:!0})}catch{return[]}let r=[];for(let i of t){if(!i.isFile()||!i.name.endsWith(`.json`))continue;let t=H(c.join(n,i.name));t&&t.ownerPid===e.pid&&(e.startTime!==void 0&&t.ownerStartTime!==e.startTime||r.push(t))}return r}function H(e){try{let t=JSON.parse(u.readFileSync(e,`utf8`)),n=G(t.deviceId);return n?U(t,n):null}catch{return null}}function U(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;if(n.schemaVersion!==1||n.deviceId!==t)return null;let r=W(n);return r?{schemaVersion:1,deviceId:t,...r,ownerStartTime:K(n.ownerStartTime),ownerStateDir:K(n.ownerStateDir)??void 0,runnerPid:q(n.runnerPid),runnerStartTime:K(n.runnerStartTime)}:null}function W(e){let t={ownerToken:G(e.ownerToken),ownerPid:q(e.ownerPid),sessionId:G(e.sessionId),port:q(e.port),xctestrunPath:G(e.xctestrunPath),jsonPath:G(e.jsonPath),createdAtMs:J(e.createdAtMs)};return Object.values(t).some(e=>e===null)?null:t}function G(e){return typeof e==`string`&&e.length>0?e:null}function K(e){return typeof e==`string`?e:null}function q(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:null}function J(e){return typeof e==`number`&&Number.isFinite(e)?e:null}async function Y(e,t,r){n({level:t===`stale`||t===`same-state-dir`||t===`logical-lease-takeover`?`warn`:`debug`,phase:`ios_runner_lease_cleanup`,data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(X(e),`SIGTERM`),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(X(e),`SIGKILL`),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),I(e)}function X(e){let t=e.runnerPid??void 0;if(!(!t||!i(t))){if(Z(e,t))return t;n({level:`warn`,phase:`ios_runner_lease_recycled_pid_skipped`,data:{deviceId:e.deviceId,runnerPid:t,runnerStartTime:e.runnerStartTime??null,sessionId:e.sessionId}})}}function Z(e,t){return e.runnerStartTime?r(t)===e.runnerStartTime:Q(a(t))}function Q(e){return!!e&&e.includes(`xcodebuild`)&&e.includes(`AgentDeviceRunner`)}function $(e,t){let n=l.createHash(`sha256`);return n.update(String(e)),n.update(`\0`),n.update(t??`unknown-start`),`owner-${e}-${n.digest(`hex`).slice(0,8)}`}function ee(e){return e.replaceAll(/[^A-Za-z0-9._-]/g,`-`)||`unknown-device`}export{S as a,f as c,y as d,L as f,P as i,v as l,N as n,M as o,_ as r,I as s,h as t,Z as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{A as t,_ as n}from"./sdk-contracts.js";var r=e({MAX_RUNNER_SEQUENCE_STEPS:()=>20,SEQUENCEABLE_RUNNER_STEP_KINDS:()=>i,buildRunnerSequenceCommand:()=>u,parseRunnerSequenceResult:()=>d,validateRunnerSequenceSteps:()=>s});const i=[`tap`,`doubleTap`,`longPress`];function a(e){return typeof e==`string`&&i.includes(e)}function o(e,t,r){return new n(`INVALID_ARGS`,r,{stepIndex:e,kind:typeof t==`string`?t:void 0})}function s(e){if(!Array.isArray(e)||e.length===0)throw new n(`INVALID_ARGS`,`sequence requires at least one step`,{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new n(`INVALID_ARGS`,`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});e.forEach((e,t)=>c(e,t))}function c(e,t){if(!a(e.kind))throw o(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${i.join(`, `)}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw o(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);e.durationMs!==void 0&&l(e.durationMs,0,1e4,t,e.kind,`durationMs`),e.pauseMs!==void 0&&l(e.pauseMs,0,1e4,t,e.kind,`pauseMs`)}function l(e,t,n,r,i,a){if(!Number.isFinite(e)||e<t||e>n)throw o(r,i,`sequence step ${r} (${i}) ${a} must be between ${t} and ${n}`)}function u(e,t){return s(e),{command:`sequence`,steps:e,appBundleId:t}}function d(e){let t=p(e.sequenceResults),n=typeof e.completedSteps==`number`&&Number.isFinite(e.completedSteps)?e.completedSteps:t.filter(e=>e.ok).length,r=typeof e.failedStepIndex==`number`&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:t.findIndex(e=>!e.ok)>=0?t.findIndex(e=>!e.ok):void 0;if(r!==void 0)throw f(t,n,r);return{results:t,completedSteps:n,failedStepIndex:r}}function f(e,r,i){let a=e[i],o=a?.kind??`step`,s=a?.errorMessage??`sequence step ${i} (${o}) failed`;return new n(t(a?.errorCode),s,{failedStepIndex:i,failedStepKind:o,completedSteps:r,sequenceResults:e,hint:`Run snapshot -i to inspect the current UI, then continue from the observed state.`})}function p(e){return Array.isArray(e)?e.map(e=>{let t=e??{};return{ok:t.ok===!0,kind:typeof t.kind==`string`?t.kind:`unknown`,errorCode:typeof t.errorCode==`string`?t.errorCode:void 0,errorMessage:typeof t.errorMessage==`string`?t.errorMessage:void 0,gestureStartUptimeMs:typeof t.gestureStartUptimeMs==`number`?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:typeof t.gestureEndUptimeMs==`number`?t.gestureEndUptimeMs:void 0}}):[]}export{d as n,r,u as t};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import{E as e,_ as t,d as n,f as r,g as i,h as a,j as o,p as s,u as c}from"./sdk-contracts.js";import{C as l,S as u,_ as d,m as f}from"./location-coordinates.js";import{Ar as p,Cr as m,Dn as h,Dr as g,En as _,Fn as v,Hn as y,In as ee,Jr as b,Lt as te,Mn as ne,Mr as re,Nn as ie,Pn as ae,Rn as oe,Rt as se,Sr as ce,Tr as le,Un as ue,Ut as de,_r as x,ar as fe,br as pe,cr as me,dn as he,gn as ge,hn as _e,ir as ve,kn as ye,kr as be,ln as S,mn as xe,mr as Se,or as Ce,pn as we,pr as Te,rr as Ee,sr as De,un as Oe,vr as ke,wr as Ae,yr as je}from"./sdk-batch-runner.js";import{p as Me,r as Ne}from"./sdk-device.js";import{n as Pe}from"./snapshot-scope.js";import{r as Fe}from"./recording-export-quality.js";import{S as Ie,b as Le,d as Re,f as ze,g as Be,t as Ve,u as He}from"./interaction.js";import{n as Ue,o as We,r as Ge,t as Ke}from"./mobile-snapshot-semantics.js";import{n as qe,t as Je}from"./verdict.js";import"./device.js";import{n as Ye}from"./path-resolution.js";import Xe from"node:path";import{styleText as Ze}from"node:util";import{createHash as Qe}from"node:crypto";import $e from"node:fs";const et=3e5,tt=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function nt(e){return b({tenantId:e.meta?.tenantId??C(e.flags,`tenant`),runId:e.meta?.runId??C(e.flags,`runId`),leaseId:e.meta?.leaseId??C(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??C(e.flags,`leaseProvider`)??C(e.flags,`provider`),deviceKey:e.meta?.deviceKey??C(e.flags,`deviceKey`),clientId:e.meta?.clientId??C(e.flags,`clientId`)})}function rt(e){return b({tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs??e.ttlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider??e.provider,deviceKey:e.deviceKey,clientId:e.clientId})}function it(e){return b({tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function at(e){return b({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function ot(e){return b({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function st(e){return pt(e)}function ct(e){let{ttlMs:t,...n}=pt(e);return n}function lt(e,t,n){let r=b({...n.includeTokenParam?{token:n.token}:{},session:n.session,tenantId:e.tenantId,runId:e.runId,leaseProvider:e.leaseProvider,clientId:e.clientId,deviceKey:e.deviceKey});switch(t){case`lease_allocate`:return{...r,...b({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...b({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...b({leaseId:e.leaseId})}}}function ut(e){let t=b({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function dt(e){return e.leaseProvider===`proxy`}function ft(e){return dt(e)?tt.filter(t=>!e[t]):[]}function pt(e){return b({leaseId:e.leaseId??``,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function C(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function w(e){return e?{message:e}:{}}function mt(e,t){return t?{...e,message:t}:e}function ht(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}function gt(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function _t(e,t,n){return{deviceId:t,deviceName:n,...Me(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function vt(e,t={}){let n=t.includeSerial??!0,r=yt(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function yt(e){return Me(e.platform)?e.identifiers.serial??e.id:void 0}function bt(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...vt(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function xt(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function St(e){return e.bundleId??e.package??e.app}function Ct(e){return mt({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${St(e)}`)}function wt(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function Tt(e){return mt({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${wt(e)}`)}function Et(e){let t=e.appName??e.appBundleId??e.session;return mt({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?vt(e.device):{},...e.snapshot?{snapshot:e.snapshot}:{},...e.initialSnapshotError?{initialSnapshotError:e.initialSnapshotError}:{}},t?`Opened: ${t}`:`Opened`)}function Dt(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...w(e.session?`Closed: ${e.session}`:`Closed`)}}function Ot(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...f(kt(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.fallbackScreenshotPath?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function kt(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}const At=[`app`,`device`,`system`];function jt(e){return e===`device`||e===`system`}function T(e){return e.startsWith(`@`)?a(e)?.base??e:e}const Mt=/^-?\d+(\.\d+)?$/,Nt=/^[^\s"\\]+$/,Pt=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),Ft=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),It=new Map([[`--pointer-count`,`pointerCount`]]),Lt=new Map([[`--delay-ms`,`delayMs`]]);function E(e){return e===`click`||e===`press`}function Rt(e){return E(e)||e===`longpress`||e===`hover`}function zt(e){return e===`type`||e===`fill`}function D(e){return Vt(e,Ht)}function Bt(e){return JSON.stringify(e)}function O(e){return Vt(e,Ut)}function Vt(e,t){return t(e)?e:Bt(e)}function Ht(e){return Ut(e)&&e.startsWith(`@`)||Mt.test(e)}function Ut(e){return Nt.test(e)}const Wt=new Set([`fill`,`type`]);function Gt(e){if(!Wt.has(e.command)){let t=(e.positionals??[]).map(e=>D(e));return[e.command,...t].join(` `)}let t=Kt(e).map(e=>D(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function Kt(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&Mt.test(n)&&Mt.test(t[1]??``)?[n,t[1]]:[n]}function qt(e,t){let n=t.flags??{};if(E(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}zt(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function Jt(e,t){t&&((t.platform===`ios`||t.platform===`android`)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,O(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,O(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,O(t.launchUrl)))}function Yt(e,t){let[n,...r]=t.positionals??[];n&&e.push(O(n));for(let t of r)e.push(D(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function Xt(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,D(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function Zt(e,t){for(let n of t.positionals??[])e.push(D(n));u(e,t.flags)}function Qt(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(O(t));Jt(e,t.flags)}function $t(e,t){for(let n of t.positionals??[])e.push(D(t.command===`wait`?T(n):n));qt(e,t)}function en(e,t){let n=[],r={},i=E(e)?Pt:e===`swipe`?Ft:e===`gesture`?It:zt(e)?Lt:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(E(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(E(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=nn(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function tn(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;(e===`ios`||e===`android`)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=nn(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function nn(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function rn(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function an(e,t){for(let n of t.positionals??[])e.push(D(n));t.flags?.relaunch&&e.push(`--relaunch`),t.flags?.testIme===!0?e.push(`--test-ime`):t.flags?.testIme===!1&&e.push(`--no-test-ime`),Jt(e,t.runtime)}function on(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}if(r===`--test-ime`){n.testIme=!0;continue}if(r===`--no-test-ime`){n.testIme=!1;continue}t.push(r)}let r=tn(t);return{positionals:r.positionals,flags:n,runtime:sn(r.flags)?r.flags:void 0}}function sn(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const cn=/^[A-Z_][A-Z0-9_]*$/,ln=new Set(Ne.filter(e=>e!==`web`)),un=new Set([`mobile`,`tv`,`desktop`]);function dn(e){let n=[],r=[],i=e.split(/\r?\n/),a=!1,o,s=(e,n,r)=>{throw new t(`INVALID_ARGS`,`${e.kind===`multiple`?`targets-v1`:`target-v1`} annotation on line ${e.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[e,c]of i.entries()){let i=c.trim();if(i.length===0){o&&s(o,e,`is blank`);continue}if(i.startsWith(`#`)){let t=y(i);if(t.kind===`v1`){o&&s(o,e,`is another target annotation`),o={kind:`multiple`,evidence:t.evidence,line:e+1};continue}let n=ue(i);if(n.kind===`v1`){o&&s(o,e,`is another target annotation`),o={kind:`single`,evidence:n.evidence,line:e+1};continue}o&&s(o,e,`is a comment`);continue}if(pn(i)){if(o&&s(o,e,`is an env directive`),a)throw new t(`INVALID_ARGS`,`env directives must precede all actions (line ${e+1}).`);continue}let l=vn(c);if(!l){o&&s(o,e,`did not parse as an action`);continue}let u=Ie(l.command,l.positionals??[],`line ${e+1}`);if(u)throw new t(`INVALID_ARGS`,u);o&&=(o.kind===`single`?l.targetEvidence=o.evidence:l.targetEvidences=o.evidence,void 0),n.push(l),r.push(e+1),a=!0}if(o)throw new t(`INVALID_ARGS`,`${o.kind===`multiple`?`targets-v1`:`target-v1`} annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`);return{actions:n,actionLines:r}}function fn(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(pn(t)){gn(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&ln.has(e)&&_n(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&un.has(e)&&_n(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&_n(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&_n(n,`retries`,Math.floor(e))}}return n}function pn(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function mn(e,n){let r=e.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new t(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!cn.test(a))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:hn(r.slice(i+1),n)}}function hn(e,n){if(e.length===0)return``;if(e.startsWith(`"`))try{let t=JSON.parse(e);if(typeof t!=`string`)throw Error(`not a string literal`);return t}catch{throw new t(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return e}function gn(e,n,r){let{key:i,value:a}=mn(n,r),o=e.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new t(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,e.env=o}function _n(e,n,r){let i=e[n];if(i!==void 0)throw new t(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);e[n]=r}function vn(e){let n=e.trim();if(n.length===0||n.startsWith(`#`))return null;let[r,...i]=xn(n);if(r===void 0||r===`context`)return null;let a={ts:Date.now(),command:r,positionals:[],flags:{}};if(r===`snapshot`){a.positionals=[];for(let e=0;e<i.length;e+=1){let t=i[e];if(t===`-i`){a.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){a.flags.snapshotRaw=!0;continue}if(t===`--force-full`){a.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<i.length){let t=Number(i[e+1]);Number.isFinite(t)&&t>=0&&(a.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<i.length){a.flags.snapshotScope=i[e+1],e+=1;continue}if(t===`--backend`&&e+1<i.length){e+=1;continue}}}return a}if(r===`open`){let e=on(i);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a.runtime=e.runtime,a}if(r===`runtime`){let e=tn(i);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a}if(E(r)){let e=en(r,i);Object.assign(a.flags,e.flags);let t=e.positionals[0];if(t===void 0)return a;if(t.startsWith(`@`))return a.positionals=[T(t)],e.positionals[1]&&(a.result={refLabel:e.positionals[1]}),a;let n=e.positionals[0],o=e.positionals[1];return bn(n)&&bn(o)&&e.positionals.length>=2?(a.positionals=[n,o],a):(a.positionals=[e.positionals.join(` `)],a)}if(r===`fill`){let e=en(r,i);if(Object.assign(a.flags,e.flags),!yn(e.positionals))return a.positionals=e.positionals,a;let[t,n,...o]=e.positionals;if(bn(t)&&bn(n))return a.positionals=[t,n,o.join(` `)],a;let[s,c,...l]=e.positionals;if(s.startsWith(`@`)){let e=T(s);return l.length>0?(a.positionals=[e,l.join(` `)],a.result={refLabel:c},a):(a.positionals=[e,c],a)}return a.positionals=[s,[c,...l].join(` `)],a}if(r===`get`){let e=i[0],t=i[1];return e===void 0||t===void 0?(a.positionals=i,a):t.startsWith(`@`)?(a.positionals=[e,T(t)],i[2]&&(a.result={refLabel:i[2]}),a):(a.positionals=[e,i.slice(1).join(` `)],a)}if(r===`swipe`||r===`type`||r===`gesture`){let e=en(r,i);return Object.assign(a.flags,e.flags),a.positionals=e.positionals,a}if(r===`record`){let e=[];for(let n=0;n<i.length;n+=1){let r=i[n];if(r===d.cliToken)throw new t(`INVALID_ARGS`,d.migration.record);if(r===`--hide-touches`){a.flags.hideTouches=!0;continue}if(r===`--fps`&&n+1<i.length){let e=Number(i[n+1]);Number.isFinite(e)&&(a.flags.fps=Math.floor(e)),n+=1;continue}if(r===`--quality`&&n+1<i.length){let e=i[n+1],t=Fe(e);t!==void 0&&(a.flags.quality=t),n+=1;continue}e.push(r)}return a.positionals=e,a}if(r===`screenshot`){let e=[];for(let t=0;t<i.length;t+=1){let n=i[t],r=l({args:i,index:t,flags:a.flags});if(r.handled){t=r.nextIndex;continue}e.push(n)}return a.positionals=e,a}return a.positionals=r===`wait`||r===`longpress`||r===`hover`?i.map(e=>T(e)):i,a}function yn(e){return e.length>=2}function bn(e){return e?!Number.isNaN(Number(e)):!1}function xn(e){let t=[],n=0;for(;n<e.length&&(n=Sn(e,n),!(n>=e.length));){let r=e[n]===`"`?Cn(e,n):wn(e,n);t.push(r.value),n=r.nextCursor}return t}function Sn(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function Cn(e,n){let r=n+1,i=!1,a=r;for(;a<e.length;a+=1){let t=e.charAt(a);if(t===`"`&&!i)break;if(i){i=!1;continue}i=t===`\\`}if(a>=e.length)throw new t(`INVALID_ARGS`,`Invalid replay script line: ${e}`);let o=e.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new t(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${e}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function wn(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}function k(e){return e.startsWith(`AD_`)}function Tn(e){return new t(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${e} to avoid the AD_ prefix.`)}function En(e){let t={};if(e.builtins)for(let[n,r]of Object.entries(e.builtins))t[n]=r;let n=[e.fileEnv,e.shellEnv,e.cliEnv];for(let e of n)if(e)for(let[n,r]of Object.entries(e)){if(k(n))throw Tn(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function Dn(e){let t={};for(let[n,r]of Object.entries(e)){if(typeof r!=`string`||!n.startsWith(`AD_VAR_`))continue;let e=n.slice(7);e.length!==0&&cn.test(e)&&(k(e)||(t[e]=r))}return t}function On(e){let n={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new t(`INVALID_ARGS`,`Invalid -e entry "${r}": expected KEY=VALUE.`);let i=r.slice(0,e);if(!cn.test(i))throw new t(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(k(i))throw Tn(i);n[i]=r.slice(e+1)}return n}function kn(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function An(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}return process.env}function jn(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function Mn(e){return jn(e)||e>=`0`&&e<=`9`||e===`.`}function Nn(e){return e===`
|
|
2
|
-
`||e===`\r`||e===`\u2028`||e===`\u2029`}function Pn(e,t){let n=t+2;if(n>=e.length||!jn(e[n]))return null;for(n+=1;n<e.length&&Mn(e[n]);)n+=1;let r=e.slice(t+2,n);if(e[n]===`}`)return{key:r,fallback:void 0,end:n+1};if(e[n]!==`:`||e[n+1]!==`-`)return null;n+=2;let i=``;for(;n<e.length;){let t=e[n];if(t===`}`)return{key:r,fallback:i,end:n+1};if(t===`\\`){let t=e[n+1];if(t===void 0)return{abortEnd:e.length};if(Nn(t))return{abortEnd:n+2};i+=t,n+=2;continue}i+=t,n+=1}return{abortEnd:e.length}}function Fn(e,n,r){let i=``,a=0;for(;a<e.length;){let o=e[a];if(o===`\\`&&e.startsWith("${",a+1)){i+="${",a+=3;continue}if(o===`$`&&e[a+1]===`{`){let o=Pn(e,a);if(o!==null&&`abortEnd`in o){i+=e.slice(a,o.abortEnd),a=o.abortEnd;continue}if(o!==null){let{key:e,fallback:s}=o;if(Object.prototype.hasOwnProperty.call(n.values,e))k(e)&&(n.expandedBuiltinNames??=new Set).add(e),i+=String(n.values[e]);else if(s!==void 0)i+=s;else throw new t(`INVALID_ARGS`,`Unresolved variable \${${e}} at ${r.file}:${r.line}.`);a=o.end;continue}}i+=o,a+=1}return i}function In(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>Fn(e,t,n)),flags:Ln(e.flags,t,n)??{},runtime:Ln(e.runtime,t,n)}}function Ln(e,t,n){return e&&Rn(e,t,n)}function Rn(e,t,n){return typeof e==`string`?Fn(e,t,n):Array.isArray(e)?e.map(e=>Rn(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,Rn(r,t,n)])):e}function zn(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!k(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function A(e){return e.width>0&&e.height>0}function Bn(e,t){return!e||!t?!1:e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function Vn(e,t){if(!e||!t)return!0;let n=e.y+e.height/2,r=t.y+t.height/2;return Math.abs(n-r)<=Math.max(e.height,t.height,1)}function Hn(e){return typeof e.parentIndex!=`number`}function j(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function Un(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function M(e){let t=pe(e);if(!t||t!==e.identifier?.trim()||!Wn(t))return t;let n=(e.type??``).toLowerCase();return n.includes(`view`)||n.includes(`layout`)||n.includes(`image`)||n.includes(`list`)||n.includes(`recyclerview`)||n.includes(`collection`)?``:t}function N(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function Wn(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Gn(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=t.get(r.parentIndex);if(!e)return null;if(n(e))return e;r=e}return null}function Kn(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let i of e)i.parentIndex===t&&(n.push(i),r.push(i.index))}return n}function P(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t)){n.add(t);for(let i of e)i.parentIndex!==t||n.has(i.index)||r.push(i.index)}}}const qn=[`button`,`switch`,`checkbox`,`radio`],Jn=[`button`,`image`,`textview`,`view`];function Yn(e,t,n){for(let r of e){if(t.has(r.index)||!Qn(r))continue;let i=$n(Kn(e,r.index),r,t);if(i.label){n.set(r.index,{...r,...n.get(r.index),label:i.label});for(let n of i.removableIndexes)P(e,n,t)}}}function Xn(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!sr(i))continue;let a=N(M(i));if(!a)continue;let o=r.get(a);if(o&&ir(o,i,t)){let s=ar(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function Zn(e,t){for(let n of e){if(t.has(n.index)||!nr(n))continue;let r=N(M(n));if(!r)continue;let i=Kn(e,n.index).filter(e=>!t.has(e.index)&&rr(n,e,r));for(let n of i.filter(tr))P(e,n.index,t);let a=i.filter(e=>!tr(e)),o=new Set(a.map(e=>N(M(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)P(e,n.index,t)}}function Qn(e){return e.hittable===!0&&!j(e)&&!!(e.rect&&A(e.rect))&&M(e).trim().length===0}function $n(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!er(o,e)||!Bn(o.rect,t.rect))continue;let s=M(o).trim().replace(/\s+/g,` `),c=N(s);i.push(o.index),!(!s||!c||a.has(c))&&(a.add(c),r.push(s))}return{label:r.join(`, `),removableIndexes:i}}function er(e,t){if(tr(e))return!0;let n=(e.type??``).toLowerCase();return e.hittable!==!0&&!j(e)&&n.includes(`view`)&&M(e).trim().length>0&&!t.some(t=>t.parentIndex===e.index)}function tr(e){if(e.hittable===!0||j(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function nr(e){return e.hittable===!0&&!j(e)&&!!(e.rect&&A(e.rect))&&!!N(M(e))}function rr(e,t,n){if(!sr(t)||!Bn(t.rect,e.rect))return!1;let r=N(M(t));return!!(r&&n!==r&&n.includes(r))}function ir(e,t,n){return!n.has(e.index)&&Vn(e.rect,t.rect)&&(fr(e,t)||dr(e,t))}function ar(e,t,n,r,i){let a=cr(t,n),o=a.index===t.index?n:t,s=(o.type??``).toLowerCase().includes(`image`)?`has image`:null,c=i.get(a.index)??a,l=i.get(o.index)?.presentationHints??o.presentationHints;return i.set(a.index,{...c,presentationHints:or(c.presentationHints,l,s)}),P(e,o.index,r),i.get(a.index)??a}function or(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function sr(e){if(!e.rect||!A(e.rect)||Hn(e)||j(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||ur(t,Jn)}function cr(e,t){let n=lr(e);return lr(t)>n?t:e}function lr(e){let t=(e.type??``).toLowerCase(),n=0;return ur(t,qn)?n+=100:t.includes(`image`)?n+=30:t.includes(`textview`)||t===`text`?n+=20:t.includes(`view`)&&(n+=10),e.hittable===!0&&(n+=20),e.enabled!==!1&&(n+=5),n}function ur(e,t){return t.some(t=>e.includes(t))}function dr(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!n||!r?!1:cr(n,r).index===n.index}function fr(e,t){return e.parentIndex===t.parentIndex?Math.abs(e.index-t.index)<=3:e.parentIndex===t.index||t.parentIndex===e.index?!1:Math.abs((e.depth??0)-(t.depth??0))<=1&&Math.abs(e.index-t.index)<=2}function pr(e,t,n){if(n.raw||!mr(e))return{nodes:t,filteredCount:0};let r=hr(t);return{nodes:r,filteredCount:t.length-r.length}}function mr(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function hr(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return gr(e,t),_r(e,r,t,n),Yn(e,t,n),Zn(e,t),Xn(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function gr(e,t){for(let n of e)!n.rect||A(n.rect)||Hn(n)||P(e,n.index,t)}function _r(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||Hn(i))continue;let a=Gn(i,t,Un);a&&yr(r,a,vr(i,e)),P(e,i.index,n)}}function vr(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&A(t.rect)).map(e=>e.index);return n.length===0?null:e.index<Math.min(...n)?`above`:e.index>Math.max(...n)?`below`:null}function yr(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n===`above`?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n===`below`?!0:void 0})}function br(e){return[...xr(e),...wr(e)]}function xr(e){let t=Tr(e?.candidates);if(t.length===0)return[];let n=typeof e?.matches==`number`?e.matches:t.length,r=typeof e?.refsGeneration==`number`?e.refsGeneration:void 0,i=n-t.length;return[`Candidates:`,...t.map(e=>` ${Cr(e,r)}`),...i>0?[` +${i} more`]:[]]}function Sr(e){return Tr(e?.candidates).flatMap(e=>{let t=/^@(e\d+)(?:~s\d+)?(?:\s|$)/.exec(e);return t?.[1]?[t[1]]:[]})}function Cr(e,t){return t===void 0?e:e.replace(/^@(e\d+)(?=\s|$)/,`@$1~s${t}`)}function wr(e){let t=Er(e?.devices);return t.length===0?[]:[`Devices:`,...t.map(e=>` ${e.id} ${e.name}`)]}function Tr(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Er(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.id==`string`&&typeof e.name==`string`):[]}function Dr(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=Or(pe(n));if(!r)continue;let i=`${e}|${r}`,a=t.get(i)??[];a.push(n),t.set(i,a)}let n=0;for(let e of t.values())e.length<=1||!Ar(e)||(n+=e.length);return n>=8}function Or(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||kr(t)?null:t}function kr(e){return/\S+@\S+\.\S+/.test(e)}function Ar(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(jr(e[t]?.rect,e[n]?.rect))return!0;return!1}function jr(e,t){if(!e||!t)return!0;let n=.5;return!(e.x+e.width<=t.x+n||t.x+t.width<=e.x+n||e.y+e.height<=t.y+n||t.y+t.height<=e.y+n)}const Mr={digest:8*1024,default:24*1024,full:64*1024};function Nr(e){return e===`digest`||e===`full`?e:`default`}function Pr(e,t=256){let n=Buffer.from(e,`utf8`);if(n.length<=t)return e;let r=`…<truncated>`,i=Buffer.byteLength(r,`utf8`),a=Math.max(0,t-i);for(;a>0&&(n[a]&192)==128;)--a;return`${n.subarray(0,a).toString(`utf8`)}${r}`}function F(e,t=256){return Pr(o(e),t)}function Fr(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function Ir(e){return(t,n)=>F(Fr(t,e),n)}function Lr(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function Rr(e,t){let n=Nr(t),r=n===`digest`?8:20,i=Lr(e.screen,r),a=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:i,suggestions:a}}function zr(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function Br(e){let{divergence:t,level:n,writeOverflowArtifact:r}=e,i=Nr(n),a=Mr[i],o=Rr(t,n),s=zr(o);if(s<=a)return o;let c=s-a,l=r(Rr(t,`full`)),u=Vr(o);return`artifactPath`in l?{...u,overflow:{omittedBytes:c,artifactPath:l.artifactPath}}:{...u,artifactUnavailable:!0}}function Vr(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:F(e.step.source.path),line:e.step.source.line}},action:F(e.action),cause:{code:e.cause.code,message:F(e.cause.message),...e.cause.hint?{hint:F(e.cause.hint)}:{}},screen:{state:`unavailable`,reason:`omitted-for-size`,hint:`The screen digest and suggestions were omitted to stay within the response byte budget. See overflow.artifactPath (or retry at --level full) for the complete report.`},suggestions:[],suggestionCount:e.suggestionCount,resume:e.resume,repairHint:e.repairHint,...e.targetBinding?{targetBinding:e.targetBinding}:{}}}function Hr(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...ti(n.step),...Zr(n.kind,n.targetBinding),...Ur(n.repairHint,n.resume),...ni(n.screen),...oi(n.suggestions,n.suggestionCount),...ci(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
|
|
3
|
-
`):null}function Ur(e,t){if(typeof e!=`string`)return[];let n=qr(e,t);return[`Repair hint: ${e}${n?` — ${n}`:``}`]}function Wr(e){let t=e;if(!t||typeof t.allowed!=`boolean`)return;if(!t.allowed)return{allowed:!1,reason:typeof t.reason==`string`?t.reason:void 0};let{from:n,planDigest:r,alternateFrom:i}=t;if(!(typeof n!=`number`||typeof r!=`string`||r.length===0))return{allowed:!0,from:n,planDigest:r,alternateFrom:typeof i==`number`?i:void 0}}function Gr(e,t){return`replay --from ${e} --plan-digest ${t}`}function Kr(e){return e?.repairSessionHeld===!0}function qr(e,t){let n=Jr(e,Wr(t));if(n!==void 0)return Kr(t)?`${n} Read-only inspection while armed (snapshot -i, get attrs, find, is) is excluded from the healed script by default — no --no-record needed. If the step you are repairing is itself a read, add --record to that command so it lands in the heal.`:n}function Jr(e,t){switch(e){case`record-and-heal`:return t?.allowed?`press the correct control via a blessed @ref from screen.refs (recorded), then ${Gr(t.from,t.planDigest)}.`:`press the correct control via a blessed @ref from screen.refs (recorded). ${Xr(t)}`;case`state-repair`:return t?.allowed?`fix app state with --no-record actions, then ${Gr(t.from,t.planDigest)} to re-run it.`:`fix app state with --no-record actions. ${Xr(t)}`;case`caution`:return Yr({lead:`something already matches the recorded selector; a blind re-press may repeat the mistake.`,guidance:t});case`manual`:return Yr({lead:`no safe automated repair could be proven; inspect the screen and repair by hand.`,guidance:t});default:return}}function Yr(e){let{lead:t,guidance:n}=e;if(!n?.allowed)return`${t} ${Xr(n)}`;let r=`if you fixed app state with --no-record actions: ${Gr(n.from,n.planDigest)}`;return n.alternateFrom===void 0?`${t} ${r}.`:`${t} ${r}; ${`if you performed the step's intent as a recorded action: ${Gr(n.alternateFrom,n.planDigest)}`}.`}function Xr(e){return e&&!e.allowed&&e.reason?`This step cannot currently be resumed automatically (${e.reason}) — run a fresh full replay instead.`:`This step cannot currently be resumed automatically — run a fresh full replay instead.`}function Zr(e,t){if(typeof e!=`string`||e===`action-failure`)return[];let n=t;return n?[Qr(e,n.matchCount),...$r(n.mismatches),...ei(n.candidates)]:[]}function Qr(e,t){return`Target binding: ${e}${typeof t==`number`?` (matchCount ${t})`:``} — recorded target evidence did not verify.`}function $r(e){return!Array.isArray(e)||e.length===0?[]:[` mismatches: ${e.slice(0,5).join(`; `)}`]}function ei(e){return!Array.isArray(e)||e.length===0?[]:[` ${e.length} candidate(s) shared the recorded identity:`,...e.slice(0,5).map(e=>` ${ai(e)}`)]}function ti(e){let t=e;if(typeof t?.index!=`number`)return[];let n=t.source,r=typeof n?.path==`string`&&typeof n.line==`number`?` (${n.path}:${n.line})`:``;return[`Divergence at step ${t.index}${r}`]}function ni(e){let t=e;return t?.state===`available`&&Array.isArray(t.refs)?ri(t.refs,t.refsGeneration):t?.state===`unavailable`?[ii(t)]:[]}function ri(e,t){let n=e.slice(0,8).map(ai),r=e.length-n.length;return[`Screen: ${e.length} actionable ref(s) captured (refsGeneration ${t}).`,...n,...r>0?[` ... ${r} more`]:[]]}function ii(e){let t=typeof e.hint==`string`&&e.hint.length>0?` ${e.hint}`:``;return`Screen: unavailable (${String(e.reason??`unknown`)}).${t}`}function ai(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` @${String(t.ref)} [${String(t.role)}]${n}`}function oi(e,t){return Array.isArray(e)&&e.length>0?[`Suggestions:`,...e.slice(0,5).map(si)]:typeof t==`number`&&t>0?[`Suggestions: ${t} available (omitted at this response level; rerun with --json for the full report).`]:[]}function si(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` - [${String(t.basis)}]${n} ${String(t.selector)}`}function ci(e,t){return e&&typeof e==`object`?[`Full report written to ${String(e.artifactPath)}.`]:t===!0?[`Full report exceeded the response budget and the overflow artifact could not be written.`]:[]}function li(e){let t=I(e.label),n=I(e.value),r=I(e.identifier),i=hi(r)?r:``;return mi(e.type??``)?n||t||i:t||n||i}function ui(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=m(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function di(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function fi(e,t){let n=li(e),r=ui(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&pi(n)}}function pi(e){return e?e.length>80||/[\r\n]/.test(e):!1}function I(e){return typeof e==`string`?e.trim():``}function mi(e){let t=m(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function hi(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}const gi={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,textfield:`text-field`,edittext:`text-field`,textarea:`text-view`,switch:`switch`,slider:`slider`,image:`image`,imageview:`image`,webview:`webview`,framelayout:`group`,linearlayout:`group`,relativelayout:`group`,constraintlayout:`group`,viewgroup:`group`,view:`group`,listview:`list`,recyclerview:`list`,collectionview:`collection`,searchfield:`search`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,segmentedcontrol:`segmented-control`,group:`group`,window:`window`,checkbox:`checkbox`,radio:`radio`,menuitem:`menu-item`,toolbar:`toolbar`,scrollarea:`scroll-area`,scrollview:`scroll-area`,nestedscrollview:`scroll-area`,table:`table`};function _i(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=z(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:L(i,c,!1,o,t)})}return r}function L(e,t,n,r,i={}){let a=r??z(e.type??`Element`),o=fi(e,a),s=wi(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,u=Ti(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&u.push(`same label as parent`);let d=u.map(e=>` [${e}]`).join(``),f=s?` "${s}"`:``,p=vi(e);return n?`${c}${l} [${a}]${d}${p}`.trimEnd():`${c}${l} [${a}]${f}${d}${p}`.trimEnd()}function vi(e){let t=e.actions?.filter(e=>e.trim().length>0);return!t||t.length===0?``:` actions: [${t.map(e=>`"${Oi(yi(e))}"`).join(`, `)}]`}function yi(e){return e.replace(/\s+/g,` `).replace(/[\u0000-\u001f\u007f-\u009f]/g,``).trim()}function R(e,t){let n=e.label?.trim();if(n&&Si(t,n))return``;let r=e.value?.trim();if(xi(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||Ci(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function z(e){let t=e,n=e.replace(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.startsWith(`com.`));return n.includes(`.`)&&(n=n.replace(/^android\.widget\./,``).replace(/^android\.view\./,``).replace(/^android\.webkit\./,``).replace(/^androidx\./,``).replace(/^com\.google\.android\./,``).replace(/^com\.android\./,``),r&&n.includes(`.`)&&(n=n.slice(n.lastIndexOf(`.`)+1))),n===`textview`?r?`text`:`text-view`:bi(n)||n||`element`}function bi(e){return Object.prototype.hasOwnProperty.call(gi,e)?gi[e]:void 0}function xi(e){return e===`text-field`||e===`text-view`||e===`search`}function Si(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:We(t)}function Ci(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function wi(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?R(e,t):Ei(e,t,r.text)||R(e,t)}function Ti(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.selected===!0&&i.push(`selected`),e.focused===!0&&i.push(`focused`),xi(t)&&i.push(`editable`),Di(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?ki(i):(i.push(`preview:"${Oi(di(r.text))}"`),i.push(`truncated`),ki(i))}function Ei(e,t,n){let r=I(e.label);if(r&&r!==n)return r;let i=I(e.identifier);if(i&&!Ci(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function Di(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function Oi(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function ki(e){return[...new Set(e)]}function Ai(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function ji(n,r={}){let i=n instanceof t?e(n):n;process.stderr.write(`Error (${i.code}): ${i.message}\n`),i.hint&&process.stderr.write(`Hint: ${i.hint}\n`);let a=br(i.details);a.length>0&&process.stderr.write(`${a.join(`
|
|
4
|
-
`)}\n`),i.diagnosticId&&process.stderr.write(`Diagnostic ID: ${i.diagnosticId}\n`),i.logPath&&process.stderr.write(`Diagnostics Log: ${i.logPath}\n`),i.logPathUnavailable&&process.stderr.write(`Remote Diagnostics: unavailable (${i.logPathUnavailable})\n`);let o=Hr(i.details);o&&process.stderr.write(`${o}\n`),r.showDetails&&i.details&&process.stderr.write(`${JSON.stringify(i.details,null,2)}\n`)}function Mi(e,t={}){let n=e.nodes,a=Array.isArray(n)?n:[],o=i(r(e.backend)?e.backend:void 0),s=pr(e,a,t),c=Ii(e),l=na(e,a,t,s),u=l.length>0?`${l.join(`
|
|
5
|
-
`)}\n`:``,d=t.raw?null:Ni(e);if(d)return`${c}${u}${Pi(d)}\n`;let f=t.raw||!o?null:Ke(s.nodes),p=!!e.truncated,m=f?.nodes??a,h=t.raw||!o?null:Hi(e,f,m.length,a.length,s.filteredCount),g=Li(a.length,h,p);return a.length===0?`${c}${g}\n${u}`:t.raw?`${c}${g}\n${u}${Ri(a)}\n`:t.flatten?`${c}${g}\n${u}${zi(m)}${Vi(f)}\n`:`${c}${g}\n${u}${Bi(m)}${Vi(f)}\n`}function Ni(e){let t=e.unchanged;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.ageMs!=`number`||typeof n.nodeCount!=`number`?null:{ageMs:n.ageMs,nodeCount:n.nodeCount,interactiveOnly:n.interactiveOnly===!0?!0:void 0,scope:typeof n.scope==`string`?n.scope:void 0}}function Pi(e){let t=Fi(e.ageMs);return e.scope?[`Scoped snapshot unchanged for scope "${e.scope}" since previous read ${t} ago.`,`Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
|
|
6
|
-
`):e.interactiveOnly?[`Interactive snapshot unchanged since previous read ${t} ago.`,`${e.nodeCount} visible nodes are unchanged. Previous @e refs are still valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
|
|
7
|
-
`):[`Snapshot unchanged since previous read ${t} ago.`,`Refs from the previous snapshot are still valid. Use --force-full to re-emit the tree, or use find/get/is for a targeted query.`].join(`
|
|
8
|
-
`)}function Fi(e){if(e<1e3)return`${Math.round(e)}ms`;if(e<6e4)return`${(Math.round(e/100)/10).toFixed(1)}s`;let t=e/6e4;if(t<60)return`${(Math.round(t*10)/10).toFixed(1)}m`;let n=t/60;return`${(Math.round(n*10)/10).toFixed(1)}h`}function Ii(e){let t=typeof e.appName==`string`?e.appName:void 0,n=typeof e.appBundleId==`string`?e.appBundleId:void 0,r=[];return t&&r.push(`Page: ${t}`),n&&r.push(`App: ${n}`),r.length>0?`${r.join(`
|
|
9
|
-
`)}\n`:``}function Li(e,t,n){let r=n?` (truncated)`:``;return t?.partial?t.totalNodeCount>t.visibleNodeCount?`Snapshot: ${t.visibleNodeCount} visible nodes (${t.totalNodeCount} total)${r}`:`Snapshot: ${t.visibleNodeCount} visible nodes${r}`:`Snapshot: ${e} nodes${r}`}function Ri(e){return e.map(e=>JSON.stringify(e)).join(`
|
|
10
|
-
`)}function zi(e){return da(e).join(`
|
|
11
|
-
`)}function Bi(e){return ca(_i(e,{summarizeTextSurfaces:!0})).join(`
|
|
12
|
-
`)}function Vi(e){return e&&e.summaryLines.length>0?`\n${e.summaryLines.join(`
|
|
13
|
-
`)}`:``}function Hi(e,t,n,r,i=0){let a=Ui(e);if(i===0&&a)return a;let o=(t?.hiddenCount??0)+i,s=t?t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow):!1;return o>0?{partial:!0,visibleNodeCount:n,totalNodeCount:Math.max(r,a?.totalNodeCount??r),reasons:Wi([...a?.reasons??[],`offscreen-nodes`])}:a||(s?{partial:!0,visibleNodeCount:n,totalNodeCount:n,reasons:[]}:null)}function Ui(e){let t=e.visibility;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.partial!=`boolean`||typeof n.visibleNodeCount!=`number`||typeof n.totalNodeCount!=`number`||!Array.isArray(n.reasons)?null:{partial:n.partial,visibleNodeCount:n.visibleNodeCount,totalNodeCount:n.totalNodeCount,reasons:n.reasons.filter(e=>typeof e==`string`)}}function Wi(e){return[...new Set(e)]}function Gi(e){let t=e.baselineInitialized===!0,n=e.summary??{},r=B(n.additions),i=B(n.removals),a=B(n.unchanged),o=ea(),s=sa(e),c=s.length>0?`${s.join(`
|
|
14
|
-
`)}\n`:``;if(t)return`${c}Baseline initialized (${a} lines).\n`;let l=$i(Array.isArray(e.lines)?e.lines:[],1).map(e=>{let t=typeof e.text==`string`?e.text:``;if(e.kind===`added`){let e=t.startsWith(` `)?`+${t}`:`+ ${t}`;return o?V(e,`green`):e}if(e.kind===`removed`){let e=t.startsWith(` `)?`-${t}`:`- ${t}`;return o?V(e,`red`):e}return o?V(t,`dim`):t}),u=l.length>0?`${l.join(`
|
|
15
|
-
`)}\n`:``;return o?`${c}${u}${[`${V(String(r),`green`)} additions`,`${V(String(i),`red`)} removals`,`${V(String(a),`dim`)} unchanged`].join(`, `)}\n`:`${c}${u}${r} additions, ${i} removals, ${a} unchanged\n`}function Ki(e){let t=ea(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...qi(e,t)),i.push(...Ji(e,n,t)),!n&&!r&&(i.push(...Yi(e,t)),i.push(...Xi(e,t))),`${i.join(`
|
|
16
|
-
`)}\n`}function qi(e,t){if(e.match===!0)return[`${t?V(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?V(`✗`,`red`):`✗`;if(n){let e=n.expected,t=n.actual;return[`${r} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=B(e.differentPixels),a=B(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?V(o,`red`):o}`]}function Ji(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=Qi(e.diffPath),i=n?V(`Diff image:`,`dim`):`Diff image:`,a=n?V(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=Qi(e.currentOverlayPath),i=n?V(`Current overlay:`,`dim`):`Current overlay:`,a=n?V(t,`green`):t,o=B(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function Yi(e,t){let n=B(e.differentPixels),r=B(e.totalPixels);return[` ${t?V(String(n),`red`):String(n)} different / ${r} total pixels`]}function Xi(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${ta(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...Zi(e));return r}function Zi(e){let t=e.shareOfDiffPercentage===0&&e.differentPixels>0?`<0.01`:String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff`],i=e.currentOverlayMatches?.[0];if(i){let e=i.label?` "${i.label}"`:``;r.push(` overlaps @${i.ref}${e}, ${i.regionCoveragePercentage}% of region`)}return r}function Qi(e){let t=process.cwd(),n=Xe.relative(t,e);return n===``||!n.startsWith(`..`)&&!Xe.isAbsolute(n)?n===``?`.`:`.${Xe.sep}${n}`:e}function B(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function $i(e,t){if(e.length===0)return e;let n=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>e.kind===`added`||e.kind===`removed`).map(e=>e.index);if(n.length===0)return e;let r=Array(e.length).fill(!1);for(let i of n){let n=Math.max(0,i-t),a=Math.min(e.length-1,i+t);for(let e=n;e<=a;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])}function ea(e=process.stdout){let t=process.env.FORCE_COLOR;return typeof t==`string`?t!==`0`:typeof process.env.NO_COLOR==`string`?!1:!!e.isTTY}function V(e,t,n){return Ze(t,e,n)}function ta(e,t){return t?V(e,`dim`):e}function na(e,t,n,r={nodes:t,filteredCount:0}){let i=[...sa(e),...ra(e)];if(ia(e)){let e=oa(t,n);e&&i.push(e)}!n.raw&&r.filteredCount>0&&i.push(`Collapsed ${r.filteredCount} Android helper node${r.filteredCount===1?``:`s`} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let a=r.filteredCount>0?r.nodes:t;return!n.raw&&Dr(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function ra(e){let t=e.fallbackScreenshotPath;return typeof t==`string`&&t.length>0?[`Captured a screenshot of this screen automatically as visual truth: ${t}`]:[]}function ia(e){return!e.snapshotQuality&&!aa(e)}function aa(e){let t=e.snapshotDiagnostics;if(!t||typeof t!=`object`)return!1;let n=t.stats;return!!(n&&typeof n==`object`&&n.platform===`web`)}function oa(e,t){if(t.scoped===!0||t.depthLimited===!0||e.length>3)return null;let n=e.length===1?`node`:`nodes`;return`Hint: sparse accessibility snapshot returned ${e.length} ${n}; snapshot state is invalid or unavailable for this screen. Use plain screenshot, not screenshot --overlay-refs, as visual truth. If screenshot shows the Home Screen or another app, run open for this app again first. Then navigate away with coordinates if needed and retry snapshot -i on the next screen.`}function sa(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function ca(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||la(e,n[n.length-1],r));)t.push(...fa(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...fa(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function la(e,t,n){return ua(e.node,t.node,n)?!1:e.depth<=t.depth}function ua(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){if(r.parentIndex===t.index)return!0;let e=n.get(r.parentIndex);if(!e)return!1;r=e}return!1}function da(e){return _i(e,{summarizeTextSurfaces:!0}).flatMap(e=>[L(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...fa({...e,depth:0})])}function fa(e,t){let n=pa(e.type);if(!n)return[];let r=[];if(e.node.hiddenContentAbove&&t!==`below`&&r.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&t!==`above`&&r.push(`[content below ${n} hidden]`),r.length===0)return[];let i=` `.repeat(e.depth+1);return r.map(e=>`${i}${e}`)}function pa(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}const ma={defaultTimeoutMs:1e4,intervalMs:300},H={promotedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`hittable-ancestor`,poll:`none`},resolvedTarget:{resolution:S.act,occlusion:`exclude-and-refuse`,offscreen:`refuse`,promotion:`none`,poll:`none`},coveredDiagnosis:{resolution:S.actCoveredDiagnosis,occlusion:`refuse`,offscreen:`ignore`,promotion:`none`,poll:`none`},readText:{resolution:S.readText,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readUnique:{resolution:S.readUnique,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},readAny:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:`none`},findWait:{resolution:S.readAny,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:ma},wait:{resolution:S.wait,occlusion:`ignore`,offscreen:`ignore`,promotion:`none`,poll:ma},readList:{resolution:S.readList,occlusion:`ignore`},findAct:{resolution:S.findAct,occlusion:`refuse`,offscreen:`ignore`,promotion:`hittable-ancestor-below-root`,poll:`none`}};function ha(e,t,n={}){let r=ba(e);if(r.length===0)return{canScroll:!1,emptySnapshot:!0};let i=Ge(r),a=xa(r,i,t,n);return a?{canScroll:Ca(a,i.get(a.index),t),emptySnapshot:!1,scope:wa(a,r)}:{canScroll:!1,emptySnapshot:!1}}async function ga(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=ha(await i(r),t,n);return r&&e.emptySnapshot?await ga({edge:t,target:n,captureNodes:i}):e}catch(e){throw ya(t,r,e)}}async function _a(e){let{edge:n,captureState:r,scroll:i}=e,a=await r();a.scope&&(a=await r(a.scope));let o=0,s;for(;a.canScroll;){if(o>=40)throw new t(`COMMAND_FAILED`,`scroll ${n} 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.`});s=await i(),o+=1,a=await r(a.scope)}return{passes:o,result:s}}function va(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 ya(e,n,r){return n?new t(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:n,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},r):new t(`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.`},r)}function ba(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function xa(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>g(e)&&ja(e.rect));if(a.length===0)return null;let o=Sa(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&Aa(e.rect,s)).sort(Da);if(e.length>0)return e.find(e=>Ca(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>Ca(e,t.get(e.index),n)).sort(Oa);return c.length>0?c[0]??null:a.filter(t=>Te(t,e)).sort(Oa)[0]??a.sort(Oa)[0]??null}function Sa(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(g(n)&&ja(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function Ca(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function wa(e,t){return[e.identifier,e.label].filter(e=>typeof e==`string`).map(e=>e.trim()).find(n=>Ea(n)&&Ta(n,e,t))}function Ta(e,t,n){let r=e.toLowerCase(),i=n.filter(e=>[e.identifier,e.label,e.value].some(e=>typeof e==`string`&&e.trim().toLowerCase().includes(r)));return i.length===1&&i[0]?.index===t.index}function Ea(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function Da(e,t){return ka(e.rect)-ka(t.rect)}function Oa(e,t){return ka(t.rect)-ka(e.rect)}function ka(e){return e?e.width*e.height:0}function Aa(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function ja(e){return!!(e&&e.width>0&&e.height>0)}function Ma(e,n,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new t(`INVALID_ARGS`,`${n} must be an integer between ${r} and ${i}`);return e}function U(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function W(e){return e.clock?.now()??Date.now()}async function Na(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Pa(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function G(e){return e&&typeof e==`object`?e:void 0}function Fa(e){let t=Buffer.alloc(16);for(let n of e)La(t,Ia(n));return{digest:`ax1:${Qe(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Ia(e){return Qe(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function La(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function K(e){let{digest:t,nodeCount:n}=Fa(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Ra(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Ra(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}const za=[`x`,`y`,`width`,`height`];function q(e){let t=J(e);if(!t)return null;let n=c(t);return!Number.isFinite(n.x)||!Number.isFinite(n.y)?null:n}function J(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),r=Number(e.width),i=Number(e.height);return!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(i)||r<0||i<0?null:{x:t,y:n,width:r,height:i}}function Y(e,t){return!e||!t?!1:za.every(n=>Math.abs(e[n]-t[n])<=.5)}function Ba(e){return{x:Va(e.x,e.width),y:Va(e.y,e.height)}}function Va(e,t){if(t<=1)return Math.floor(e);let n=Math.ceil(e),r=Math.floor(e+t-1);return Math.round(Math.min(r,Math.max(n,e+t/2)))}function Ha(e,t,n,r){let i=n.ambiguity,a=xe(e,t,{...r,requireRect:n.requireRect});if(!a||a.matchedNodes.length===0)return{kind:`none`};if(i===`first-match`)return Wa(a);if(i===`reject-candidates`)return a.matchedNodes.length>1?Ua(a):Wa(a);let o=_e(e,t,{...r,...Oe({ambiguity:i,requireRect:n.requireRect})});return o?{kind:`resolved`,resolution:o,matchedNodes:a.matchedNodes}:Ua(a)}function Ua(e){return{kind:`ambiguous`,selector:e.selector.raw,selectorIndex:e.selectorIndex,matchedNodes:e.matchedNodes}}function Wa(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 Ga(e,t,n){let r=xe(e,De(t),n);return r?{...r,selector:r.selector.raw}:null}function Ka(e,t,n,r){let i=Ha(e,De(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}const qa=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],Ja=[`tabbar`,`toolbar`,`navigationbar`],Ya=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function Xa(e,t={}){if(e.length<2)return e;let n=new Map(e.map(e=>[e.index,e])),r={nodes:e,byIndex:n,overlayPositions:e.flatMap((e,r)=>ro(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())no(a)&&Za(r,n,a,t)&&i.push(n);if(i.length===0)return e;let a=[...e];for(let t of i){let n=e[t];a[t]={...n,hittable:!1,interactionBlocked:`covered`,presentationHints:mo(n.presentationHints)}}return a}function X(e){return e.interactionBlocked!==void 0}function Za(e,t,n,r){let i=e.coverCache.get(t);if(i!==void 0)return i;e.coverCache.set(t,null);let a=Z(n.rect);if(!a)return $a(e,t,null);let o=c(a),s=r.isAdditionalOverlayNode?.(n)===!0;for(let i of e.overlayPositions){if(!Qa(e,i,t,s,r))continue;let c=e.nodes[i];if(eo(e,i,n,a,o,r))return $a(e,t,c)}return $a(e,t,null)}function Qa(e,t,n,r,i){let a=e.nodes[t];return a?t>n?!0:t===n||r?!1:i.isAdditionalOverlayNode?.(a)===!0:!1}function $a(e,t,n){return e.coverCache.set(t,n),n}function eo(e,t,n,r,i,a){if(!e.nodes[t])return!1;let o=to(e,t,n,r,a);return!!(o&&be(o,i.x,i.y))}function to(e,t,n,r,i){let a=e.nodes[t];if(!a||!ro(a,e.byIndex,i)||fo(n,a,e.byIndex))return null;let o=Z(a.rect);return!o||Y(r,o)||Za(e,t,a,i)?null:o}function no(e){return Z(e.rect)?e.hittable===!0||co(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function ro(e,t,n){return!Z(e.rect)||x(e)||io(e,t)?!1:lo(e,qa)||ao(e,t,n)}function io(e,t){if(!lo(e,Ja))return!1;let n=Z(e.rect);if(!n)return!1;let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(x(r)){let e=Z(r.rect);return!!(e&&Y(n,e))}i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function ao(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0?!oo(e,t,n):!1}function oo(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(so(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function so(e,t){return t.isAdditionalOverlayNode?.(e)===!0&&Z(e.rect)!==null&&!x(e)}function co(e){return lo(e,Ya)}function lo(e,t){let n=uo(e);return t.some(e=>n.includes(e))}function uo(e){return[e.type,e.role,e.subrole].map(e=>m(e??``)).join(` `)}function fo(e,t,n){return po(e,t,n)||po(t,e,n)}function po(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function Z(e){let t=J(e);return t&&t.width>0&&t.height>0?t:null}function mo(e){return Array.from(new Set([...e??[],`covered`]))}function ho(e){return e}function go(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 _o=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function vo(e,t){let n=t[0];if(!n||!yo(t,new Map(e.map(e=>[e.index,e]))))return{kind:`ambiguous`,candidates:t};let r=So(e,n).node;for(let n of t.slice(1))if(So(e,n).node.index!==r.index)return{kind:`ambiguous`,candidates:t};return{kind:`equivalent`,node:r}}function yo(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(!bo(i,a,t)&&!bo(a,i,t))return!1}return!0}function bo(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 xo(e,t){if(!t?.rect||!e.rect||!x(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 So(e,t){if(X(t))return{node:t,reason:`covered`};let n=wo(e,t);if(n?.rect&&q(n.rect))return{node:n,reason:`same-rect-descendant`};if(To(t)&&t.rect&&q(t.rect))return{node:t,reason:`semantic-target`};let r=Co(e,t);return r?.rect&&!X(r)&&q(r.rect)?Do(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function Co(e,t){return t.hittable?t:le(e,t,e=>e.hittable===!0)}function wo(e,t){let n=J(t.rect);if(!n)return null;let r=t,i=new Set;for(;!i.has(r.ref);){i.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable||X(e))return!1;let t=J(e.rect);return t?Y(t,n):!1});if(t.length!==1)break;r=t[0]}return r===t?null:r}function To(e){return[e.type,e.role,e.subrole].map(e=>m(e??``)).some(Eo)}function Eo(e){return e===`tab`||_o.some(t=>e.includes(t))}function Do(e,t,n){let r=J(e.rect),i=J(t.rect);if(!r||!i)return!1;if(Oo(t)&&!Y(r,i))return!0;let a=ko(n,r);return!a||!Ao(i,a)?!1:!Y(r,i)}function Oo(e){let t=m(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 ko(e,t){let n=c(t),r=e.filter(x).map(e=>J(e.rect)).filter(e=>e!==null);if(r.length===0)return null;let i=r.filter(e=>be(e,n.x,n.y));return re(i.length>0?i:r)}function Ao(e,t){let n=go(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 jo(e,t,n,r,i={}){let a=Ka(Po(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 No(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 Mo(e,t,n,r){let i=Po(e,t);return{candidates:i,list:Ga(i,n,{...r,requireRect:e.resolution.requireRect})}}async function No(e,t,n,r={}){r.onResolved?.(n,t);let i=Fo(e.promotion,t,n);return e.occlusion!==`ignore`&&(i.covered||X(i.node))?{kind:`occluded`,node:i.node}:{kind:`target`,node:await Io(e,t,i.node,r)}}function Po(e,t){return e.occlusion===`exclude-and-refuse`?t.filter(e=>!X(e)):t}function Fo(e,t,n){if(e===`none`)return{node:n,covered:!1};let r=So(t,n);return r.reason===`covered`?{node:r.node,covered:!0}:e===`hittable-ancestor-below-root`&&xo(r.node,t[0])&&n.rect?{node:n,covered:!1}:{node:r.node,covered:!1}}async function Io(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 Lo(e){if(e.poll===`none`)throw Error(`selector pipeline row resolves against one capture and declares no poll budget`);return e.poll}function Ro(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function zo(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=v(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function Bo(e,t,n,r){return e.filter(e=>{if(!ae(v(e),n))return!1;let i=zo(e,t,Math.max(r.length,1));return!i.broken&&ie(i.chain,r)})}function Vo(e){return e.hittable===!0||To(e)}function Ho(e,t){let n=ye(v(e),t);return n.id!==void 0||n.label!==void 0?!1:h(e.value)===null}function Uo(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 Wo(e,t){let n=Ro(t);return t.filter(t=>t.index!==e.index&&Uo(t,e,n)).sort((e,t)=>e.index-t.index)}function Go(e,t){let n=q(e.rect);return!n||!t.rect?!1:be(t.rect,n.x,n.y)}function Ko(e,t){if(!Ho(e,t))return e;let n=Wo(e,t);if(n.some(Vo))return e;let r=n.find(e=>v(e).label!==void 0);return!r||!Go(r,e)?e:r}function qo(e,t){return e.find(e=>Pe(e,t))??null}function Jo(e,t){let n=pe(e);return n&&ce(n)?n:Yo(e,t)}function Yo(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=pe(e);if(!t||!ce(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 Xo(e){return e===`text`||e===`label`||e===`any`}function Zo(e,t,n,r){if(!(r||e===`web`))return Xo(t)?n:void 0}function Qo(e){return new t(`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 $o(e,n){let r=n??`default`,i=await e.sessions.get(r);if(!i)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new t(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function es(e,n,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=n.session??`default`,o=await e.sessions.get(a),s=await i(U(e,n),{interactiveOnly:r.interactiveOnly??!1,depth:n.depth,scope:r.scope??n.scope,raw:n.raw,includeRects:r.includeRects,...r.preferredBackend?{preferredBackend:r.preferredBackend}:{},...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),c=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:W(e)};return(n.signal??e.signal)?.throwIfAborted(),r.updateSession&&o&&!Je(c.snapshotQuality)&&await e.sessions.set({...o,snapshot:c}),{sessionName:a,session:o,snapshot:c}}async function ts(e,t,n){if(e.backend.readText){let r=await e.backend.readText(U(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return li(n)}function ns(e,r,i){let a=s(r);if(!a)throw new t(`INVALID_ARGS`,i.invalidRefMessage);let o=n(e,a)??(i.fallbackLabel.length>0?qo(e,i.fallbackLabel):null);if(!o)throw new t(`COMMAND_FAILED`,i.notFoundMessage);return{ref:a,node:o}}function rs(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 is(e,t,n={}){let r=J(t.rect),i=q(r??void 0);if(!r||!i)return{kind:`invalid`};let a=as(e,t,r);if(a.length===0)return{kind:`resolved`,point:i,strategy:`center`};let o=(n.bounds??[]).reduce((e,t)=>e?ss(e,t):null,r),s=o?cs(r,o,i,a):null;return s?{kind:`resolved`,point:s,strategy:`parent-owned`}:{kind:`blocked`,competitorRefs:a.map(e=>e.ref)}}function as(e,t,n){let r=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index!==t.index).filter(e=>os(e,t,r)).filter(To).flatMap(e=>{let t=J(e.rect);if(!t||Y(t,n))return[];let r=ss(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 os(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 ss(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 cs(e,t,n,r){let i=ms(e),a=fs(t.x,t.width,n.x,r.flatMap(({rect:e})=>[e.x,e.x+e.width]),i),o=fs(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(!ls(t,s))return[];let c=us(s,e,n,r,i);return c?[c]:[]})).sort(ds)[0]?.point??null}function ls(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function us(e,t,n,r,i){let a=ps(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 ds(e,t){return e.distanceSquared-t.distanceSquared||t.clearance-e.clearance||e.point.y-t.point.y||e.point.x-t.point.x}function fs(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 ps(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 ms(e){let t=Math.min(e.width,e.height);return Math.max(0,Math.min(12,Math.floor(t/2)-1))}const hs=`replay_target_guard_mismatch`,gs=Ve.landmarkIdentityMismatch;function _s(e,n,r,i){let{candidates:a,list:o}=Mo(i,e,n,{platform:r}),s=o?.matchedNodes??[];if(!o||s.length===0)return null;let c=[{selector:o.selector,matches:s.length}];if(s.length===1)return{node:s[0],selector:o.selector,selectorIndex:o.selectorIndex,matches:1,diagnostics:c};let l=vo(a,s);if(l.kind===`ambiguous`)throw new t(`AMBIGUOUS_MATCH`,`Selector matched ${l.candidates.length} distinct actionable elements: ${o.selector}`,{selector:o.selector,matches:l.candidates.length,candidates:l.candidates.slice(0,5).map(e=>L(e,0,!1))});return{node:l.node,selector:o.selector,selectorIndex:o.selectorIndex,matches:s.length,diagnostics:c,disambiguation:{matchCount:s.length,tiebreak:`structural-equivalence`,alternatives:s.filter(e=>e.index!==l.node.index)}}}function vs(e,n,r,i,a){if(!r)return;let o=v(e),s=ee(e,n);if(!(ne(o,r.identity)&&oe(s,r.structural)))throw new t(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:hs,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function Q(e,t,n){return await Vs(e,t,n.action),t.target.kind===`point`?await bs(e,t,t.target,n):t.target.kind===`ref`?await ws(e,t,t.target,n):await Ts(e,t,t.target,n)}async function ys(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=je(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!be(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 bs(e,t,n,r){let i=await ys(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await xs(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function xs(e,t){try{return(await Bs(e,t,!0)).snapshot.nodes}catch{return}}function Ss(e,n){let r=s(e.ref);if(!r)throw new t(`INVALID_ARGS`,`Invalid ref: ${e.ref}`);let i=s(n.ref),a=n.node.ref?s(n.node.ref):null;if(i!==r||a!==r||!n.nodes.includes(n.node))throw new t(`COMMAND_FAILED`,`Internal find target provenance does not match the interaction ref`);return{nodes:n.nodes,resolved:As(r,n.node,`exact`)}}async function Cs(e,t,n){let r=await Us(e,t,n);return{nodes:r.snapshot.nodes,resolved:r.resolved}}async function ws(e,t,n,r){let{nodes:i,resolved:a}=r.preresolvedTarget?Ss(n,r.preresolvedTarget):await Cs(e,t,n),o=await Ls({policy:r.pipeline,nodes:i,node:a.node,action:r.action,label:`Ref ${n.ref}`,hooks:{onResolved:(e,t)=>Ds(e,t,r),offscreen:async(i,a)=>await Ys(e,t,i,a,n.ref,r)}});return{kind:`ref`,point:Ks(o,i,{invalidMessage:`Ref ${n.ref} not found or has invalid bounds`,blockedTargetLabel:`Ref ${n.ref}`,blockedTargetDetails:{ref:`@${s(n.ref)??o.ref}`}}),target:{kind:`ref`,ref:`@${a.ref}`},...Ps(e,o,i,r.action,a.resolution)}}async function Ts(e,t,n,r){let i=n.selector,a=await Bs(e,t,r.requireInteractive),o=_s(a.snapshot.nodes,i,e.backend.platform,r.pipeline);if((!o||!o.node.rect)&&r.requireInteractive&&(a=await Bs(e,t,!1),o=_s(a.snapshot.nodes,i,e.backend.platform,r.pipeline)),!o||!o.node.rect)throw await Es({runtime:e,nodes:a.snapshot.nodes,selectorExpression:i,action:r.action,resolved:o});let s=o,c=await Ls({policy:r.pipeline,nodes:a.snapshot.nodes,node:s.node,action:r.action,label:`Selector ${s.selector}`,hooks:{onResolved:(e,t)=>Ds(e,t,r),offscreen:async(n,i)=>await Js(e,t,n,i,s.selector,r)}});return{kind:`selector`,point:Ks(c,a.snapshot.nodes,{invalidMessage:`Selector ${o.selector} resolved to invalid bounds`,blockedTargetLabel:`Selector ${i}`,blockedTargetDetails:{selector:i}}),target:{kind:`selector`,selector:o.selector},...Ps(e,c,a.snapshot.nodes,r.action,Ms(o,a.snapshot.nodes))}}async function Es(e){let{runtime:n,nodes:r,selectorExpression:i,action:a,resolved:o}=e,s=await jo(H.coveredDiagnosis,r,i,{platform:n.backend.platform});if(s.kind===`occluded`)return Rs({label:`Selector ${s.selector}`,node:s.node,action:a,selector:s.selector});let c=o?.diagnostics??[];return new t(`COMMAND_FAILED`,we(i,c,{unique:!0}),{hint:ge(c)})}function Ds(e,t,n){vs(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const Os={source:`ref`,phase:`pre-action`,kind:`exact`},ks={source:`ref`,phase:`pre-action`,kind:`label-fallback`};function As(e,t,n){return{ref:e,node:t,resolution:n===`exact`?Os:ks}}const js={source:`runtime`,phase:`pre-action`,kind:`unique`};function Ms(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:Ns(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>Ns(e,t))}:js}function Ns(e,t){let n=m(e.type??``),r=Jo(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:rs(n,256)}:{},...r===void 0?{}:{label:rs(r,256)}}}function Ps(e,t,n,r,i){return{node:t,selectorChain:_(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:Jo(t,n),...Is(t,r),preActionNodes:n,resolution:i,...Fs(e,t,n,r)}}function Fs(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Ko(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:_(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:Jo(i,n)}}}function Is(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 Ls(e){let t=await No(e.policy,e.nodes,e.node,e.hooks);if(t.kind===`occluded`)throw Rs({label:e.label,node:t.node,action:e.action});return t.node}function Rs(e){return new t(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${zs(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 zs(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 Bs(e,n,r){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=n.session??`default`,a=await e.sessions.get(i);if(!a)throw new t(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(U(e,n),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:W(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function Vs(e,n,r){if(e.backend.platform!==`macos`)return;let i=await Hs(e,n);if(!(i!==`desktop`&&i!==`menubar`)&&!(i===`menubar`&&(r===`click`||r===`press`)))throw new t(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function Hs(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Us(e,n,r){let{session:i,snapshot:a}=await $o(e,n.session),o=r.fallbackLabel??``,s=Gs(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new t(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:he});return Ws({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function Ws(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=Gs(o.nodes,r.ref,{fallbackLabel:i});return s&&ne(v(a.node),v(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function Gs(e,r,i){let a=s(r);if(!a)throw new t(`INVALID_ARGS`,`Invalid ref: ${r}`);let o=n(e,a);if(qs(o))return As(a,o,`exact`);let c=i.fallbackLabel.length>0?qo(e,i.fallbackLabel):null;return qs(c)?As(a,c,`label-fallback`):null}function Ks(e,n,r){let i=is(n,e,{bounds:[ke(e,n),e.rect?je(n,e.rect):null].filter(e=>e!==null)});if(i.kind===`resolved`)return i.point;throw i.kind===`invalid`?new t(`COMMAND_FAILED`,r.invalidMessage):new t(`COMMAND_FAILED`,`${r.blockedTargetLabel} has no parent-owned touch point outside its interactive descendants`,{reason:`covered_by_interactive_descendants`,...r.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 qs(e){return e?q(e.rect)!==null:!1}async function Js(e,t,n,r,i,{action:a}){return await $s(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=>`${Xs(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 Ys(e,t,n,r,i,{action:a}){return await $s(e,t,n,r,{message:`Ref ${i} is off-screen and not safe to ${a}`,details:{reason:`offscreen_ref`,ref:s(i)},hint:e=>`${Xs(e)} in small steps (a single large scroll can overshoot; a short bounded gesture pan lands it more reliably), then retry ${a} 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 Xs(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function Zs(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||s(n.ref)===null)return{};let a=Gs(i,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!a)return{};let o=H.resolvedTarget,c=await Ls({policy:o,nodes:i,node:a.node,action:r,label:`Ref ${n.ref}`,hooks:{offscreen:async(i,a)=>await Ys(e,t,i,a,n.ref,{action:r,pipeline:o})}});return{...Is(c,r),node:c,preActionNodes:i}}async function Qs(e,t,n,r,i){let a=await Zs(e,t,n,r),o=G(await i(U(e,t),{kind:`ref`,ref:n.ref,...n.fallbackLabel?{fallbackLabel:n.fallbackLabel}:{}}));return{kind:`ref`,target:{kind:`ref`,ref:n.ref},resolution:Os,...a,...o?{backendResult:o}:{}}}async function $s(e,n,r,i,a){let o=r.rect?ke(r,i):null;if(!r.rect||!o||Se(r,i))return r;let s=je(i,r.rect),c=await e.backend.confirmOffscreenTargetVisible?.(U(e,n),r,s);if(c)return{...r,rect:c};let l=Ue(r,i);throw new t(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:o,...l?{scrollDirection:l}:{},hint:a.hint(l)})}function ec(e,t){let n=z(e.type??`Element`),r=R(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 tc(e,t,n={}){let r=ic(rc(e,n),rc(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 nc(e,t={}){return rc(e,t).length}function rc(e,t){return t.flatten?e.map(e=>({text:L(e,0,!1),comparable:ec(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):_i(e).map(e=>({text:e.text,comparable:ec(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function ic(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=oc(a,i,s)?sc(a,i+1):sc(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 ac(o,e,t,n,r)}}return[]}function ac(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=oc(i,c,r)?c+1:c-1,u=sc(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 oc(e,t,n){return t===-n||t!==n&&sc(e,t-1)<sc(e,t+1)}function sc(e,t){return e.get(t)??0}const cc=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),lc={strippedIndexes:new Set,refs:new Set};function uc(e){let t=new Set(e.filter(e=>m(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return lc;let n=new Map(e.map(e=>[e.index,e])),r=hc(e,n,t),i=new Set(r),a=Cc(e,n,r);for(let t of hc(e,n,a))i.add(t);for(let o of dc(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 dc(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=pc(t,n,r);if(o.size===0)return a;let s=mc(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&fc(n,t,o)&&a.add(n.index);return a}function fc(e,t,n){if(!e.rect)return!1;let r=wc(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 pc(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=wc(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 mc(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 hc(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)Tc(i,t,n)&&r.add(i.index);return r}function gc(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(te(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(se(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function _c(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(de).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:vc(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?lc:{strippedIndexes:o,refs:s}}function vc(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&gc(e,t)).map(e=>e.index))}function yc(e,t){let n=uc(e),r=_c(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 bc(e,t){let{strippedIndexes:n}=yc(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function xc(e,t){return yc(e,t).refs}function Sc(e){return uc(e).refs}function Cc(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||m(n.type??``)!==`keyboard`)continue;let i=wc(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>cc.has(m(e.type??``))&&!n.has(e.index)&&Tc(e,t,a))&&r.delete(i)}return r}function wc(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(m(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function Tc(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}async function Ec(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};throw e}finally{clearTimeout(c)}}function Dc(e){let t=e.snapshotQuality?.backend,n=(e.backend===`xctest`?Oc(e.nodes):e.nodes).map(jc);return n.sort((e,t)=>Nc(e).localeCompare(Nc(t))),{captureBackend:t,nodes:n}}function Oc(e){let t=Ae(e),n=e.flatMap(e=>x(e)&&p(e.rect)?[e.rect]:[]);return e.filter(r=>x(r)||Se(r,e,t,n))}function kc(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 Ac(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 jc(e){return{identity:`${e.type??``}#${Mc(e)}`,...e.rect?{rect:{...e.rect}}:{}}}function Mc(e){return[e.label,e.identifier,e.value].map(e=>String(e??``).trim()).join(`#`)}function Nc(e){let t=e.rect;return`${e.identity}#${t?`${t.x},${t.y},${t.width},${t.height}`:``}`}const Pc=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Fc(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=W(e),o=a+i,s=!1,c=await e.sessions.get(t.session??`default`),l,u=qe(c?.snapshot?.snapshotQuality),d=Math.min(300,Math.max(25,r)),f=0,p,m=0,h,g=a,_=r;for(;W(e)<o;){let c=await Hc(e,t,o-W(e),u);if(!c)return{settled:!1,stalled:!0,waitedMs:W(e)-a,captures:f,nodeCount:m,lastCapture:h};f+=1,h=c,l??=Ic(n.broadTransitionBaselineNodes,c.snapshot,e.backend.platform);let v=Dc(c.snapshot);_=Rc({baseline:l,signal:v,requestedQuietMs:r,currentQuietMs:_}),u??=qe(c.snapshot.snapshotQuality);let y=W(e),ee=Bc({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=Vc({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(t<=0)break;await Na(e,t);continue}if(!kc(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=Vc({nowMs:y,quietSinceMs:g,quietMs:_,pollMs:d,deadlineMs:o});if(b<=0)break;await Na(e,b)}return{settled:!1,stalled:!1,waitedMs:W(e)-a,captures:f,nodeCount:m,lastCapture:h}}function Ic(e,t,n){if(!e||!t||!Lc(t.backend,n))return;let r=t.nodes.some(x),i=e.length<=5;if(!(!r&&!i))return Dc({...t,nodes:e})}function Lc(e,t){return e===`xctest`?!0:e===void 0&&t===`ios`}function Rc(e){return e.requestedQuietMs<500||!Ac(e.baseline,e.signal)?e.currentQuietMs:Math.max(e.requestedQuietMs,1500)}function zc(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function Bc(e){if(!(e.resetRequested!==!0||e.alreadyReset||!zc(e.verdict)))return Math.max(e.deadlineMs,e.nowMs+e.timeoutMs)}function Vc(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 Hc(e,t,n,r){let i=await Ec(e,t,n,async n=>await es(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0,preferredBackend:r}));return i.timedOut?void 0:i.value}const Uc=`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.`,Wc=`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 Gc(e,t,n){return await qc(e,t,{...n,baselineNodes:await Xc(e,t,n.resolved),actionPoint:n.resolved.point})}const Kc=async(e,t)=>(await qc(e,t,t)).observation;async function qc(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 Jc(e,t,n,a,await Fc(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 Jc(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?Wc:Uc}};let{stored:o,session:s}=await ll(e,t,i.lastCapture),c=i.lastCapture.snapshot.nodes;return{observation:{...a,...i.settled&&o?nl(n.baselineNodes,c,n.actionPoint,s?.appBundleId):{},...cl(i,o,c.length)},settledNodes:c}}function Yc(e,t){if(!e)return;let n=K(e),r=t!==void 0&&n.digest!==K(t).digest;return{...n,changedFromBefore:r}}async function Xc(e,t,n){let r=await e.sessions.get(t.session??`default`);return Zc(n,r)??Qc(n)??$c(r)}function Zc(e,t){if(e.kind===`ref`)return el(t?.refFrameSnapshot?.nodes)}function Qc(e){if(`preActionNodes`in e)return el(e.preActionNodes)}function $c(e){return e?.refFrameSnapshot?.nodes??e?.snapshot?.nodes??[]}function el(e){return e?.length?e:void 0}function tl(e,t,n){let r=tc(bc(e,n),bc(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=sl(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 nl(e,t,n,r){let i=tl(e,t,r);return{diff:i,...rl(i,t,n,r)}}function rl(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=xc(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)&&!il(o.get(e),n))?{}:ol(t,i,r)}function il(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 al=new Set([`application`,`window`]);function ol(e,t,n){let r=xc(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!al.has(z(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=z(e.type??`Element`),n=R(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function sl(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 cl(e,t,n){return e.stalled?{hint:Wc}:e.settled?t?n<5?{hint:Pc}:{}:{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:Uc}}async function ll(e,t,n){if(Je(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 ul(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function dl(e,t,n,r,i){let a=await fl(e,t,n,i);return ml({...r,...a})}async function fl(e,t,n,r){if(r.settle!==void 0){let i=await Gc(e,t,{...r.settle,resolved:n}),a=r.verify?Yc(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 pl(e,t,n);return i?{evidence:i}:{}}async function pl(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=K((await Bs(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==K(r).digest;return{...n,changedFromBefore:i}}catch{return}}function ml(e){let t=e;if(t.targetHittable!==!1||!hl(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function hl(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function gl(e,n){let r=e.filter(t=>Te(t,e)).map(e=>e.rect).filter(_l),i=r.length>0?r:e.map(e=>e.rect).filter(_l);if(i.length===0)throw new t(`COMMAND_FAILED`,`Cannot infer viewport for ${n}`);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)),c=Math.max(...i.map(e=>e.y+e.height));return{x:a,y:o,width:s-a,height:c-o}}function _l(e){return!!(e&&e.width>0&&e.height>0)}async function vl(e,t){return await e.backend.resolveGestureViewport?.(U(e,t))||gl((await Bs(e,t,!1)).snapshot.nodes,`gesture`)}const yl=async(e,n)=>{let r=await Q(e,n,{action:`focus`,requireInteractive:!0,pipeline:H.resolvedTarget});if(!e.backend.focus)throw new t(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=$(r),a=G(await e.backend.focus(U(e,n),i));return{...r,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},bl=async(e,n)=>{let r=ul(n),i=await Q(e,n,{action:`longPress`,requireInteractive:!0,pipeline:H.promotedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.longPress)throw new t(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=n.durationMs===void 0?void 0:Ma(n.durationMs,`durationMs`,0,12e4),o=$(i),s=G(await e.backend.longPress(U(e,n),o,{durationMs:a}));return await dl(e,n,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},r)},xl=async(e,n)=>{let r=ul(n),i=r.needsPreActionBaseline?null:await Sl(e,n);if(i)return i;let a=await Q(e,n,{action:`hover`,requireInteractive:!1,pipeline:H.resolvedTarget,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:n.expectedResolvedTarget});if(!e.backend.hover)throw new t(`UNSUPPORTED_OPERATION`,`hover is not supported by this backend`);let o=$(a),s=G(await e.backend.hover(U(e,n),o));return await dl(e,n,a,{...a,...s?{backendResult:s}:{},...w(`Hovered (${o.x}, ${o.y})`)},r)};async function Sl(e,t){if(t.target.kind!==`ref`||!e.backend.hoverTarget||t.expectedResolvedTarget)return null;let{hoverTarget:n}=e.backend;return await Qs(e,t,t.target,`hover`,async(e,t)=>await n(e,t))}const Cl=async(e,n)=>{if(!e.backend.performGesture)throw new t(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Vs(e,n,`drag`);let r=await vl(e,n),i=await wl(e,n,`source`),a=await wl(e,n,`destination`),o=Be({from:$(i),to:$(a),sourceHoldMs:n.gesture.sourceHoldMs,moveMs:n.gesture.moveMs,destinationHoldMs:n.gesture.destinationHoldMs},r),s=G(await e.backend.performGesture(U(e,n),o)),{start:c,end:l}=Le(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:l,targets:{source:Tl(i),destination:Tl(a)},recording:El(i,a),...s?{backendResult:s}:{},...w(`Dragged ${n.gesture.source} to ${n.gesture.destination}`)}};async function wl(e,t,n){let r=t.gesture[n];return await Q(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,pipeline:H.resolvedTarget,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Tl(e){if(e.kind===`point`||!e.resolution)throw new t(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let n=`selectorChain`in e?e.selectorChain:void 0;return{...n?.length?{selectorChain:n}:{},resolution:e.resolution}}function El(e,t){let n=Dl(e),r=Dl(t),i=Ol(e),a=Ol(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Dl(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Ol(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preActionNodes))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preActionNodes}}const kl=async(e,n)=>{if(!e.backend.scroll)throw new t(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=jl(n.direction),i=Fl(n.amount,`scroll amount`),a=Ll(n.pixels,`scroll pixels`),o=ze(n.durationMs);He({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await Al(e,n),c=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:$(s)},l=e.backend.scroll,u=async()=>await l(U(e,n),c,{direction:r.direction,...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...o===void 0?{}:{durationMs:o}}),d,f=0;if(r.edge){let t=r.edge,i=Ml(s),a=await _a({edge:t,captureState:async r=>await Nl(e,n,t,i,r),scroll:u});d=a.result,f=a.passes}else d=await u(),f=1;let p=G(d),m=Re(p);return{...s,direction:r.direction,...r.edge?{edge:r.edge,passes:f}:{},...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...m===void 0?{}:{durationMs:m},...p?{backendResult:p}:{},...w(va(r.direction,r.edge,f,i,a))}};async function Al(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await Vs(e,t,`scroll`),{kind:`viewport`}):await Q(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,pipeline:H.resolvedTarget})}function jl(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:Pl(e,`scroll direction`)}}function Ml(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function $(e){if(!e.point)throw new t(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Nl(e,n,r,i,a){if(!e.backend.captureSnapshot)throw new t(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:o}=e.backend;return await ga({edge:r,target:i,scope:a,captureNodes:async t=>{let r=await o(U(e,n),{scope:t});return r.snapshot?.nodes??r.nodes??[]}})}function Pl(e,n){switch(e){case`up`:case`down`:case`left`:case`right`:return e;default:throw new t(`INVALID_ARGS`,`${n} must be up, down, left, or right`)}}function Fl(e,t){return e===void 0?void 0:Il(e,t)}function Il(e,n){if(!Number.isFinite(e)||e<=0)throw new t(`INVALID_ARGS`,`${n} must be a positive number`);return e}function Ll(e,n){if(e!==void 0){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new t(`INVALID_ARGS`,`${n} must be a positive integer`);return e}}const Rl=/^e\d+$/;function zl(e){if(e[0]?.startsWith(`@`)){let t=Jl(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(Rl.test(e[0]??``))throw new t(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let n=me(e);if(n){if(n.rest.length>0)throw new t(`INVALID_ARGS`,Gl(e,n));return{selector:n.selectorExpression}}return Vl(e)}function Bl(e){let n=e[0];if(n?.startsWith(`@`)){let t=e.length>=3?e.slice(2).join(` `):e.slice(1).join(` `);return{kind:`ref`,target:{ref:n,label:e.length>=3?Jl(e.slice(1,2)):void 0},text:t}}if(Rl.test(n??``))throw new t(`INVALID_ARGS`,`Did you mean "@${n}"? Snapshot refs need the @ prefix.`);let r=me(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:Vl(e.slice(0,2)),text:e.slice(2).join(` `)}}function Vl(e){let n=e[0]??``,r=ve(n);if(r){let i=Hl(n)?r.value:[r.value,...e.slice(1)].join(` `).trim();throw new t(`INVALID_ARGS`,Ul({key:r.key,value:i}))}let i=Number(e[0]),a=Number(e[1]);if(Number.isFinite(i)&&Number.isFinite(a))return{x:i,y:a};throw new t(`INVALID_ARGS`,Wl(e))}function Hl(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function Ul(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${Ee.join(`, `)}. ${fe(t)?`Did you mean role=${t} label=${ql(n)}?`:`Did you mean label=${ql(n)}?`}`}function Wl(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>Ce(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${ql(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function Gl(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${Kl(e,t)??`text="Sign in"`}.`}function Kl(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${ql(a)}`;return[...e.slice(0,n-1),o].join(` `)}function ql(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function Jl(e){return e.join(` `).trim()||void 0}function Yl(e,t={}){let n=ea(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?Xl(`✓`,e):`✓`}return e===`fail`?n?Xl(`⨯`,`red`):`⨯`:e===`warn`?n?Xl(`!`,`yellow`):`!`:n?Xl(`-`,`dim`):`-`}function Xl(e,t){return V(e,t,{validateStream:!1})}function Zl(e){return`${Yl($l(e.status))} ${eu(e)}`}function Ql(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function $l(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function eu(e){let t=typeof e.id==`string`&&e.id.length>0?e.id:`check`,n=typeof e.summary==`string`&&e.summary.length>0?e.summary:t;return n===t?t:`${t}: ${n}`}let tu=!1;function nu(){tu=!0}function ru(){let e=tu;return tu=!1,e}function iu(e,n){let r=e===void 0?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new t(`INVALID_ARGS`,`viewport ${n} must be a positive integer`);return r}const au=[`auto`,`react-native`,`expo`,`repack`];function ou(e){if(e!==void 0){if(au.includes(e))return e;throw new t(`INVALID_ARGS`,`metro prepare --kind must be auto, react-native, expo, or repack`)}}function su(e){let t=Xe.extname(e).toLowerCase();return t===`.yaml`||t===`.yml`}function cu(e,t){return`Maestro YAML requires explicit --maestro routing: ${e} ${t} --maestro`}function lu(e,t){return t===`maestro`&&su(e)?`maestro`:`ad`}const uu=2*1024*1024,du=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;async function fu(e){let t=Ye(e.inputPath,{cwd:e.cwd}),n=mu(t,e.inputPath);if(lu(t,e.replayBackend)!==`maestro`)return pu(t,{[t]:n},e.inputPath);let{collectMaestroFlowSources:r}=await import(`./src4.js`).then(e=>e.t);return pu(t,r({entryPath:t,entrySource:n,env:e.env,readSource:hu}),e.inputPath)}function pu(e,t,n){return gu(t,n),{entry:e,files:t}}function mu(e,n){try{return $e.readFileSync(e,`utf8`)}catch(r){throw new t(`INVALID_ARGS`,`replay script not found on this machine: ${n}`,{path:e,hint:`Replay scripts are read by the client and sent to the daemon, so the path must resolve where you ran the command.`},r instanceof Error?r:void 0)}}function hu(e){try{return $e.readFileSync(e,`utf8`)}catch{return}}function gu(e,n){let r=Object.values(e).reduce((e,t)=>e+Buffer.byteLength(t,`utf8`),0);if(!(r<=2097152))throw new t(`INVALID_ARGS`,`replay script sources for ${n} total ${r} bytes, over the ${uu}-byte limit; split the flow or drop unused runFlow includes.`,{limitBytes:uu,totalBytes:r})}function _u(e,n){let r=e.files[n];if(r===void 0)throw new t(`INVALID_ARGS`,`replay script source is missing ${n}; it was not part of the script sources sent with this request.`,{path:n,entry:e.entry});return r}export{xo as $,Gt as $t,tc as A,lt as An,Ir as At,$o as B,An as Bt,ul as C,dt as Cn,ea as Ct,Ec as D,at as Dn,li as Dt,Fc as E,ot as En,L as Et,Q as F,En as Ft,qo as G,an as Gt,Zo as H,cn as Ht,hs as I,zn as It,Bo as J,Yt as Jt,zo as K,rn as Kt,gs as L,Dn as Lt,vs as M,it as Mn,Fr as Mt,Vs as N,br as Nt,Sc as O,ut as On,mi as Ot,Qs as P,Sr as Pt,Lo as Q,Xt as Qt,es as R,On as Rt,dl as S,ft as Sn,Ai as St,Pc as T,nt as Tn,z as Tt,Qo as U,dn as Ut,ns as V,In as Vt,Jo as W,fn as Wt,jo as X,Zt as Xt,Mo as Y,Qt as Yt,No as Z,qt as Zt,yl as _,Ot as _n,V as _t,cu as a,At as an,Ba as at,vl as b,mt as bn,Mi as bt,iu as c,_t as cn,Pa as ct,Ql as d,Dt as dn,U as dt,D as en,So as et,Zl as f,Ct as fn,Ma as ft,Cl as g,bt as gn,H as gt,zl as h,Et as hn,_a as ht,su as i,T as in,Y as it,nc as j,ct as jn,Hr as jt,xc as k,st as kn,Br as kt,ru as l,St as ln,G as lt,Bl as m,Tt as mn,va as mt,fu as n,E as nn,ho as nt,lu as o,jt as on,q as ot,Yl as p,xt as pn,ga as pt,Ro as q,$t as qt,_u as r,Rt as rn,Xa as rt,ou as s,gt as sn,K as st,du as t,Bt as tn,go as tt,nu as u,wt as un,W as ut,xl as v,ht as vn,Ki as vt,Kc as w,rt as wn,R as wt,kl as x,et as xn,ji as xt,bl as y,w as yn,Gi as yt,ts as z,kn as zt};
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import { b as Rect, v as Point } from "./sdk-contracts.js";
|
|
2
|
-
import { Readable, Writable } from "node:stream";
|
|
3
|
-
import { StdioOptions, spawn } from "node:child_process";
|
|
4
|
-
//#region packages/contracts/src/scroll-gesture.d.ts
|
|
5
|
-
declare const SCROLL_INPUT_DIRECTIONS: readonly ['up', 'down', 'left', 'right', 'top', 'bottom'];
|
|
6
|
-
type ScrollInputDirection = (typeof SCROLL_INPUT_DIRECTIONS)[number];
|
|
7
|
-
declare const SCROLL_DIRECTIONS: readonly ['up', 'down', 'left', 'right'];
|
|
8
|
-
type ScrollDirection = (typeof SCROLL_DIRECTIONS)[number];
|
|
9
|
-
declare const SWIPE_PRESETS: readonly ['left', 'right', 'left-edge', 'right-edge'];
|
|
10
|
-
type SwipePreset = (typeof SWIPE_PRESETS)[number];
|
|
11
|
-
declare const SWIPE_PATTERNS: readonly ['one-way', 'ping-pong'];
|
|
12
|
-
type SwipePattern = (typeof SWIPE_PATTERNS)[number];
|
|
13
|
-
type TransformGestureParams = {
|
|
14
|
-
x: number;
|
|
15
|
-
y: number;
|
|
16
|
-
dx: number;
|
|
17
|
-
dy: number;
|
|
18
|
-
scale: number;
|
|
19
|
-
degrees: number;
|
|
20
|
-
durationMs?: number;
|
|
21
|
-
};
|
|
22
|
-
//#endregion
|
|
23
|
-
//#region packages/contracts/src/gesture-plan-types.d.ts
|
|
24
|
-
type GesturePointerCount = 1 | 2;
|
|
25
|
-
/** Selects one-pointer release timing without changing semantic gesture intent. */
|
|
26
|
-
type GestureExecutionProfile = 'endpoint-hold' | 'timed-pan';
|
|
27
|
-
type PointerTrajectorySample = {
|
|
28
|
-
offsetMs: number;
|
|
29
|
-
point: Point;
|
|
30
|
-
};
|
|
31
|
-
type PointerTrajectory = {
|
|
32
|
-
pointerId: 0 | 1;
|
|
33
|
-
samples: readonly PointerTrajectorySample[];
|
|
34
|
-
};
|
|
35
|
-
type SinglePointerTrajectory = {
|
|
36
|
-
pointerId: 0;
|
|
37
|
-
samples: readonly [PointerTrajectorySample, PointerTrajectorySample, ...PointerTrajectorySample[]];
|
|
38
|
-
};
|
|
39
|
-
type SinglePointerGesturePlan = {
|
|
40
|
-
topology: 'single';
|
|
41
|
-
intent: 'fling' | 'pan';
|
|
42
|
-
executionProfile: GestureExecutionProfile;
|
|
43
|
-
durationMs: number;
|
|
44
|
-
viewport: Rect;
|
|
45
|
-
pointers: readonly [SinglePointerTrajectory];
|
|
46
|
-
};
|
|
47
|
-
type MultiTouchGesturePlan = {
|
|
48
|
-
topology: 'two';
|
|
49
|
-
intent: 'pan' | 'pinch' | 'rotate' | 'transform';
|
|
50
|
-
durationMs: number;
|
|
51
|
-
viewport: Rect;
|
|
52
|
-
pointers: readonly [PointerTrajectory, PointerTrajectory];
|
|
53
|
-
};
|
|
54
|
-
type GesturePlan = SinglePointerGesturePlan | MultiTouchGesturePlan;
|
|
55
|
-
//#endregion
|
|
56
|
-
//#region src/platforms/android/ime-helper-types.d.ts
|
|
57
|
-
type AndroidImeHelperManifest = {
|
|
58
|
-
name: 'android-ime-helper';
|
|
59
|
-
version: string;
|
|
60
|
-
assetName: string;
|
|
61
|
-
sha256: string;
|
|
62
|
-
packageName: string;
|
|
63
|
-
versionCode: number;
|
|
64
|
-
serviceComponent: string;
|
|
65
|
-
broadcastProtocol: 'android-ime-helper-v1';
|
|
66
|
-
};
|
|
67
|
-
type AndroidImeHelperArtifact = {
|
|
68
|
-
apkPath: string;
|
|
69
|
-
manifest: AndroidImeHelperManifest;
|
|
70
|
-
};
|
|
71
|
-
//#endregion
|
|
72
|
-
//#region src/platforms/android/snapshot-helper-types.d.ts
|
|
73
|
-
type AndroidSnapshotHelperManifest = {
|
|
74
|
-
name: 'android-snapshot-helper';
|
|
75
|
-
version: string;
|
|
76
|
-
releaseTag?: string;
|
|
77
|
-
assetName?: string;
|
|
78
|
-
apkUrl: string | null;
|
|
79
|
-
sha256: string;
|
|
80
|
-
checksumName?: string;
|
|
81
|
-
packageName: string;
|
|
82
|
-
versionCode: number;
|
|
83
|
-
instrumentationRunner: string;
|
|
84
|
-
minSdk: number;
|
|
85
|
-
targetSdk?: number;
|
|
86
|
-
outputFormat: 'uiautomator-xml';
|
|
87
|
-
statusProtocol: 'android-snapshot-helper-v1';
|
|
88
|
-
installArgs: string[];
|
|
89
|
-
};
|
|
90
|
-
type AndroidSnapshotHelperArtifact = {
|
|
91
|
-
apkPath: string;
|
|
92
|
-
manifest: AndroidSnapshotHelperManifest;
|
|
93
|
-
};
|
|
94
|
-
//#endregion
|
|
95
|
-
//#region src/platforms/android/touch-plan.d.ts
|
|
96
|
-
type AndroidLongPressTouchPlan = {
|
|
97
|
-
topology: 'single';
|
|
98
|
-
intent: 'longPress';
|
|
99
|
-
durationMs: number;
|
|
100
|
-
pointers: readonly [PointerTrajectory];
|
|
101
|
-
};
|
|
102
|
-
/**
|
|
103
|
-
* Transport samples are strictly denser than the canonical endpoint pair, so the shared plan a
|
|
104
|
-
* command builds cannot satisfy the transport types: skipping the lowering below is a type error
|
|
105
|
-
* at every injection seam rather than a silently sparse gesture.
|
|
106
|
-
*/
|
|
107
|
-
type AndroidTransportSamples = readonly [PointerTrajectorySample, PointerTrajectorySample, PointerTrajectorySample, ...PointerTrajectorySample[]];
|
|
108
|
-
type AndroidTransportSinglePointerTrajectory = {
|
|
109
|
-
pointerId: 0;
|
|
110
|
-
samples: AndroidTransportSamples;
|
|
111
|
-
};
|
|
112
|
-
type AndroidTransportSinglePointerGesturePlan = Omit<SinglePointerGesturePlan, 'pointers'> & {
|
|
113
|
-
pointers: readonly [AndroidTransportSinglePointerTrajectory];
|
|
114
|
-
};
|
|
115
|
-
type AndroidTransportGesturePlan = AndroidTransportSinglePointerGesturePlan | MultiTouchGesturePlan;
|
|
116
|
-
type AndroidProviderTouchPlan = AndroidTransportGesturePlan | (AndroidLongPressTouchPlan & {
|
|
117
|
-
viewport: Rect;
|
|
118
|
-
});
|
|
119
|
-
//#endregion
|
|
120
|
-
//#region src/utils/exec.d.ts
|
|
121
|
-
type ExecResult = {
|
|
122
|
-
stdout: string;
|
|
123
|
-
stderr: string;
|
|
124
|
-
exitCode: number;
|
|
125
|
-
stdoutBuffer?: Buffer;
|
|
126
|
-
};
|
|
127
|
-
type ExecOptions = {
|
|
128
|
-
cwd?: string;
|
|
129
|
-
env?: NodeJS.ProcessEnv;
|
|
130
|
-
allowFailure?: boolean;
|
|
131
|
-
binaryStdout?: boolean;
|
|
132
|
-
stdin?: string | Buffer;
|
|
133
|
-
timeoutMs?: number;
|
|
134
|
-
detached?: boolean;
|
|
135
|
-
signal?: AbortSignal;
|
|
136
|
-
/** Max stdout/stderr bytes for synchronous runs (default Node ~1MB). */
|
|
137
|
-
maxBuffer?: number;
|
|
138
|
-
};
|
|
139
|
-
type ExecBackgroundOptions = ExecOptions & {
|
|
140
|
-
/**
|
|
141
|
-
* Capture stdout/stderr into the wait result when the child has piped stdio.
|
|
142
|
-
* Set false when the caller owns, ignores, or forwards the streams.
|
|
143
|
-
*/
|
|
144
|
-
captureOutput?: boolean;
|
|
145
|
-
stdio?: StdioOptions;
|
|
146
|
-
};
|
|
147
|
-
//#endregion
|
|
148
|
-
//#region src/platforms/android/adb-executor.d.ts
|
|
149
|
-
type AndroidAdbExecutorOptions = Pick<ExecOptions, 'allowFailure' | 'timeoutMs' | 'binaryStdout' | 'stdin' | 'signal'>;
|
|
150
|
-
type AndroidAdbExecutorResult = Pick<ExecResult, 'exitCode' | 'stdout' | 'stderr' | 'stdoutBuffer'>;
|
|
151
|
-
type AndroidAdbProcess = {
|
|
152
|
-
pid?: number;
|
|
153
|
-
exitCode?: number | null;
|
|
154
|
-
signalCode?: NodeJS.Signals | null;
|
|
155
|
-
stdin: Writable | null;
|
|
156
|
-
stdout: Readable | null;
|
|
157
|
-
stderr: Readable | null;
|
|
158
|
-
killed: boolean;
|
|
159
|
-
kill(signal?: NodeJS.Signals | number): boolean;
|
|
160
|
-
once(event: 'exit' | 'close', listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
|
|
161
|
-
on(event: 'error', listener: (error: Error) => void): unknown;
|
|
162
|
-
on(event: 'exit' | 'close', listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
|
|
163
|
-
};
|
|
164
|
-
/**
|
|
165
|
-
* Runs device-scoped adb arguments after the device serial has already been selected.
|
|
166
|
-
* Implementations must be safe to call concurrently for one request.
|
|
167
|
-
*/
|
|
168
|
-
type AndroidAdbExecutor = (args: string[], options?: AndroidAdbExecutorOptions) => Promise<AndroidAdbExecutorResult>;
|
|
169
|
-
type AndroidAdbSpawner = (args: string[], options?: ExecBackgroundOptions) => AndroidAdbProcess;
|
|
170
|
-
type AndroidPortReverseEndpoint = `tcp:${number}` | `localabstract:${string}`;
|
|
171
|
-
type AndroidPortReverseMapping = {
|
|
172
|
-
local: AndroidPortReverseEndpoint;
|
|
173
|
-
remote: AndroidPortReverseEndpoint;
|
|
174
|
-
ownerId?: string;
|
|
175
|
-
};
|
|
176
|
-
type AndroidPortReverseOptions = {
|
|
177
|
-
signal?: AbortSignal;
|
|
178
|
-
timeoutMs?: number;
|
|
179
|
-
};
|
|
180
|
-
type AndroidPortReverseProvider = {
|
|
181
|
-
ensure(mapping: AndroidPortReverseMapping, options?: AndroidPortReverseOptions): Promise<void>;
|
|
182
|
-
remove(local: AndroidPortReverseEndpoint, options?: AndroidPortReverseOptions): Promise<void>;
|
|
183
|
-
removeAllOwned(ownerId: string, options?: AndroidPortReverseOptions): Promise<void>;
|
|
184
|
-
list?(options?: AndroidPortReverseOptions): Promise<AndroidPortReverseMapping[]>;
|
|
185
|
-
};
|
|
186
|
-
type AndroidAdbTransferOptions = AndroidAdbExecutorOptions;
|
|
187
|
-
type AndroidAdbInstallOptions = AndroidAdbTransferOptions & {
|
|
188
|
-
replace?: boolean;
|
|
189
|
-
allowTestPackages?: boolean;
|
|
190
|
-
allowDowngrade?: boolean;
|
|
191
|
-
grantPermissions?: boolean;
|
|
192
|
-
};
|
|
193
|
-
type AndroidAdbPuller = (remotePath: string, localPath: string, options?: AndroidAdbTransferOptions) => Promise<AndroidAdbExecutorResult>;
|
|
194
|
-
/**
|
|
195
|
-
* Installs an APK path. Implementations are responsible for honoring semantic
|
|
196
|
-
* install options such as replace/test/downgrade/grant-permissions.
|
|
197
|
-
*/
|
|
198
|
-
type AndroidAdbInstaller = (apkPath: string, options?: AndroidAdbInstallOptions) => Promise<AndroidAdbExecutorResult>;
|
|
199
|
-
type AndroidBundleInstaller = (bundlePath: string, options: Readonly<{
|
|
200
|
-
mode: string;
|
|
201
|
-
signal?: AbortSignal;
|
|
202
|
-
}>) => Promise<void>;
|
|
203
|
-
type AndroidTextInputAction = 'type' | 'fill';
|
|
204
|
-
type AndroidTextInjectionRequest = {
|
|
205
|
-
action: AndroidTextInputAction;
|
|
206
|
-
text: string;
|
|
207
|
-
delayMs?: number;
|
|
208
|
-
/**
|
|
209
|
-
* Present only for fill. Providers must make this target the focused/replaced
|
|
210
|
-
* input for the request, not inject into an unrelated currently focused field.
|
|
211
|
-
*/
|
|
212
|
-
target?: {
|
|
213
|
-
x: number;
|
|
214
|
-
y: number;
|
|
215
|
-
};
|
|
216
|
-
};
|
|
217
|
-
type AndroidTextInjector = (request: AndroidTextInjectionRequest) => Promise<void>;
|
|
218
|
-
type AndroidTouchInjector = (request: AndroidProviderTouchPlan) => Promise<Record<string, unknown> | void>;
|
|
219
|
-
type AndroidGestureViewportProvider = () => Promise<Rect>;
|
|
220
|
-
type AndroidAdbProviderBase = {
|
|
221
|
-
/**
|
|
222
|
-
* Fallback executor for device-scoped adb arguments. Providers may omit explicit
|
|
223
|
-
* methods to keep the legacy exec-shaped pull/install fallback.
|
|
224
|
-
*/
|
|
225
|
-
exec: AndroidAdbExecutor;
|
|
226
|
-
spawn?: AndroidAdbSpawner;
|
|
227
|
-
reverse?: AndroidPortReverseProvider;
|
|
228
|
-
pull?: AndroidAdbPuller;
|
|
229
|
-
install?: AndroidAdbInstaller;
|
|
230
|
-
installBundle?: AndroidBundleInstaller;
|
|
231
|
-
text?: AndroidTextInjector;
|
|
232
|
-
snapshotHelperArtifact?: AndroidSnapshotHelperArtifact;
|
|
233
|
-
imeHelperArtifact?: AndroidImeHelperArtifact;
|
|
234
|
-
};
|
|
235
|
-
type AndroidTouchCapabilities = {
|
|
236
|
-
touch?: never;
|
|
237
|
-
gestureViewport?: never;
|
|
238
|
-
} | {
|
|
239
|
-
touch: AndroidTouchInjector;
|
|
240
|
-
gestureViewport: AndroidGestureViewportProvider;
|
|
241
|
-
};
|
|
242
|
-
type AndroidAdbProvider = AndroidAdbProviderBase & AndroidTouchCapabilities;
|
|
243
|
-
declare function createAndroidPortReverseManager(provider: AndroidAdbProvider | AndroidAdbExecutor): AndroidPortReverseProvider;
|
|
244
|
-
//#endregion
|
|
245
|
-
export { createAndroidPortReverseManager as a, ScrollDirection as c, SwipePreset as d, TransformGestureParams as f, AndroidPortReverseEndpoint as i, ScrollInputDirection as l, AndroidAdbExecutorOptions as n, GesturePlan as o, AndroidAdbProvider as r, GesturePointerCount as s, AndroidAdbExecutor as t, SwipePattern as u };
|