agent-device 0.20.10 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.apk → agent-device-android-ime-helper-0.21.0.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.0.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.manifest.json → agent-device-android-ime-helper-0.21.0.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.10.manifest.json → agent-device-android-snapshot-helper-0.21.0.manifest.json} +6 -6
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
- package/apple/snapshot-bridge/LICENSE.idb +23 -0
- package/apple/snapshot-bridge/README.md +49 -0
- package/apple/snapshot-bridge/SnapshotBridge.m +280 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +33 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +382 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +2 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +16 -8
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +21 -88
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +106 -103
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +6 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +63 -91
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +72 -155
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +74 -78
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +17 -9
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +42 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +185 -461
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +98 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +224 -164
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +110 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +147 -25
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +1 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +24 -307
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +49 -16
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +2 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +4 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +16 -20
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +42 -81
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +35 -82
- package/dist/apple/snapshot-presentation/Package.swift +21 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
- package/dist/src/adapter.js +1 -0
- package/dist/src/adb-executor.js +2 -0
- package/dist/src/adb-failure.js +1 -0
- package/dist/src/adb-host.js +1 -0
- package/dist/src/adb.js +1 -0
- package/dist/src/agent-browser-lifecycle.js +1 -0
- package/dist/src/agent-browser-process-record.js +1 -0
- package/dist/src/agent-browser-provider.js +1 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.d.ts +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-contract.js +1 -0
- package/dist/src/alert-runtime.js +1 -0
- package/dist/src/android-adb.d.ts +27 -19
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -0
- package/dist/src/android-system-chrome.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/api.js +11 -0
- package/dist/src/app-catalog.js +1 -0
- package/dist/src/app-deployment-resolution.js +2 -0
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory-contract.js +1 -0
- package/dist/src/app-inventory.js +1 -0
- package/dist/src/app-launch.js +2 -0
- package/dist/src/app-lifecycle-facade.js +1 -0
- package/dist/src/app-lifecycle.js +3 -6
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-lifecycle3.js +1 -0
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime.js +1 -4
- package/dist/src/app-log-runtime2.js +4 -0
- package/dist/src/app-parsers.js +4 -0
- package/dist/src/app-resolution-cache.js +1 -0
- package/dist/src/app-resolution-facade.js +1 -0
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +1 -2
- package/dist/src/application-lifecycle-interaction.js +1 -0
- package/dist/src/application-lifecycle-runtime.js +1 -0
- package/dist/src/apps-simctl.js +1 -0
- package/dist/src/archive.js +4 -0
- package/dist/src/artifact-download.js +1 -0
- package/dist/src/artifacts.d.ts +6 -2
- package/dist/src/artifacts.js +1 -1
- package/dist/src/async-lifecycle.js +1 -0
- package/dist/src/audio-probe-result.js +1 -0
- package/dist/src/audio-probe-runtime.js +1 -0
- package/dist/src/audio-probe-support.js +1 -0
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/back-mode.js +1 -0
- package/dist/src/{url.js → base-url.js} +1 -1
- package/dist/src/boot-diagnostics.js +2 -2
- package/dist/src/byte-limit-stream.js +1 -1
- package/dist/src/capabilities.js +1 -0
- package/dist/src/capture.js +1 -0
- package/dist/src/catalog.js +1 -0
- package/dist/src/cli-command-aliases.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +69 -50
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +4 -6
- package/dist/src/click-button.js +1 -0
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +255 -231
- package/dist/src/clipboard.js +1 -0
- package/dist/src/code-signature-cache.js +1 -0
- package/dist/src/code-signature.js +1 -0
- package/dist/src/color.js +1 -0
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/command.js +1 -0
- package/dist/src/compatibility-policy.js +1 -0
- package/dist/src/config.js +1 -1
- package/dist/src/config2.js +1 -0
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -0
- package/dist/src/daemon-process.js +1 -0
- package/dist/src/daemon-registration.js +1 -0
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +2 -2
- package/dist/src/debug-symbols-facade.js +5 -0
- package/dist/src/deploy-result-target.js +1 -0
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -0
- package/dist/src/device-input-state.d.ts +190 -3
- package/dist/src/device-inventory-context.js +1 -0
- package/dist/src/device-isolation.js +1 -0
- package/dist/src/device-release.js +1 -0
- package/dist/src/device-rotation.js +1 -0
- package/dist/src/device-selection-resolver.js +1 -0
- package/dist/src/device-session.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +3 -2
- package/dist/src/diagnostics.js +3 -0
- package/dist/src/diagnostics2.js +1 -0
- package/dist/src/dispatch-resolve.js +1 -0
- package/dist/src/doctor-facade.js +1 -0
- package/dist/src/doctor-output.js +1 -0
- package/dist/src/doctor.js +1 -0
- package/dist/src/doctor2.js +1 -0
- package/dist/src/doctor3.js +1 -0
- package/dist/src/durable-resource.js +1 -0
- package/dist/src/entities.js +1 -1
- package/dist/src/error.js +2 -0
- package/dist/src/exec.js +1 -0
- package/dist/src/file.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/format.js +2 -0
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/gesture-admission.js +1 -0
- package/dist/src/gesture-plan-types.js +1 -0
- package/dist/src/gesture-plan.js +1 -0
- package/dist/src/gesture-runtime.js +1 -0
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/host-file.js +1 -0
- package/dist/src/human-control-contract.js +1 -0
- package/dist/src/human-control.js +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -4
- package/dist/src/input-actions2.js +2 -1
- package/dist/src/install-artifact-facade.js +1 -0
- package/dist/src/install-source-network-transport.js +1 -0
- package/dist/src/install-source.d.ts +3 -10
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -0
- package/dist/src/interaction-ref-policy.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -0
- package/dist/src/interactor-types.js +1 -0
- package/dist/src/interactor.js +6 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +1 -2
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +2 -4
- package/dist/src/internal/png-worker.d.ts +4 -4
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.d.ts +4 -0
- package/dist/src/internal/run-script-http-child.js +1 -0
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/inventory.js +4 -4
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/inventory6.js +1 -1
- package/dist/src/ios-client.js +16 -0
- package/dist/src/ios-snapshot-acquisition.js +1 -0
- package/dist/src/ios-snapshot-adapter.js +1 -0
- package/dist/src/ios-snapshot-planning.js +1 -0
- package/dist/src/ios-snapshot-runtime.js +1 -0
- package/dist/src/json.js +1 -0
- package/dist/src/keyboard-actions.js +1 -0
- package/dist/src/launch-console.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-scope.js +1 -0
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +1610 -7
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -0
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/macos-facade.js +1 -0
- package/dist/src/managed-device-scope.js +1 -0
- package/dist/src/mechanics.js +19 -0
- package/dist/src/metro.d.ts +4 -2
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/multitouch-support.js +1 -0
- package/dist/src/numeric.js +1 -0
- package/dist/src/observability.js +1 -1
- package/dist/src/observation.js +2 -0
- package/dist/src/output-path.js +1 -1
- package/dist/src/owner-identity.js +3 -1
- package/dist/src/parameterized-recorded-fill.js +1 -0
- package/dist/src/parser.js +1 -1
- package/dist/src/perf-facade.js +2 -0
- package/dist/src/perf-runtime-operation-builder.js +1 -0
- package/dist/src/perf-runtime-plan.js +1 -0
- package/dist/src/perf-runtime.js +1 -0
- package/dist/src/perf.js +1 -4
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/physical-device-facade.js +1 -0
- package/dist/src/platform-request-scope.js +1 -0
- package/dist/src/platform-runtime-android-adb-host.js +1 -0
- package/dist/src/platform-runtime-android-mechanics.js +1 -0
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-apple-resources.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -0
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -0
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/plist.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/prepare-kind.js +1 -0
- package/dist/src/process-exit.js +1 -1
- package/dist/src/process.js +1 -0
- package/dist/src/provider-device-runtime.js +1 -0
- package/dist/src/provider-session-ownership.js +2 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/proxy.js +2 -2
- package/dist/src/react-native-overlay.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/rect-center.js +1 -0
- package/dist/src/register-builtins.js +1 -0
- package/dist/src/registry.js +39 -28
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +2 -0
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +8 -8
- package/dist/src/request-admission.js +1 -0
- package/dist/src/request-cancel.js +1 -0
- package/dist/src/request-cancellation.js +1 -0
- package/dist/src/request-progress-protocol.js +1 -0
- package/dist/src/request-providers.js +1 -0
- package/dist/src/request-runtime-binding.js +1 -0
- package/dist/src/request.js +1 -0
- package/dist/src/result-serialization.js +1 -0
- package/dist/src/retry.js +1 -0
- package/dist/src/rolldown-runtime.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -0
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -0
- package/dist/src/runner-owner-facade.js +1 -0
- package/dist/src/runner-owner-state.js +1 -0
- package/dist/src/runner-presentation.js +1 -0
- package/dist/src/runner-selector-query.js +1 -0
- package/dist/src/runner.js +1 -0
- package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +4 -3
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/scoped-provider.js +1 -1
- package/dist/src/screen-recording-completion.js +1 -0
- package/dist/src/screen-recording-live-handle.js +1 -0
- package/dist/src/screen-recording-options.js +1 -0
- package/dist/src/screen-recording-resource-recovery.js +1 -0
- package/dist/src/screen-recording-runtime.js +1 -0
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-result.js +1 -6
- package/dist/src/screenshot-runtime.js +1 -0
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot2.js +1 -0
- package/dist/src/screenshot3.js +5 -0
- package/dist/src/script.js +1 -0
- package/dist/src/scroll-command.js +1 -0
- package/dist/src/scroll-gesture.js +1 -0
- package/dist/src/scroll-indicator.js +1 -0
- package/dist/src/sdk-batch-runner.d.ts +23 -6
- package/dist/src/sdk-batch-runner.js +2 -3
- package/dist/src/sdk-batch.js +2 -0
- package/dist/src/sdk-contracts.d.ts +127 -41
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.d.ts +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +472 -144
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -0
- package/dist/src/server.js +4 -4
- package/dist/src/session-allocation.js +1 -0
- package/dist/src/session-artifact-paths.js +1 -0
- package/dist/src/session-paths.js +1 -0
- package/dist/src/session-repair-tombstone.js +1 -0
- package/dist/src/session-routing.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -0
- package/dist/src/session-snapshot.js +1 -0
- package/dist/src/session-store.js +4 -0
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session2.js +5 -27
- package/dist/src/settings.js +1 -0
- package/dist/src/shared.js +2 -2
- package/dist/src/simctl-facade.js +1 -0
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-facade.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -0
- package/dist/src/snapshot-diagnostics.js +1 -0
- package/dist/src/snapshot-process.js +1 -0
- package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -0
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-scope.js +1 -1
- package/dist/src/snapshot-state.js +1 -0
- package/dist/src/snapshot.js +1 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -0
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +1 -2
- package/dist/src/src4.js +1 -1
- package/dist/src/src5.js +1 -0
- package/dist/src/src6.js +1 -0
- package/dist/src/src7.js +2 -0
- package/dist/src/src8.js +115 -0
- package/dist/src/startup-recovery-fence.js +1 -0
- package/dist/src/status-markers.js +1 -0
- package/dist/src/string-enum.js +1 -1
- package/dist/src/success-text.js +1 -0
- package/dist/src/surface-snapshot.js +1 -0
- package/dist/src/surface-snapshot2.js +1 -0
- package/dist/src/takeover.js +5 -0
- package/dist/src/tool-provider-facade.js +1 -0
- package/dist/src/tool-provider.js +4 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/toolchain-probe.js +2 -0
- package/dist/src/touch-runtime.js +1 -0
- package/dist/src/transport.js +3 -0
- package/dist/src/tree.js +1 -0
- package/dist/src/ttl-memo.js +1 -0
- package/dist/src/tv-remote.js +1 -0
- package/dist/src/type-text-runtime.js +1 -0
- package/dist/src/undici.js +99 -0
- package/dist/src/update-check.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/web.js +2 -1
- package/dist/src/web2.js +1 -0
- package/dist/src/webdriver-ios-snapshot.js +1 -0
- package/dist/src/webdriver-source.js +1 -0
- package/linux/atspi-dump.py +54 -9
- package/package.json +56 -34
- package/server.json +9 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
- package/dist/src/appearance.js +0 -1
- package/dist/src/apps.js +0 -5
- package/dist/src/audio-probe.js +0 -1
- package/dist/src/cli-grammar.js +0 -1
- package/dist/src/command-catalog.js +0 -1
- package/dist/src/debug-symbols.js +0 -5
- package/dist/src/device-input-state.js +0 -2
- package/dist/src/device-ready.js +0 -1
- package/dist/src/dispatch.js +0 -1
- package/dist/src/handler-utils.js +0 -1
- package/dist/src/helper-package-install.js +0 -1
- package/dist/src/host-process.js +0 -3
- package/dist/src/ime-lifecycle.js +0 -2
- package/dist/src/ime-recovery-marker.js +0 -1
- package/dist/src/input-actions3.js +0 -1
- package/dist/src/install-artifact.js +0 -1
- package/dist/src/install-artifact2.js +0 -1
- package/dist/src/interaction-common.js +0 -1
- package/dist/src/interaction-runtime.js +0 -1
- package/dist/src/interaction-snapshot.js +0 -1
- package/dist/src/manifest.js +0 -1
- package/dist/src/method-scope.js +0 -1
- package/dist/src/png-resize.js +0 -1
- package/dist/src/process-lock.js +0 -1
- package/dist/src/runner-lease.js +0 -1
- package/dist/src/runner-sequence.js +0 -1
- package/dist/src/script-source-bundle.js +0 -16
- package/dist/src/sdk-android-adb.d.ts +0 -245
- package/dist/src/sdk-android-adb.js +0 -4
- package/dist/src/sdk.js +0 -1
- package/dist/src/setting-state.js +0 -1
- package/dist/src/shell-quote.js +0 -1
- package/dist/src/snapshot-session.js +0 -1
- package/dist/src/timing-safe-equal.js +0 -1
- package/dist/src/unsupported-interactor.js +0 -1
- package/dist/src/verdict.js +0 -1
- /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
package/dist/src/limrun.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{i as e}from"./request-cancellation.js";import{r as t}from"./src.js";import{t as n}from"./limrun-runtime-dependencies.js";var r=class{implementation;provider=e;constructor(e){this.implementation=t(e,n())}get leaseLifecycle(){return this.implementation.leaseLifecycle}get recoverExpiredLease(){return this.implementation.recoverExpiredLease}get deviceInventoryProvider(){return this.implementation.deviceInventoryProvider}ownsDevice(e){return this.implementation.ownsDevice(e)}getInteractor(e){return this.implementation.getInteractor(e)}getDeviceSession(e){return this.implementation.getDeviceSession(e)}async installApp(e,t,n,r){return await this.implementation.installApp?.(e,t,n,r)}async installInstallablePath(e,t,n){return await this.implementation.installInstallablePath?.(e,t,n)}async configurePortReverse(e){return await this.implementation.configurePortReverse?.(e)}async shutdown(){await this.implementation.shutdown()}};export{r as LimrunRuntime};
|
package/dist/src/linux.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import{a as n}from"./gesture-plan.js";import{S as r,_ as i,a,b as o,d as s,f as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y,v as b,x}from"./src5.js";function S(){throw new e(`UNSUPPORTED_OPERATION`,`alert not supported on Linux`)}function C(){return{open:e=>s(e),openDevice:()=>Promise.resolve(),close:e=>g(e),tap:(e,t)=>c(e,t),alternateClick:async(e,t)=>t===`secondary`?await l(e.x,e.y):await y(e.x,e.y),doubleTap:(e,t)=>u(e,t),longPress:(e,t,n)=>d(e,t,n),focus:(e,t)=>m(e,t),type:(e,t)=>x(e,t),fill:(e,t,n,r)=>a(e,t,n,r),scroll:(e,t)=>b(e,t),performGesture:async t=>{if(t.topology===`two`)throw new e(`UNSUPPORTED_OPERATION`,`Multi-touch gestures are not supported on Linux`);let{start:r,end:i}=n(t);await o(r.x,r.y,i.x,i.y,t.durationMs)},screenshot:(e,t)=>i(e,t),readTextAtPoint:async(e,t)=>await f(e.x,e.y,t?.surface),snapshot:async e=>await t(`snapshot_capture`,async()=>await p(e,e?.signal),{backend:`linux-atspi`}),back:()=>v(),home:()=>_(),setOrientation:()=>{throw new e(`UNSUPPORTED_OPERATION`,`orientation not supported on Linux`)},appSwitcher:()=>{throw new e(`UNSUPPORTED_OPERATION`,`appSwitcher not yet supported on Linux`)},tvRemote:()=>{throw new e(`UNSUPPORTED_OPERATION`,`tv-remote not supported on Linux`)},readClipboard:()=>h(),writeClipboard:e=>r(e),setSetting:()=>{throw new e(`UNSUPPORTED_OPERATION`,`setSetting not supported on Linux`)},readAlert:S,awaitAlert:S,acceptAlert:S,dismissAlert:S}}export{C as createLinuxInteractor};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Xt as e}from"./sdk-batch.js";import{t}from"./touch-runtime.js";import{C as n,O as r,P as i,T as a,U as o,j as s}from"./alert-runtime.js";import{t as c}from"./interactor-operation-catalog.js";function l(l){let{facts:u,pause:d}=l,f={device:l.device,signal:l.signal,resolveInteractor:l.resolveInteractor};return{...u.captureScreenshot.available?o(f):{},...u.focusPoint.available?i(f):{},...s({...f,facts:u}),...u.scrollDirection.available?r(f):{},...u.typeText.available?a(f):{},...u.readTextAtPoint.available?n(f):{},...e(u.tapPoint,()=>t({...f,facts:u,pause:d})),...c({...f,facts:u})}}export{l as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{Yr as t}from"./sdk-batch-runner.js";const n={min:.01,max:1},r={flagKey:`screenshotMaxSize`,cliToken:`--max-size`,envVar:`AGENT_DEVICE_SCREENSHOT_MAX_SIZE`,publicOptionKey:`maxSize`,migration:{screenshot:`screenshot --max-size was removed; use --scale <0.01-1> (or AGENT_DEVICE_SCREENSHOT_SCALE) to downscale proportionally`,record:`record --max-size was removed; recordings capture at native resolution`}};function i(e,t){return t&&Object.hasOwn(t,r.flagKey)?r.migration[e]:void 0}function a(t,n){if(Object.hasOwn(n,r.publicOptionKey)||Object.hasOwn(n,r.flagKey))throw new e(`INVALID_ARGS`,r.migration[t])}const o=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],s=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],c=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotScale`,names:[`--scale`],type:`number`,min:n.min,max:n.max,usageLabel:`--scale <0.01-1>`,usageDescription:`Screenshot: resize both dimensions by this factor (or use AGENT_DEVICE_SCREENSHOT_SCALE)`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],l=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],ee=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`}],u=[{token:`--scale`,key:`screenshotScale`,label:`screenshot --scale`,min:n.min,max:n.max}];function d(e){return _({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,scale:e?.screenshotScale,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function f(e={}){return _({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotScale:e.screenshotScale,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function p(e={}){return f({...e,screenshotScale:e.screenshotScale??e.scale})}function m(t){let{min:r,max:i}=n;if(t.scale!==void 0&&(!Number.isFinite(t.scale)||t.scale<r||t.scale>i))throw new e(`INVALID_ARGS`,`screenshot scale must be between ${r} and ${i}`)}function h(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotScale==`number`&&e.push(`--scale`,String(t.screenshotScale)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function g(t){let{args:n,flags:i,index:a}=t,o=n[a];if(o===r.cliToken)throw new e(`INVALID_ARGS`,r.migration.screenshot);return v(o,i,a)??y({args:n,index:a,flags:i,token:o})??b({args:n,index:a,flags:i,token:o})??{handled:!1}}function _(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function v(e,t,n){let r=l.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function y(t){let n=ee.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isInteger(r)||r<1)throw new e(`INVALID_ARGS`,`${n.label} requires a positive integer`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function b(t){let n=u.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isFinite(r)||r<n.min||r>n.max)throw new e(`INVALID_ARGS`,`${n.label} requires a number from ${n.min} to ${n.max}`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function x(e){let t=w(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function S(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function C(e){let t=te(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,r=w(e.snapshotQuality);return S({...t?{androidSnapshot:t}:{},...r?{quality:r}:{},...n?{warnings:n}:{}})}function w(e){if(!e||typeof e!=`object`)return;let t=e;return typeof t.state==`string`&&typeof t.backend==`string`?t:void 0}function te(e){return typeof e==`object`&&e?e:void 0}const T=1500;function E(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function D(e){let t=e?.snapshotDiagnostics?.samples;if(!(!t||t.length===0))return O(t)}function O(e){if(e.length===0)return;let t=e.slice(1),n=t.length>=3?j(t):void 0,r=t.filter(e=>e.durationMs>=T).length,i=n!==void 0&&n.p95Ms>=T&&r>=2;return{stats:j(e),...i&&n?{warning:F(n)}:{}}}function k(e){let t=e.filter(e=>e!==void 0),n=t.flatMap(e=>ne(e.stats));if(n.length===0)return;let r=j(n),i=t.filter(e=>e.warning);return{stats:r,...i.length>0?{warning:I({warnedCount:i.length,totalCount:t.length,worst:i.reduce((e,t)=>Math.max(e,t.stats.p95Ms),0),platform:r.platform})}:{}}}function A(e){if(!t(e))return;let n=L(e.stats);if(!n)return;let r=typeof e.warning==`string`?e.warning:void 0;return{stats:n,...r?{warning:r}:{}}}function j(e){let t=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:t.length,p50Ms:M(t,50),p95Ms:M(t,95),maxMs:t[t.length-1]??0,slowThresholdMs:T,...N(e),...P(e)}}function M(e,t){if(e.length===0)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function N(e){let t=e.map(e=>e.platform).filter(e=>!!e);return new Set(t).size===1?{platform:t[0]}:{}}function P(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}function F(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function I(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots were slow in ${e.warnedCount} of ${e.totalCount} runs (worst run p95 ${e.worst}ms). Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function L(e){if(!t(e))return;let n=R(e);if(n)return{...n,...B(e)}}function R(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>typeof e!=`number`))return t}function z(e){let t=Object.entries(e).filter(e=>typeof e[1]==`number`);return t.length>0?Object.fromEntries(t):void 0}function B(e){let n=typeof e.platform==`string`?e.platform:void 0,r=t(e.backends)?z(e.backends):void 0;return{...n?{platform:n}:{},...r?{backends:r}:{}}}function ne(e){if(!e||e.count<=0)return[];let t=e.platform;return e.count===1?[{durationMs:e.maxMs,platform:t}]:e.count===2?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]}const V=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],H=`<wifi|airplane|location> <on|off>`,U=`location set <lat> <lon>`,W=`animations <on|off>`,G=`appearance <light|dark|toggle>`,K=`faceid <match|nonmatch|enroll|unenroll>`,q=`touchid <match|nonmatch|enroll|unenroll>`,J=`fingerprint <match|nonmatch>`,Y=`clear-app-state [app-id]`,X=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Z=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,re=`macOS supports only settings ${G} and settings ${Z}. wifi|airplane|location|animations remain unsupported on macOS.`,ie=[`settings ${H}`,`settings ${U}`,`settings ${W}`,`settings ${G}`,`settings ${K}`,`settings ${q}`,`settings ${J}`,`settings ${Y}`,`settings ${X}`,`settings ${Z}`].join(` | `),ae=`settings requires ${H}, ${U}, ${W}, ${G}, ${K}, ${q}, ${J}, ${Y}, ${X}, or ${Z}`;function oe(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function se(e){return`Unsupported macOS setting: ${e}. ${re}`}function Q(t){let n=t.trim().toLowerCase();if(n===`grant`)return`grant`;if(n===`deny`)return`deny`;if(n===`reset`)return`reset`;throw new e(`INVALID_ARGS`,`Invalid permission action: ${t}. Use grant|deny|reset.`)}function ce(t){let n=t?.trim().toLowerCase();if(n===`camera`||n===`microphone`||n===`photos`||n===`contacts`||n===`contacts-limited`||n===`notifications`||n===`calendar`||n===`location`||n===`location-always`||n===`media-library`||n===`motion`||n===`reminders`||n===`siri`)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${V.join(`|`)}`)}function le(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return $(Number(t),n)}function ue(e){return{latitude:$(e?.latitude,`latitude`),longitude:$(e?.longitude,`longitude`)}}function $(t,n){let r=n===`latitude`?-90:-180,i=n===`latitude`?90:180;if(typeof t!=`number`||!Number.isFinite(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be a number from ${r} to ${i}`);return t}export{g as C,d as D,p as E,a as O,h as S,f as T,r as _,se as a,n as b,ce as c,E as d,D as f,x as g,C as h,ie as i,m as k,k as l,S as m,ue as n,oe as o,O as p,ae as r,Q as s,le as t,A as u,s as v,i as w,c as x,o as y};
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";const t=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],n=`<wifi|airplane|location> <on|off>`,r=`location set <lat> <lon>`,i=`animations <on|off>`,a=`appearance <light|dark|toggle>`,o=`faceid <match|nonmatch|enroll|unenroll>`,s=`touchid <match|nonmatch|enroll|unenroll>`,c=`fingerprint <match|nonmatch>`,l=`clear-app-state [app-id]`,u=`reset-keychain clear`,d=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,f=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,p=`macOS supports only settings ${a} and settings ${f}. wifi|airplane|location|animations remain unsupported on macOS.`,m=[`settings ${n}`,`settings ${r}`,`settings ${i}`,`settings ${a}`,`settings ${o}`,`settings ${s}`,`settings ${c}`,`settings ${l}`,`settings ${u}`,`settings ${d}`,`settings ${f}`].join(` | `),h=`settings requires ${n}, ${r}, ${i}, ${a}, ${o}, ${s}, ${c}, ${l}, ${u}, ${d}, or ${f}`;function g(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function _(e){return`Unsupported macOS setting: ${e}. ${p}`}function v(t){let n=t.trim().toLowerCase();if(n===`grant`)return`grant`;if(n===`deny`)return`deny`;if(n===`reset`)return`reset`;throw new e(`INVALID_ARGS`,`Invalid permission action: ${t}. Use grant|deny|reset.`)}function y(n){let r=n?.trim().toLowerCase();if(r===`camera`||r===`microphone`||r===`photos`||r===`contacts`||r===`contacts-limited`||r===`notifications`||r===`calendar`||r===`location`||r===`location-always`||r===`media-library`||r===`motion`||r===`reminders`||r===`siri`)return r;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${t.join(`|`)}`)}function b(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return S(Number(t),n)}function x(e){return{latitude:S(e?.latitude,`latitude`),longitude:S(e?.longitude,`longitude`)}}function S(t,n){let r=n===`latitude`?-90:-180,i=n===`latitude`?90:180;if(typeof t!=`number`||!Number.isFinite(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be a number from ${r} to ${i}`);return t}export{_ as a,y as c,m as i,x as n,g as o,h as r,v as s,b as t};
|
package/dist/src/logcat.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./
|
|
1
|
+
import{n as e}from"./adb-failure.js";import"./adb-executor.js";async function t(t,n={}){let r=[`logcat`,`-d`,`-v`,`time`];n.lines!==void 0&&r.push(`-t`,String(Math.max(1,Math.floor(n.lines))));let i=await t(r,{allowFailure:!0,timeoutMs:n.timeoutMs,signal:n.signal});if(i.exitCode!==0)throw e(`Failed to capture Android logcat`,i);return i.stdout}export{t as captureAndroidLogcatWithAdb};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e,r as t,s as n}from"./helper.js";import{t as r}from"./surface-snapshot.js";export{r as captureMacOsSurfaceSnapshot,t as resolveFrontmostMacOsApp,e as runMacOsAlertAction,n as startMacOsAudioProbeProcess};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{D as t,w as n}from"./sdk-device.js";import{t as r}from"./scoped-provider.js";const i=r(void 0);function a(){return i.resolve()}async function o(e,t){return await i.run(e,t)}function s(r,i){if(!t(n(r.device),n(i))||r.device.simulatorSetPath!==i.simulatorSetPath)throw new e(`COMMAND_FAILED`,`Managed automation cannot select another device.`,{reason:`managed-device-transport-mismatch`})}function c(){let e=a();if(e)return async t=>{s(e,t)}}async function l(e){let t=c();return t?(await t(e),!0):!1}export{o as a,c as i,a as n,l as r,s as t};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{O as t,P as n,b as r,d as i,l as a,y as o}from"./sdk-contracts.js";import"./capture.js";import{E as s}from"./sdk-batch-runner.js";import{a as c,d as l,i as u,l as d,o as f,r as p,t as ee,u as te}from"./android-input-ownership.js";import{Br as ne,Ir as re,Lr as ie,Rr as ae}from"./sdk-batch.js";import{i as oe,n as se,r as ce}from"./snapshot-scope.js";import{l as le}from"./scroll-gesture.js";import{t as ue}from"./gesture-plan-types.js";import{n as de}from"./success-text.js";import{n as fe}from"./alert-contract.js";import{c as pe,n as me,s as he}from"./location-coordinates.js";import{r as ge}from"./mobile-snapshot-semantics.js";import"./device.js";import{n as _e}from"./device-rotation.js";import{c as m,r as h}from"./diagnostics.js";import{i as ve,n as ye,o as be,p as xe,s as Se}from"./exec.js";import{t as g}from"./timeouts.js";import{i as Ce}from"./tv-remote.js";import"./diagnostics2.js";import{r as we}from"./command.js";import"./retry.js";import{n as Te,r as Ee}from"./version.js";import{n as De,r as Oe}from"./install-source2.js";import{a as ke,i as Ae,n as _,r as v}from"./adb-host.js";import{i as je,n as y,o as Me}from"./adb-failure.js";import{a as b,c as Ne,d as Pe,i as Fe,l as Ie,n as Le,o as x,r as Re,s as ze,t as Be,u as Ve}from"./adb-executor.js";import{n as He,r as S}from"./adb.js";import{i as Ue,n as We,r as Ge}from"./gesture-plan.js";import{n as Ke,r as qe,s as Je}from"./android-system-chrome.js";import{a as Ye,c as Xe,d as Ze,f as Qe,i as $e,l as et,m as tt,n as nt,o as rt,p as it,r as at,s as ot,u as st}from"./app-lifecycle.js";import{a as ct,i as lt,n as ut,o as dt,r as ft,t as pt}from"./app-deployment-resolution.js";import{a as mt,i as ht,n as gt,o as _t,t as vt}from"./app-parsers.js";import{n as yt}from"./toolchain-probe.js";import{t as bt}from"./keyed-lock.js";import{t as xt}from"./bounds.js";import{t as St}from"./entities.js";import{n as Ct}from"./startup-recovery-fence.js";import{n as wt}from"./numeric.js";import C from"node:path";import Tt from"node:net";import{TextDecoder as Et}from"node:util";const Dt=new Map;async function Ot(e){let t=Dt.get(e.deviceKey);if(t!==void 0)return t;let n;try{let t=await e.adb([`features`],{allowFailure:!0,timeoutMs:2e3,...e.signal?{signal:e.signal}:{}});if(t.exitCode!==0)return!1;n=t.stdout}catch{return!1}let r=At(n).includes(`shell_v2`);return Dt.set(e.deviceKey,r),r}function kt(){Dt.clear()}function At(e){return e.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(Boolean)}const jt=new Set([`com.android.permissioncontroller`,`com.google.android.permissioncontroller`,`com.google.android.packageinstaller`,`com.android.packageinstaller`]);function Mt(e){return jt.has(e)}const Nt=new Set([`android`,`com.android.systemui`]),Pt=/^android:id\/(?:alertTitle|message|button[123]|parentPanel|buttonPanel|contentPanel)$/i,Ft=/^android:id\/button[123]$/i,It=/(?:^|:)id\/permission_/i,Lt=/\b(?:is(?:n't| not) responding|keeps stopping|has stopped|close app|app info)\b/i,Rt=/^(?:ok|allow|allow all|while using the app|only this time|yes|continue|save|confirm|turn on|open settings)$/i,zt=/^(?:cancel|deny|don.t allow|don’t allow|not now|no|dismiss|close|close app|later|skip)$/i;function Bt(e){if(e!==null){if(Ft.test(e))return`button`;if(Pt.test(e))return`content`}}function Vt(e){let t=Wt(e.filter(Ht)),n=t.nodes;if(n.length===0)return null;let r=Yt(n),i=n.filter(e=>w(e)&&!on(e)),a=Qt(i),o=$t(i,a);if(!a&&!o&&r.length===0)return null;let s=sn(n);return{alert:{...a?{title:a}:{},...o?{message:o}:{},buttons:r.map(e=>e.label),platform:`android`,source:t.source,...s?{packageName:s}:{}},buttons:r}}function Ht(e){return!d(e)}function Ut(e,t){let n=t===`accept`?`accept`:`dismiss`;return e.find(e=>e.role===n)||(t===`dismiss`?e.find(e=>e.role===`neutral`)??null:e.length===1?e[0]??null:null)}function Wt(e){let t=e.filter(e=>rn(e));if(t.length)return{nodes:t,source:`permission`};let n=Jt(e);return n.length?{nodes:n,source:`system-dialog`}:{nodes:Gt(e),source:`native-dialog`}}function Gt(e){let t=e.filter(e=>Kt(e.type??``)),n=e.filter(e=>Pt.test(e.identifier??``)),r=t.length?[...t,...n]:qt(n);if(r.length===0)return[];let i=en(e,r);return i===void 0?r:nn(e,i)}function Kt(e){let t=Math.max(e.lastIndexOf(`.`),e.lastIndexOf(`$`));return e.slice(t+1).toLowerCase().endsWith(`dialog`)}function qt(e){let t=e.some(e=>Ft.test(e.identifier??``)),n=e.some(e=>!Ft.test(e.identifier??``));return t&&n?e:[]}function Jt(e){let t=e.filter(e=>an(e));if(t.length===0)return[];let n=en(e,t);return n===void 0?t:nn(e,n).filter(e=>e.bundleId&&Nt.has(e.bundleId))}function Yt(e){let t=new Set,n=[];for(let r of e){let e=w(r);if(!e||!r.rect||!on(r))continue;let a=e.trim().toLowerCase();if(!a||t.has(a))continue;t.add(a);let o=i(r.rect);n.push({label:e,x:o.x,y:o.y,role:Xt(r,e)})}return n}function Xt(e,t){return Zt(e.identifier??``)||(Rt.test(t.trim())?`accept`:zt.test(t.trim())?`dismiss`:`neutral`)}function Zt(e){return/(?:^|:)id\/button1$/i.test(e)?`accept`:/(?:^|:)id\/button2$/i.test(e)?`dismiss`:/(?:^|:)id\/button3$/i.test(e)?`neutral`:/(?:^|:)id\/permission_allow/i.test(e)?`accept`:/(?:^|:)id\/permission_deny/i.test(e)?`dismiss`:null}function Qt(e){return w(e.find(e=>/(?:^|:)id\/(?:alertTitle|permission_message)$/i.test(e.identifier??``)))||w(e[0])}function $t(e,t){let n=e.map(e=>w(e)).filter(e=>e&&e!==t);return n.length?[...new Set(n)].join(`
|
|
3
|
+
`):void 0}function en(e,t){let n=t[0];if(!n)return;let r=tn(e,n.index);for(let n of t.slice(1)){let t=new Set(tn(e,n.index));for(let e=r.length-1;e>=0;--e)t.has(r[e])||r.splice(e,1)}return r.at(-1)}function tn(e,t){let n=new Map(e.map(e=>[e.index,e])),r=[],i=n.get(t);for(;i;)r.push(i.index),i=i.parentIndex===void 0?void 0:n.get(i.parentIndex);return r.reverse()}function nn(e,t){let n=new Map;for(let t of e){if(t.parentIndex===void 0)continue;let e=n.get(t.parentIndex)??[];e.push(t),n.set(t.parentIndex,e)}let r=new Set([t]),i=[t];for(let e of i)for(let t of n.get(e)??[])r.has(t.index)||(r.add(t.index),i.push(t.index));return e.filter(e=>r.has(e.index))}function rn(e){let t=e.bundleId??``;return jt.has(t)||It.test(e.identifier??``)}function an(e){let t=e.bundleId??``;return Nt.has(t)&&Lt.test(w(e))}function on(e){let t=e.type??``,n=e.identifier??``;return!!(e.hittable||/\bbutton\b/i.test(t)||Ft.test(n)||/(?:^|:)id\/permission_(?:allow|deny)/i.test(n))}function w(e){return e?[e.label,e.value].filter(e=>typeof e==`string`&&e.trim().length>0)[0]?.trim()??``:``}function sn(e){return e.find(e=>e.bundleId)?.bundleId}function cn(e,t,n){if(typeof e!=`number`||!Number.isInteger(e))throw new o(`INVALID_ARGS`,`Android ${n} manifest ${t} must be an integer.`);return e}function T(e,t,n,r){if(e!==n)throw new o(`INVALID_ARGS`,`Android ${r} manifest ${t} must be "${n}".`);return n}function ln(e,t,n){if(typeof e!=`string`||e.length===0)throw new o(`INVALID_ARGS`,`Android ${n} manifest ${t} is required.`);return e}function un(e,t){let n=ln(e,`sha256`,t).trim().toLowerCase();if(n.length!==64||!/^[0-9a-f]+$/.test(n))throw new o(`INVALID_ARGS`,`Android ${t} manifest sha256 must be a 64-character hex string.`);return n}function E(e){let t={status:[],results:[],currentStatus:null,currentResult:null};for(let n of e.split(/\r?\n/))dn(n,t);return fn(t),{status:t.status,results:t.results}}function dn(e,t){if(e.startsWith(`INSTRUMENTATION_STATUS: `)){t.currentStatus??={},hn(e.slice(24),t.currentStatus);return}if(e.startsWith(`INSTRUMENTATION_STATUS_CODE: `)){pn(t);return}if(e.startsWith(`INSTRUMENTATION_RESULT: `)){t.currentResult??={},hn(e.slice(24),t.currentResult);return}e.startsWith(`INSTRUMENTATION_CODE: `)&&mn(t)}function fn(e){pn(e),mn(e)}function pn(e){e.currentStatus&&=(e.status.push(e.currentStatus),null)}function mn(e){e.currentResult&&=(e.results.push(e.currentResult),null)}function hn(e,t){let n=e.indexOf(`=`);n<0||(t[e.slice(0,n)]=e.slice(n+1))}function D(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function gn(e){if(e===`true`)return!0;if(e===`false`)return!1}function _n(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new o(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return e}const vn=1e4;async function yn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,apkPath:a,sha256:o,cache:s,deviceKey:c,installTimeoutMs:l,helperLabel:u}=e,d=`${c}\0${r}\0${i}\0${o}`;if(s.has(d))return{packageName:r,versionCode:i,installedSha256:o,installed:!1,reason:`current`};await En(a,o,u);let f=await bn({adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:o});if(f.reason===`current`)return s.add(d),{packageName:r,versionCode:i,...f,installed:!1};let p=await Be(a,{provider:n,replace:!0,allowTestPackages:!0,allowFailure:!0,timeoutMs:l});if(p.exitCode!==0)throw y(`Failed to install ${u}`,p,{packageName:r,versionCode:i,reason:f.reason});return s.add(d),{packageName:r,versionCode:i,...f,installed:!0}}async function bn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:a,signal:o}=e,s=await Cn(t,r,o);if(s===void 0)return{reason:`missing`};if(s<i)return{installedVersionCode:s,reason:`outdated`};if(s>i)return{installedVersionCode:s,reason:`current`};try{let e=await wn(t,n,r,o);return{installedVersionCode:s,installedSha256:e,reason:e===a?`current`:`mismatched`}}catch{return o?.throwIfAborted(),{installedVersionCode:s,reason:`unverifiable`}}}async function xn(e){let n=v().files,r=Ee(),i=C.join(Te(),`android`,e.helperDirName,`dist`),a=C.join(i,e.manifestFileName(r));try{let t=e.parseManifest(JSON.parse(await n.readText(a))),r=C.join(i,t.assetName);return await n.access(r),{apkPath:r,manifest:t}}catch(n){throw new o(`UNSUPPORTED_OPERATION`,e.unavailableMessage,{manifestPath:a,error:t(n).message},n)}}function Sn(e){return async t=>await yn({adb:t.adb,adbProvider:t.adbProvider,packageName:t.artifact.manifest.packageName,versionCode:t.artifact.manifest.versionCode,apkPath:t.artifact.apkPath,sha256:t.artifact.manifest.sha256,cache:e.cache,deviceKey:t.deviceKey,installTimeoutMs:e.installTimeoutMs,helperLabel:e.helperLabel})}async function Cn(e,t,n){let r=await e([`shell`,`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:5e3,signal:n});if(r.exitCode!==0)return;let i=RegExp(`package:${On(t)}(?:\\s|$).*versionCode:(\\d+)`).exec(`${r.stdout}\n${r.stderr}`);return i?Number(i[1]):void 0}async function wn(e,t,n,r){let i=await e([`shell`,`pm`,`path`,n],{allowFailure:!0,timeoutMs:vn,signal:r}),a=Tn(`${i.stdout}\n${i.stderr}`);if(i.exitCode!==0||!a)throw new o(`COMMAND_FAILED`,`Could not resolve installed Android helper APK`);let s=v().files,c=await s.makeTempDirectory(`agent-device-helper-`),l=C.join(c,`base.apk`);try{let e=await Le(a,l,{provider:t,allowFailure:!0,timeoutMs:vn,signal:r});if(e.exitCode!==0)throw y(`Could not read installed Android helper APK`,e,{packageName:n,remotePath:a});return await Dn(l)}finally{await s.remove(c,{recursive:!0,force:!0})}}function Tn(e){return e.split(/\r?\n/).map(e=>e.startsWith(`package:`)?e.slice(8).trim():``).find(e=>e.endsWith(`/base.apk`))}async function En(e,t,n){let r=await Dn(e);if(r!==t)throw new o(`COMMAND_FAILED`,`${n} APK checksum mismatch`,{apkPath:e,expectedSha256:t,actualSha256:r})}async function Dn(e){let t=v().files;return t.sha256(await t.readBytes(e))}function On(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const kn=`android-snapshot-helper-v1`,An=`uiautomator-xml`,jn=5e3,Mn=3e4,Nn={"-r":`replace`,"-t":`allowTestPackages`,"-d":`allowDowngrade`,"-g":`grantPermissions`};function Pn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new o(`INVALID_ARGS`,`Android snapshot helper manifest must be an object.`);let t=e;return{name:In(t.name,`name`,`android-snapshot-helper`),version:O(t.version,`version`),releaseTag:Vn(t.releaseTag),assetName:Vn(t.assetName),apkUrl:Hn(t.apkUrl,`apkUrl`),sha256:Bn(t.sha256),checksumName:Vn(t.checksumName),packageName:O(t.packageName,`packageName`),versionCode:Fn(t.versionCode,`versionCode`),instrumentationRunner:O(t.instrumentationRunner,`instrumentationRunner`),minSdk:Fn(t.minSdk,`minSdk`),targetSdk:t.targetSdk===void 0?void 0:Fn(t.targetSdk,`targetSdk`),outputFormat:In(t.outputFormat,`outputFormat`,An),statusProtocol:In(t.statusProtocol,`statusProtocol`,kn),installArgs:Rn(t.installArgs)}}function Fn(e,t){return cn(e,t,`snapshot helper`)}function In(e,t,n){return T(e,t,n,`snapshot helper`)}function Ln(e){return zn(Rn(e.installArgs))}function Rn(e){let t=Un(e,`installArgs`);if(t[0]!==`install`)throw new o(`INVALID_ARGS`,`Android snapshot helper manifest installArgs must start with "install".`);if(t.some(e=>e.includes(`\0`)))throw new o(`INVALID_ARGS`,`Android snapshot helper manifest installArgs must not contain null bytes.`);let n=t.slice(1).find(e=>!Wn(e));if(n)throw new o(`INVALID_ARGS`,`Android snapshot helper manifest installArgs contains unsupported install flag "${n}".`);return t}function zn(e){let t={};for(let n of e.slice(1)){let e=Gn(n);if(!e)throw new o(`INVALID_ARGS`,`Android snapshot helper manifest installArgs contains unsupported install flag "${n}".`);t[e]=!0}return t}function Bn(e){let t=O(e,`sha256`).trim().toLowerCase();if(t.length!==64||!Kn(t))throw new o(`INVALID_ARGS`,`Android snapshot helper manifest sha256 must be a 64-character hex string.`);return t}function O(e,t){if(typeof e!=`string`||e.trim().length===0)throw new o(`INVALID_ARGS`,`Android snapshot helper manifest ${t} is required.`);return e}function Vn(e){return typeof e==`string`&&e.trim().length>0?e:void 0}function Hn(e,t){return e===null?null:O(e,t)}function Un(e,t){if(!Array.isArray(e)||!e.every(e=>typeof e==`string`))throw new o(`INVALID_ARGS`,`Android snapshot helper manifest ${t} must be a string array.`);return e}function Wn(e){return Gn(e)!==void 0}function Gn(e){if(Object.hasOwn(Nn,e))return Nn[e]}function Kn(e){for(let t of e){let e=t.charCodeAt(0);if(!(e>=48&&e<=57)&&!(e>=97&&e<=102))return!1}return!0}const k=new Map;function qn(e){let t=`${e.deviceKey}\0${e.packageName}\0${e.versionCode}\0`;for(let e of k.keys())e.startsWith(t)&&Zn(e)}function Jn(){k.clear()}function Yn(e,t,n,r){return e?`${e}\0${t}\0${n}\0${r}`:void 0}function Xn(e,t){if(!e)return;let[n,r]=e.split(`\0`),i=`${n}\0${r}\0`;for(let t of k.keys())t!==e&&t.startsWith(i)&&k.delete(t);k.set(e,t)}function Zn(e){e&&k.delete(e)}async function Qn(e){let{adb:t,artifact:n}=e,r=e.installPolicy??`missing-or-outdated`,i=n.manifest.packageName,a=n.manifest.versionCode,o=n.manifest.sha256;if(r===`never`)return{packageName:i,versionCode:a,installed:!1,reason:`skipped`};let s=Yn(e.deviceKey,i,a,o),c=s?k.get(s):void 0;if(s&&r!==`always`&&c!==void 0)return{packageName:i,versionCode:a,installedVersionCode:c,installedSha256:o,installed:!1,reason:`current`};await En(n.apkPath,o,`Android snapshot helper`);let l=r===`always`?{installedVersionCode:await tr(t,i,e.timeoutMs,e.signal),reason:`forced`}:await bn({adb:t,adbProvider:er(e.adbProvider,t),packageName:i,versionCode:a,sha256:o,signal:e.signal}),{installedVersionCode:u}=l,d=`installedSha256`in l?l.installedSha256:void 0,f=l.reason;if(f===`current`){if(u===void 0)throw Error(`Expected installed versionCode for current Android snapshot helper`);return Xn(s,u),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!1,reason:f}}let p;try{p=await nr(t,e.adbProvider??t,n.apkPath,Ln(n.manifest),{packageName:i,timeoutMs:e.timeoutMs,signal:e.signal})}catch(e){throw Zn(s),$n(e,{packageName:i,versionCode:a})}if(p.exitCode!==0)throw Zn(s),$n(y(`Failed to install Android snapshot helper`,p,{packageName:i,versionCode:a}));return Xn(s,a),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!0,reason:f}}function $n(e,t){let n=r(e,`COMMAND_FAILED`);return n.details={...t,...n.details,androidSnapshotHelperInstallFailure:!0},n}function er(e,t){return e?typeof e==`function`?{exec:e}:e:{exec:t}}async function tr(e,t,n,r){let i=await e([`shell`,`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:n,signal:r});if(i.exitCode===0)return rr(`${i.stdout}\n${i.stderr}`,t)}async function nr(e,t,n,r,i){let a=async()=>await Be(n,{allowFailure:!0,provider:t,...r,timeoutMs:i.timeoutMs,signal:i.signal}),o=await a();if(o.exitCode===0||!ir(o))return o;let s=await e([`uninstall`,i.packageName],{allowFailure:!0,timeoutMs:i.timeoutMs,signal:i.signal}),c=await a();return c.exitCode===0?c:{...c,stderr:[c.stderr,s.stderr?`Previous uninstall stderr after INSTALL_FAILED_UPDATE_INCOMPATIBLE: ${s.stderr}`:``].filter(Boolean).join(`
|
|
4
|
+
`)}}function rr(e,t){let n=`package:${t}`;for(let t of e.split(/\r?\n/)){if(!t.startsWith(n)||t.length>n.length&&!/\s/.test(t[n.length]??``))continue;let e=/(?:^|\s)versionCode:(\d+)(?:\s|$)/.exec(t);if(e)return Number(e[1])}}function ir(e){return`${e.stdout}\n${e.stderr}`.includes(`INSTALL_FAILED_UPDATE_INCOMPATIBLE`)}function ar(e){return e.errorType===`java.util.concurrent.TimeoutException`?`accessibility-timeout`:void 0}function or(e){return e===137?`accessibility-timeout`:void 0}function A(e){return e?{androidCaptureFailureReason:e}:{}}function sr(){return new Promise((e,t)=>{let n=Tt.createServer();n.unref(),n.on(`error`,t),n.listen(0,`127.0.0.1`,()=>{let r=n.address();if(!r||typeof r==`string`){n.close(()=>t(Error(`Failed to allocate a local TCP port`)));return}let i=r.port;n.close(()=>e(i))})})}function cr(e,t,n,r){return new Promise((i,a)=>{let s=Tt.connect({host:`127.0.0.1`,port:e}),c=[],l=setTimeout(()=>{u(),s.destroy(),a(new o(`COMMAND_FAILED`,`Android snapshot helper session request timed out`,{command:t,timeoutMs:n,port:e}))},n),u=()=>{clearTimeout(l),r?.removeEventListener(`abort`,d)},d=()=>{u(),s.destroy(),a(r?.reason??new DOMException(`The operation was aborted`,`AbortError`))};if(r?.addEventListener(`abort`,d,{once:!0}),r?.aborted){d();return}s.on(`connect`,()=>s.write(`${t}\n`)),s.on(`data`,e=>c.push(Buffer.from(e))),s.on(`error`,e=>{u(),a(e)}),s.on(`close`,()=>{u(),i(Buffer.concat(c).toString(`utf8`))})})}async function lr(e){let t=`snapshot-${Date.now()}-${Math.random().toString(16).slice(2)}`;return hr(await cr(e.port,`snapshot ${t}`,ur(e),e.signal),t)}function ur(e){return Math.min(e.commandTimeoutMs,Math.max(e.timeoutMs+3e3,3e3))}function dr(e,t,n){return new Promise((r,i)=>{let a=``,s=setTimeout(()=>{n?.removeEventListener(`abort`,l),i(new o(`COMMAND_FAILED`,`Android snapshot helper session did not become ready`,{output:a,timeoutMs:t}))},t),c=e=>{a+=e.toString(),a.includes(`agentDeviceProtocol=android-snapshot-helper-v1`)&&a.includes(`sessionReady=true`)&&(clearTimeout(s),n?.removeEventListener(`abort`,l),r())},l=()=>{clearTimeout(s),i(n?.reason??new DOMException(`The operation was aborted`,`AbortError`))};if(n?.addEventListener(`abort`,l,{once:!0}),n?.aborted){l();return}e.stdout?.on(`data`,c),e.stderr?.on(`data`,c),e.once(`exit`,(e,t)=>{clearTimeout(s),n?.removeEventListener(`abort`,l),i(new o(`COMMAND_FAILED`,`Android snapshot helper session exited before ready`,{output:a,exitCode:e,signal:t}))}),e.on(`error`,e=>{clearTimeout(s),n?.removeEventListener(`abort`,l),i(e)})})}function fr(e){let t=e.indexOf(`
|
|
5
|
+
|
|
6
|
+
`);return vr(e.slice(0,t<0?e.length:t))}function pr(e,t){if(e.agentDeviceProtocol!==`android-snapshot-helper-v1`)throw new o(`COMMAND_FAILED`,`Android automation helper session returned wrong protocol`,{headers:e});if(e.requestId!==t)throw new o(`COMMAND_FAILED`,`Android automation helper session returned stale output`,{headers:e,requestId:t})}function mr(e,t){let n=fr(e);return n.agentDeviceProtocol===`android-snapshot-helper-v1`&&n.requestId===t&&n.ok===`true`}function hr(e,t){let n=e.indexOf(`
|
|
7
|
+
|
|
8
|
+
`);if(n<0)throw new o(`COMMAND_FAILED`,`Android snapshot helper session returned malformed output`,{response:e});let r=vr(e.slice(0,n)),i=e.slice(n+2);return gr(r,t),_r(r,i),{xml:i,metadata:yr(r)}}function gr(e,t){if(e.agentDeviceProtocol!==`android-snapshot-helper-v1`)throw new o(`COMMAND_FAILED`,`Android snapshot helper session returned wrong protocol`,{headers:e});if(e.outputFormat!==`uiautomator-xml`)throw new o(`COMMAND_FAILED`,`Android snapshot helper session returned wrong output format`,{headers:e});if(e.requestId!==t)throw new o(`COMMAND_FAILED`,`Android snapshot helper session returned stale output`,{headers:e,requestId:t});if(e.ok!==`true`)throw new o(`COMMAND_FAILED`,e.message||e.errorType||`Android snapshot helper session returned an error`,{helper:e,...A(ar(e))})}function _r(e,t){let n=D(e.byteLength);if(n!==void 0&&Buffer.byteLength(t,`utf8`)!==n)throw new o(`COMMAND_FAILED`,`Android snapshot helper session returned truncated XML`,{headers:e,actualByteLength:Buffer.byteLength(t,`utf8`)});if(!t.includes(`<hierarchy`)||!t.includes(`</hierarchy>`))throw new o(`COMMAND_FAILED`,`Android snapshot helper session did not return XML`,{headers:e,xml:t})}function vr(e){let t={};for(let n of e.split(/\r?\n/)){let e=n.indexOf(`=`);e<0||(t[n.slice(0,e)]=n.slice(e+1))}return t}function yr(e){return{helperApiVersion:e.helperApiVersion,outputFormat:An,waitForIdleTimeoutMs:D(e.waitForIdleTimeoutMs),waitForIdleQuietMs:D(e.waitForIdleQuietMs),timeoutMs:D(e.timeoutMs),maxDepth:D(e.maxDepth),maxNodes:D(e.maxNodes),rootPresent:gn(e.rootPresent),captureMode:e.captureMode===`interactive-windows`||e.captureMode===`active-window`?e.captureMode:void 0,windowCount:D(e.windowCount),nodeCount:D(e.nodeCount),truncated:gn(e.truncated),elapsedMs:D(e.elapsedMs)}}const br=2e3,xr=`android_snapshot_helper_retirement_unconfirmed`,j=new Map;function Sr(e){return`${e.platform}:${e.id}`}async function Cr(e){await Nr({adb:e.adb,packageName:e.packageName,timeoutMs:2e3})||Tr(e)}async function wr(e){let t=j.get(e.deviceKey);if(t){try{let n=await e.adb([`shell`,`am`,`force-stop`,t.packageName],{allowFailure:!0,timeoutMs:5e3,signal:e.signal});if(e.signal?.throwIfAborted(),n.exitCode===0){j.delete(e.deviceKey);return}}catch{e.signal?.throwIfAborted()}Tr({deviceKey:e.deviceKey,packageName:t.packageName,cause:t.cause})}}function Tr(e){let t=e.cause instanceof Error?e.cause.message:String(e.cause);throw j.set(e.deviceKey,{packageName:e.packageName,cause:t}),new o(`COMMAND_FAILED`,`Android snapshot helper could not confirm release of device automation ownership`,{reason:xr,deviceKey:e.deviceKey,cause:t,hint:`Retry after the helper process exits, or restart the device if Android still reports automation as busy.`})}function Er(e){return e instanceof o&&e.details?.reason===xr}async function Dr(e){let t=AbortSignal.timeout(e.timeoutMs),[n]=await Promise.allSettled([e.forceStopRuntime?Nr({adb:e.adb,packageName:e.packageName,timeoutMs:e.timeoutMs,signal:t}):Promise.resolve(!1),Pr({...e,signal:t})]);return{timedOut:t.aborted,runtimeForceStopped:n?.status===`fulfilled`&&n.value}}function Or(e){let t=kr(e);return{ended:t?Promise.resolve():new Promise(t=>{e.once(`close`,()=>t()),e.once(`exit`,()=>t())}),hasEnded:()=>kr(e),completedCleanly:()=>!t&&e.exitCode===0&&e.signalCode==null}}function kr(e){return e.exitCode!=null||e.signalCode!=null}async function Ar(e,t,n){let r,i,a=await Promise.race([e.then(()=>!0),new Promise(e=>{r=setTimeout(()=>e(!1),t)}),...n?[new Promise(e=>{i=()=>e(!1),n.addEventListener(`abort`,i,{once:!0}),n.aborted&&i()})]:[]]);return r&&clearTimeout(r),i&&n?.removeEventListener(`abort`,i),a}async function jr(e){if(e.processExit.hasEnded())return!0;try{e.process.kill(`SIGTERM`)}catch{}return await Ar(e.processExit.ended,e.timeoutMs)}function Mr(){j.clear()}async function Nr(e){let t=e.signal??AbortSignal.timeout(e.timeoutMs);try{return(await e.adb([`shell`,`am`,`force-stop`,e.packageName],{allowFailure:!0,timeoutMs:e.timeoutMs,signal:t})).exitCode===0}catch{return!1}}async function Pr(e){e.process.stdin?.end(),e.process.stdout?.destroy(),e.process.stderr?.destroy(),await e.adb([`forward`,`--remove`,`tcp:${e.port}`],{allowFailure:!0,timeoutMs:e.timeoutMs,signal:e.signal})}async function Fr(e){let t=Lr(e),n=e.deviceKey??`android:default`;await wr({deviceKey:n,adb:e.adb,signal:e.signal});let r;try{r=await e.adb(Rr(t),{allowFailure:!0,timeoutMs:t.commandTimeoutMs,signal:e.signal})}catch(r){throw e.signal?.aborted?(await Cr({deviceKey:n,packageName:t.packageName,adb:e.adb,cause:r}),e.signal.throwIfAborted(),r):r}e.signal?.aborted&&(await Cr({deviceKey:n,packageName:t.packageName,adb:e.adb,cause:e.signal.reason}),e.signal.throwIfAborted());let{output:i,cleanupDone:a}=await zr(e,t,r);if(t.outputPath&&!a&&await Kr(e.adb,t.outputPath),r.exitCode!==0)throw new o(`COMMAND_FAILED`,`Android snapshot helper failed`,ye(r,{helper:i.metadata}));return i}function Ir(e){return{adb:e.adb,adbProvider:e.adbProvider,deviceKey:e.deviceKey,helperVersion:e.artifact.manifest.version,helperVersionCode:e.artifact.manifest.versionCode,helperSha256:e.artifact.manifest.sha256,packageName:e.artifact.manifest.packageName,instrumentationRunner:e.artifact.manifest.instrumentationRunner,waitForIdleTimeoutMs:500,timeoutMs:jn,commandTimeoutMs:Mn,...e.signal?{signal:e.signal}:{}}}function Lr(e){let t=M(e.timeoutMs,8e3),n=M(e.packageName,`com.callstack.agentdevice.snapshothelper`);return{waitForIdleTimeoutMs:M(e.waitForIdleTimeoutMs,500),waitForIdleQuietMs:M(e.waitForIdleQuietMs,100),timeoutMs:t,commandTimeoutMs:M(e.commandTimeoutMs,t+5e3),maxDepth:M(e.maxDepth,128),maxNodes:M(e.maxNodes,5e3),packageName:n,runner:M(e.instrumentationRunner,`${n}/.SnapshotInstrumentation`),...e.outputPath?{outputPath:e.outputPath}:{},...e.emitChunks===void 0?{}:{emitChunks:e.emitChunks}}}function M(e,t){return e===void 0?t:e}function Rr(e){return[`shell`,`am`,`instrument`,`-w`,`-e`,`waitForIdleTimeoutMs`,String(e.waitForIdleTimeoutMs),`-e`,`waitForIdleQuietMs`,String(e.waitForIdleQuietMs),`-e`,`timeoutMs`,String(e.timeoutMs),`-e`,`maxDepth`,String(e.maxDepth),`-e`,`maxNodes`,String(e.maxNodes),...e.outputPath?[`-e`,`outputPath`,e.outputPath]:[],...e.emitChunks===void 0?[]:[`-e`,`emitChunks`,String(e.emitChunks)],e.runner]}async function zr(e,t,n){try{return{output:qr(`${n.stdout}\n${n.stderr}`),cleanupDone:!1}}catch(r){return await Br(e,t,n,r)}}async function Br(e,t,n,r){if(r instanceof o&&n.exitCode!==0&&r.details?.helper)throw r;let i=await Vr(e,t,n);if(i)return{output:i,cleanupDone:!0};throw new o(`COMMAND_FAILED`,n.exitCode===0?`Android snapshot helper output could not be parsed`:`Android snapshot helper failed before returning parseable output`,{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,...A(or(n.exitCode))},r)}async function Vr(e,t,n){if(!(n.exitCode!==0||!t.outputPath))return await Ur(e.adb,t.outputPath,Gr(`${n.stdout}\n${n.stderr}`)??Hr(t))}function Hr(e){return{outputFormat:An,waitForIdleTimeoutMs:e.waitForIdleTimeoutMs,waitForIdleQuietMs:e.waitForIdleQuietMs,timeoutMs:e.timeoutMs,maxDepth:e.maxDepth,maxNodes:e.maxNodes,transport:`instrumentation`}}async function Ur(e,t,n){let r;try{r=await e(Wr(t),{allowFailure:!0,timeoutMs:5e3})}catch{return}if(r.exitCode!==0)return;let i=r.stdout.trim();if(!(!i.includes(`<hierarchy`)||!i.includes(`</hierarchy>`)))return{xml:i,metadata:n}}function Wr(e){return[`shell`,`sh`,`-c`,`cat "$1"; status=$?; rm -f "$1"; exit "$status"`,`agent-device-snapshot-helper-output`,e]}function Gr(e){try{return ti(Yr(E(e).results))}catch{return null}}async function Kr(e,t){try{await e([`shell`,`rm`,`-f`,t],{allowFailure:!0,timeoutMs:5e3})}catch{}}function qr(e){let t=E(e),n=Yr(t.results);return{xml:Zr(Jr(t.status),n),metadata:{...ti(n),transport:`instrumentation`}}}function Jr(e){let t=[];for(let n of e){if(n.agentDeviceProtocol!==`android-snapshot-helper-v1`||n.outputFormat!==`uiautomator-xml`)continue;let{payloadBase64:e}=n;e!==void 0&&t.push({index:N(n.chunkIndex),count:N(n.chunkCount),payloadBase64:e})}return t}function Yr(e){let t=e.find(e=>e.agentDeviceProtocol===kn);if(!t)throw new o(`COMMAND_FAILED`,`Android snapshot helper did not return a final result`);if(t.ok!==`true`)throw new o(`COMMAND_FAILED`,Xr(t),{errorType:t.errorType,helper:t,...A(ar(t))});return t}function Xr(e){return e.message&&e.message!==`null`?e.message:e.errorType||`Android snapshot helper returned an error`}function Zr(e,t){if(e.length===0)throw new o(`COMMAND_FAILED`,`Android snapshot helper did not return XML chunks`,{helper:t});let n=Qr(e),r=Buffer.concat(ei($r(e,n),n)).toString(`utf8`);if(!r.includes(`<hierarchy`)||!r.includes(`</hierarchy>`))throw new o(`COMMAND_FAILED`,`Android snapshot helper output did not contain XML`,{xml:r});return r}function Qr(e){let t=e[0]?.count??e.length;if(t<1||e.length!==t||e.some(e=>e.count!==t))throw new o(`COMMAND_FAILED`,`Android snapshot helper returned incomplete XML chunks`,{expectedChunks:t,actualChunks:e.length});return t}function $r(e,t){let n=new Map;for(let r of e){if(r.index===void 0||r.index<0||r.index>=t)throw new o(`COMMAND_FAILED`,`Android snapshot helper returned invalid chunk index`,{chunkIndex:r.index,expectedChunks:t});if(n.has(r.index))throw new o(`COMMAND_FAILED`,`Android snapshot helper returned duplicate XML chunks`,{chunkIndex:r.index});n.set(r.index,r.payloadBase64)}return n}function ei(e,t){let n=[];for(let r=0;r<t;r+=1){let i=e.get(r);if(i===void 0)throw new o(`COMMAND_FAILED`,`Android snapshot helper returned incomplete XML chunks`,{missingChunkIndex:r,expectedChunks:t});n.push(Buffer.from(i,`base64`))}return n}function ti(e){return{helperApiVersion:e.helperApiVersion,outputFormat:An,waitForIdleTimeoutMs:N(e.waitForIdleTimeoutMs),waitForIdleQuietMs:N(e.waitForIdleQuietMs),timeoutMs:N(e.timeoutMs),maxDepth:N(e.maxDepth),maxNodes:N(e.maxNodes),rootPresent:ri(e.rootPresent),captureMode:ni(e.captureMode),windowCount:N(e.windowCount),nodeCount:N(e.nodeCount),truncated:ri(e.truncated),elapsedMs:N(e.elapsedMs)}}function ni(e){return e===`interactive-windows`||e===`active-window`?e:void 0}const N=D,ri=gn,ii=5e3,P=new Map,ai=new Map;async function oi(e){return await si(e)!==void 0}async function si(e){let t=e.deviceKey??`android:default`;if(await wr({deviceKey:t,adb:e.adb,signal:e.signal}),!pi()||!e.adbProvider?.spawn)return;let n=fi(Lr(e)),r=await li({deviceKey:t,identity:di(t,n,e),options:e,resolved:n});return r?{session:r,resolved:n,deviceKey:t}:void 0}function ci(e){return P.get(e)}async function li(e){let{deviceKey:t,identity:n,options:r,resolved:i}=e;if(ai.get(t)===n)return;let a=P.get(t);if(a&&a.identity!==n&&(await F(t),a=void 0),!a)try{a=await ui({deviceKey:t,identity:n,options:r,resolved:i})}catch(e){if(r.signal?.throwIfAborted(),ai.set(t,n),h({level:`warn`,phase:`android_snapshot_helper_session_disabled`,data:{deviceKey:t,reason:e instanceof Error?e.message:String(e)}}),Er(e))throw e;return}return a}async function ui(e){let t=await sr();await e.options.adb([`forward`,`tcp:${t}`,`tcp:${t}`],{allowFailure:!1,timeoutMs:ii,signal:e.options.signal});let n=Rr({...e.resolved,outputPath:void 0,emitChunks:!1}),r=n.at(-1);if(!r)throw new o(`INVALID_ARGS`,`Android snapshot helper runner was not resolved`);let i=[...n.slice(0,-1),`-e`,`sessionPort`,String(t),r],a=e.options.adbProvider.spawn(i,{allowFailure:!0,captureOutput:!1}),s={identity:e.identity,deviceKey:e.deviceKey,helper:{packageName:e.resolved.packageName,runner:e.resolved.runner,helperVersion:e.options.helperVersion,helperVersionCode:e.options.helperVersionCode,sha256:e.options.helperSha256},port:t,adb:e.options.adb,process:a,startedAtMs:Date.now(),capturedCount:0};try{return await dr(a,1e4,e.options.signal),P.set(e.deviceKey,s),h({phase:`android_snapshot_helper_session_ready`,data:{deviceKey:e.deviceKey,port:t,packageName:e.resolved.packageName,runner:e.resolved.runner}}),s}catch(t){let n=Or(a);try{a.kill(`SIGTERM`)}catch{}let[,r]=await Promise.all([Ar(n.ended,250),Dr({adb:s.adb,process:s.process,port:s.port,packageName:s.helper.packageName,timeoutMs:br,forceStopRuntime:!0})]);throw r.runtimeForceStopped||Tr({deviceKey:e.deviceKey,packageName:s.helper.packageName,cause:t}),t}}function di(e,t,n){return JSON.stringify({deviceKey:e,packageName:t.packageName,runner:t.runner,helperVersion:n.helperVersion,helperVersionCode:n.helperVersionCode,helperSha256:n.helperSha256,waitForIdleTimeoutMs:t.waitForIdleTimeoutMs,waitForIdleQuietMs:t.waitForIdleQuietMs,timeoutMs:t.timeoutMs,maxDepth:t.maxDepth,maxNodes:t.maxNodes})}function fi(e){let t=Math.min(e.timeoutMs,2e3);return{...e,timeoutMs:t,commandTimeoutMs:Math.min(e.commandTimeoutMs,t+3e3)}}function pi(){let e=v().environment.AGENT_DEVICE_ANDROID_SNAPSHOT_HELPER_SESSION;return e===void 0||!/^(0|false|no|off)$/i.test(e)}async function F(e,t={}){let n=P.get(e);if(!n)return!1;P.delete(e);let r=Or(n.process),i=t.force===!0||t.signal?.aborted===!0,a=await mi(n,r,i,t.signal),o=r.hasEnded(),s=a.acknowledged&&a.exited,c=s&&await Ot({adb:n.adb,deviceKey:e,signal:t.signal}),l=i?t.signal?.aborted===!0?250:br:ii,u=i?250:2e3,[d,f]=await Promise.all([jr({process:n.process,processExit:r,timeoutMs:u}),Dr({adb:n.adb,process:n.process,port:n.port,packageName:n.helper.packageName,timeoutMs:l,forceStopRuntime:t.resetRuntime===!0||!c})]);return h({phase:`android_snapshot_helper_session_stop`,data:{deviceKey:e,port:n.port,capturedCount:n.capturedCount,lifetimeMs:Date.now()-n.startedAtMs,quitAcknowledged:a.acknowledged,quitExitObserved:s,runtimeReleaseConfirmed:c,forceKilled:!o&&d,forced:i||t.signal?.aborted===!0,runtimeForceStopped:f.runtimeForceStopped,externalCleanupTimedOut:f.timedOut}}),!c&&!f.runtimeForceStopped&&Tr({deviceKey:e,packageName:n.helper.packageName,cause:t.cause}),!0}async function mi(e,t,n,r){if(n)return{acknowledged:!1,exited:!1};let i=`quit-${Date.now()}`;try{let n=mr(await cr(e.port,`quit ${i}`,1e3,r),i);return{acknowledged:n,exited:n&&await Ar(t.ended,11e3,r)&&t.completedCleanly()}}catch{return{acknowledged:!1,exited:!1}}}async function hi(e){await F(Sr(e))}async function gi(){let e=await Promise.allSettled([...P.keys()].map(e=>F(e)));ai.clear();let t=e.filter(e=>e.status===`rejected`).map(e=>e.reason);if(t.length>0)throw AggregateError(t,`Failed to retire every Android snapshot helper session`);Mr(),kt()}async function _i(e){let t=await si(e);if(t)return await vi({session:t.session,deviceKey:t.deviceKey,options:e,resolved:t.resolved})}async function vi(e){let{session:t,deviceKey:n,options:r,resolved:i}=e;try{let e=t.capturedCount>0,n=await lr({port:t.port,timeoutMs:i.timeoutMs,commandTimeoutMs:i.commandTimeoutMs,signal:r.signal});return t.capturedCount+=1,{xml:n.xml,metadata:{...n.metadata,transport:`persistent-session`,sessionReused:e}}}catch(e){await F(n,{force:!0,signal:r.signal,cause:e}),r.signal?.throwIfAborted(),h({level:`warn`,phase:`android_snapshot_helper_session_fallback`,data:{deviceKey:n,reason:e instanceof Error?e.message:String(e),uiAutomationConnectionTimeout:Je(e)===`accessibility-timeout`}});return}}async function yi(e){let t=ci(e.deviceKey);if(!t)return;if(!bi(t.helper,e.helper)){h({level:`warn`,phase:`android_snapshot_helper_session_touch_identity_mismatch`,data:{deviceKey:e.deviceKey,sessionHelper:t.helper,requestedHelper:e.helper}}),await F(e.deviceKey);return}let n=`${e.action}-${Date.now()}-${Math.random().toString(16).slice(2)}`,r=e.payloadBase64?`${e.action} ${n} ${e.payloadBase64}`:`${e.action} ${n}`,i;try{i=fr(await cr(t.port,r,e.timeoutMs)),pr(i,n)}catch(t){throw await F(e.deviceKey),t}if(i.ok!==`true`)throw new o(`COMMAND_FAILED`,i.message||i.errorType||`Android automation helper ${e.action} failed`,{errorType:i.errorType,helper:i});return i}function bi(e,t){return e.packageName===t.packageName&&e.runner===t.runner&&xi(e.helperVersion,t.helperVersion)&&xi(e.helperVersionCode,t.helperVersionCode)&&xi(e.sha256,t.sha256)}function xi(e,t){return e===void 0||t===void 0||e===t}const Si=`android-touch-plan-v1`,Ci=45e3,wi=`ANDROID_TOUCH_HELPER_NO_FINAL_RESULT`,Ti=`ANDROID_TOUCH_HELPER_REPORTED_FAILURE`;async function Ei(e,t){let n=await ki(e),r=ji(t),i=Math.max(45e3,r.durationMs+15e3),a=Buffer.from(JSON.stringify({protocol:Si,...r})).toString(`base64`),o=await m(`android_touch_helper_gesture`,async()=>{let e=await yi({deviceKey:n.deviceKey,action:`gesture`,helper:Oi(n.artifact),payloadBase64:a,timeoutMs:i});return e?{...Fi(e),helperTransport:`persistent-session`}:{...await Ni({adb:n.adb,runner:n.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`gesture`,`-e`,`payloadBase64`,a],timeoutMs:i,readResult:Fi}),helperTransport:`instrumentation`}},{packageName:n.artifact.manifest.packageName,version:n.artifact.manifest.version});return{backend:`android-helper`,helperVersion:n.artifact.manifest.version,installReason:n.install.reason,...o}}async function Di(e,t={}){let n=await ki(e);t.helperSessionScope===`daemon-session`&&await oi(Ir({adb:n.adb,adbProvider:n.adbProvider,artifact:n.artifact,deviceKey:n.deviceKey}));try{let e=await yi({deviceKey:n.deviceKey,action:`viewport`,helper:Oi(n.artifact),timeoutMs:Ci});if(e)return Ii(e)}catch(e){await F(n.deviceKey),h({level:`warn`,phase:`android_touch_helper_viewport_session_fallback`,data:{reason:e instanceof Error?e.message:String(e)}})}return await Ni({adb:n.adb,runner:n.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`viewport`],timeoutMs:Ci,readResult:Ii})}function Oi(e){return{packageName:e.manifest.packageName,runner:e.manifest.instrumentationRunner,helperVersion:e.manifest.version,helperVersionCode:e.manifest.versionCode,sha256:e.manifest.sha256}}async function ki(e){let t=x(e),n=t.snapshotHelperArtifact??await Ai(),r=Sr(e);await wr({deviceKey:r,adb:t.exec});let i=await m(`android_touch_helper_install`,async()=>await Qn({adb:t.exec,adbProvider:t,artifact:n,deviceKey:r,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode});return h({phase:`android_touch_helper_install_decision`,data:i}),i.installed&&await F(r),{adb:t.exec,adbProvider:t,artifact:n,install:i,deviceKey:r}}async function Ai(){return await xn({helperDirName:`snapshot-helper`,manifestFileName:e=>`agent-device-android-snapshot-helper-${e}.manifest.json`,parseManifest:e=>{let t=Pn(e);return{...t,assetName:t.assetName??`agent-device-android-snapshot-helper-${t.version}.apk`}},unavailableMessage:`Android touch gestures require the bundled Android automation helper artifact, but it was not found or could not be read`})}function ji(e){return{kind:e.topology===`single`?`swipe`:`transform`,durationMs:e.durationMs,pointers:e.pointers.map(Mi)}}function Mi(e){return{pointerId:e.pointerId,samples:e.samples.map(({offsetMs:e,point:t})=>({offsetMs:e,x:t.x,y:t.y}))}}async function Ni(e){let t=await e.adb([`shell`,`am`,`instrument`,`-w`,...e.extraArgs,e.runner],{allowFailure:!0,timeoutMs:e.timeoutMs}),n;try{n=Pi(`${t.stdout}\n${t.stderr}`)}catch(e){if(e instanceof o){if(e.code===Ti)throw new o(`COMMAND_FAILED`,e.message,e.details,e);if(e.code!==wi)throw e}throw new o(`COMMAND_FAILED`,t.exitCode===0?`Android automation helper output could not be parsed`:`Android automation helper failed before returning parseable output`,ye(t),e)}if(t.exitCode!==0)throw new o(`COMMAND_FAILED`,`Android automation helper failed`,ye(t,{helper:n}));return e.readResult(n)}function Pi(e){let t=E(e).results.find(e=>e.agentDeviceProtocol===kn);if(!t)throw new o(wi,`Android automation helper did not return a final result`);if(t.ok!==`true`)throw new o(Ti,t.message&&t.message!==`null`?t.message:t.errorType||`Android automation helper returned an error`,{errorType:t.errorType,helper:t});return t}function Fi(e){return{helperKind:e.kind,helperApiVersion:e.helperApiVersion,injectedEvents:D(e.injectedEvents),elapsedMs:D(e.elapsedMs)}}function Ii(e){let t=D(e.x),n=D(e.y),r=D(e.width),i=D(e.height);if(t===void 0||n===void 0||r===void 0||i===void 0)throw new o(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return _n({x:t,y:n,width:r,height:i})}function Li(e){if(e.topology===`two`||e.intent===`longPress`)return e;let[{pointerId:t,samples:n}]=e.pointers,r=[...new Set([...Ue(e.durationMs,`android`),...n.map(({offsetMs:e})=>e)])].sort((e,t)=>e-t),i=0,a=r.map(e=>{for(;i<n.length-2&&e>n[i+1].offsetMs;)i+=1;let t=n[i],r=n[i+1],a=r.offsetMs-t.offsetMs;return{offsetMs:e,point:e===r.offsetMs||a===0?r.point:Ge(t.point,r.point,(e-t.offsetMs)/a)}}),o=[a[0],a[1],a[2],...a.slice(3)];return{...e,pointers:[{pointerId:t,samples:o}]}}async function Ri(e,t){let n=Li(t),r=Ne(e);if(r){let e=n.intent===`longPress`?{...n,viewport:_n(await r.gestureViewport())}:n;return{backend:`provider-native-touch`,...await r.touch(e)??{}}}return await Ei(e,n)}async function zi(e,t={}){let n=Ne(e);return n?_n(await n.gestureViewport()):await Di(e,t)}async function Bi(e,t,n){await S(e,[`shell`,`input`,`tap`,String(t),String(n)])}async function Vi(e,t,n){let r=Ce(t);await S(e,[`shell`,`input`,...n&&n>0?[`keyevent`,`--longpress`]:[`keyevent`],r])}async function Hi(e){await S(e,[`shell`,`input`,`keyevent`,`4`])}async function Ui(e){await S(e,[`shell`,`input`,`keyevent`,`3`])}async function Wi(e){await S(e,[`shell`,`input`,`keyevent`,`ENTER`])}async function Gi(e,t){let n=ra(t);await S(e,[`shell`,`settings`,`put`,`system`,`accelerometer_rotation`,`0`]),await S(e,[`shell`,`settings`,`put`,`system`,`user_rotation`,n]),await qi(e,t,n)}const Ki=15e3;async function qi(e,t,n){let r=Date.now()+Ki,i=await Ji(e,t,r);for(;i!==void 0&&i!==n&&Date.now()<r;)await g(Math.min(500,Yi(r))),i=await Ji(e,t,r);if(i!==void 0&&i!==n)throw new o(`COMMAND_FAILED`,`orientation ${t} did not take effect: the display still reports rotation ${i} after ${Ki}ms`,{requestedRotation:Number(n),observedRotation:Number(i),hint:"The foreground app may pin its orientation, or the device may ignore user_rotation. Check `adb shell dumpsys display | grep mCurrentOrientation` and the app manifest."})}async function Ji(e,t,n){try{let t=await S(e,[`shell`,`dumpsys`,`display`],{timeoutMs:Yi(n)});return/mCurrentOrientation=(\d)/.exec(t.stdout)?.[1]}catch(e){throw new o(`COMMAND_FAILED`,`orientation ${t} could not confirm the display rotation: ${e instanceof Error?e.message:String(e)}`,{hint:"The device did not answer `dumpsys display` within the orientation budget."})}}function Yi(e){return Math.max(1,e-Date.now())}async function Xi(e){await S(e,[`shell`,`input`,`keyevent`,`187`])}async function Zi(e,t,n,r=800){let i={x:t,y:n};return await Ri(e,{topology:`single`,intent:`longPress`,durationMs:r,pointers:[{pointerId:0,samples:[{offsetMs:0,point:i},{offsetMs:r,point:i}]}]})}async function Qi(e,t,n){await Bi(e,t,n)}async function $i(e,t,n){let r=await zi(e,{helperSessionScope:n?.helperSessionScope}),i=le({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:r.width,referenceHeight:r.height}),a={...i,referenceWidth:r.x+r.width,referenceHeight:r.y+r.height,x1:r.x+i.x1,y1:r.y+i.y1,x2:r.x+i.x2,y2:r.y+i.y2},o=Math.max(n?.durationMs??300,16),s=n?.releaseBehavior??`controlled`;s===`controlled`&&ta(o);let c=We({intent:`pan`,origin:{x:a.x1,y:a.y1},delta:{x:a.x2-a.x1,y:a.y2-a.y1},durationMs:o},r,`android`),l=await Ri(e,s===`controlled`?na(c,r,t):c);return{...a,...n?.durationMs===void 0?{}:{durationMs:o},...l}}const ea=ue-160;function ta(e){if(!(e<=ea))throw new o(`INVALID_ARGS`,`scroll durationMs must be at most ${ea} for a controlled release (leaves room for the 160ms release tail within the ${ue}ms gesture ceiling)`,{hint:`Pass a shorter durationMs, or releaseBehavior 'inertial' if the fling is acceptable.`})}function na(e,t,n){if(e.topology!==`single`)return e;let[r]=e.pointers,i=r.samples.at(-1),a=n===`left`||n===`right`,o=a?i.point.y:i.point.x,s=(a?t.y:t.x)+1,c=(a?t.y+t.height:t.x+t.width)-1,l=o+1<=c?o+1:Math.max(s,o-1),u=Array.from({length:10},(t,n)=>{let r=n%2==0?l:o;return{offsetMs:e.durationMs+(n+1)*16,point:a?{x:i.point.x,y:r}:{x:r,y:i.point.y}}}),d=[r.samples[0],r.samples[1],...r.samples.slice(2),...u];return{...e,durationMs:e.durationMs+160,pointers:[{...r,samples:d}]}}function ra(e){let t=_e[e];if(t===void 0)throw new o(`INVALID_ARGS`,`Unsupported Android rotation: ${e}`);return String(t)}async function ia(e){let t=(await S(e,[`shell`,`wm`,`size`])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!t)throw new o(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(t[1]),height:Number(t[2])}}async function aa(e,t,n){return t===`wait`?await oa(n.captureNodes,n.timeoutMs??1e4):t===`get`?fa((await da(n.captureNodes))?.alert??null):await sa(e,t,n.captureNodes)}async function oa(e,t){let n=Date.now(),r=await ua(e,t);if(!r)throw new o(`COMMAND_FAILED`,`alert wait timed out`);return{kind:`alertWait`,platform:`android`,action:`wait`,alert:r.alert,waitedMs:Date.now()-n,...de(`Alert visible`)}}async function sa(e,t,n){let r=await ua(n,fe);if(!r)throw new o(`COMMAND_FAILED`,`alert not found`,{hint:`If a sheet is visible in snapshot but alert reports no alert, it is likely app-owned UI. Use snapshot -i and press the visible label/ref.`});let i=Ut(r.buttons,t);if(i)return await Bi(e,i.x,i.y),await ca(r.alert,t,n),pa(t,r.alert,i.label,{x:i.x,y:i.y});if(t===`dismiss`)return await Hi(e),await ca(r.alert,t,n),pa(t,r.alert,`Back`);throw new o(`COMMAND_FAILED`,`alert accept found an alert but no accept button`,{alert:r.alert,hint:`Inspect alert get --json for visible buttons, then use press by visible label/ref if needed.`})}async function ca(e,t,n){let r=Date.now();for(;;){let i=await da(n);if(!i||!la(i.alert,e))return;if(Date.now()-r>=2e3)throw new o(`COMMAND_FAILED`,`alert ${t} did not dismiss the visible alert`,{alert:e,hint:`The alert button was pressed but the dialog is still visible. Inspect alert get --json, then press the visible button by label/ref or retry.`});await g(300)}}function la(e,t){return e.title===t.title&&e.buttons.join(`\0`)===t.buttons.join(`\0`)}async function ua(e,t){let n=Date.now();for(;Date.now()-n<t;){let t=await da(e);if(t)return t;await g(300)}return null}async function da(e){return Vt(await m(`snapshot_capture`,e,{backend:`android`,purpose:`alert`}))}function fa(e){return{kind:`alertStatus`,platform:`android`,action:`get`,alert:e,...de(e?`Alert visible`:`No alert visible`)}}function pa(e,t,n,r){return{kind:`alertHandled`,platform:`android`,action:e,handled:!0,alert:t,button:n,...r?{coordinates:r}:{},...de(`Alert ${e}ed`)}}const ma=`android.intent.category.LAUNCHER`,ha=`android.intent.category.DEFAULT`;async function ga(e,t){await e([`shell`,`am`,`force-stop`,t])}async function _a(e,t,n=[ma]){for(let r of n){let n=await e([`shell`,`cmd`,`package`,`resolve-activity`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,r,t],{allowFailure:!0});if(n.exitCode!==0)continue;let i=rt(n.stdout);if(i)return i}return null}async function va(e,t,n={}){let r=n.category??ma;if(n.activity){await e([`shell`,`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,ha,`-c`,r,`-n`,ya(t,n.activity)]);return}let i=await e([`shell`,`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,ha,`-c`,r,`-p`,t],{allowFailure:!0});if(i.exitCode===0&&!at(i.stdout,i.stderr))return;let a=await _a(e,t,[r]);if(!a)throw new o(`COMMAND_FAILED`,`Failed to resolve Android launch component for ${t}`,{stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode});await e([`shell`,`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,ha,`-c`,r,`-n`,a])}function ya(e,t){return t.includes(`/`)?t:`${e}/${t.startsWith(`.`)?t:`.${t}`}`}let ba=null;function xa(e){return`${e.PATH??``}::${e.AGENT_DEVICE_BUNDLETOOL_JAR??``}`}async function Sa(e){let t=xa(e);if(ba?.key===t)return ba.invocation;if(await xe(`bundletool`)){let e={cmd:`bundletool`,prefixArgs:[]};return ba={key:t,invocation:e},e}let n=await be(e.AGENT_DEVICE_BUNDLETOOL_JAR,`AGENT_DEVICE_BUNDLETOOL_JAR`);if(!n)throw new o(`TOOL_MISSING`,`bundletool not found in PATH. Install bundletool or set AGENT_DEVICE_BUNDLETOOL_JAR to a bundletool-all.jar path.`);let r={cmd:`java`,prefixArgs:[`-jar`,n]};return ba={key:t,invocation:r},r}async function Ca(e,t,n){let r=await Sa(n);await Se(r.cmd,[...r.prefixArgs,...e],{signal:t})}function wa(e){return C.extname(e).toLowerCase()===`.aab`}async function Ta(e,t,n={}){let r=x(e),i=`universal`;if(r.installBundle){await r.installBundle(t,{mode:i,signal:n.signal});return}let a=v().files,o=await a.makeTempDirectory(`agent-device-aab-`),s=C.join(o,`bundle.apks`);try{await Ca([`build-apks`,`--bundle`,t,`--output`,s,`--mode`,i],n.signal,n.environment??v().environment),await Ca([`install-apks`,`--apks`,s,`--device-id`,e.id],n.signal,n.environment??v().environment)}finally{await a.remove(o,{recursive:!0,force:!0})}}async function Ea(e,t,n={}){if(wa(t)){await Ta(e,t,n);return}await Be(t,{device:e,replace:!0,signal:n.signal})}async function Da(e,t,n={}){await lt(e,async()=>{e.booted||await Qe(e.id,void 0,n.signal),await Ea(e,t,n)})}const Oa=[`mInputShown`,`mIsInputViewShown`,`isInputViewShown`,`mDecorViewVisible`,`mWindowVisible`,`mInShowWindow`],ka=new Map([[2,`number`],[3,`phone`],[4,`datetime`]]),Aa=new Set([32,208]),ja=new Set([128,224,144]);async function Ma(e){return await I(b(e))}async function I(e){let t=await e([`shell`,`dumpsys`,`input_method`],{allowFailure:!0});if(t.exitCode!==0)throw y(`Failed to query Android keyboard state`,t);return Fa(t.stdout)}async function Na(e){return await Pa(b(e))}async function Pa(e){let t=await I(e),n=t,r=0;for(;n.visible&&r<2;)await e([`shell`,`input`,`keyevent`,`111`]),r+=1,await g(120),n=await I(e);if(t.visible&&n.visible)throw new o(`UNSUPPORTED_OPERATION`,`Android keyboard dismiss is unavailable for the current IME without back navigation.`,{attempts:r,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner});return{attempts:r,wasVisible:t.visible,dismissed:t.visible&&!n.visible,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}function Fa(e){let t=Ba(e)??Ia(e),n=La(e),r=Ra(e,/\bpackageName=([A-Za-z0-9_.]+)\b/g),i=Ra(e,/\b(?:resourceId|resource-id)=([^\s,}]+)/g),a=f(e),o=ee(r,i,a);return za(r,i,a),{visible:t??!1,inputType:n,type:n?Wa(n):void 0,inputMethodPackage:a,focusedPackage:r,focusedResourceId:i,inputOwner:o}}function Ia(e){let t=e.match(/\bmImeWindowVis=0x([0-9a-fA-F]+)\b/)?.[1];if(!t)return null;let n=Number.parseInt(t,16);return Number.isNaN(n)?null:!!(n&1)}function La(e){let t=Ra(e,/\binputType=0x([0-9a-fA-F]+)\b/gi);return t?`0x${t.toLowerCase()}`:void 0}function Ra(e,t){let n;for(let r of e.matchAll(t))n=r[1];return n}function za(e,t,n){n||!u(e)&&!c(t)||h({level:`warn`,phase:`android_input_ownership_fallback`,data:{focusedPackage:e,focusedResourceId:t}})}function Ba(e){return Ha(Va(e,Oa))}function Va(e,t){let n=new Map,r=RegExp(`\\b(${t.join(`|`)})=([a-zA-Z]+)\\b`,`g`);for(let t of e.matchAll(r)){let e=t[1],r=t[2]?.toLowerCase();!e||r!==`true`&&r!==`false`||n.set(e,r===`true`)}return n}function Ha(e){if(e.size===0)return null;let t=Ua(e,[`mWindowVisible`,`mDecorViewVisible`,`mInShowWindow`]);if(t!==void 0)return t;let n=e.get(`mInputShown`);return n===void 0?Ua(e,[`mIsInputViewShown`,`isInputViewShown`])??null:n}function Ua(e,t){for(let n of t){let t=e.get(n);if(t!==void 0)return t}}function Wa(e){let t=Number.parseInt(e.replace(/^0x/i,``),16);if(Number.isNaN(t))return`unknown`;let n=t&15,r=ka.get(n);if(r)return r;if(n!==1)return`unknown`;let i=t&4080;return Aa.has(i)?`email`:ja.has(i)?`password`:`text`}async function Ga(e){return await Ka(b(e))}async function Ka(e){return Xa(await Ya(e,[`shell`,`cmd`,`clipboard`,`get`,`text`],`read`))}async function qa(e,t){await Ja(b(e),t)}async function Ja(e,t){await Ya(e,[`shell`,`cmd`,`clipboard`,`set`,`text`,we(t)],`write`)}async function Ya(e,t,n){let r=await e(t,{allowFailure:!0});if(r.exitCode===0)return r.stdout;throw He(r.stdout,r.stderr)?new o(`UNSUPPORTED_OPERATION`,`Android shell clipboard ${n} is not supported on this device.`):y(`Failed to ${n} Android clipboard text`,r)}function Xa(e){let t=e.replaceAll(`\r
|
|
9
|
+
`,`
|
|
10
|
+
`).replace(/\n$/,``),n=t.match(/^clipboard text:\s*(.*)$/i);return n?n[1]??``:t.trim().toLowerCase()===`null`?``:t}const Za=`com.callstack.agentdevice.imehelper`,Qa=`android-ime-helper-v1`;async function $a(e){return e.imeHelperArtifact??await eo()}async function eo(){return await v().resolveHelperArtifact({helperDirName:`ime-helper`,manifestFileName:e=>`agent-device-android-ime-helper-${e}.manifest.json`,parseManifest:to,unavailableMessage:`Android test IME text entry requires the bundled Android IME helper artifact, but it was not found or could not be read`})}const L=`IME helper`;function to(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new o(`INVALID_ARGS`,`Android IME helper manifest must be an object.`);let t=e;return{name:T(t.name,`name`,`android-ime-helper`,L),version:ln(t.version,`version`,L),assetName:ln(t.assetName,`assetName`,L),sha256:un(t.sha256,L),packageName:T(t.packageName,`packageName`,Za,L),versionCode:cn(t.versionCode,`versionCode`,L),serviceComponent:T(t.serviceComponent,`serviceComponent`,`com.callstack.agentdevice.imehelper/.TestInputMethodService`,L),broadcastProtocol:T(t.broadcastProtocol,`broadcastProtocol`,Qa,L)}}const no=new Set;async function ro(e){return await v().ensureHelperInstalled({cache:no,installTimeoutMs:3e4,helperLabel:`Android IME helper`},e)}function io(){no.clear()}function R(e){return`${e.platform}:${e.id}`}function ao(e){return e===Za}async function oo(e,t,n){await co(e,t,`com.callstack.agentdevice.imehelper.ACTION_INPUT_TEXT_B64`,{text:Buffer.from(n,`utf8`).toString(`base64`)})}async function so(e,t){await co(e,t,`com.callstack.agentdevice.imehelper.ACTION_CLEAR_TEXT`,{})}async function co(e,t,n,r){let i=[`shell`,`am`,`broadcast`,`-p`,t,`-a`,n];i.push(`--es`,`protocol`,Qa);for(let[e,t]of Object.entries(r))i.push(`--es`,e,t);let a=await e(i,{allowFailure:!0,timeoutMs:1e4});if(a.exitCode!==0)throw y(`Android IME helper broadcast failed`,a,{action:n,packageName:t})}const z=`agent_device_ime_helper_previous_ime`,B=`secure`,lo=`default_input_method`,uo={previousIme:z,defaultInputMethod:lo};async function V(e){let t=await e([`shell`,`settings`,`get`,B,lo],{allowFailure:!0,timeoutMs:5e3});return go(t.exitCode===0?t.stdout:``)}async function H(e){let t=await e([`shell`,`settings`,`get`,B,z],{allowFailure:!0,timeoutMs:5e3});return go(t.exitCode===0?t.stdout:``)||void 0}async function fo(e,t){return(await e([`shell`,`settings`,`put`,B,z,t],{allowFailure:!0,timeoutMs:5e3})).exitCode===0&&await H(e)===t}async function po(e){await e([`shell`,`settings`,`delete`,B,z],{allowFailure:!0,timeoutMs:5e3})}async function mo(e,n,r){try{(n?await fo(e,n):await ho(e))||_({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0}})}catch(e){_({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0,error:t(e).message}})}}async function ho(e){return await po(e),await H(e)===void 0}function go(e){let t=e.trim();return!t||t===`null`?``:t}const U=new Set,_o=new Map;function vo(e){return U.has(R(e))}function yo(e,t,n){return bt(_o,`${e}:${t}`,n)}function bo(){U.clear()}function xo(e,t){let n=R(e);t?U.add(n):U.delete(n)}async function So(e,t){return await yo(t.stateDir,e.id,async()=>{let n=R(e);if(!U.has(n))return{restored:!1,reason:`no-record`};U.delete(n);let r=await wo(b(e),e);return Co(r.reason)&&await v().imeRecoveryMarkers.clear(t.stateDir,e.id),r})}function Co(e){return e===`ok`||e===`helper-not-active`||e===`no-record`}async function wo(e,t){let n=t.id;if(U.has(R(t)))return{restored:!1,reason:`owned-by-live-session`};let r=await H(e);if(!r)return{restored:!1,reason:`no-record`};let i=await V(e);if(i!==`com.callstack.agentdevice.imehelper/.TestInputMethodService`)return _({level:`debug`,phase:`android_test_ime_restore_skipped`,data:{device:n,currentIme:i,previousIme:r}}),{restored:!1,previousIme:r,reason:`helper-not-active`};await e([`shell`,`ime`,`set`,r],{allowFailure:!0,timeoutMs:1e4});let a=await V(e);return a===r?(await po(e).catch(()=>{}),_({phase:`android_test_ime_restored`,data:{device:n,previousIme:r}}),{restored:!0,previousIme:r,reason:`ok`}):(_({level:`warn`,phase:`android_test_ime_restore_failed`,data:{device:n,previousIme:r,afterIme:a}}),{restored:!1,previousIme:r,reason:`set-failed`})}async function To(e){let n=v().imeRecoveryMarkers,r=await n.read(e.stateDir);if(r.length===0)return;let i;try{i=new Set(await e.listSerials())}catch(e){_({level:`debug`,phase:`android_test_ime_startup_scan_failed`,data:{error:t(e).message}});return}for(let a of r){if(!i.has(a))continue;let r={platform:`android`,id:a,name:a,kind:a.startsWith(`emulator-`)?`emulator`:`device`,booted:!0};try{await yo(e.stateDir,a,async()=>{let t=await wo(b(r),r);t.restored&&_({level:`warn`,phase:`android_test_ime_orphan_restored`,data:{device:a,previousIme:t.previousIme}}),Co(t.reason)&&await n.clear(e.stateDir,a)})}catch(e){_({level:`debug`,phase:`android_test_ime_orphan_restore_failed`,data:{device:a,error:t(e).message}})}}}async function Eo(){v();try{return(await Ae([`devices`],{timeoutMs:5e3})).stdout.split(`
|
|
11
|
+
`).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`List of devices`)).map(e=>e.split(/\s+/)).filter(e=>e[1]===`device`).map(e=>e[0])}catch{return[]}}const Do=2e3;async function Oo(e=v().environment,t=v().files){let n=e.ANDROID_HOME||e.ANDROID_SDK_ROOT,r=await Bo(n,t),i=await yt(`adb`,[`version`]);return i?Io({license:r,sdkRoot:n,versionLine:i}):zo(n,r)}async function ko(e,t){if(e.platform!==`android`)return[];let n=b(e,t.transportOverrides.androidAdb),r=[];return t.shouldProbeMetro&&r.push(await Fo(n,e.id,t.metroPort)),r.push(await Ao(n,e)),r}async function Ao(e,t){try{let n=await V(e),r=vo(t);return n===await jo()&&!r?await Mo(e,t,n):No(t,n,r)}catch(e){return Po(e)}}async function jo(){try{return(await eo()).manifest.serviceComponent}catch{return}}async function Mo(e,t,n){let r=(await e([`shell`,`settings`,`get`,`secure`,uo.previousIme],{allowFailure:!0,timeoutMs:Do})).stdout.trim(),i=r&&r!==`null`?r:void 0;return{id:`android-test-ime`,status:`fail`,summary:`Android test IME helper is the active input method on ${t.id}, but no active session owns it -- likely left over from a crashed session.`,hint:`A stuck test IME leaves the real keyboard unavailable on this device until restored.`,command:i?`adb -s ${t.id} shell ime set ${i}`:`adb -s ${t.id} shell ime list -s`,evidence:{currentIme:n,previousIme:i}}}function No(e,t,n){return{id:`android-test-ime`,status:`pass`,summary:n?`Android test IME helper is active for this session on ${e.id}.`:`Android test IME helper is not active on ${e.id}; the device's normal IME is in use.`,evidence:{currentIme:t}}}function Po(e){let n=t(e);return{id:`android-test-ime`,status:`warn`,summary:`Could not inspect the Android test IME helper state.`,hint:n.message,evidence:{code:n.code}}}async function Fo(e,n,r){try{let t=await e([`reverse`,`--list`],{allowFailure:!0,timeoutMs:Do}),i=`tcp:${r} tcp:${r}`,a=t.stdout.includes(i);return{id:`android-reverse`,status:a?`pass`:`warn`,summary:a?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:a?void 0:`adb -s ${n} reverse tcp:${r} tcp:${r}`,evidence:{stdout:t.stdout.trim()}}}catch(e){let n=t(e);return{id:`android-reverse`,status:`warn`,summary:`Could not inspect Android adb reverse mappings.`,hint:n.message,evidence:{code:n.code}}}}function Io(e){return{id:`toolchain`,status:Lo(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${Ro(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function Lo(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function Ro(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function zo(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function Bo(e,t){if(!e)return`unknown`;try{return await t.access(C.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}function Vo(e,t){if(!t)return{expected:e,actual:null,failureReason:`text_mismatch`,targetInput:null,actualInput:null};let n=Go(t),r={failureReason:t.reason??`text_mismatch`,targetInput:Uo(t.targetInput),actualInput:Uo(t.actualInput)};return n?{...r,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??``).length}:{...r,expected:e,actual:t.actual}}function W(e){return e?e.password?!0:Ho(e.text):!1}function Ho(e){return e?Array.from(e).every(Wo):!1}function Uo(e){if(!e)return null;let t=W(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function Wo(e){return e===`•`||e===`*`||e===`●`}function Go(e){return e.masked===!0||W(e.targetInput)||W(e.actualInput)}const Ko=new WeakMap;function qo(e,t){return t&&Ko.set(e,t),e}function Jo(e){return Ko.get(e)}function Yo(e){return e.clickable}function Xo(e){return e.focusable||e.focused===!0}function G(e){return Yo(e)||Xo(e)}function Zo(e){let t=e.trim();return t?/^[\w.]+:id\/[\w.-]+$/i.test(t):!1}function Qo(e,t){return{raw:e,...t?{effectiveRect:t}:{}}}function $o(e,t,n){if(!e)return;let r=ns(e);return t&&(r=ts(r,t)),n&&(r=ts(r,n)),r}function es(e){return{...e.raw,...e.effectiveRect?{rect:e.effectiveRect}:{rect:void 0},hittable:e.raw.hittable===!0&&ae(e.effectiveRect)?!0:void 0}}function ts(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),o=i>n&&a>r;return{x:o?n:e.x,y:o?r:e.y,width:o?i-n:0,height:o?a-r:0}}function ns(e){return{x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)}}function rs(e,t){let n=new Set;return is(e,n,t),os(e,n,t),n}function is(e,t,n){for(let r of e.children){if(n?.check(`work`),r.visibleToUser===!1){t.add(r);continue}is(r,t,n)}}function as(e,t,n){return n?.check(`work`),e.children.filter(e=>!t.has(e)&&e.visibleToUser!==!1)}function os(e,t,n){let r=as(e,t,n).filter(cs);if(r.length<2)return;let i=r.filter(e=>ls(e)&&us(e));if(i.length===0)return;let a=ss(i);for(let r of as(e,t,n))n?.check(`work`),ls(r)&&(us(r)&&(a===void 0||r.windowLayer===a)||t.add(r))}function ss(e){let t=e.map(e=>e.windowLayer).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function cs(e){return e.windowIndex!==void 0||e.windowType!==void 0}function ls(e){return e.windowType===1}function us(e){return e.windowActive===!0||e.windowFocused===!0}function ds(e,t,n,r,i){let a=new Set(e.sourceNodes),o=ps(t,i),s=fs(o,n,ms(o,a,i),i);if(!s)return{nodes:[],sourceNodes:[]};let c=new Set(ps([s],i)),l=[];for(let[t,n]of e.sourceNodes.entries())i.check(`work`),c.has(n)&&l.push(t);if(l.length===0)return{nodes:[],sourceNodes:[]};let u=1/0;for(let t of l)i.check(`work`),u=Math.min(u,e.nodes[t]?.depth??0);let d=[];for(let t of l)i.check(`work`),(e.nodes[t]?.depth??0)-u<=r&&d.push(t);return i.consume(d.length),{nodes:oe(d.map(t=>e.nodes[t]),u),sourceNodes:d.map(t=>e.sourceNodes[t])}}function fs(e,t,n,r){for(let i of e)if(r.check(`work`),se(i,t)&&n.has(i))return i;return null}function ps(e,t){let n=[],r=[...e].reverse();for(;r.length>0;){t.check(`work`);let e=r.pop();n.push(e);for(let n=e.children.length-1;n>=0;--n)t.check(`work`),r.push(e.children[n])}return n}function ms(e,t,n){let r=new Set;for(let i=e.length-1;i>=0;--i){n.check(`work`);let a=e[i];if(t.has(a)){r.add(a);continue}for(let e of a.children)if(n.check(`work`),r.has(e)){r.add(a);break}}return r}function hs(e,t,n,r,i){if(e.visibleToUser===!1)return!1;let a=gs(e);return t.interactiveOnly?_s(e,a,n,r,i):a.isStructural||a.isVisual?bs(e,a,r):!0}function gs(e){let t=Ss(e.type),n=!!(e.label&&e.label.trim().length>0),r=!!(e.identifier&&e.identifier.trim().length>0);return{type:t,hasMeaningfulText:n&&!Zo(e.label??``),hasMeaningfulId:r&&!Zo(e.identifier??``),isStructural:Cs(t),isVisual:t===`imageview`||t===`imagebutton`}}function _s(e,t,n,r,i){return ys(e)?!1:G(e)||re(t.type)&&r?!0:vs(t,n,r,i)}function vs(e,t,n,r){return!e.hasMeaningfulText&&!e.hasMeaningfulId||e.isVisual||e.isStructural&&!r&&!t?!1:t||n||r}function ys(e){return!!(e.rect&&(e.rect.width<=0||e.rect.height<=0))}function bs(e,t,n){return G(e)||t.hasMeaningfulText||t.hasMeaningfulId?!0:n}function xs(e){if(!e)return!1;let t=Ss(e);return t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)}function Ss(e){return e?e.toLowerCase():``}function Cs(e){let t=e.split(`.`).pop()??e;return t.includes(`layout`)||t===`viewgroup`||t===`view`}function ws(e,t,n,r){return{...Qo(e,t),...n?{clipsDescendants:!0}:{},...r?{windowRect:r}:{}}}const Ts=`ANDROID_SNAPSHOT_PRESENTATION_FAILED`;var K=class extends Error{code=Ts;qualityReasonCode=`presentation-failed`;details;analysis;constructor(e,t,n){super(e),this.name=`AndroidSnapshotPresentationFailure`,this.details=t,this.analysis=n}};function Es(e){return e instanceof K?e.code===Ts:!!(e&&typeof e==`object`&&e.code===Ts)}var Ds=class{workUnits=0;options;defaultMaxWorkUnits;deadlineAtMs;constructor(e,t){this.options=e,this.defaultMaxWorkUnits=t;let n=e.now??Date.now;this.deadlineAtMs=e.deadlineAtMs??n()+Ms()}get workUnitCount(){return this.workUnits}check(e){this.consume(1)}consume(e){this.workUnits+=e;let t=this.options.maxWorkUnits??this.defaultMaxWorkUnits;if(this.workUnits>t)throw new K(`Android snapshot presentation exceeded its linear work budget`,{phase:`complexity`,workUnits:this.workUnits,maxWorkUnits:t});if((this.options.now??Date.now)()>=this.deadlineAtMs)throw new K(`Android snapshot presentation exceeded its cooperative deadline`,{phase:`deadline`,workUnits:this.workUnits,deadlineAtMs:this.deadlineAtMs,maxWorkUnits:t})}};function Os(e,t){return new Ds(e??{},t)}function ks(e,t,n){let r=new Map;for(let i of e){n.check(`regular-invariant`);let e=As(i,r,t),a=i.effectiveRect;if(!a||!ae(a)){if(es(i).hittable===!0)throw new K(`Android regular snapshot node ${i.raw.index} with degenerate effective geometry was marked hittable`,{phase:`regular-invariant`,workUnits:n.workUnitCount,nodeIndex:i.raw.index,frame:a});r.set(i.raw.index,e);continue}if(e&&!js(a,e))throw new K(`Android regular snapshot node ${i.raw.index} escaped its cumulative clip`,{phase:`regular-invariant`,workUnits:n.workUnitCount,nodeIndex:i.raw.index,frame:a,clip:e});r.set(i.raw.index,i.clipsDescendants?a:e)}}function As(e,t,n){let r=e.raw.parentIndex;return r===void 0?e.windowRect??n:t.get(r)??e.windowRect??n}function js(e,t){let n=1e-4;return e.x>=t.x-n&&e.y>=t.y-n&&e.x+e.width<=t.x+t.width+n&&e.y+e.height<=t.y+t.height+n}function Ms(){return 250}function Ns(e,t,n){let r=n.depth??1/0,i=ce(n.scope),a=Zs(e),o=Os(n.androidPresentation,Math.max(1024,a.rawNodeCount*128)),s={nodes:[],sourceNodes:[],...t===void 0?{}:{maxNodes:t},maxDepth:i?1/0:r,options:n,analysis:a,interactiveDescendantMemo:new Map,hidden:new Set,presentationBudget:o,presentationNodes:[],truncated:!1};try{o.check(`work`),s.viewport=Ws(e,o),s.hidden=n.raw?new Set:rs(e,o);for(let t of e.children)if(Fs(s,t,0),s.truncated)break;n.raw||ks(s.presentationNodes,s.viewport,o);let t=s.nodes,a=new Map(s.sourceNodes.map((e,t)=>[e,t])),{nodes:c,sourceNodes:l}=i?ds(s,e.children,i,r,o):s,u={nodes:c,sourceNodes:l,occlusionContext:{nodes:t,sourceIndexByNodeIndex:new Map(l.flatMap((e,t)=>{let n=a.get(e),r=c[t]?.index;return n===void 0||r===void 0?[]:[[r,n]]})),androidSiblingOrderByNodeIndex:Ps(s.sourceNodes)},analysis:s.analysis};return s.truncated?{...u,truncated:!0}:u}catch(e){throw Es(e)&&(e.analysis??=s.analysis),e}}function Ps(e){let t=new Map,n=new Map;for(let[r,i]of e.entries()){let e=Jo(i);if(!e)continue;let a=t.get(e.parent);a===void 0&&(a=t.size,t.set(e.parent,a)),n.set(r,{group:a,order:e.order})}return n}function Fs(e,t,n,r,i=!1,a=!1,o=!1,s,c){if(e.presentationBudget.check(`work`),Is(e,t,n))return;let l=t.windowRect??s??e.viewport,u=Ls(e,t,c,l),d=Rs(e,t,r,i,a,o,u,l),f=i||G(t),p=a||xs(t.type),ee=zs(e,t,u,c);Bs(e,t,n,d,f,p,o||qe(t.identifier),l,ee)}function Is(e,t,n){return e.maxNodes!==void 0&&e.nodes.length>=e.maxNodes?(e.truncated=!0,!0):n>e.maxDepth||e.hidden.has(t)}function Ls(e,t,n,r){return e.options.raw?t.rect:$o(t.rect,r,n)}function Rs(e,t,n,r,i,a,o,s){return!e.options.raw&&!hs(t,e.options,r,qs(e,t),i)?n:Vs(e,t,n,a||qe(t.identifier),o,s)}function zs(e,t,n,r){return e.options.raw||!Gs(t)?r:n}function Bs(e,t,n,r,i,a,o,s,c){for(let l of t.children)if(Fs(e,l,n+1,r,i,a,o,s,c),e.truncated)return}function Vs(e,t,n,r,i,a){let o=e.nodes.length;return e.sourceNodes.push(t),Us(e,t,Hs(e,t,n,r),i,a),o}function Hs(e,t,n,r){return{index:e.nodes.length,type:t.type??void 0,label:t.label??void 0,value:t.value??void 0,identifier:t.identifier??void 0,bundleId:t.packageName??void 0,rect:t.rect,enabled:t.enabled,focused:t.focused,editable:t.editable,password:t.password,hintShowing:t.hintShowing,selectionStart:t.selectionStart,selectionEnd:t.selectionEnd,visibleToUser:t.visibleToUser,hittable:G(t)||void 0,depth:Ks(e.nodes,n),parentIndex:n,...Js(t,e.hidden),...r?{systemChrome:!0}:{}}}function Us(e,t,n,r,i){let a=ws(n,r,!e.options.raw&&Gs(t),i);e.presentationNodes.push(a),e.nodes.push(e.options.raw?a.raw:es(a))}function Ws(e,t){let n=[],r=[...e.children];for(;r.length>0;){t.check(`work`);let e=r.pop();ae(e.windowRect)&&n.push(e.windowRect),r.push(...e.children)}return ne(n)??void 0}function Gs(e){return e.scrollable===!0&&re(e.type)}function Ks(e,t){return t===void 0?0:(e[t]?.depth??-1)+1}function qs(e,t){let n=e.interactiveDescendantMemo.get(t);if(n!==void 0)return n;for(let n of t.children)if(!e.hidden.has(n)&&n.visibleToUser!==!1&&(G(n)||qs(e,n)))return e.interactiveDescendantMemo.set(t,!0),!0;return e.interactiveDescendantMemo.set(t,!1),!1}function Js(e,t){return Ys(e,t)?{...e.canScrollBackward?{hiddenContentAbove:!0}:{},...e.canScrollForward?{hiddenContentBelow:!0}:{}}:{}}function Ys(e,t){if(!e.scrollable||!re(e.type)||`${e.type??``}`.toLowerCase().includes(`horizontalscrollview`))return!1;let n=Xs(e,t);return!(n&&n.horizontal>n.vertical&&n.horizontal>16)}function Xs(e,t){let n=e.children.filter(e=>!t.has(e)&&e.visibleToUser!==!1);if(!e.rect||n.length===0)return null;let r=n.map(e=>e.rect).filter(e=>e!==void 0);if(r.length===0)return null;let i=Math.min(...r.map(e=>e.x)),a=Math.max(...r.map(e=>e.x+e.width)),o=Math.min(...r.map(e=>e.y)),s=Math.max(...r.map(e=>e.y+e.height));return{horizontal:Math.max(0,a-i-e.rect.width),vertical:Math.max(0,s-o-e.rect.height)}}function Zs(e){let t=0,n=0,r=[...e.children];for(;r.length>0;){let e=r.pop();t+=1,n=Math.max(n,e.depth),r.push(...e.children)}return{rawNodeCount:t,maxDepth:n}}function Qs(){let e=[],t=()=>e.at(-1)===!0;return{open(n,r){let i=t()||qe(n);return r||e.push(i),i},close(){e.pop()}}}function*$s(e){let t=/<node\b[^>]*>|<\/node>/g,n=Qs(),r=t.exec(e);for(;r;){let i=r[0];if(i.startsWith(`</node`))n.close();else{let e=ec(i);yield n.open(e.resourceId,i.endsWith(`/>`))?{...e,systemChrome:!0}:e}r=t.exec(e)}}function ec(e){let t=tc(e),n=xt(t.bounds);return{...t,...n?{rect:n}:{}}}function tc(e){let t=nc(e),n=e=>uc(t,e),r=e=>{let t=n(e);if(t!==null)return t===`true`},i=e=>{let t=n(e);if(t===null||t.trim()===``)return;let r=Number(t);return Number.isFinite(r)?r:void 0},a=(e,t)=>{let n=i(t);return n===void 0?{}:{[e]:n}},o=(e,t)=>{let r=xt(n(t));return r===void 0?{}:{[e]:r}},s=(e,t)=>{let n=r(t);return n===void 0?{}:{[e]:n}};return{text:n(`text`),desc:n(`content-desc`),resourceId:n(`resource-id`),packageName:n(`package`),className:n(`class`),bounds:n(`bounds`),clickable:r(`clickable`),enabled:r(`enabled`),focusable:r(`focusable`),focused:r(`focused`),password:r(`password`),...s(`editable`,`editable`),...a(`selectionStart`,`selection-start`),...a(`selectionEnd`,`selection-end`),...s(`hintShowing`,`hint-showing`),...s(`visibleToUser`,`visible-to-user`),...a(`drawingOrder`,`drawing-order`),...s(`scrollable`,`scrollable`),...s(`canScrollForward`,`can-scroll-forward`),...s(`canScrollBackward`,`can-scroll-backward`),...a(`windowIndex`,`window-index`),...a(`windowType`,`window-type`),...a(`windowLayer`,`window-layer`),...s(`windowActive`,`window-active`),...s(`windowFocused`,`window-focused`),...o(`windowRect`,`window-bounds`)}}function nc(e){let t=new Map,n=e.indexOf(` `),r=e.lastIndexOf(`>`);if(n<0||r<=n)return t;let i=n;for(;i<r;){let n=rc(e,i,r);if(!n)break;t.set(n.name,n.value),i=n.nextCursor}return t}function rc(e,t,n){if(t=ac(e,t,n),t>=n||oc(e[t]))return;let r=t;t=ic(e,t,n);let i=e.slice(r,t);if(t=ac(e,t,n),!i||e[t]!==`=`)return;t=ac(e,t+1,n);let a=e[t];if(!sc(a))return;let o=t+1,s=e.indexOf(a,o);if(!(s<0||s>=n))return{name:i,value:St(e.slice(o,s)),nextCursor:s+1}}function ic(e,t,n){for(;t<n&&!lc(e[t]??``);)t+=1;return t}function ac(e,t,n){for(;t<n&&cc(e[t]??``);)t+=1;return t}function oc(e){return e===`/`||e===`>`}function sc(e){return e===`"`||e===`'`}function cc(e){return e===` `||e===`
|
|
12
|
+
`||e===`\r`||e===` `}function lc(e){return e===`=`||e===`/`||e===`>`||cc(e)}function uc(e,t){return e.get(t)??null}function dc(e){let t={type:null,label:null,value:null,identifier:null,packageName:null,clickable:!1,focusable:!1,depth:-1,children:[]},n=[t],r=/<node\b[^>]*>|<\/node>/g,i=r.exec(e);for(;i;){let t=i[0];if(t.startsWith(`</node`)){n.length>1&&n.pop(),i=r.exec(e);continue}let a=ec(t),o=n.at(-1),s=fc(a,o.depth+1,o);o.children.push(s),t.endsWith(`/>`)||n.push(s),i=r.exec(e)}return t}function fc(e,t,n){return qo({type:e.className,label:e.text||e.desc,value:e.text,identifier:e.resourceId,packageName:e.packageName,rect:e.rect,enabled:e.enabled,focused:e.focused,editable:e.editable,password:e.password,hintShowing:e.hintShowing,selectionStart:e.selectionStart,selectionEnd:e.selectionEnd,visibleToUser:e.visibleToUser,clickable:e.clickable===!0,focusable:e.focusable===!0,scrollable:e.scrollable,canScrollForward:e.canScrollForward,canScrollBackward:e.canScrollBackward,windowIndex:e.windowIndex,windowType:e.windowType,windowLayer:e.windowLayer,windowActive:e.windowActive,windowFocused:e.windowFocused,windowRect:e.windowRect,depth:t,parentIndex:void 0,children:[]},e.drawingOrder===void 0?void 0:{parent:n,order:e.drawingOrder})}function pc(e){let t=new Map;return e.nodes.forEach((n,r)=>{t.set(n.index,e.sourceNodes[r]?.clickable)}),{kind:`exact`,provider:`android-helper`,clickableByNodeIndex:t}}const mc=new Set([`android`,`com.android.systemui`]);function hc(e,t,n={}){if(t.backend!==`android-helper`)return{outcome:`ok`};let r=Ec(e,n.foregroundAppPackage);return vc(r,t)?gc(r,t,`empty-helper-output`,`Android snapshot helper returned no accessibility nodes`):wc(r)?{outcome:`ok`}:_c(r)?{outcome:`system-surface-only`}:yc(r)?{outcome:`ok`}:bc(r)?gc(r,t,`content-poor-app-window`,`Android snapshot helper returned insufficient foreground app content`):xc(r)||Sc(r,t)?gc(r,t,`content-poor-app-window`,`Android snapshot helper returned insufficient application window content`):Cc(r)?gc(r,t,`system-window-only`,`Android snapshot helper returned only non-application windows`):{outcome:`ok`}}function gc(e,t,n,r){return{outcome:`unusable`,decision:Tc(e,t,n,r)}}function _c(e){return e.windowRootCount>0&&e.applicationWindowRootCount===0&&e.activeSystemSurfaceMeaningfulNodeCount>=3}function vc(e,t){return e.nodeCount===0||t.nodeCount===0||t.rootPresent===!1}function yc(e){return bc(e)&&e.inputMethodMeaningfulNodeCount>=2}function bc(e){let t=e.foregroundAppMeaningfulNodeCount;return t===void 0?!1:t===0?e.applicationMeaningfulNodeCount<2:t<2&&e.meaningfulNodeCount>t}function xc(e){return e.foregroundAppMeaningfulNodeCount===void 0&&e.applicationWindowRootCount>0&&e.applicationMeaningfulNodeCount<2}function Sc(e,t){return e.foregroundAppMeaningfulNodeCount===void 0&&e.windowRootCount===0&&(t.windowCount??0)>1&&e.nonSystemMeaningfulNodeCount<2}function Cc(e){return e.windowRootCount>0&&e.applicationWindowRootCount===0||e.windowRootCount===0&&e.nodeCount>0&&e.systemUiNodeCount===e.nodeCount}function wc(e){return e.hasAlertButtonIdentifier&&e.hasAlertContentIdentifier}function Tc(e,t,n,r){return{reason:n,failureReason:r,diagnostics:Bc(e,t)}}function Ec(e,t){let n=Dc(t);for(let t of $s(e))Oc(n,t);return Fc(n)}function Dc(e){return{nodeCount:0,systemUiNodeCount:0,windowRootCount:0,applicationWindowRootCount:0,activeSystemSurfaceMeaningfulNodeCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,inputMethodMeaningfulNodeCount:0,hasAlertButtonIdentifier:!1,hasAlertContentIdentifier:!1,...e===void 0?{}:{foregroundAppPackage:e,foregroundAppMeaningfulNodeCount:0},windowTypes:new Set}}function Oc(e,t){e.nodeCount+=1,zc(t.packageName)&&(e.systemUiNodeCount+=1),t.visibleToUser!==!1&&kc(e,t.resourceId),Ac(e,t),jc(e,t)}function kc(e,t){let n=Bt(t);n===`button`&&(e.hasAlertButtonIdentifier=!0),n===`content`&&(e.hasAlertContentIdentifier=!0)}function Ac(e,t){t.windowType!==void 0&&(e.currentWindowType=t.windowType,e.currentWindowActiveOrFocused=t.windowActive===!0||t.windowFocused===!0,e.windowRootCount+=1,e.windowTypes.add(t.windowType),t.windowType===1&&(e.applicationWindowRootCount+=1))}function jc(e,t){Ic(t)&&(e.meaningfulNodeCount+=1,Mc(e,t),Pc(e,t))}function Mc(e,t){e.currentWindowType===1&&!Rc(t.packageName)&&(e.applicationMeaningfulNodeCount+=1),Nc(e)&&!Ke(t)&&(e.activeSystemSurfaceMeaningfulNodeCount+=1)}function Nc(e){return e.currentWindowType!==void 0&&e.currentWindowType!==1&&e.currentWindowActiveOrFocused===!0}function Pc(e,t){Rc(t.packageName)||(e.nonSystemMeaningfulNodeCount+=1),p({packageName:t.packageName,resourceId:t.resourceId})&&(e.inputMethodMeaningfulNodeCount+=1),e.foregroundAppPackage!==void 0&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1)}function Fc(e){return{nodeCount:e.nodeCount,systemUiNodeCount:e.systemUiNodeCount,windowRootCount:e.windowRootCount,applicationWindowRootCount:e.applicationWindowRootCount,activeSystemSurfaceMeaningfulNodeCount:e.activeSystemSurfaceMeaningfulNodeCount,meaningfulNodeCount:e.meaningfulNodeCount,applicationMeaningfulNodeCount:e.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:e.nonSystemMeaningfulNodeCount,inputMethodMeaningfulNodeCount:e.inputMethodMeaningfulNodeCount,hasAlertButtonIdentifier:e.hasAlertButtonIdentifier,hasAlertContentIdentifier:e.hasAlertContentIdentifier,...e.foregroundAppPackage===void 0?{}:{foregroundAppPackage:e.foregroundAppPackage,foregroundAppMeaningfulNodeCount:e.foregroundAppMeaningfulNodeCount??0},windowTypes:[...e.windowTypes].sort((e,t)=>e-t).slice(0,8)}}function Ic(e){return e.visibleToUser===!1?!1:Lc(e.text)||Lc(e.desc)||Lc(e.resourceId)}function Lc(e){return e!==null&&e.trim()!==``}function Rc(e){return e===null||mc.has(e)}function zc(e){return e!==null&&mc.has(e)}function Bc(e,t){return{helperNodeCount:e.nodeCount,helperSystemUiNodeCount:e.systemUiNodeCount,helperWindowRootCount:e.windowRootCount,helperApplicationWindowRootCount:e.applicationWindowRootCount,helperMeaningfulNodeCount:e.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:e.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:e.nonSystemMeaningfulNodeCount,helperInputMethodMeaningfulNodeCount:e.inputMethodMeaningfulNodeCount,...e.foregroundAppPackage===void 0?{}:{helperForegroundAppPackage:e.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:e.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2},helperWindowTypes:e.windowTypes,...t.captureMode?{helperCaptureMode:t.captureMode}:{}}}async function Vc(e){let t=await F(e.deviceKey,{resetRuntime:!0,signal:e.signal,cause:e.cause});e.signal?.throwIfAborted(),t||await Hc(e.adb,e.packageName)}async function Hc(e,n){try{await e([`shell`,`am`,`force-stop`,n],{allowFailure:!0,timeoutMs:2e3}),await g(150),h({level:`debug`,phase:`android_snapshot_helper_runtime_reset`,data:{packageName:n}})}catch(e){h({level:`warn`,phase:`android_snapshot_helper_runtime_reset_failed`,data:{packageName:n,error:t(e).message}})}}const Uc=Symbol(`androidSnapshotCaptureEvidence`);function Wc(e,t){return Object.defineProperty(e,Uc,{value:t}),e}function Gc(e){let t={...e,backend:`android`,producer:`android-uiautomator`},n=e[Uc];return te(t,n.clickability),n.occlusionContext&&l(t,n.occlusionContext),t}async function Kc(e,t={}){let n=x(e,t.helperAdb).exec;return(await el(e,t,n)).xml}async function qc(e,t={}){let n=x(e,t.helperAdb).exec,r=await el(e,t,n),i=r.xml,a=dc(i),o=Xc(r.metadata,a),s={...t,androidPresentation:{...t.androidPresentation,deadlineAtMs:t.androidPresentation?.deadlineAtMs??Date.now()+250}};try{let e=Ns(a,void 0,s),n=Yc(e.truncated,r.metadata);t.interactiveOnly&&t.includeHiddenContentHints!==!1&&$c({options:s,tree:a,xml:i,interactiveSnapshot:e});let{sourceNodes:c,occlusionContext:l,...u}=e;return Wc({...u,...Qc(n),androidSnapshot:o,quality:{state:`healthy`,backend:`android-helper`}},{clickability:pc(e),occlusionContext:l})}catch(e){if(!Es(e))throw e;return Jc({failure:e,androidSnapshot:o})}}function Jc(e){return Wc({nodes:[],truncated:!0,analysis:e.failure.analysis??{rawNodeCount:0,maxDepth:0},androidSnapshot:{...e.androidSnapshot,presentationFailure:{phase:e.failure.details.phase,workUnits:e.failure.details.workUnits,...e.failure.details.maxWorkUnits===void 0?{}:{maxWorkUnits:e.failure.details.maxWorkUnits}}},quality:{state:`sparse`,backend:`android-helper`,reason:e.failure.message,reasonCode:e.failure.qualityReasonCode}},{clickability:{kind:`exact`,provider:`android-helper`,clickableByNodeIndex:new Map}})}function Yc(e,t){return e===!0||t.helperTruncated===!0||e}function Xc(e,t){return Zc(t)===!1?{...e,occlusionScanUnavailable:!0}:e}function Zc(e){let t=[...e.children];if(t.length!==0){for(;t.length>0;){let e=t.pop();if(Jo(e)!==void 0)return!0;t.push(...e.children)}return!1}}function Qc(e){return e===!0?{truncated:!0}:{}}function $c(e){if(vl(e.interactiveSnapshot.nodes).size>0||_l(e.xml))return;let t=Ns(e.tree,void 0,{...e.options,interactiveOnly:!1});yl(ge(a(t.nodes)),t,e.interactiveSnapshot)}async function el(e,t,n){let r=x(e,t.helperAdb),i=await m(`android_snapshot_helper_artifact_resolution`,async()=>await hl(t.helperArtifact??r.snapshotHelperArtifact));if(i.artifact)return await tl(e,t,n,i.artifact);throw h({level:`error`,phase:`android_snapshot_helper_unavailable`,data:{reason:i.errorReason??`artifact_not_found`}}),gl(i.errorReason)}async function tl(e,t,n,r){let i=Sr(e),a=x(e,t.helperAdb),o=t.helperSessionScope!==`daemon-session`;try{let e;for(let o=0;;o+=1){o>0&&await ol(t.signal);let s=await al({options:t,adb:n,adbProvider:a,artifact:r,helperDeviceKey:i,attempt:o,previousContentReason:e});if(s.outcome===`captured`)return s.capture;if(o+1>=3)return await sl({contentRecovery:s.decision,attempts:o+1,helperDeviceKey:i,artifact:r,adb:n,signal:t.signal});e=s.decision.reason}}finally{o&&await F(i)}}async function nl(e,t,n,r,i){let a=await m(`android_snapshot_helper_install`,async()=>await Qn({adb:t,adbProvider:n,artifact:r,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4,signal:e.signal}),{packageName:r.manifest.packageName,versionCode:r.manifest.versionCode,installPolicy:e.helperInstallPolicy??`missing-or-outdated`});return h({phase:`android_snapshot_helper_install_decision`,data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,artifactSha256:r.manifest.sha256,installedSha256:a.installedSha256,installed:a.installed,reason:a.reason}}),a}async function rl(e){let{signal:n,adb:r,adbProvider:i,artifact:a,helperDeviceKey:o}=e,s=Ir({adb:r,adbProvider:i,artifact:a,deviceKey:o,signal:n});try{let e=await m(`android_snapshot_helper_session_capture`,async()=>await _i(s),{packageName:a.manifest.packageName,version:a.manifest.version,timeoutMs:jn});if(e)return e}catch(e){if(n?.throwIfAborted(),Er(e))throw e;h({level:`warn`,phase:`android_snapshot_helper_session_fallback`,data:{reason:t(e).message}}),await Hc(r,a.manifest.packageName)}return await m(`android_snapshot_helper_capture`,async()=>await Fr(s),{packageName:a.manifest.packageName,version:a.manifest.version,timeoutMs:jn,commandTimeoutMs:Mn})}function il(e,t,n){return{xml:e.xml,metadata:{backend:`android-helper`,helperVersion:t.manifest.version,helperApiVersion:e.metadata.helperApiVersion,helperTransport:e.metadata.transport,helperSessionReused:e.metadata.sessionReused,installReason:n,waitForIdleTimeoutMs:e.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:e.metadata.waitForIdleQuietMs,timeoutMs:e.metadata.timeoutMs,maxDepth:e.metadata.maxDepth,maxNodes:e.metadata.maxNodes,rootPresent:e.metadata.rootPresent,captureMode:e.metadata.captureMode,windowCount:e.metadata.windowCount,nodeCount:e.metadata.nodeCount,helperTruncated:e.metadata.truncated,elapsedMs:e.metadata.elapsedMs}}}async function al(e){let{options:t,adb:n,adbProvider:r,artifact:i,helperDeviceKey:a,attempt:o}=e,s;try{let e=await nl(t,n,r,i,a);e.installed&&await F(a),s=il(await rl({signal:t.signal,adb:n,adbProvider:r,artifact:i,helperDeviceKey:a}),i,e.reason)}catch(e){return t.signal?.throwIfAborted(),{outcome:`captured`,capture:await cl({error:e,helperDeviceKey:a,artifact:i,adb:n})}}let c=hc(s.xml,s.metadata,{foregroundAppPackage:t.appBundleId});return c.outcome===`system-surface-only`?(h({phase:`android_snapshot_helper_system_surface`,data:{foregroundAppPackage:t.appBundleId}}),{outcome:`captured`,capture:{xml:s.xml,metadata:{...s.metadata,systemSurfaceOnly:!0}}}):c.outcome===`ok`?(o>0&&h({phase:`android_snapshot_helper_content_recaptured`,data:{attempts:o+1,recoveredFromReason:e.previousContentReason}}),{outcome:`captured`,capture:s}):{outcome:`unusable`,decision:c.decision}}async function ol(e){e?.throwIfAborted(),await g(250),e?.throwIfAborted()}async function sl(e){throw h({level:`error`,phase:`android_snapshot_helper_content_invalid`,data:{reason:e.contentRecovery.reason,failureReason:e.contentRecovery.failureReason,attempts:e.attempts,...e.contentRecovery.diagnostics}}),await Vc({adb:e.adb,deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,signal:e.signal,cause:e.contentRecovery.failureReason}),new o(`COMMAND_FAILED`,e.contentRecovery.failureReason,{...e.contentRecovery.diagnostics,androidSnapshotHelperFailureReason:e.contentRecovery.reason,attempts:e.attempts,retriable:!0,hint:`Retry after the app UI stabilizes. If this persists, capture a screenshot and report the helper diagnostics; agent-device does not substitute a second snapshot engine.`})}async function cl(e){let t=ll(e.error);throw h({level:`error`,phase:`android_snapshot_helper_failed`,data:{reason:t}}),await F(e.helperDeviceKey),await Hc(e.adb,e.artifact.manifest.packageName),qn({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),ul(e.error,t)}function ll(e){let n=t(e),r=ml(n.details?.helper);if(r&&r!==n.message)return`${n.message}: ${r}`;if(r)return r;let i=(typeof n.details?.stderr==`string`?n.details.stderr.trim():``).split(/\r?\n/).find(e=>e.trim());return i?`${n.message}: ${i}`:n.message}function ul(e,r){let i=t(e),a=dl(i);return new o(n(i.code),`Android snapshot helper failed: ${r}`,{...i.details,...pl(i),androidSnapshotHelperFailureReason:r,...a?{androidCaptureFailureReason:a}:{},hint:fl(i,a)},e)}function dl(e){return Je(e)}function fl(e,t){return t===`accessibility-timeout`?`Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists.`:e.details?.androidSnapshotHelperInstallFailure===!0?[e.hint,`This is a device-side install failure (adb rejection or OEM policy) — the helper artifact itself is present, this is not a missing/unbuilt build.`].filter(Boolean).join(` `):e.hint??`Retry once. If the helper still fails, run agent-device doctor and report the diagnostic log; agent-device does not substitute a second snapshot engine.`}function pl(e){let t={};return e.diagnosticId!==void 0&&(t.diagnosticId=e.diagnosticId),e.logPath!==void 0&&(t.logPath=e.logPath),e.retriable!==void 0&&(t.retriable=e.retriable),e.supportedOn!==void 0&&(t.supportedOn=e.supportedOn),t}function ml(e){if(!e||typeof e!=`object`||!(`message`in e))return;let t=String(e.message).trim();return t&&t!==`null`?t:void 0}async function hl(e){if(e)return{artifact:e};let n=Ee(),r=C.join(Te(),`android`,`snapshot-helper`,`dist`),i=C.join(r,`agent-device-android-snapshot-helper-${n}.manifest.json`);try{await v().files.access(i)}catch{return{}}try{let e=Pn(JSON.parse(await v().files.readText(i))),t=C.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await v().files.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{errorReason:t(e).message}}}function gl(e){let t=e??`the bundled helper artifact was not found`;return new o(`COMMAND_FAILED`,`Android snapshot helper is unavailable: ${t}`,{androidSnapshotHelperFailureReason:t,hint:"Run `pnpm build:android` to build the helper dist for a source checkout — the runtime needs android/snapshot-helper/dist/agent-device-android-snapshot-helper-<version>.manifest.json and the .apk it references. Packaged installs ship these via the prepack script; if they are missing from a packaged install, reinstall agent-device."})}function _l(e){return e.includes(` can-scroll-forward=`)||e.includes(` can-scroll-backward=`)}function vl(e){let t=new Map;for(let n of e){let e={};n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n.index,e)}return t}function yl(e,t,n){if(e.size===0)return;let r=new Map;for(let[e,t]of n.sourceNodes.entries()){let i=n.nodes[e];i&&r.set(t,i)}for(let[n,i]of e){let e=t.sourceNodes[n];if(!e)continue;let a=r.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}async function bl(e,t,n,r,i={}){let a=[0,150,350],o=null,s=null,c=await zl(e);for(let l of a){l>0&&await g(l);let a=await kl(e,t,n,r,c,i);if(o=a,a.reason===`ime_capture`)return a;s=a.ok?a:null}return s??o??{ok:!1,actual:null,reason:`text_mismatch`,targetInput:null,actualInput:null}}async function xl(e,t,n,r={}){return El(await Kc(e,r),t,n)}async function Sl(e,t,n,r){let i=await zl(e);return Al(await Kc(e,r),t,n,i).targetInput}async function Cl(e,t,n,r={}){try{return await Sl(e,t,n,r)}catch(e){return h({level:`warn`,phase:`android_fill_pre_action_target_capture_failed`,data:{error:e instanceof Error?e.message:String(e)}}),null}}function q(e,t,n){if(n?.ok)return;let r=n?wl(e,t,n):null;if(r)return r;throw new o(`COMMAND_FAILED`,Dl(n),Ol(e,n))}function wl(e,t,n){let r=n.targetInput,i=n.actualInput;if(e.length===0||n.reason===`ime_capture`||!t||!r||!i||W(t)||W(r)||W(i)||!Gl(t,r)||!Gl(t,i)||t.text===n.actual)return null;let a=Kl(t);return h({level:`warn`,phase:`android_fill_verification_unconfirmed`,data:{target:a}}),{verification:`unconfirmed`,requested:e,before:t.text,after:n.actual,target:a}}function Tl(e,t,n,r,i={}){let a=Al(e,t,n,i);return jl(a)?{ok:!1,actual:a.actualInput?.text??null,reason:`ime_capture`,targetInput:a.targetInput,actualInput:a.actualInput}:Ml(a,r)??Nl(a,r)}function El(e,t,n){return Al(e,t,n).targetInput?.text??null}function Dl(e){return e?.reason===`ime_capture`?`Android fill input was captured by the active keyboard instead of the app field`:e?.reason===`masked_unverified`?`Android fill verification could not confirm masked text value`:`Android fill verification failed`}function Ol(e,t){let n=Vo(e,t);return t?.reason===`ime_capture`&&(n.hint=`The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill.`),n}async function kl(e,t,n,r,i,a){return Tl(await Kc(e,a),t,n,r,i)}function Al(e,t,n,r={}){let i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let a of $s(e)){let e=Rl(a,r);e&&Bl(i,e,t,n)}return Hl(i)}function jl(e){let{targetInput:t,actualInput:n}=e;return!t||!n||n===t?!1:n.inputMethodOwned&&!t.inputMethodOwned}function Ml(e,t){let n=e.actualInput;if(!n||!Wl(n))return null;let r=n.text??null,i=Array.from(Pl(n)).length,a=Array.from(t).length,o=a===0?i===0:i>0&&i===a;return{ok:o,actual:r,reason:o?void 0:`masked_unverified`,masked:!0,targetInput:e.targetInput,actualInput:n}}function Nl(e,t){let n=e.actualInput;return{ok:n!==null&&Fl(Pl(n),t),actual:n?.text??null,reason:`text_mismatch`,targetInput:e.targetInput,actualInput:n}}function Pl(e){return e.hintShowing?``:e.text??``}function Fl(e,t){if(e===t)return!0;if(t.length===0)return!1;let n=Il(e),r=Il(t);return!n||!r?!1:!!(n===r||Ll(n,r))}function Il(e){return e.replaceAll(/\s+/g,` `).trim()}function Ll(e,t){if(e.length!==t.length||e.length===0||e.slice(1)!==t.slice(1))return!1;let n=e[0],r=t[0];return!n||!r?!1:r.toLowerCase()===r&&n===r.toUpperCase()}function Rl(e,t){if(!e.rect)return null;let n=e.text??``,r=Math.max(1,e.rect.width*e.rect.height);return{text:n||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:e.password===!0,inputMethodOwned:p({packageName:e.packageName,resourceId:e.resourceId,activeInputMethodPackage:t.activeInputMethodPackage}),area:r,editText:Ul(e.className??``),hintShowing:e.hintShowing===!0}}async function zl(e){try{return{activeInputMethodPackage:(await Ma(e)).inputMethodPackage}}catch(e){return h({level:`warn`,phase:`android_fill_verification_input_method_probe_failed`,data:{error:e instanceof Error?e.message:String(e)}}),{}}}function Bl(e,t,n,r){let i=ie(t.rect,n,r);if(i&&t.editText&&(e.editAtPoint=Vl(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=Vl(e.focusedEdit,t);return}i&&t.text&&(e.anyAtPoint=Vl(e.anyAtPoint,t))}function Vl(e,t){return e&&e.area<t.area?e:t}function Hl(e){let t=e.editAtPoint??e.anyAtPoint;return{targetInput:t,actualInput:(e.focusedEdit?.text?e.focusedEdit:null)??t}}function Ul(e){let t=e.toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)}function Wl(e){return W(e)}function Gl(e,t){return e.resourceId||t.resourceId?e.resourceId===t.resourceId&&e.packageName===t.packageName:e.className===t.className&&e.packageName===t.packageName&&e.rect.x===t.rect.x&&e.rect.y===t.rect.y&&e.rect.width===t.rect.width&&e.rect.height===t.rect.height}function Kl(e){return{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:e.rect}}async function ql(e,t){return await Ct(t.stateDir),await yo(t.stateDir,e.id,async()=>await Jl(e,t))}async function Jl(e,n){let r=v().imeRecoveryMarkers,i=b(e),a=x(e),o=R(e),s;try{s=await $a(a),await ro({adb:i,adbProvider:a,artifact:s,deviceKey:o})}catch(e){return{outcome:`helper-unavailable`,reason:t(e).message}}let{manifest:c}=s,l=await V(i);if(l===c.serviceComponent){let t=await r.write(n.stateDir,e.id),a=await H(i);return t&&U.add(o),{outcome:`settled`,activated:!1,alreadyActive:!0,...t?{}:{persistFailed:!0},previousIme:a,helperServiceComponent:c.serviceComponent,helperPackageName:c.packageName}}let u=await H(i);if(!await fo(i,l))return await mo(i,u,e.id),_({level:`warn`,phase:`android_test_ime_persist_failed`,data:{device:e.id,previousIme:l}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:c.serviceComponent,helperPackageName:c.packageName};let d=(await r.read(n.stateDir)).includes(e.id);if(!await r.write(n.stateDir,e.id))return await mo(i,u,e.id),_({level:`warn`,phase:`android_test_ime_marker_persist_failed`,data:{device:e.id,previousIme:l}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:c.serviceComponent,helperPackageName:c.packageName};await i([`shell`,`ime`,`enable`,c.serviceComponent],{allowFailure:!0,timeoutMs:1e4});let f=await i([`shell`,`ime`,`set`,c.serviceComponent],{allowFailure:!0,timeoutMs:1e4}),p=await V(i);return p===c.serviceComponent?(U.add(o),_({phase:`android_test_ime_activated`,data:{device:e.id,previousIme:l}}),{outcome:`settled`,activated:!0,alreadyActive:!1,previousIme:l,helperServiceComponent:c.serviceComponent,helperPackageName:c.packageName}):(U.delete(o),await mo(i,u,e.id),d||await r.clear(n.stateDir,e.id),_({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,activeIme:p,stderr:f.stderr.trim()}}),{outcome:`settled`,activated:!1,alreadyActive:!1,helperServiceComponent:c.serviceComponent,helperPackageName:c.packageName})}function Yl(e){return C.join(e,`android-test-ime-pending`)}function Xl(e,t){return C.join(Yl(e),encodeURIComponent(t))}async function Zl(e,n){let r=v().files,i,a=!1;try{let t=Yl(e);if(i=Xl(e,n),await r.ensureDirectory(t),(await eu(i))?.serial===n)return!0;let o={version:1,serial:n};if(await r.writeAtomicText(i,`${JSON.stringify(o)}\n`,384),a=!0,(await eu(i))?.serial!==n)throw Error(`Android test IME marker read-back did not match the requested device.`);return!0}catch(o){return a&&i&&await r.remove(i,{force:!0}).catch(()=>{}),h({level:`debug`,phase:`android_test_ime_marker_write_failed`,data:{stateDir:e,serial:n,error:t(o).message}}),!1}}async function Ql(e,t){await v().files.remove(Xl(e,t),{force:!0}).catch(()=>{})}async function $l(e){let t=v().files,n;try{n=await t.readDirectory(Yl(e))}catch{return[]}let r=[];for(let t of n)try{let n=C.join(Yl(e),t),i=await eu(n);i&&Xl(e,i.serial)===n&&r.push(i.serial)}catch{}return[...new Set(r)].sort()}async function eu(e){try{return tu(await v().files.readText(e))}catch{return}}function tu(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t;return n.version===1&&typeof n.serial==`string`&&n.serial.length>0?{version:1,serial:n.serial}:void 0}catch{return}}const nu=new Et(`utf-16le`);let ru;async function iu(e,t){for(let n of[`AndroidManifest.xml`,`base/manifest/AndroidManifest.xml`]){let r=await au(e,n,t);if(!r)continue;let i=ou(r);if(i)return i}return await hu(e,t)}async function au(e,t,n){try{let r=await Se(`unzip`,[`-p`,e,t],{allowFailure:!0,binaryStdout:!0,signal:n});return r.exitCode!==0||!r.stdoutBuffer||r.stdoutBuffer.length===0?void 0:r.stdoutBuffer}catch{n?.throwIfAborted();return}}function ou(e){return e.subarray(0,Math.min(e.length,128)).toString(`utf8`).trimStart().startsWith(`<`)?su(e.toString(`utf8`)):cu(e)}function su(e){return e.match(/<manifest\b[^>]*\bpackage\s*=\s*["']([^"']+)["']/i)?.[1]}function cu(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=uu(e.subarray(n,n+a));else if(r===258&&t){let r=lu(e,n,i,t);if(r)return r}n+=a}}function lu(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 uu(e){if(e.length<28)return[];let t=e.readUInt32LE(8),n=e.readUInt32LE(16),r=e.readUInt32LE(20),i=!!(n&256),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?du(e,o):fu(e,o))}return a}function du(e,t){let[,n]=pu(e,t),[r,i]=pu(e,t+n),a=t+n+i;return e.subarray(a,a+r).toString(`utf8`)}function fu(e,t){let[n,r]=mu(e,t),i=t+r;return nu.decode(e.subarray(i,i+n*2))}function pu(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 mu(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 hu(e,t){t?.throwIfAborted();let n=await gu();if(!n)return;let r=await Se(n,[`dump`,`badging`,e],{allowFailure:!0,signal:t});if(r.exitCode===0)return r.stdout.match(/package:\s+name='([^']+)'/)?.[1]}async function gu(){if(ru!==void 0)return ru??void 0;try{let e=v().files;for(let t of tt()){let n=C.join(t,`build-tools`);try{let t=(await e.readDirectory(n)).sort((e,t)=>t.localeCompare(e,void 0,{numeric:!0}));for(let r of t){let t=C.join(n,r,`aapt`);if(C.isAbsolute(t)&&await e.isExecutable(t))return ru=t,t}}catch{}}}catch{}ru=null}async function _u(e,t){let n=e.kind===`url`&&De(e.url),r=await Oe({source:e,isInstallablePath:(e,t)=>t.isFile()&&vu(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||n,signal:t?.signal});try{let e=t?.resolveIdentity===!1?{}:await yu(r.installablePath,t?.signal);return{archivePath:r.archivePath,installablePath:r.installablePath,packageName:e.packageName,cleanup:r.cleanup}}catch(e){throw await r.cleanup(),e}}function vu(e){let t=C.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function yu(e,t){let n=C.extname(e).toLowerCase();return n!==`.apk`&&n!==`.aab`?{}:{packageName:await iu(e,t)}}async function bu(e,t,n,r={}){let i=typeof n.action==`string`&&n.action.trim()?n.action.trim():`${t}.TEST_PUSH`,a=[`shell`,`am`,`broadcast`,`-a`,i,`-p`,t],s=typeof n.receiver==`string`?n.receiver.trim():``;s&&a.push(`-n`,s);let c=n.extras;if(c!==void 0&&(typeof c!=`object`||!c||Array.isArray(c)))throw new o(`INVALID_ARGS`,`Android push payload extras must be an object`);let l=c??{},u=0;for(let[e,t]of Object.entries(l))e&&(xu(a,e,t),u+=1);return await S(e,a,{signal:r.signal}),{action:i,extrasCount:u}}function xu(e,t,n){if(typeof n==`string`){e.push(`--es`,t,n);return}if(typeof n==`boolean`){e.push(`--ez`,t,n?`true`:`false`);return}if(typeof n==`number`&&Number.isFinite(n)){if(Number.isInteger(n)){e.push(`--ei`,t,String(n));return}e.push(`--ef`,t,String(n));return}throw new o(`INVALID_ARGS`,`Unsupported Android broadcast extra type for "${t}". Use string, boolean, or number.`)}function J(e){let t=e.replaceAll(`,`,``).match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let n=Number(t[0]);return Number.isFinite(n)?n:null}function Su(e){let t=Du(e.map(e=>e.intendedVsyncNs)),n=[];for(let e=1;e<t.length;e+=1){let r=t[e]-t[e-1];r>=4e6&&r<=5e7&&n.push(r)}if(n.length!==0)return Ou(n)}function Cu(e){let{frames:t,frameDeadlineNs:n,summaryDroppedFrameCount:r}=e;return r===void 0?n===void 0?[]:t.filter(e=>e.durationNs>n):r<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,r).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}function wu(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e;if(t.length===0||n===void 0)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>Eu({frames:e,windowStartNs:n,measuredAtMs:r,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}function Tu(e){return Math.round(e*10)/10}function Eu(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-n)/1e6)),c=Math.max(s,Math.round((o-n)/1e6)),l=i!==void 0&&Number.isFinite(r)?r-i:void 0;return{startOffsetMs:s,endOffsetMs:c,startAt:l===void 0?void 0:new Date(l+a/1e6).toISOString(),endAt:l===void 0?void 0:new Date(l+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:Tu(Math.max(...t.map(e=>e.durationNs))/1e6)}}function Du(e){return[...new Set(e.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)}function Ou(e){let t=[...e].sort((e,t)=>e-t),n=Math.floor(t.length/2);return t.length%2==1?t[n]:(t[n-1]+t[n])/2}function ku(e,t,n){Au(e,t);let r=Bu(e),i=Iu(e),a=Mu(i,r,t),o=Date.parse(n),s=Hu({frames:i,measuredAtMs:o,summary:r}),c=Cu({frames:i,frameDeadlineNs:a,summaryDroppedFrameCount:r?.droppedFrameCount}),l=r?.sampleWindowMs??s.sampleWindowMs??Ku(i),u=Nu(r,i,c),d=Fu({droppedFrames:c,timing:s,measuredAtMs:o,summary:r});return{...u,sampleWindowMs:l,...Pu(a),windowStartedAt:s.windowStartedAt,windowEndedAt:s.windowEndedAt,timestampSource:s.timestampSource,measuredAt:n,method:`adb-shell-dumpsys-gfxinfo-framestats`,source:r?`android-gfxinfo-summary`:`framestats-rows`,worstWindows:d&&d.length>0?d:void 0}}function Au(e,t){if(/no process found for:/i.test(e))throw new o(`COMMAND_FAILED`,`Android gfxinfo did not find a running process for ${t}`,{metric:`fps`,package:t,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect.`})}function ju(e){throw new o(`COMMAND_FAILED`,`Failed to parse Android framestats output for ${e}`,{metric:`fps`,package:e,hint:`Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging.`})}function Mu(e,t,n){let r=Su(e);if(!t&&e.length===0&&ju(n),t||r!==void 0)return r;throw new o(`COMMAND_FAILED`,`Failed to infer Android frame deadline from framestats output for ${n}`,{metric:`fps`,package:n,hint:`Retry perf after a longer interaction window so consecutive Android frame timestamps are available.`})}function Nu(e,t,n){let r=e?.totalFrameCount??t.length,i=e?.droppedFrameCount??n.length;return{totalFrameCount:r,droppedFrameCount:i,droppedFramePercent:e?.droppedFramePercent??(r>0?wt(i/r*100):0)}}function Pu(e){return{frameDeadlineMs:e===void 0?void 0:Tu(e/1e6),refreshRateHz:e===void 0?void 0:Tu(1e9/e)}}function Fu(e){let{droppedFrames:t,timing:n,measuredAtMs:r,summary:i}=e;if(t.length===0)return;let a=wu({frames:t,windowStartNs:n.windowStartNs,measuredAtMs:r,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}function Iu(e){let t=[],n=null;for(let r of e.split(`
|
|
13
|
+
`)){let e=r.trim();if(e.length===0||e===`---PROFILEDATA---`)continue;let i=e.split(`,`).map(e=>e.trim());if(Lu(i)){n=new Map(i.map((e,t)=>[e,t]));continue}let a=Ru(i,n);a&&t.push(a)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}function Lu(e){return e.includes(`IntendedVsync`)&&e.includes(`FrameCompleted`)}function Ru(e,t){if(!t||e.length<t.size)return;let n=zu(e,t,`Flags`),r=zu(e,t,`IntendedVsync`),i=zu(e,t,`FrameCompleted`);if(!(n!==0||r===null||i===null||r<=0||i<=r))return{intendedVsyncNs:r,frameCompletedNs:i,durationNs:i-r}}function zu(e,t,n){let r=t.get(n);if(r===void 0)return null;let i=Number(e[r]);return Number.isFinite(i)?i:null}function Bu(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??``,n=qu(t,`Total frames rendered`),r=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(n===void 0||!r)return;let i=r[1],a=r[2];if(i===void 0||a===void 0)return;let o=J(i)??void 0,s=Number(a);if(o===void 0||!Number.isFinite(s)||n<0)return;let c=qu(t,`Uptime`),l=qu(t,`Stats since`);return{droppedFramePercent:wt(s),droppedFrameCount:o,totalFrameCount:n,sampleWindowMs:Vu({uptimeMs:c,statsSinceNs:l}),uptimeMs:c,statsSinceNs:l}}function Vu(e){let{uptimeMs:t,statsSinceNs:n}=e;if(t===void 0||n===void 0)return;let r=t-Math.round(n/1e6);return r>=0?r:void 0}function Hu(e){let{frames:t,measuredAtMs:n,summary:r}=e,i=Uu(t),a=r?.statsSinceNs,o=a??i.firstFrameNs,s=Wu(o,i.lastFrameNs),c=r?.sampleWindowMs??s;if(!Number.isFinite(n)||r?.uptimeMs===void 0||o===void 0)return{sampleWindowMs:c,windowStartNs:o};let l=n-r.uptimeMs;return{sampleWindowMs:c,windowStartNs:o,windowStartedAt:new Date(l+o/1e6).toISOString(),windowEndedAt:Gu({deviceBootWallClockMs:l,measuredAtMs:n,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:`estimated-from-device-uptime`}}function Uu(e){return e.length===0?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function Wu(e,t){if(e!==void 0&&t!==void 0)return Math.max(0,Math.round((t-e)/1e6))}function Gu(e){let{deviceBootWallClockMs:t,measuredAtMs:n,summaryStartNs:r,lastFrameNs:i}=e;return r===void 0?i===void 0?void 0:new Date(t+i/1e6).toISOString():new Date(n).toISOString()}function Ku(e){if(e.length===0)return;let t=Uu(e);return Wu(t.firstFrameNs,t.lastFrameNs)}function qu(e,t){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),r=e.match(RegExp(`^\\s*${n}:\\s*([0-9][0-9,]*)`,`im`));if(!r)return;let i=r[1];return i===void 0?void 0:J(i)??void 0}async function Ju(e,t,n={}){let r=b(e,n.adb);try{let i=ku((await r([`shell`,`dumpsys`,`gfxinfo`,t,`framestats`],{timeoutMs:15e3})).stdout,t,new Date().toISOString());return await Yu(e,t,n),i}catch(e){throw Xu(t,e)}}async function Yu(e,t,n={}){let r=b(e,n.adb);try{await r([`shell`,`dumpsys`,`gfxinfo`,t,`reset`],{allowFailure:!0,timeoutMs:3e3})}catch{}}function Xu(e,t){return t instanceof o?new o(t.code,t.message,{...t.details??{},metric:`fps`,package:e},t):new o(`COMMAND_FAILED`,`Failed to sample Android fps for ${e}`,{metric:`fps`,package:e},t)}function Y(e,t,n,r){if(r instanceof o){let i=r.details??{};return new o(r.code,r.message,{...i,action:e,package:n,tool:t,hint:typeof i.hint==`string`?i.hint:$u(t,i)},r)}return new o(`COMMAND_FAILED`,`Failed to ${e} Android ${t} for ${n}`,{action:e,package:n,tool:t,hint:Zu(t)},r)}function Zu(e){return e===`simpleperf`?`Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.`:`Verify perfetto is available, the app process is running, and the device permits trace capture.`}function Qu(e){return e===`simpleperf`?`Use an emulator/system image with simpleperf available, or install the Android NDK simpleperf binary for this device.`:`Use Android 10+ or a system image that exposes the perfetto command-line binary.`}function $u(e,t){let n=(typeof t.stderr==`string`?t.stderr:``).toLowerCase();return e===`simpleperf`?ed(n):nd(n)?`Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.`:Zu(e)}function ed(e){return td(e)?`Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.`:e.includes(`not supported`)||e.includes(`failed to open perf event`)?`This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.`:Zu(`simpleperf`)}function td(e){return e.includes(`permission denied`)||e.includes(`not profileable`)||e.includes(`profileable`)}function nd(e){return e.includes(`permission denied`)||e.includes(`not allowed`)}async function rd(e,t,n,r,i){return{capture:{durationMs:r,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:n},frameHealth:t.kind===`perfetto`?await id(e,t.packageName,i):void 0,notes:[t.kind===`perfetto`?`Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.`:`Open the Simpleperf report artifact for symbol-level CPU attribution.`]}}async function id(e,t,n){try{let r=await Ju(e,t,n);return{available:!0,droppedFramePercent:r.droppedFramePercent,droppedFrameCount:r.droppedFrameCount,totalFrameCount:r.totalFrameCount,method:r.method,worstWindows:r.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:`Android frame health was not available`}}}const ad=`adb-shell-simpleperf`,od=`adb-shell-perfetto`,X=15e3,Z=3e4,sd=`/data/local/tmp`;async function cd(e,t,n){let r=b(e,n.adb);await md(r,t),await _d(r,t),await gd(r,t,n.files);let i=await pd(t.outPath,n.files);await dd(r,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await rd(e,t,i,o,{adb:r});return{...t,action:`stop`,platform:`android`,state:`stopped`,stoppedAt:a,durationMs:o,sizeBytes:i,method:t.kind===`simpleperf`?ad:od,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function ld(e,t,n={}){let r=b(e,n.adb);try{t.state===`running`&&(await md(r,t),await _d(r,t).catch(()=>{}))}finally{await dd(r,t.remotePath)}}function ud(e,t,n=sd){return`${n}/agent-device-${e.replaceAll(/[^A-Za-z0-9_.-]/g,`_`)}-${Date.now()}-${t}`}async function dd(e,t){try{await e([`shell`,`rm -f ${Q(t)}`],{allowFailure:!0,timeoutMs:X})}catch{}}async function fd(e,t,n=v().files){await n.ensureDirectory(C.dirname(e)),await n.writeBytes(e,Buffer.from(`${JSON.stringify(t,null,2)}\n`))}async function pd(e,t=v().files){try{return(await t.stat(e)).size}catch(t){throw new o(`COMMAND_FAILED`,`Profiler artifact was not written: ${e}`,{outPath:e,hint:`Retry the profiling command and check daemon logs if the artifact path is still missing.`},t)}}function Q(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}async function md(e,t){try{await e([`shell`,hd(t.profilerPid)],{timeoutMs:Z})}catch(e){throw Y(`stop`,t.kind,t.packageName,e)}}function hd(e){return[`pid=${Q(e)}`,`kill -INT "$pid" 2>/dev/null || true`,`for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done`,`kill -TERM "$pid" 2>/dev/null || true`,`for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done`,`echo "profiler process did not stop after SIGTERM" >&2`,`exit 1`].join(`; `)}async function gd(e,t,n){await(n??v().files).ensureDirectory(C.dirname(t.outPath));try{await e([`pull`,t.remotePath,t.outPath],{timeoutMs:Z})}catch(e){throw new o(`COMMAND_FAILED`,`Failed to pull Android ${t.kind} artifact for ${t.packageName}`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,outPath:t.outPath,hint:`Check that the profiling command ran long enough to create an artifact, then retry stop with the same session.`},e)}}async function _d(e,t){let n;for(let r=0;r<12;r+=1){let r=await vd(e,t.remotePath);if(r!==void 0&&r>0&&r===n)return;n=r,await g(250)}throw new o(`COMMAND_FAILED`,`Android ${t.kind} artifact is not ready to pull`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,hint:`The profiler stopped, but the remote artifact was missing, empty, or still changing. Retry stop with the same session or inspect the device-side artifact.`})}async function vd(e,t){let n=Q(t),r=await e([`shell`,`if [ -f ${n} ]; then stat -c %s ${n} 2>/dev/null || wc -c < ${n}; fi`],{allowFailure:!0,timeoutMs:X});if(r.exitCode!==0)return;let i=Number(r.stdout.trim().split(/\s+/)[0]);return Number.isFinite(i)?i:void 0}async function yd(e,t){try{let n=await e([`shell`,`pidof`,t],{allowFailure:!0,timeoutMs:X}),r=xd(n.stdout);if(n.exitCode===0&&r)return r}catch{}throw new o(`COMMAND_FAILED`,`No active Android app process found for ${t}`,{package:t,hint:`Run open <app> for this session again, wait for the app UI to appear, then retry perf.`})}async function bd(e,t,n){let r=await e([`shell`,`command -v ${t} || which ${t}`],{allowFailure:!0,timeoutMs:X});if(!(r.exitCode===0&&r.stdout.trim()))throw new o(`UNSUPPORTED_OPERATION`,`Android device does not expose ${t}`,{package:n,tool:t,hint:Qu(t)})}function xd(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function Sd(e,t,n,r={}){let i=b(e,r.adb),a=await yd(i,t);await bd(i,`perfetto`,t);let o=ud(t,`app.perfetto-trace`,`/data/misc/perfetto-traces`),s;try{await Yu(e,t,{adb:i}),s=await wd(i,o,t)}catch(e){throw await dd(i,o),e}return{type:`trace`,kind:`perfetto`,packageName:t,appPid:a,profilerPid:s,remotePath:o,outPath:n,startedAt:Date.now(),state:`running`,action:`start`,platform:`android`,method:od,message:`Started Android Perfetto trace for ${t}`}}async function Cd(e,t,n,r={}){return await cd(e,{...t,outPath:n},r)}async function wd(e,t,n){try{let r=xd((await e([`shell`,`perfetto`,`--background-wait`,`-o`,t,`-t`,`3600s`,`sched`,`freq`,`idle`,`am`,`wm`,`gfx`,`view`,`binder_driver`,`hal`,`dalvik`],{timeoutMs:Z})).stdout);if(r)return r;throw new o(`COMMAND_FAILED`,`Android perfetto did not return a profiler pid`,{package:n,tool:`perfetto`,hint:`Retry perf trace start. If perfetto exits immediately, verify the device permits trace capture.`})}catch(e){throw Y(`start`,`perfetto`,n,e)}}function Td(e){let t=[];for(let n of s(e)){let e=n.match(/^([0-9]+(?:\.[0-9]+)?)%\s+(.+)$/);if(!e)continue;let r=Number(e[1]),i=e[2]?.trim();if(!Number.isFinite(r)||!i)continue;let a=i.split(/\s{2,}/).filter(Boolean);if(t.push({percentage:wt(r),command:a[0],dso:a[1],symbol:a.slice(2).join(` `)||void 0}),t.length>=50)break}return t}async function Ed(e,t,n,r={}){let i=b(e,r.adb),a=await yd(i,t);await bd(i,`simpleperf`,t);let o=ud(t,`cpu.perf.data`),s;try{s=await kd(i,a,o,t)}catch(e){throw await dd(i,o),e}return{type:`cpu-profile`,kind:`simpleperf`,packageName:t,appPid:a,profilerPid:s,remotePath:o,outPath:n,startedAt:Date.now(),state:`running`,action:`start`,platform:`android`,method:ad,message:`Started Android Simpleperf CPU profile for ${t}`}}async function Dd(e,t,n,r={}){return await cd(e,{...t,outPath:n},r)}async function Od(e,t,n,r={}){let i=b(e,r.adb);await bd(i,`simpleperf`,t.packageName);let a=await Md(i,t),o=new Date().toISOString(),s=Td(a.stdout),c=s.slice(0,10).map(e=>({symbol:e.symbol??`<unknown>`,binary:e.dso,selfSamplePercent:e.percentage}));await fd(n,{kind:`simpleperf-report`,generatedAt:o,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,sourceRemotePath:t.remotePath,entryCount:s.length,summary:{topFunctions:c},entries:s},r.files);let l=await pd(n,r.files);return{action:`report`,platform:`android`,type:`cpu-profile-report`,kind:`simpleperf`,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,outPath:n,sizeBytes:l,generatedAt:o,entryCount:s.length,summary:{topFunctions:c},method:ad,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function kd(e,t,n,r){try{let i=xd((await e([`shell`,Ad(t,n)],{timeoutMs:Z})).stdout);if(i)return i;throw new o(`COMMAND_FAILED`,`Android simpleperf did not return a profiler pid`,{package:r,tool:`simpleperf`,hint:`Retry perf. If simpleperf exits immediately, verify the app is profileable and the device permits native profiling.`})}catch(e){throw Y(`start`,`simpleperf`,r,e)}}function Ad(e,t){return jd([`simpleperf`,`record`,`-e`,`cpu-clock:u`,`-p`,e,`-o`,t,`--duration`,`3600`],`simpleperf`)}function jd(e,t){let n=e.map(Q).join(` `);return[`err=${Q(`${sd}/agent-device-${t}-${Date.now()}.err`)}`,`(${n}) >/dev/null 2>"$err" & pid=$!`,`sleep 1`,`if kill -0 "$pid" 2>/dev/null; then rm -f "$err"; echo "$pid"; exit 0; fi`,`cat "$err" >&2`,`rm -f "$err"`,`exit 1`].join(`; `)}async function Md(e,t){try{return await e([`shell`,`simpleperf`,`report`,`-i`,t.remotePath,`--stdio`,`--sort`,`comm,dso,symbol`],{timeoutMs:Z})}catch(e){throw Y(`report`,`simpleperf`,t.packageName,e)}}const Nd=15e3,Pd=12e4;async function Fd(e,t,n={}){let r=b(e,n.adb);try{return zd((await r([`shell`,`dumpsys`,`meminfo`,t],{timeoutMs:Nd})).stdout,t,new Date().toISOString())}catch(e){throw qd(`memory`,t,e)}}async function Id(e,t,n,r={}){let i=b(e,r.adb),a=r.files??v().files,s=await Bd(i,t),c=Vd(t);await a.ensureDirectory(C.dirname(n));let l=await Ld(a,n);try{ve(await i([`shell`,`am`,`dumpheap`,t,c],{allowFailure:!0,timeoutMs:Pd}),`Failed to capture Android heap dump for ${t}`,e=>({kind:`android-hprof`,package:t,pid:s,remotePath:c,hint:Hd(e.stdout,e.stderr)}));let e=await i([`pull`,c,n],{allowFailure:!0,timeoutMs:Pd});if(e.exitCode!==0)throw await Rd(a,n,l),y(`Failed to pull Android heap dump for ${t}`,e,{kind:`android-hprof`,package:t,pid:s,remotePath:c,path:n,hint:`Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs.`});let r=await a.stat(n).catch(()=>null);if(!r?.isFile||r.size<=0)throw await Rd(a,n,l),new o(`COMMAND_FAILED`,`Android heap dump artifact is missing or empty`,{kind:`android-hprof`,package:t,pid:s,path:n,remotePath:c,hint:`Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug.`});return{available:!0,kind:`android-hprof`,path:n,sizeBytes:r.size,measuredAt:new Date().toISOString(),method:`adb-shell-am-dumpheap`,packageName:t,pid:s,remotePath:c}}finally{await i([`shell`,`rm`,`-f`,c],{allowFailure:!0,timeoutMs:Nd}).catch(()=>{})}}async function Ld(e,t){return await e.stat(t).then(e=>e.isFile).catch(()=>!1)}async function Rd(e,t,n){n||await e.remove(t,{force:!0}).catch(()=>{})}function zd(e,t,n){if(/no process found for:/i.test(e))throw new o(`COMMAND_FAILED`,`Android meminfo did not find a running process for ${t}`,{metric:`memory`,package:t,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf.`});let r=Jd(e,`TOTAL PSS`)??Yd(e);if(r===void 0)throw new o(`COMMAND_FAILED`,`Failed to parse Android meminfo output for ${t}`,{metric:`memory`,package:t,hint:`Retry perf after reopening the app session. If the problem persists, capture adb shell dumpsys meminfo output for debugging.`});return{totalPssKb:r,totalRssKb:Jd(e,`TOTAL RSS`),measuredAt:n,method:`adb-shell-dumpsys-meminfo`,topConsumers:Ud(e)}}async function Bd(e,t){let n=await e([`shell`,`pidof`,t],{allowFailure:!0,timeoutMs:Nd}),r=n.stdout.trim().split(/\s+/).map(Number).find(e=>Number.isInteger(e)&&e>0);if(n.exitCode===0&&r!==void 0)return r;throw new o(`COMMAND_FAILED`,`No running Android process found for ${t}`,{kind:`android-hprof`,package:t,stdout:n.stdout,stderr:n.stderr,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot.`})}function Vd(e){return`/data/local/tmp/agent-device-${e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}-${Date.now()}.hprof`}function Hd(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`profileable`)||n.includes(`debuggable`)||n.includes(`not allowed`)?`Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.`:n.includes(`permission`)||n.includes(`denied`)?`The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.`:`Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.`}function Ud(e){let t=e.split(`
|
|
14
|
+
`).flatMap(e=>Wd(e)??[]).sort((e,t)=>t.pssKb-e.pssKb).slice(0,5);return t.length>0?t:void 0}function Wd(e){let t=e.trim();if(Gd(t))return;let n=t.match(/^(.+?)\s+([0-9][0-9,]*(?:\(\d+\))?)(?:\s|$)/);if(n)return Kd(n[1],n[2])}function Gd(e){if(!e||e.startsWith(`**`)||e.startsWith(`-`)||e.includes(`:`))return!0;let t=/^\S.+\s+\d/.test(e);return/^(pss|total|native|dalvik|unknown|app summary\b)/i.test(e)&&!t}function Kd(e,t){let n=e?.trim(),r=t?J(t):null;if(!(!n||n===`TOTAL`||r===null||r<=0)&&!/^(pss|private|shared|heap|size|alloc|free)$/i.test(n))return{name:n,pssKb:r}}function qd(e,t,n){return n instanceof o?new o(n.code,n.message,{...n.details??{},metric:e,package:t},n):new o(`COMMAND_FAILED`,`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},n)}function Jd(e,t){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),r=e.match(RegExp(`${n}:\\s*([0-9][0-9,]*)`,`i`));if(!r)return;let i=r[1];return i===void 0?void 0:J(i)??void 0}function Yd(e){for(let t of e.split(`
|
|
15
|
+
`)){let e=t.trim();if(!/^TOTAL\b(?!\s+PSS:)/.test(e))continue;let n=e.split(/\s+/).slice(1).find(e=>J(e)!==null);return n?J(n)??void 0:void 0}}async function Xd(e,t,n){let r=await S(e,[`shell`,`dumpsys`,`package`,t],{allowFailure:!0});if(r.exitCode===0)return tf(r.stdout,n)}async function Zd(e){let t=await S(e,[`shell`,`am`,`get-current-user`],{allowFailure:!0});if(t.exitCode!==0)return;let n=Number.parseInt(t.stdout.trim(),10);return Number.isInteger(n)&&n>=0?n:void 0}const Qd=/^\s*User (\d+):/,$d=/^\s*runtime permissions:\s*$/,ef=/^\s*([\w.]+): granted=(true|false)\b/;function tf(e,t){let n=nf(nf(nf(e.split(`
|
|
16
|
+
`).filter(e=>e.trim().length>0).map(e=>({text:e,indent:e.length-e.trimStart().length})),e=>e.indent===0&&e.text.trim()===`Packages:`),e=>Qd.exec(e.text)?.[1]===String(t)),e=>$d.test(e.text));if(!n)return;let r=new Map;for(let{text:e}of n){let t=ef.exec(e);t&&r.set(t[1],t[2]===`true`?`granted`:`not_granted`)}return r}function nf(e,t){if(!e)return;let n=e.findIndex(e=>t(e));if(n<0)return;let r=e.slice(n+1),i=r.findIndex(t=>t.indent<=e[n].indent);return i<0?r:r.slice(0,i)}function rf(e,t,n){if(n!==`not_granted`)return`${n===`granted`?`${t} was granted before this revoke, and Android kills an app when a granted permission is revoked: if ${e} was running it is no longer.`:`Whether ${t} was granted before this revoke could not be read (adb did not report the acting user's runtime permission state), and Android kills an app when a granted permission is revoked: ${e} may no longer be running.`} Relaunch it with open ${e} --relaunch before the next interaction.`}async function af(e){let t=await Zd(e);if(t!==void 0)return t;throw new o(`COMMAND_FAILED`,`Could not determine which Android user the session runs as, so no permission was changed.`,{deviceId:e.id,hint:`Check adb -s ${e.id} shell am get-current-user — if the device is still booting, retry once it reports a user. agent-device refuses to change permissions it cannot scope, because pm would silently apply them to user 0.`})}async function of(e,t,n,r){let i=he(n),a=lf(r?.permissionTarget,r?.permissionMode),o=await af(e),s=[`--user`,String(o)];if(i===`grant`){await sf(e,t,a,s);return}let c=await Xd(e,t,o),l=await cf(e,t,i,a,s),u=c?.get(l)??`unknown`,d=rf(t,l,u);return{permission:l,priorGrantState:u,...d?{warnings:[d]}:{}}}async function sf(e,t,n,r){n.kind===`notifications`?await df(e,t,`grant`,n,r):n.type===`photos`?await uf(e,t,`grant`,r):await S(e,[`shell`,`pm`,`grant`,...r,t,n.value])}async function cf(e,t,n,r,i){if(r.kind===`notifications`)return await df(e,t,n,r,i),r.permission;let a;return r.type===`photos`?a=await uf(e,t,`revoke`,i):(a=r.value,await S(e,[`shell`,`pm`,`revoke`,...i,t,a])),n===`reset`&&await ff(e,t,a,i),a}function lf(e,t){let n=pe(e);if(t?.trim())throw new o(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${t}.`);if(n===`camera`)return{kind:`pm`,value:`android.permission.CAMERA`,type:`camera`};if(n===`microphone`)return{kind:`pm`,value:`android.permission.RECORD_AUDIO`,type:`microphone`};if(n===`photos`)return{kind:`pm`,value:`android.permission.READ_MEDIA_IMAGES`,type:`photos`};if(n===`contacts`)return{kind:`pm`,value:`android.permission.READ_CONTACTS`,type:`contacts`};if(n===`notifications`)return{kind:`notifications`,appOps:`POST_NOTIFICATION`,permission:`android.permission.POST_NOTIFICATIONS`};throw new o(`INVALID_ARGS`,`Unsupported permission target on Android: ${e}. Use camera|microphone|photos|contacts|notifications.`)}async function uf(e,t,n,r){let i=await pf(e),a=i!==null&&i>=33?[`android.permission.READ_MEDIA_IMAGES`,`android.permission.READ_EXTERNAL_STORAGE`]:[`android.permission.READ_EXTERNAL_STORAGE`,`android.permission.READ_MEDIA_IMAGES`],s=[];for(let i of a){let a=await S(e,[`shell`,`pm`,n,...r,t,i],{allowFailure:!0});if(a.exitCode===0)return i;s.push({permission:i,stderr:a.stderr,exitCode:a.exitCode})}throw new o(`COMMAND_FAILED`,`Failed to ${n} Android photos permission`,{appPackage:t,sdkInt:i,attempts:s})}async function df(e,t,n,r,i){let a=n===`grant`?`allow`:n===`deny`?`deny`:`default`;n===`grant`?await S(e,[`shell`,`pm`,`grant`,...i,t,r.permission],{allowFailure:!0}):(await S(e,[`shell`,`pm`,`revoke`,...i,t,r.permission],{allowFailure:!0}),n===`reset`&&await ff(e,t,r.permission,i)),await S(e,[`shell`,`appops`,`set`,...i,t,r.appOps,a])}async function ff(e,t,n,r){for(let i of[`user-set`,`user-fixed`])await S(e,[`shell`,`pm`,`clear-permission-flags`,...r,t,n,i],{allowFailure:!0})}async function pf(e){let t=await S(e,[`shell`,`getprop`,`ro.build.version.sdk`],{allowFailure:!0});if(t.exitCode!==0)return null;let n=Number.parseInt(t.stdout.trim(),10);return!Number.isFinite(n)||n<=0?null:n}function mf(e){let t=e.trim().toLowerCase();if(t===`light`)return`light`;if(t===`dark`)return`dark`;if(t===`toggle`)return`toggle`;throw new o(`INVALID_ARGS`,`Invalid appearance state: ${e}. Use light|dark|toggle.`)}function hf(e){let t=e.toLowerCase();if(t===`on`||t===`true`||t===`1`)return!0;if(t===`off`||t===`false`||t===`0`)return!1;throw new o(`INVALID_ARGS`,`Invalid setting state: ${e}`)}function gf(e){return e.map(e=>({args:e.args.join(` `),exitCode:e.exitCode,stderr:e.stderr.slice(0,400)}))}const _f=[`shell`,`cmd`,`connectivity`,`airplane-mode`];async function vf(e,t){let n=t?`enabled`:`disabled`;await yf(e),await S(e,[..._f,t?`enable`:`disable`]);let r=await bf(e);if(r!==n)throw new o(`COMMAND_FAILED`,`Android airplane mode reads ${r} after requesting ${n}.`,{deviceId:e.id,requested:n,airplaneMode:r});return{airplaneMode:r}}async function yf(e){let{state:t,result:n}=await xf(e);if(!t)throw n.exitCode!==0&&He(n.stdout,n.stderr)?new o(`UNSUPPORTED_OPERATION`,`The connectivity service on this Android build has no airplane-mode command, so nothing was changed.`,{deviceId:e.id,hint:`settings airplane needs cmd connectivity airplane-mode, which requires Android 11 (API 30) or newer. Use a newer device or emulator image.`,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode}):y(`Failed to read Android airplane mode`,n,{deviceId:e.id})}async function bf(e){let{state:t,result:n}=await xf(e);if(t)return t;throw y(`Failed to read Android airplane mode after changing it`,n,{deviceId:e.id})}async function xf(e){let t=await S(e,[..._f],{allowFailure:!0});return{state:t.exitCode===0?Sf(t.stdout):void 0,result:t}}function Sf(e){let t=e.trim().toLowerCase();if(t===`enabled`)return`enabled`;if(t===`disabled`)return`disabled`}const Cf=[`window_animation_scale`,`transition_animation_scale`,`animator_duration_scale`];async function wf(e,t,n,r,i){switch(t.toLowerCase()){case`wifi`:{let t=hf(n);await S(e,[`shell`,`svc`,`wifi`,t?`enable`:`disable`]);return}case`airplane`:return await vf(e,hf(n));case`location`:{if(n.toLowerCase()===`set`){if(e.kind!==`emulator`)throw new o(`UNSUPPORTED_OPERATION`,`Android precise location coordinates are supported only on emulators.`,{deviceId:e.id,hint:`Use an Android emulator for adb emu geo fix, or configure location through device/provider tooling.`});let{latitude:t,longitude:n}=me(i);return await S(e,[`emu`,`geo`,`fix`,String(n),String(t)]),{latitude:t,longitude:n}}let t=hf(n)?`3`:`0`;await S(e,[`shell`,`settings`,`put`,`secure`,`location_mode`,t]);return}case`animations`:{let t=hf(n)?`1`:`0`;for(let n of Cf)await S(e,[`shell`,`settings`,`put`,`global`,n,t]);return{scale:t,keys:[...Cf]}}case`appearance`:{let t=await kf(e,n);await S(e,[`shell`,`cmd`,`uimode`,`night`,t===`dark`?`yes`:`no`]);return}case`clear-app-state`:{if(n.toLowerCase()!==`clear`)throw new o(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!r)throw new o(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let t=await ft(e,r);if(t.type===`intent`)throw new o(`INVALID_ARGS`,`settings clear-app-state requires a package name, not an intent.`);await S(e,[`shell`,`am`,`force-stop`,t.value],{allowFailure:!0});let i=await S(e,[`shell`,`pm`,`clear`,t.value],{allowFailure:!0});if(i.exitCode!==0||!/\bSuccess\b/i.test(i.stdout))throw new o(`COMMAND_FAILED`,`Failed to clear Android app data for ${t.value}`,{package:t.value,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode});return{package:t.value,cleared:!0}}case`fingerprint`:await Ef(e,Tf(n));return;case`permission`:if(!r)throw new o(`INVALID_ARGS`,`permission setting requires an active app in session`);return await of(e,r,n,i);default:throw new o(`INVALID_ARGS`,`Unsupported setting: ${t}`)}}function Tf(e){let t=e.trim().toLowerCase();if(t===`match`)return`match`;if(t===`nonmatch`)return`nonmatch`;throw new o(`INVALID_ARGS`,`Invalid fingerprint state: ${e}. Use match|nonmatch.`)}async function Ef(e,t){let n=Df(e,t),r=[];for(let t of n){let n=await S(e,t,{allowFailure:!0});if(n.exitCode===0)return;r.push({args:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})}let i=gf(r);throw r.length>0&&r.every(e=>Of(e.stdout,e.stderr))?new o(`UNSUPPORTED_OPERATION`,`Android fingerprint simulation is not supported on this target/runtime.`,{deviceId:e.id,action:t,hint:`Use an Android emulator with biometric support, or a device/runtime that exposes cmd fingerprint.`,attempts:i}):new o(`COMMAND_FAILED`,`Failed to simulate Android fingerprint.`,{deviceId:e.id,action:t,attempts:i})}function Df(e,t){let n=t===`match`?`1`:`9999`,r=[[`shell`,`cmd`,`fingerprint`,`touch`,n],[`shell`,`cmd`,`fingerprint`,`finger`,n]];return e.kind===`emulator`&&r.push([`emu`,`finger`,`touch`,n]),r}function Of(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unknown command`)||n.includes(`can't find service: fingerprint`)||n.includes(`service fingerprint was not found`)||n.includes(`fingerprint cmd unavailable`)||n.includes(`emu command is not supported`)||n.includes(`emulator console is not running`)||n.includes(`fingerprint`)&&n.includes(`not found`)}async function kf(e,t){let n=mf(t);if(n!==`toggle`)return n;let r=await S(e,[`shell`,`cmd`,`uimode`,`night`],{allowFailure:!0});if(r.exitCode!==0)throw y(`Failed to read current Android appearance`,r);let i=Af(r.stdout,r.stderr);if(!i)throw new o(`COMMAND_FAILED`,`Unable to determine current Android appearance for toggle`,{stdout:r.stdout,stderr:r.stderr});return i===`auto`?`dark`:i===`dark`?`light`:`dark`}function Af(e,t){let n=/night mode:\s*(yes|no|auto)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`yes`?`dark`:r===`no`?`light`:r===`auto`?`auto`:null}const jf=Buffer.from([137,80,78,71,13,10,26,10]);async function Mf(e,t,n={}){if(n.stabilize===!1){await Ff(e,t);return}await Nf(e);try{await g(1e3),await Ff(e,t)}finally{await Pf(e).catch(()=>{})}}async function Nf(e){let t=t=>S(e,[`shell`,t],{allowFailure:!0});await t(`settings put global sysui_demo_allowed 1`);let n=e=>t(`am broadcast -a com.android.systemui.demo -e command ${e}`);await n(`clock -e hhmm 0941`),await n(`notifications -e visible false`)}async function Pf(e){await S(e,[`shell`,`am broadcast -a com.android.systemui.demo -e command exit`],{allowFailure:!0})}async function Ff(e,t){let n=await S(e,[`exec-out`,`screencap`,`-p`],{binaryStdout:!0});if(!n.stdoutBuffer)throw new o(`COMMAND_FAILED`,`Failed to capture screenshot`);let r=n.stdoutBuffer.indexOf(jf);if(r<0)throw new o(`COMMAND_FAILED`,`Screenshot data does not contain a valid PNG header`);let i=If(n.stdoutBuffer,r);if(!i)throw new o(`COMMAND_FAILED`,`Screenshot data does not contain a complete PNG payload`);await v().files.writeBytes(t,n.stdoutBuffer.subarray(r,i))}function If(e,t){let n=t+jf.length;for(;n+8<=e.length;){let t=e.readUInt32BE(n),r=n+4,i=e.toString(`ascii`,r,r+4),a=n+12+t;if(a>e.length)return null;if(i===`IEND`)return a;n=a}return null}async function Lf(e,t,n=0){let r=ze(e);if(r){await r({action:`type`,text:t,delayMs:n}),$(`type`,`provider-native`,t);return}let i=await Hf(e,`type`,t);if(i.backend===`test-ime`){await Uf(e,i.packageName,t,n);return}if(n>0&&Array.from(t).length>1){await Gf(e,{action:`type`,text:t,chunkSize:1,delayMs:n});return}await Gf(e,{action:`type`,text:t,chunkSize:8,delayMs:0})}async function Rf(e,t,n,r,i=0,a={}){let o=await Cl(e,t,n,a),s=ze(e);if(s)return await s({action:`fill`,target:{x:t,y:n},text:r,delayMs:i}),$(`fill`,`provider-native`,r),q(r,o,await bl(e,t,n,r,a));let c=null;for(let s of zf(i)){await Qi(e,t,n);let i=await Hf(e,`fill`,r);if(i.backend===`test-ime`)return q(r,o,await Wf(e,i.packageName,t,n,r,o,a));let l=await Bf(e,{x:t,y:n,text:r,beforeTarget:o,attempt:s},a);if(c=l,l.ok)return;if(l.reason===`ime_capture`)return q(r,o,l);let u=wl(r,o,l);if(u)return u}return q(r,o,c)}function zf(e){return[{clearPadding:12,minClear:8,maxClear:48,chunkSize:e>0?1:8,inputDelayMs:e},{clearPadding:24,minClear:16,maxClear:96,chunkSize:e>0?1:4,inputDelayMs:e>0?e:15}]}async function Bf(e,t,n){let{x:r,y:i,text:a,beforeTarget:o,attempt:s}=t;return await qf(e,Vf(a,o,s)),await Gf(e,{action:`fill`,text:a,chunkSize:s.chunkSize,delayMs:s.inputDelayMs}),bl(e,r,i,a,n)}function Vf(e,t,n){let r=Array.from(e).length;return np(r>0?r+n.clearPadding:t?.text?Array.from(t.text).length+n.clearPadding:n.maxClear,n.minClear,n.maxClear)}async function Hf(e,t,n){if(vo(e))return{backend:`test-ime`,packageName:(await $a(x(e))).manifest.packageName};let r=await Jf(e,t),i=r?.inputMethodPackage;return ao(i)?{backend:`test-ime`,packageName:i}:(Xf(n),Yf(r,t),{backend:`adb-shell`})}async function Uf(e,t,n,r){let i=b(e),a=n.split(`
|
|
17
|
+
`);for(let[n,o]of a.entries()){let s=r>0?tp(o,1):[o];for(let[e,o]of s.entries())o&&await oo(i,t,o),r>0&&(e+1<s.length||n+1<a.length)&&await g(r);n+1<a.length&&await S(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(`type`,`test-ime`,n)}async function Wf(e,t,n,r,i,a,o){let s=b(e),c=null;for(let l=0;l<2;l+=1){l>0&&await Qi(e,n,r),await so(s,t),i&&await oo(s,t,i);let u=await bl(e,n,r,i,o);if(c=u,u.ok||wl(i,a,u))break}return $(`fill`,`test-ime`,i),c}async function Gf(e,t){let n=t.text.split(`
|
|
18
|
+
`);for(let[r,i]of n.entries()){let a=tp(i,t.chunkSize);for(let[i,o]of a.entries())await Kf(e,o),t.delayMs>0&&(i+1<a.length||r+1<n.length)&&await g(t.delayMs);r+1<n.length&&await S(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(t.action,`adb-shell`,t.text)}async function Kf(e,t){if(t)try{await S(e,[`shell`,`input`,`text`,we(Qf(t))])}catch(e){throw $f(e)?ep(t,e):e}}async function qf(e,t){let n=Math.max(0,t);await S(e,[`shell`,`input`,`keyevent`,`KEYCODE_MOVE_END`],{allowFailure:!0});for(let t=0;t<n;t+=24){let r=Math.min(24,n-t);await S(e,[`shell`,`input`,`keyevent`,...Array(r).fill(`KEYCODE_DEL`)],{allowFailure:!0})}}async function Jf(e,t){try{return await Ma(e)}catch(e){return h({level:`warn`,phase:`android_input_ownership_probe_failed`,data:{action:t,error:e instanceof Error?e.message:String(e)}}),null}}function Yf(e,t){if(!(!e||e.inputOwner!==`ime`))throw new o(`COMMAND_FAILED`,`KEYBOARD_OVERLAY_BLOCKING: Android text input is blocked because the focused input belongs to the active keyboard/IME.`,{failureReason:`ime_capture`,action:t,inputOwner:e.inputOwner,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,nextAction:`Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.`})}function Xf(e){if(!Zf(e))throw ep(e)}function Zf(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&t!==`
|
|
19
|
+
`&&(e<32||e>126))return!1}return!0}function Qf(e){return e.replaceAll(` `,`%s`)}function $f(e){if(!(e instanceof o)||e.code!==`COMMAND_FAILED`)return!1;let t=e.details?.stderr,n=(typeof t==`string`?t:``).toLowerCase();return!!(n.includes(`exception occurred while executing 'text'`)||n.includes(`nullpointerexception`)&&n.includes(`inputshellcommand.sendtext`))}function ep(e,t){return new o(`COMMAND_FAILED`,"Android text input requires provider-native text injection or the bundled test IME helper for non-ASCII/control characters; the adb-shell fallback supports ASCII text only. On emulators the test IME activates automatically; on real devices pass `open --test-ime` to enable it (see `agent-device doctor` for the current IME state).",{backend:`adb-shell`,textLength:Array.from(e).length,textPreview:e.slice(0,32)},t instanceof Error?t:void 0)}function tp(e,t){let n=Math.max(1,Math.floor(t)),r=[],i=Array.from(e);for(let e=0;e<i.length;e+=n)r.push(i.slice(e,e+n).join(``));return r.length>0?r:[``]}function $(e,t,n){h({phase:`android_text_injection`,data:{action:e,backend:t,textLength:Array.from(n).length}})}function np(e,t,n){return Math.max(t,Math.min(n,e))}var rp=e({ANDROID_FOCUSED_WINDOW_MARKER:()=>vt,ANDROID_FOCUS_MARKERS:()=>gt,ANDROID_IME_HELPER_SERVICE_COMPONENT:()=>`com.callstack.agentdevice.imehelper/.TestInputMethodService`,ANDROID_SNAPSHOT_PRESENTATION_DEFAULT_DEADLINE_MS:()=>250,ANDROID_TEST_IME_SETTINGS_KEYS:()=>uo,ANDROID_TOUCH_PLAN_PROTOCOL:()=>Si,AndroidSnapshotPresentationFailure:()=>K,activateAndroidTestIme:()=>ql,androidAdbForwardsDeviceExitStatus:()=>Ot,androidAdbResultError:()=>y,androidAppsDiscoveryHint:()=>pt,androidCaptureFailureReasonDetail:()=>A,androidCaptureFailureReasonFromExitCode:()=>or,androidCaptureFailureReasonFromHelperResult:()=>ar,androidDeviceChecks:()=>ko,androidFillFailureDetails:()=>Ol,androidFillFailureMessage:()=>Dl,androidRevokedPermissionWarning:()=>rf,androidSnapshotPublicationInput:()=>Gc,androidToolchainCheck:()=>Oo,androidUiNodes:()=>$s,annotateAndroidNativePerfError:()=>Y,appSwitcherAndroid:()=>Xi,attachAdbFailureHint:()=>je,backAndroid:()=>Hi,buildAndroidFillUnconfirmedVerification:()=>wl,buildAndroidNativeToolUnavailableHint:()=>Qu,buildAndroidSnapshotClickabilityEvidence:()=>pc,buildAndroidSnapshotHelperArgs:()=>Rr,buildAndroidSnapshotHelperCaptureOptions:()=>Ir,buildUiHierarchySnapshot:()=>Ns,captureAndroidHeapSnapshot:()=>Id,captureAndroidLogcatWithAdb:()=>ap,captureAndroidSnapshotWithHelper:()=>Fr,captureAndroidSnapshotWithHelperSession:()=>_i,classifyAdbFailure:()=>Me,classifyAndroidAlertIdentifier:()=>Bt,classifyAndroidAppTarget:()=>ct,classifyAndroidHelperContent:()=>hc,cleanupAndroidNativePerfSession:()=>ld,clearAndroidImeHelperText:()=>so,clearAndroidTestImeRecoveryMarker:()=>Ql,closeAndroidApp:()=>nt,completeAndroidFillVerification:()=>q,createAndroidPortReverseManager:()=>Pe,createAndroidSnapshotCapture:()=>Wc,createAndroidSnapshotPresentationBudget:()=>Os,createAndroidSnapshotPresentationNode:()=>ws,createAndroidWindowDumpReader:()=>ot,createDeviceAdbExecutor:()=>Re,createLocalAndroidAdbProvider:()=>Fe,dismissAndroidKeyboard:()=>Na,dismissAndroidKeyboardWithAdb:()=>Pa,ensureAndroidEmulatorBooted:()=>Ze,ensureAndroidImeHelper:()=>ro,ensureAndroidSdkPathConfigured:()=>it,ensureAndroidSnapshotHelper:()=>Qn,executeAndroidTouchHelperPlan:()=>Ei,executeAndroidTouchPlan:()=>Ri,fillAndroid:()=>Rf,findAndroidAlertCandidate:()=>Vt,focusAndroid:()=>Qi,forceStopAndroidAppWithAdb:()=>ga,forgetAndroidSnapshotHelperInstall:()=>qn,formatAndroidInstalledPackageRequiredMessage:()=>dt,getAndroidAppState:()=>Xe,getAndroidBlockingDialogObservation:()=>et,getAndroidImeHelperDeviceKey:()=>R,getAndroidKeyboardState:()=>Ma,getAndroidKeyboardStatusWithAdb:()=>I,getAndroidScreenSize:()=>ia,getAndroidSnapshotHelperSessionDeviceKey:()=>Sr,handleAndroidAlert:()=>aa,homeAndroid:()=>Ui,inferAndroidAppName:()=>ut,inspectInstalledAndroidHelper:()=>bn,installAndroidAdbPackage:()=>Be,installAndroidInstallablePath:()=>Da,isAmStartError:()=>at,isAndroidImeHelperPackage:()=>ao,isAndroidPermissionPackage:()=>Mt,isAndroidShellCommandUnsupported:()=>He,isAndroidSnapshotHelperRetirementUnconfirmedError:()=>Er,isAndroidSnapshotPresentationFailure:()=>Es,isAndroidTestImeActive:()=>vo,listAndroidAdbSerialsQuick:()=>Eo,listAndroidAppsWithAdb:()=>ip,longPressAndroid:()=>Zi,lowerAndroidTouchPlan:()=>Li,makeEnsureAndroidHelperInstalled:()=>Sn,normalizeAndroidTouchHelperGestureRequest:()=>ji,openAndroidApp:()=>$e,openAndroidAppWithAdb:()=>va,openAndroidDevice:()=>Ye,parseAndroidHelperManifest:()=>Pn,parseAndroidLaunchComponent:()=>rt,parseAndroidLaunchablePackages:()=>ht,parseAndroidSnapshotHelperManifest:()=>Pn,parseAndroidSnapshotHelperOutput:()=>qr,parseAndroidUserInstalledPackages:()=>mt,parseInstrumentationRecords:()=>E,parseUiHierarchyTree:()=>dc,prepareAndroidInstallArtifact:()=>_u,pressAndroid:()=>Bi,pressAndroidEnter:()=>Wi,pressAndroidTvRemote:()=>Vi,pullAndroidAdbFile:()=>Le,pushAndroidNotification:()=>bu,readAndroidBlockingDialogFocus:()=>_t,readAndroidClipboardText:()=>Ga,readAndroidClipboardWithAdb:()=>Ka,readAndroidDefaultInputMethod:()=>V,readAndroidFillTargetBeforeMutation:()=>Cl,readAndroidGestureViewport:()=>zi,readAndroidHelperManifestInteger:()=>cn,readAndroidHelperManifestLiteral:()=>T,readAndroidSnapshotHelperInstallOptions:()=>Ln,readAndroidTestImeRecoveryMarkers:()=>$l,readAndroidTextAtPoint:()=>xl,readAndroidTextAtPointInHierarchy:()=>El,readAndroidTouchHelperFinalRecord:()=>Pi,readAndroidTouchHelperViewport:()=>Di,readInstrumentationResultBoolean:()=>gn,readInstrumentationResultNumber:()=>D,resetAndroidAdbShellProtocolProbes:()=>kt,resetAndroidFramePerfStats:()=>Yu,resetAndroidImeHelperInstallCache:()=>io,resetAndroidSnapshotHelperInstallCache:()=>Jn,resetAndroidSnapshotHelperRuntime:()=>Hc,resetAndroidSnapshotHelperSessions:()=>gi,resetAndroidTestImeActivationCacheForTests:()=>bo,resetAndroidWindowDumpFocusMemoForTests:()=>st,resolveAndroidAdbExecutor:()=>b,resolveAndroidAdbProvider:()=>x,resolveAndroidApp:()=>ft,resolveAndroidArchivePackageName:()=>iu,resolveAndroidHelperArtifact:()=>xn,resolveAndroidImeHelperArtifact:()=>eo,resolveAndroidSnapshotHelperCaptureOptions:()=>Lr,resolveAndroidTextInjector:()=>ze,resolveAndroidTouchProvider:()=>Ne,resolveScopedAndroidAdbBackgroundTransport:()=>Ie,restoreAndroidTestIme:()=>So,restoreOrphanedAndroidTestImeOnDaemonStartup:()=>To,retireAndroidSnapshotHelperAfterContentFailure:()=>Vc,runAndroidAdb:()=>S,runAndroidHostAdb:()=>Ae,runAndroidSnapshotHelperSessionTouchCommand:()=>yi,sampleAndroidFramePerf:()=>Ju,sampleAndroidMemoryPerf:()=>Fd,screenshotAndroid:()=>Mf,scrollAndroid:()=>$i,selectAndroidImeHelperArtifact:()=>$a,sendAndroidImeHelperText:()=>oo,setAndroidOrientation:()=>Gi,setAndroidPermission:()=>of,setAndroidSetting:()=>wf,setAndroidTestImeActiveForTests:()=>xo,sleep:()=>g,snapshotAndroid:()=>qc,startAndroidPerfettoTrace:()=>Sd,startAndroidSimpleperfProfile:()=>Ed,stopAndroidPerfettoTrace:()=>Cd,stopAndroidSimpleperfProfile:()=>Dd,stopAndroidSnapshotHelperSession:()=>F,stopAndroidSnapshotHelperSessionForDevice:()=>hi,typeAndroid:()=>Lf,validateAndroidGestureViewport:()=>_n,validateAndroidRegularPresentation:()=>ks,verifyAndroidFilledText:()=>bl,verifyAndroidFilledTextInHierarchy:()=>Tl,verifyAndroidHelperApkChecksum:()=>En,waitForAndroidBoot:()=>Qe,withAndroidAdbProvider:()=>Ve,withAndroidAppResolutionCacheInvalidated:()=>lt,withAndroidHostAdbTransport:()=>ke,writeAndroidClipboardText:()=>qa,writeAndroidClipboardWithAdb:()=>Ja,writeAndroidSimpleperfReport:()=>Od,writeAndroidTestImeRecoveryMarker:()=>Zl});async function ip(...e){let{listAndroidAppsWithAdb:t}=await import(`./app-helpers.js`);return await t(...e)}async function ap(...e){let{captureAndroidLogcatWithAdb:t}=await import(`./logcat.js`);return await t(...e)}export{Gi as A,Qi as C,Wi as D,Bi as E,zi as M,Vi as O,Hi as S,Zi as T,Ja as _,Lf as a,aa as b,qc as c,Pa as d,Ma as f,qa as g,Ka as h,Rf as i,Ri as j,$i as k,Gc as l,Ga as m,ip as n,Mf as o,I as p,rp as r,wf as s,ap as t,Na as u,ga as v,Ui as w,Xi as x,va as y};
|
package/dist/src/metro.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { v as SessionRuntimeHints } from "./sdk-contracts.js";
|
|
2
2
|
import { d as PrepareMetroRuntimeResult, f as ReloadMetroResult, o as MetroPrepareKind, p as MetroBridgeScope } from "./sdk-remote-config.js";
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/client/base-url.d.ts
|
|
4
4
|
declare function normalizeBaseUrl(input: string): string;
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region src/metro/bundle-url.d.ts
|
|
5
7
|
declare function buildBundleUrl(baseUrl: string, platform: 'ios' | 'android', entryPath?: string): string;
|
|
6
8
|
//#endregion
|
|
7
9
|
//#region src/metro/metro-types.d.ts
|
package/dist/src/metro.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{t as e}from"./base-url.js";import{n as t,r as n,t as r}from"./client-metro.js";import{n as i,t as a}from"./metro2.js";export{n as buildBundleUrl,e as normalizeBaseUrl,r as prepareMetroRuntime,t as reloadMetro,a as resolveRuntimeTransport,i as stopMetroTunnel};
|
package/dist/src/metro2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as e}from"./client-metro-companion.js";import{t}from"./runtime-transport-hints.js";function n(e){return t(e)}async function r(t){await e(t)}export{r as n,n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Cr as e,Dr as t,Sr as n,xr as r,zr as i}from"./sdk-batch.js";import{t as a}from"./scroll-indicator.js";function o(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{visibility:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=c(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>m(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:h(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&v(e)),t)}}function s(e){if(e.length===0)return new Map;let{hintedContainers:t}=c(e);return p(t.directionsByContainer)}function c(e){let t=r(e),n=t.nodeByIndex,i=new Set,a=[];for(let r of e){if(t.isVisibleInEffectiveViewport(r)){b(r,i,n);continue}a.push(r)}return{visibility:t,visibleNodeIndexes:i,offscreenNodes:a,hintedContainers:f(e,a,i,n)}}function l(t,n){return t.hittable&&e(t.rect,n)}function u(t,n){if(!t.rect)return null;let r=n.resolveEffectiveViewport(t);if(r&&!i(t.rect,r)){let e=d(t.rect,r);if(e)return e}let a=n.resolveViewport(t.rect);if(a&&!e(t.rect,a)){let e=d(t.rect,a);if(e)return e}return null}function d(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function f(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=x(e,n,r);if(!t?.rect)continue;let s=_(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return S(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function p(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function m(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function h(e,t){let n=new Map;for(let r of e){let e=g(r,t);if(!e)continue;let i=n.get(e)??[];i.push(r),n.set(e,i)}return[`above`,`below`].flatMap(e=>{let t=n.get(e);if(!t||t.length===0)return[];let r=y(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=r.length>0?`: ${r.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function g(e,t){if(!e.rect)return null;let n=t.resolveEffectiveViewport(e);return n?_(e.rect,n):null}function _(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function v(e){if(e.hittable===!0)return!0;let n=(e.type??``).toLowerCase();return n.includes(`button`)||n.includes(`link`)||n.includes(`textfield`)||n.includes(`edittext`)||n.includes(`searchfield`)||n.includes(`checkbox`)||n.includes(`radio`)||n.includes(`switch`)||n.includes(`menuitem`)||!!t(e)}function y(e){let n=new Set,r=[];for(let i of e){let e=t(i);!e||n.has(e)||(n.add(e),r.push(e))}return r}function b(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function x(e,t,r){return n(e,r,e=>t.has(e.index))}function S(e,t,n,r,i){for(let a of e){let e=C(a);if(!e||e.size===0)continue;let o=x(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function C(e){let t=a(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}export{l as i,u as n,s as r,o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{S as t,c as n}from"./sdk-device.js";import{n as r}from"./gesture-admission.js";const i={visionos:`visionOS uses spatial input and does not support two-finger touch synthesis.`,tvos:`tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.`,macos:`macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.`};function a(a,s){if(!n(a.platform))throw o(s,a.platform);let c=t(a);if(c!==`ios`&&c!==`ipados`||a.kind!==`simulator`)throw c===`ios`||c===`ipados`?new e(`UNSUPPORTED_OPERATION`,`gesture ${s} is not supported on physical iOS devices`,{hint:`Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.`}):o(s,r[c],i[c])}function o(t,n,r){return new e(`UNSUPPORTED_OPERATION`,`gesture ${t} is not supported on ${n}`,r===void 0?void 0:{hint:r})}export{a as n,i as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){return Math.round(e*10)/10}function t(t){return e(t)}export{e as n,t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./string-enum.js";const t=[`
|
|
1
|
+
import{t as e}from"./string-enum.js";const t=[`frames`,`memory`,`cpu`,`trace`],n=`metrics`,r=[`sample`,`snapshot`,`start`,`stop`,`report`],i=[`profile`],a=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],o=[`android-hprof`,`memgraph`],s=e(t),c=e(r),l=e(i),u=e(a),d=e(o),f=`perf area must be frames, memory, cpu, or trace`,p=`perf action must be sample, snapshot, start, stop, or report`,m=`Aggregate perf was removed. Use perf frames, perf memory sample, perf cpu profile start|stop|report, or perf trace start|stop.`,h=`perf cpu requires profile`,g=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,_=s.is,v=c.is,y=l.is,b=u.is,x=d.is;function S(e){if(e==null)return!0;if(typeof e!=`string`)return!1;let t=e.toLowerCase();return t===`metrics`||v(t)}export{f as a,a as c,v as d,_ as f,S as g,y as h,m as i,h as l,x as m,r as n,t as o,b as p,n as r,g as s,p as t,i as u};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";const t=`mCurrentFocus=Window{`,n=[t,`mFocusedApp=AppWindowToken{`,`mResumedActivity:`,`ResumedActivity:`],r=[[`shell`,`dumpsys`,`window`,`windows`],[`shell`,`dumpsys`,`window`]],i=[[`shell`,`dumpsys`,`activity`,`activities`],[`shell`,`dumpsys`,`activity`]],a=RegExp(`(?:${n.map(x).join(`|`)})(.*)$`,`gm`),o=/\bApplication Not Responding:\s*([A-Za-z0-9_.]+)/i,s=/\b([A-Za-z][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)+)\b/,c=new Set([`com.android.permissioncontroller`,`com.google.android.permissioncontroller`,`com.android.packageinstaller`,`com.google.android.packageinstaller`]),l=new Map;function u(t){return Object.freeze({readAppState:async e=>await f(t,e),readBlockingDialog:async e=>await p(t,e),async readAppFocus(e,n,r={}){let i=d(t,e);return r.requireNoBlockingDialog&&(await p(t,e,i)).status===`dialog`?!1:(await f(t,e,i)).package===n},readSnapshotNodes:async e=>await t.readSnapshotNodes(e),async tap(e,n,r){return await t.runAdb(e,[`shell`,`input`,`tap`,String(Math.round(n)),String(Math.round(r))],{allowFailure:!0})},openApp:async(e,n)=>await t.openApp(e,n),async readScreenSize(n){let r=(await t.runAdb(n,[`shell`,`wm`,`size`])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!r)throw new e(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(r[1]),height:Number(r[2])}},async isPermissionPackage(e){return c.has(e)}})}function d(e,t){let n=new Map;return r=>{let i=r.join(` `),a=n.get(i)??e.runAdb(t,r,{allowFailure:!0}).then(e=>(h(t,i,e.stdout),e.stdout));return n.set(i,a),a}}async function f(e,t,n=d(e,t)){for(let e of m(t,`foreground`)){let t=_(await n(e));if(t)return t}return{}}async function p(e,t,n=d(e,t)){for(let e of m(t,`blockingDialog`)){let t=v(await n(e));if(t.focus)return{status:`dialog`,focus:t.focus};if(t.focusObserved)return{status:`clear`}}return{status:`unknown`}}function m(e,t){let n=t===`foreground`?[r,i]:[r],a=l.get(e.id);return n.flatMap(e=>{if(!a)return e;let n=e=>a.get(`${t} ${e.join(` `)}`)===!1,r=e.filter(e=>!n(e));return r.length===0||r.length===e.length?e:[...r,...e.filter(n)]})}function h(e,r,i){if(!i)return;let a=l.get(e.id)??new Map;g(a,`foreground ${r}`,b(n).test(i)),g(a,`blockingDialog ${r}`,b([t]).test(i)),l.set(e.id,a)}function g(e,t,n){e.get(t)!==!0&&e.set(t,n)}function _(e){for(let t of e.matchAll(a)){let e=t[1]?.match(/\b([A-Za-z][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)+)\/([A-Za-z0-9_.$]+)/);if(e?.[1]&&e[2])return{package:e[1],activity:e[2]}}return null}function v(e){let r=!1,i=e.split(`
|
|
2
|
+
`);for(let e of n)for(let n of i){let i=n.indexOf(e);if(i===-1)continue;e===t&&(r=!0);let a=n.trim(),o=y(n.slice(i+e.length).split(`}`)[0]?.trim()??``,a);if(o)return{focusObserved:r,focus:o}}return{focusObserved:r,focus:null}}function y(e,t){let n=o.exec(e)?.[1];if(n)return{package:n,focusedWindow:`Application Not Responding: ${n}`,raw:t};let r=e.toLowerCase();if(!r.includes(`isn't responding`)&&!r.includes(`is not responding`))return null;let i=e.trim().replaceAll(/\s+/g,` `),a=s.exec(i)?.[1];return{...a?{package:a}:{},focusedWindow:i,raw:t}}function b(e){return new RegExp(e.map(x).join(`|`))}function x(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}export{u as createAndroidObservationAdapter};
|
package/dist/src/output-path.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./path-resolution.js";import t from"node:path";const n=`.webm`;function r(e){return e===`web`?n:`.mp4`}function i(e,n){return t.extname(e)?e:`${e}${n}`}function a(e){return`./recording-${Date.now()}${r(e)}`}function o(t){let r=t.requestedPath===void 0?a(t.platform):t.platform===`web`?i(t.requestedPath,n):t.requestedPath;return Object.freeze({requestedPath:r,outputPath:e(r,{cwd:t.cwd})})}export{o as i,a as n,r,i as t};
|
|
1
|
+
import{n as e}from"./path-resolution.js";import"./file.js";import t from"node:path";const n=`.webm`;function r(e){return e===`web`?n:`.mp4`}function i(e,n){return t.extname(e)?e:`${e}${n}`}function a(e){return`./recording-${Date.now()}${r(e)}`}function o(t){let r=t.requestedPath===void 0?a(t.platform):t.platform===`web`?i(t.requestedPath,n):t.requestedPath;return Object.freeze({requestedPath:r,outputPath:e(r,{cwd:t.cwd})})}export{o as i,a as n,r,i as t};
|
|
@@ -1 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{r as e}from"./diagnostics.js";import{f as t,s as n}from"./exec.js";import{t as r}from"./timeouts.js";import i from"node:path";import a from"node:fs";import o from"node:crypto";function s(e){l(e.destination,t=>{e.mode===void 0?a.writeFileSync(t,e.contents,`utf8`):a.writeFileSync(t,e.contents,{encoding:`utf8`,mode:e.mode}),e.publish===`link-exclusive`?a.linkSync(t,e.destination):a.renameSync(t,e.destination)})}function c(e){let t=i.dirname(e.destination);l(e.destination,n=>{let r,i=!1,o;try{f(e.destination),r=a.openSync(n,`wx`,e.mode??384),a.writeFileSync(r,e.contents,`utf8`),a.fsyncSync(r),a.closeSync(r),r=void 0,f(e.destination),e.publish===`link-exclusive`?a.linkSync(n,e.destination):a.renameSync(n,e.destination),u(t)}catch(e){i=!0,o=e}if(r!==void 0)try{a.closeSync(r)}catch(e){i||(i=!0,o=e)}if(i)throw o})}function l(t,n){let r=d(t);try{return n(r)}finally{try{a.rmSync(r,{force:!0})}catch(n){e({level:`warn`,phase:`atomic_file_cleanup_failed`,data:{destination:t,temporaryPath:r,error:n instanceof Error?n.message:String(n)}})}}}function u(e){let t;try{t=a.openSync(e,`r`),a.fsyncSync(t)}catch{}finally{if(t!==void 0)try{a.closeSync(t)}catch{}}}function d(e){return i.join(i.dirname(e),`.${i.basename(e)}.${process.pid}-${o.randomUUID()}.tmp`)}function f(e){let t=p(e);if(t?.isSymbolicLink())throw Error(`Refusing to replace a durable file symbolic link: ${e}`);if(t&&!t.isFile())throw Error(`Refusing to replace a durable path that is not a regular file: ${e}`)}function p(e){try{return a.lstatSync(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}const m=1e3,h=process.platform===`win32`?`ps`:`/bin/ps`;function g(){return process.env}function _(e){return g()[e]}function v(e){process.stderr.write(e)}function y(){return process.cwd()}function b(){return process.execPath}function x(){return process.version}function S(){return process.platform}function C(){return process.pid}function w(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function T(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,0),!0}catch(e){return e.code===`EPERM`}}function E(e){return A(e,`lstart=`)}function D(e){return A(e,`command=`)}function O(e){return A(e,`state=`)?.startsWith(`Z`)??!1}function k(e){let n=new Map,r=P(e);if(r.length===0)return n;try{let e=t(`ps`,[`-p`,r.join(`,`),`-o`,`pid=,state=,lstart=`],{allowFailure:!0,timeoutMs:m});if(e.exitCode!==0)return n;for(let t of e.stdout.split(`
|
|
2
|
+
`)){let e=/^\s*(\d+)\s+(\S+)\s+(.+?)\s*$/.exec(t);if(!e)continue;let r=Number.parseInt(e[1],10);!Number.isInteger(r)||r<=0||n.set(r,{state:e[2],startTime:e[3]})}}catch{}return n}function A(e,n){if(!Number.isInteger(e)||e<=0)return null;try{let r=t(h,[`-p`,String(e),`-o`,n],{allowFailure:!0,timeoutMs:m});if(r.exitCode!==0)return null;let i=r.stdout.trim();return i.length>0?i:null}catch{return null}}function j(e){let t=[];for(let n of e.split(`
|
|
3
|
+
`)){let e=/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10),i=Number.parseInt(e[2],10),a=e[3];!Number.isInteger(r)||r<=0||t.push({pid:r,ppid:Number.isInteger(i)&&i>0?i:void 0,command:a})}return t}async function M(e){let t=await(e.runCommand??n)(e.runCommand?`ps`:h,[`-ax`,`-o`,`pid=,ppid=,command=`],{allowFailure:!0,timeoutMs:e.timeoutMs});return t.exitCode===0?j(t.stdout):[]}function N(e,t){let n=new Set(P(e)),r=!0;for(;r;){r=!1;for(let e of t)e.ppid===void 0||!n.has(e.ppid)||n.has(e.pid)||(n.add(e.pid),r=!0)}return t.filter(e=>n.has(e.pid))}function P(e,t={}){return[...new Set(e)].filter(e=>Number.isInteger(e)&&e>0&&e!==t.excludePid)}function F(e,t){let n=P(e,{excludePid:process.pid}),r=0;for(let e of n)try{process.kill(e,t),r+=1}catch{}return r}function I(e,t){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,t),!0}catch{return!1}}async function L(e,t){if(!w(e))return!0;let n=Date.now();for(;Date.now()-n<t;)if(await r(50),!w(e))return!0;return!w(e)}async function R(e){let t=P(e.pids,{excludePid:process.pid});t.length!==0&&(F(t,`SIGTERM`),await Promise.all(t.map(async t=>await L(t,e.termTimeoutMs))),F(t.filter(e=>w(e)),`SIGKILL`),await Promise.all(t.map(async t=>await L(t,e.killTimeoutMs))))}function z(){return{pid:process.pid,startTime:E(process.pid)}}function B(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function V(e,t){return e.pid!==t.pid||!!(e.startTime&&t.startTime&&e.startTime!==t.startTime)}function H(e){return U(e)}function U(e,t){let{owner:n,stateDir:r}=e;if(!w(n.pid)||(t===void 0?O(n.pid):t?.state.startsWith(`Z`)))return`owner-process-dead`;if(n.startTime){let e=t===void 0?E(n.pid):t?.startTime??null;if(e!==null&&e!==n.startTime)return`owner-process-reused`}if(!r)return`live`;try{return a.statSync(r),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}export{R as C,s as D,c as E,l as O,I as S,v as T,_,z as a,E as b,g as c,S as d,C as f,M as g,O as h,B as i,b as l,T as m,U as n,N as o,w as p,V as r,y as s,H as t,x as u,k as v,L as w,F as x,D as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{cn as t}from"./sdk-batch.js";import{t as n}from"./script.js";import{t as r}from"./session-paths.js";const i=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function a(t){if(t!==t.trim()||!n.test(t))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(t.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": the AD_* namespace is reserved for built-in replay variables.`);return t}function o(e){return`\${${e}}`}function s(e){let t=i.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}const c={kind:`none`};function l(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function ee(e){return e.kind===`repair`?{...e,status:`armed`}:e}function u(e){return e.kind===`none`?void 0:e.target}function te(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function d(e){return e.kind===`authoring`&&e.status===`aborted`}function f(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function p(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function m(e){return{kind:`authoring`,status:`armed`,target:l(void 0,e)}}function h(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function g(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function _(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:l(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function v(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function y(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function ne(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function re(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function ie(e){return e.kind===`repair`?e.boundary:void 0}function b(e){return e.kind===`repair`?e.sourcePath:void 0}function x(e){return e.kind===`repair`&&e.status!==`committed`}function S(e){let t=u(e);return t?.kind===`explicit`?t.path:void 0}function C(e){return u(e)?.force===!0}function w(e){return e?.scriptPublication??c}function T(e){let t=w(e);return t.kind===`authoring`&&t.status===`armed`}function E(e,t){e.scriptPublication=m({path:t.path===void 0?void 0:r(t.path),force:t.force===!0})}function D(e){e.scriptPublication=h(w(e))}function O(e){return f(w(e))}function k(e,t){if(!t.saveScript||d(w(e)))return;let n={path:typeof t.saveScript==`string`?r(t.saveScript):void 0,force:t.force===!0},i=w(e);if(i.kind===`repair`){e.scriptPublication=_(i,{requested:n,boundary:i.boundary,sourcePath:i.sourcePath});return}if(i.kind===`authoring`){e.scriptPublication={...i,target:l(i.target,n)};return}e.scriptPublication=m(n)}function A(e,t){let n=w(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:l(n.target,{path:t.explicitPath===void 0?void 0:r(t.explicitPath),force:t.liveForce===!0})})}function j(e,t){e.scriptPublication=g(w(e),t)}function M(e,t){let n=w(e);n.kind===`authoring`&&(e.scriptPublication=g(n,t))}function N(e,t){return t===!0||C(w(e))}function P(e){return p(w(e))}function F(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const ae=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),I=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),L=new Set([`cost`,`evidence`,`resolution`,`settle`]),R=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),z=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function B(e,t,n){if(!e)return e;let r=le(e.selectorChain),i=e=>q(e,t);return{...J(e,e=>ce(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function V(e,t){if(!e)return e;let n=Z(t);return J(e,e=>Q(e,n),e=>G(e,t))}function H(e,t){if(!e)return e;let n=Z(t);return{...e,...e.label===void 0?{}:{label:Q(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:Q(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:Q(e.scrollRegion.label,n)}}}:{}}}function U(e,t){return!!(e.label!==void 0&&W(e.label,t)||e.ancestry.some(e=>e.label&&W(e.label,t))||e.scrollRegion?.label&&W(e.scrollRegion.label,t))}function W(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function G(e,t){for(let n of t.keys())if(q(e,n))return!0;return!1}function K(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function q(e,n){return t(e,n)}function J(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[ae.has(e)?e:t(e),oe(r,e,t,n)]))}function oe(e,t,n,r){return typeof e==`string`&&I.has(t)?e:t===`selectorChain`&&$(e)?se(e,r):Y(e,n,r,L.has(t)?t:void 0)}function Y(e,t,n,r){if(typeof e==`string`)return r&&z.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>Y(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?R.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),Y(a,t,n,o?`${r}.${e}`:void 0)]}))}function se(e,t){return e.filter(e=>!t(e))}function ce(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}const X=/\$\{[A-Z_][A-Z0-9_]*\}/y;function Z(e){return[...e].sort(([e],[t])=>t.length-e.length)}function Q(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){X.lastIndex=r;let t=X.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function $(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function le(e){return $(e)?e:void 0}export{S as A,te as C,ie as D,y as E,o as M,a as N,b as O,f as S,v as T,c as _,U as a,ne as b,k as c,T as d,O as f,A as g,M as h,H as i,s as j,C as k,E as l,j as m,K as n,F as o,P as p,V as r,D as s,B as t,N as u,re as v,x as w,ee as x,_ as y};
|