agent-device 0.21.23 → 0.21.25
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 +6 -6
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.25.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
- package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
- package/apple/snapshot-bridge/README.md +9 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +50 -106
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
- package/dist/src/absence-observation-errors.js +1 -0
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +2 -2
- package/dist/src/adb.js +1 -1
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/alert.js +1 -1
- package/dist/src/android-adb.d.ts +3 -2
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android-system-surface-disclosure.js +1 -0
- package/dist/src/android-text-entry.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/app-backend.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory.d.ts +4 -0
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +4 -3
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-resolution-facade.js +1 -1
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state-runtime.d.ts +15 -0
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/aws-device-farm-connection.js +1 -0
- package/dist/src/back-mode.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/browserstack-connection.js +1 -0
- package/dist/src/capture-disclosure.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +36 -17
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +3 -1
- package/dist/src/cli.js +3 -4
- package/dist/src/client-companion-tunnel.js +1 -0
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +15 -7
- package/dist/src/cloud-artifacts.d.ts +3 -2
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/code-signature.js +1 -1
- package/dist/src/command-metadata.js +73 -1
- package/dist/src/command-policy.js +1 -0
- 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/connection-runtime.js +1 -1
- package/dist/src/connection-verification.js +1 -0
- 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-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-liveness-probe.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/daemon-registration-owner.js +1 -1
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-resolution.js +3 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-input-state.d.ts +6 -17
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-readiness-runtime.js +1 -1
- package/dist/src/device-release.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-shell.js +1 -1
- package/dist/src/device.js +3 -1
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/durable-capture-resource.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/exec.js +1 -1
- package/dist/src/expo-dev-client-launch.js +1 -0
- package/dist/src/file.js +3 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/gesture-admission.js +1 -1
- package/dist/src/gesture-plan-types.d.ts +2 -5
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/human-control.js +1 -1
- package/dist/src/ime-rebind.js +1 -1
- package/dist/src/ime-state.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +2 -2
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-error.js +1 -0
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +5 -1
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/inventory.js +2 -2
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory6.js +1 -1
- package/dist/src/io.d.ts +2 -2
- package/dist/src/ios-client.js +1 -1
- package/dist/src/ios-settings.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-adapter.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/keyed-lock.js +1 -1
- package/dist/src/launch-confirmation.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +5 -564
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/load.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/log-stream.js +9 -9
- package/dist/src/mechanics.js +16 -16
- 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/observability.js +1 -1
- package/dist/src/observation.js +1 -2
- package/dist/src/open-target-resolution.js +1 -1
- package/dist/src/output-path.js +1 -1
- package/dist/src/overlay.js +1 -3
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime.js +1 -1
- package/dist/src/perf-target.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-apple-resources.js +1 -0
- package/dist/src/platform-runtime-claim-recovery.js +1 -0
- package/dist/src/platform-runtime-daemon-services.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -1
- 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-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.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-web-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/plugin.js +1 -0
- package/dist/src/plugins/webdriver.d.ts +111 -0
- package/dist/src/plugins/webdriver.js +1 -0
- package/dist/src/plugins.d.ts +2 -1
- package/dist/src/plugins2.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-resize.js +1 -0
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/process-entry.js +1 -1
- package/dist/src/process-exit.js +1 -1
- package/dist/src/process.js +1 -1
- package/dist/src/provider-credential-fingerprint.js +1 -1
- package/dist/src/provider-device-admission.js +1 -1
- package/dist/src/provider-device-runtime.d.ts +556 -0
- package/dist/src/provider-policy.js +1 -0
- package/dist/src/provider-profile-fields.js +1 -1
- package/dist/src/provider-webdriver.js +1 -2
- package/dist/src/proxy.js +2 -2
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-devtools.js +2 -0
- package/dist/src/react-native-overlay2.js +3 -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/recording.js +2 -2
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/remote-bridge.js +1 -0
- package/dist/src/remote-config-core.js +1 -0
- package/dist/src/remote-config.js +1 -1
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-backend-registry.js +1 -0
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay-maestro-backend.js +117 -0
- package/dist/src/replay-script-selection.js +1 -0
- package/dist/src/replay.js +1 -3
- package/dist/src/replay2.js +1 -0
- package/dist/src/reporting.js +3 -3
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-providers.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/result-serialization.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/retry2.js +1 -0
- package/dist/src/runner-artifact-manifest.js +1 -1
- package/dist/src/runner-cache-retention.js +1 -0
- package/dist/src/runner-cache-trim.js +1 -0
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-device-readiness.js +1 -1
- package/dist/src/runner-device-set.js +1 -0
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-lease.js +1 -0
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-retention.js +1 -0
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-startup-transport.js +1 -0
- package/dist/src/runner-toolchain-probe.js +2 -0
- package/dist/src/runner.js +2 -1
- package/dist/src/runtime-command-surface.js +1 -0
- package/dist/src/runtime-deployment.js +1 -0
- package/dist/src/runtime-factory.js +1 -0
- package/dist/src/runtime-session.js +1 -0
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +2 -1
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -5
- 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/screen-recording-transport.js +1 -1
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-image.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot3.js +5 -5
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +20 -29
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.d.ts +4 -2
- package/dist/src/sdk-remote-config.d.ts +4 -0
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +5 -6
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-pipeline-policy.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-replay-runtime-failure-response.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -1
- package/dist/src/simctl-settings.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-boot.js +1 -1
- package/dist/src/simulator-state.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -1
- package/dist/src/snapshot-chrome.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-evidence.js +1 -0
- package/dist/src/snapshot-node-lookup.js +1 -0
- package/dist/src/snapshot-occlusion.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/src.js +5 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +2 -1
- package/dist/src/store.js +1 -1
- package/dist/src/surface-snapshot2.js +1 -1
- package/dist/src/target-evidence-tree.js +1 -0
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.js +1 -1
- package/dist/src/tree.js +1 -1
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/undici.js +8 -8
- package/dist/src/update-check.js +1 -1
- package/dist/src/vars.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/wait.js +1 -0
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/package.json +22 -19
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.manifest.json +0 -16
- package/dist/src/adb-transport.js +0 -1
- package/dist/src/alert-runtime.js +0 -1
- package/dist/src/app-deployment-resolution.js +0 -2
- package/dist/src/app-inventory-contract.js +0 -1
- package/dist/src/app-log-session-resource.js +0 -1
- package/dist/src/application-lifecycle-runtime.js +0 -1
- package/dist/src/auth-session.js +0 -1
- package/dist/src/cache.js +0 -1
- package/dist/src/capabilities.js +0 -1
- package/dist/src/capture.js +0 -1
- package/dist/src/catalog.js +0 -1
- package/dist/src/click-button.js +0 -1
- package/dist/src/client-metro-companion.js +0 -1
- package/dist/src/client-options.js +0 -3
- package/dist/src/compatibility-policy.js +0 -1
- package/dist/src/daemon-artifacts.js +0 -1
- package/dist/src/daemon-client-transport.js +0 -1
- package/dist/src/daemon-http.js +0 -1
- package/dist/src/device-claim-rule.js +0 -1
- package/dist/src/device-rotation.js +0 -1
- package/dist/src/device-session.js +0 -3
- package/dist/src/device2.js +0 -1
- package/dist/src/device3.js +0 -3
- package/dist/src/dispatch-resolve.js +0 -4
- package/dist/src/format.js +0 -1
- package/dist/src/gesture-plan-types.js +0 -1
- package/dist/src/host.js +0 -1
- package/dist/src/human-control-contract.js +0 -1
- package/dist/src/interaction-ref-policy.js +0 -1
- package/dist/src/interactor-operation-binding.js +0 -1
- package/dist/src/keyboard-actions.js +0 -1
- package/dist/src/lease-context.js +0 -1
- package/dist/src/lease-registry-scope.js +0 -1
- package/dist/src/lease-scope.js +0 -1
- package/dist/src/managed-device-scope.js +0 -1
- package/dist/src/observe-until.js +0 -1
- package/dist/src/output-common.js +0 -5
- package/dist/src/owner-identity.js +0 -3
- package/dist/src/path-resolution.js +0 -1
- package/dist/src/perf-runtime-plan.js +0 -1
- package/dist/src/platform-runtime-app-log-process.js +0 -1
- package/dist/src/platform-runtime-managed-owner.js +0 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
- package/dist/src/png.js +0 -1
- package/dist/src/prepare-kind.js +0 -1
- package/dist/src/provider-device-runtimes.js +0 -1
- package/dist/src/provider-session-ownership.js +0 -2
- package/dist/src/providers.js +0 -1
- package/dist/src/registry.js +0 -68
- package/dist/src/request-admission.js +0 -1
- package/dist/src/request-cancellation.js +0 -1
- package/dist/src/request-progress-protocol.js +0 -1
- package/dist/src/runner-cache-metadata.js +0 -3
- package/dist/src/runner-disposal.js +0 -1
- package/dist/src/runner-session-types.js +0 -1
- package/dist/src/runtime-admission.js +0 -1
- package/dist/src/screen-recording-admission-ledger.js +0 -1
- package/dist/src/screen-recording-resource-recovery.js +0 -1
- package/dist/src/screenshot-result.js +0 -1
- package/dist/src/script.js +0 -1
- package/dist/src/scroll-command.js +0 -1
- package/dist/src/scroll-gesture.js +0 -1
- package/dist/src/scroll-indicator.js +0 -1
- package/dist/src/session-artifact-paths.js +0 -1
- package/dist/src/session-paths.js +0 -1
- package/dist/src/session-repair-tombstone.js +0 -1
- package/dist/src/session-routing.js +0 -1
- package/dist/src/session-snapshot.js +0 -1
- package/dist/src/snapshot4.js +0 -1
- package/dist/src/src4.js +0 -1
- package/dist/src/src5.js +0 -1
- package/dist/src/src6.js +0 -1
- package/dist/src/src7.js +0 -2
- package/dist/src/src8.js +0 -115
- package/dist/src/string-enum.js +0 -1
- package/dist/src/success-text.js +0 -1
- package/dist/src/timeouts.js +0 -1
- package/dist/src/touch-reference-frame.js +0 -1
- package/dist/src/transport.js +0 -3
- package/dist/src/ttl-memo.js +0 -1
- package/dist/src/verified-file.js +0 -1
- package/dist/src/viewport.js +0 -1
- package/dist/src/window-state.js +0 -1
- /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
package/dist/src/interaction2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as e,J as t,M as n,P as r,X as i,f as a,h as o,s}from"./sdk-contracts.js";import{m as c}from"./sdk-batch-runner.js";import{r as l}from"./diagnostics.js";import"./diagnostics2.js";import{m as u,w as d}from"./sdk-device.js";import{g as f,h as p,m as ee,w as te}from"./sdk-batch.js";import{c as ne,o as re}from"./scroll-gesture.js";import{C as m,E as ie,S as ae,v as oe,x as h}from"./script.js";import{c as se}from"./target-evidence.js";import{F as ce,n as g,p as _}from"./provider-device-admission.js";import{S as le,v as ue}from"./runtime.js";import{n as v}from"./catalog.js";import{r as de}from"./success-text.js";import{i as y,n as fe,r as pe}from"./click-button.js";import{r as me,t as he}from"./interaction-positionals.js";import{t as ge}from"./timeouts.js";import"./retry.js";import"./gesture-plan.js";import{r as _e}from"./request-cancel.js";import"./request.js";import{A as b,N as x,O as ve,i as S,n as C,r as ye}from"./session-snapshot.js";import{n as w,t as T}from"./touch-reference-frame.js";import{c as be,s as xe}from"./quality-warnings.js";import{a as E,n as D,o as Se,t as O}from"./internal/daemon.js";import{a as k,c as Ce,i as we,l as Te,n as A,o as j,r as M,s as Ee,t as De,u as N}from"./interaction-ref-policy.js";import{n as Oe,t as ke}from"./touch-runtime2.js";import{t as P}from"./gesture-runtime.js";import{d as Ae,g as F,i as je,r as Me,u as Ne}from"./selector-runtime.js";import{n as Pe}from"./type-text-runtime.js";function Fe(e){let t=e.flags?.recordAs;if(t!==void 0){if(ce(t),e.flags?.noRecord)throw new r(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!e.isSessionRecording&&!e.replayPlanStep)throw new r(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}async function I(e,t){if(!ve(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(e.sessionRef,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){l({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function L(e,t){return!u(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:s(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Ie=new Set(f()),Le=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function R(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Le.has(e)))}function Re(e){return Be({fields:ze(e.command),input:e.input??{},data:R(e.data),controlledFields:Ie})}function ze(e){let t=te(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Be(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Ve(e){let{ref:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a,observation:o}=e,s=r.resolveCurrent(t);if(!s)return;let c=s.screenRecording;if(!c)return;let l=c.handle,u=e=>{if(!(!e||r.resolveCurrent(t)?.screenRecording!==c))return l.setTouchReferenceFrame(e),e},d=l.inspect().touchReferenceFrame;if(d)return d;if(s.device.platform===`android`&&!s.lease?.leaseProvider&&!g(s.device)){if(!o)throw Error(`Android observation was not injected into the request`);let e=await o.readScreenSize(s.device);return u({referenceWidth:e.width,referenceHeight:e.height})}let f=T(s.snapshot);if(f)return u(f);let p=await a(t,n,r,i,{interactiveOnly:!0});return u(T(p))}async function He(e){try{return await Ve(e)}catch(t){let n=e.sessionStore.resolveCurrent(e.ref);if(!n)return;l({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:n.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function z(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=We(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ue({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...de(o)})}function Ue(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function We(e,t,n){let r=B(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Ge(t,n),a=Ke(e);if(a)return Je(a,e??{},i);if(i)return qe(e,i)}function B(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Ge(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ke(e){let t=B(e,`ref`);return t===void 0?B(e,`selector`):`@${t}`}function qe(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:e?.gesture===`hover`?`Hovered${t}`:`Tapped${t}`}function Je(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:t.gesture===`hover`?`Hovered ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}function V(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function H(e,t){let n=V(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=F(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:s(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ye(e){let t=V(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...tt(e[2])};let n=et(e),r=H(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function U(e){return{ok:!1,response:s(`INVALID_ARGS`,`fill requires text after ${e} (use "" to clear the field)`)}}function Xe(e){let t=Ze(e);if(!t)return{ok:!1,response:s(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)};switch(t.kind){case`ref`:{let n=F(e[0]??``);return n.ok?t.text===void 0?U(`ref`):{ok:!0,target:{kind:`ref`,ref:n.ref},refGeneration:n.generation,text:t.text}:{ok:!1,response:n.response}}case`point`:return t.text===void 0?U(`coordinates`):{ok:!0,target:{kind:`point`,x:t.target.x,y:t.target.y},text:t.text};case`selector`:return t.text===void 0||t.text.length>0&&!t.text.trim()?U(`selector`):{ok:!0,target:{kind:`selector`,selector:t.target.selector},text:t.text}}}function Ze(e){try{return he(e)}catch{return null}}function Qe(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:me(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function $e(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function et(e){let t=e.at(-1);return e.length>1&&nt(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function tt(e){return e===void 0?{}:{durationMs:Number(e)}}function nt(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}const rt={source:`direct-ios`,kind:`not-observed`};function W(e,t){if(!it(e))return t;let{resolution:n,...r}=t;return r}function it(e){return`dispatchPath`in e&&e.dispatchPath===`maestro-non-hittable-fallback`}function at(e){return G({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function G(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...W(t,{resolution:t.kind===`runner-payload`?rt:t.resolution}),...r??{}};return{result:z({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:z({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...W(t,Qe(i)),...ct(i.settle,e.settleRefsGeneration),...r??{}},o=z({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...st(i)}}),s=z({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=lt(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),`readiness`in i&&i.readiness&&(s.readiness=i.readiness),{result:o,responseData:s,...ot(i)}}function ot(e){let t=K(e)?.node??(`node`in e?e.node:void 0),n=`preAction`in e?e.preAction?.nodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function st(e){let t=K(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function K(e){return`recordingTarget`in e?e.recordingTarget:void 0}function ct(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function lt(e,t){return t?e?`${e} ${t}`:t:e}async function ut(e){let{params:t,result:n,publicData:r,extra:i}=e,a=n.kind===`point`?await He({ref:t.sessionRef,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession,observation:t.androidObservation}):void 0,o=t.sessionStore.resolveCurrent(t.sessionRef),s=o?n.kind===`point`?a:w(o.snapshot?.nodes??[]):void 0,c=o?n:{...n,settle:void 0};return G({source:{kind:`runtime`,result:c,publicData:r},referenceFrame:s,extra:i,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:C(t.sessionRef,t.sessionStore,c.settle)})}function q(e){return e.command?Re({command:e.command,input:e.flags,data:e.data}):R(e.data)}function dt(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function J(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function ft(e){let{error:t,snapshotGeneration:n,publishPartialRefs:a}=e;if(t.code!==`AMBIGUOUS_MATCH`)return t;let o=i(t.details);return o.length===0||n===void 0?t:(a(o),new r(t.code,t.message,{...t.details,refsGeneration:n},t.cause))}async function pt(e,t,n){let i=await Ne(e,n);if(i){if(i.permissionDialog)return`press ${t} opened an Android permission dialog (${i.foregroundPackage}) over ${i.expectedPackage}. ${i.hint}`;throw new r(`COMMAND_FAILED`,`press ${t} left ${e.appBundleId} and foregrounded ${i.foregroundPackage}. The tap likely escaped the app.`,i)}}function mt(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}async function Y(e){let t=e.sessionStore.resolveCurrent(e.ref);if(!t||!ht(e,t))return;let n=_t(t.snapshot);if(!n)return;let r=await vt(e,n.snapshot.snapshotQuality,n.presentation);if(!(!r||!yt(n.snapshot,r,e.command)))return St(n.snapshot,r,e.command)}function ht(t,n){return gt(t.command)&&e(t.error).code===`XCTEST_RECORDED_FAILURE`&&Ce(n,{skipPendingPostGestureStabilization:!1})}function gt(e){return e===`click`||e===`press`}function _t(e){if(!X(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){l({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=Ct(e.presentationKey);if(n){if(n.raw){l({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function vt(e,t,n){try{let r=be(t);return await e.captureSnapshotForSession(e.ref,Ot(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:_e(e.requestId)})}catch(t){l({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function yt(e,t,n){let r=bt(e,t);return r===void 0?xt(e,t,n):r?!0:(l({level:`debug`,phase:`ios_tap_failure_corroboration_identity_mismatch`,data:{command:n}}),!1)}function bt(e,t){if(e.comparisonKey!==void 0||t.comparisonKey!==void 0)return e.comparisonKey!==void 0&&e.comparisonKey===t.comparisonKey}function xt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(l({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey||(l({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function St(e,t,n){if(!X(t))return;let r=ue(e.nodes),i=ue(t.nodes);if(r.digest!==i.digest)return l({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function X(e){return!!(e&&e.nodes.length>0&&!xe(e.snapshotQuality))}function Ct(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return wt(t)}function wt(e){let t=Tt(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!Et(t.depth)||!Dt(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function Tt(e){return typeof e==`object`&&e?e:void 0}function Et(e){return e==null||typeof e==`number`}function Dt(e){return e==null||typeof e==`string`}function Ot(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function kt(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function At(e,t,n,r,i){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let a=await E({session:e,command:t,phase:`before-command`,observation:i});if(n.refContext&&a.status===`recovered`){let t=A({ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning,frame:x({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration})});if(t)return{aborted:!0,response:t}}let o=await r();return await E({session:e,command:t,phase:`after-command`,observation:i}),{aborted:!1,readiness:a,runtimeResult:o}}async function Z(t,n){if(t=N(t),!t.sessionRef)return a();let r=t.sessionStore.requireCurrent(t.sessionRef),i=k({...t,touchExecutor:n.touchExecutor}),o=Date.now();try{let e,a=await At(r,t.req.command,{refContext:n.refContext},async()=>{let t=await n.run(i);return e=await n.afterRun?.(t),t},t.androidObservation);if(a.aborted)return a.response;let{readiness:s,runtimeResult:c}=a,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await n.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...e?[e]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return j({ref:t.sessionRef,sessionStore:t.sessionStore,command:t.req.command,positionals:t.req.positionals??[],flags:t.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:o,actionFinishedAt:l,androidFreshnessBaseline:n.androidFreshnessBaseline})}catch(i){let a=ft({error:e(i),snapshotGeneration:r.snapshotGeneration,publishPartialRefs:e=>ye(r,e)});if(mt(a))throw a;return a.code===`AMBIGUOUS_MATCH`?Q(a):await jt({error:a,handlerParams:t,session:r,target:n.iosTapCorroboration?.target,extra:n.iosTapCorroboration?.extra,actionStartedAt:o,androidFreshnessBaseline:n.androidFreshnessBaseline})||Q(a)}}async function jt(e){if(!e.target)return;let t=le(e.error);if(!t&&_(e.session))return;let n=await Y({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,ref:e.handlerParams.sessionRef,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=Mt({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:w(e.session.snapshot?.nodes??[]),extra:e.extra});return j({ref:e.handlerParams.sessionRef,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function Mt(e){return e.resolvedTarget?G({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):at({targetKind:e.target.kind,point:Nt(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...kt(e.target),...e.extra??{}}})}function Nt(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function Q(e){return{ok:!1,error:t(e)}}async function Pt(e,t,n,r){let i=await Oe({device:t.device,command:n,requiresCapture:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?{ok:!0,touchExecutor:ke(i.runtime,e.contextFromFlags(e.req.flags,t.appBundleId,t.trace?.outPath))}:{ok:!1,response:O(i.response)}}async function Ft(e){e=N(e);let t=await It(e);if(`response`in t)return t.response;let{parsedTarget:n,touchExecutor:r,staleRefsWarning:i}=t.admitted,{req:a,sessionName:o}=e,s=a.internal?.replayTargetGuard;return await Z(e,{touchExecutor:r,refContext:n.target.kind===`ref`&&a.internal?.findResolvedTarget===void 0?{ref:n.target.ref,mintedGeneration:n.refGeneration,staleRefsWarning:i}:void 0,run:async e=>await e.interactions.fill(n.target,n.text,{session:o,requestId:a.meta?.requestId,delayMs:a.flags?.delayMs,allowNonHittableCoordinateFallback:a.flags?.maestro?.allowNonHittableCoordinateFallback,verify:a.flags?.verify,settle:M(a.flags),expectedResolvedTarget:s,preresolvedTarget:a.internal?.findResolvedTarget}),buildPayloads:t=>Bt({ref:e.sessionRef,sessionStore:e.sessionStore,result:t,text:n.text,flags:a.flags,staleRefsWarning:i})})}async function It(e){try{let t=await Lt(e);return`response`in t?{response:O(t.response)}:t}catch(e){throw D(e)}}async function Lt(e){let{req:t}=e,n=Rt(e);if(`response`in n)return n;let{session:r,parsedTarget:i}=n,a=await Pt(e,r,`fill`,i.target.kind!==`point`);if(!a.ok)return{response:a.response};Fe({flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0,isSessionRecording:_(r)});let o=we(`fill`,t.flags);if(o)return{response:o};let s=await zt(e,r,i.target,i.refGeneration);return s.response?{response:s.response}:{admitted:{session:r,parsedTarget:i,touchExecutor:a.touchExecutor,staleRefsWarning:s.staleRefsWarning}}}function Rt(e){let t=e.sessionStore.get(e.sessionName);if(!t)return{response:a()};let n=L(t,`fill`);if(n)return{response:n};let r=Xe(e.req.positionals??[]);return r.ok?{session:t,parsedTarget:r}:{response:r.response}}async function zt(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?S({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:A({ref:n.ref,mintedGeneration:r,staleRefsWarning:i,frame:x({session:t,ref:n.ref,mintedGeneration:r})});return o?{response:o,staleRefsWarning:i}:(await I(e,t),{staleRefsWarning:i})}function Bt(e){let{result:t,ref:n,sessionStore:r}=e,i=r.requireCurrent(n),a=J(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,t.backendResult),o=t.kind===`point`?void 0:w(i.snapshot?.nodes??[]);return G({source:{kind:`runtime`,result:t,publicData:q({command:`fill`,flags:e.flags,data:t.backendResult}),...a.used?{dispatchPath:`maestro-non-hittable-fallback`}:{}},referenceFrame:o,extra:{text:e.text,...a.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:C(n,r,t.settle)})}async function Vt(e,n,r,i){let a=e,o={selector:r.raw},s=Date.now();b(n);try{let e=await i(r)??{},t=Date.now(),n=Ut(e),c=q({command:dt(a.req.command,`press`),flags:a.req.flags,data:e}),l=J(r.allowNonHittableCoordinateFallback===!0,e),{result:u,responseData:d}=G({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:c,point:n,dispatchPath:l.used?`maestro-non-hittable-fallback`:`maestro-direct-selector`},referenceFrame:Wt(e),extra:{...o,...l.extra}});return j({ref:a.sessionRef,sessionStore:a.sessionStore,command:a.req.command,positionals:a.req.positionals??[],flags:a.req.flags,result:u,responseData:d,actionStartedAt:s,actionFinishedAt:t})}catch(e){return await Ht({error:e,handlerParams:a,extra:o,positionals:[],actionStartedAt:s})||(Ee(e,{delegateSemanticFailures:r.allowNonHittableCoordinateFallback!==!0})?(l({level:`debug`,phase:`ios_direct_selector_tap_fallback`,data:{selector:r.raw,error:e instanceof Error?e.message:String(e)}}),null):{ok:!1,error:t(e)})}}async function Ht(e){let{error:t,handlerParams:n,extra:r,positionals:i,actionStartedAt:a}=e,o=await Y({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,ref:n.sessionRef,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!o)return;let{result:s,responseData:c}=at({targetKind:`selector`,warning:o.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:r});return j({ref:n.sessionRef,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??i,flags:n.req.flags,result:s,responseData:c,actionStartedAt:a,actionFinishedAt:Date.now()})}function Ut(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Wt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Gt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return!e.tapElementSelectorAvailable||i?.maestro?.allowNonHittableCoordinateFallback!==!0||n!==`click`||r.kind!==`selector`||_(t)||Jt(i)||p(n)&&i?.verify===!0||ee(n)&&i?.settle===!0?null:Kt(t,r.selector,i)}function Kt(e,t,n){let r=Te({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const qt=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function Jt(e){return qt.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}const Yt=new Set([`press`,`click`]);async function Xt(e,t){let n=await Zt(e,t);return`response`in n?{response:O(n.response)}:n}async function Zt(e,t){let{req:n,sessionStore:r,sessionName:i}=e,o=r.get(i);if(!o)return{response:a()};let s=t===`click`?`click`:t,c=Qt(o,t,s,n.flags);if(c)return{response:c};let l=n.positionals??[],u=t===`longpress`?Ye(l):H(l,s);if(!u.ok)return{response:u.response};let d=en(o,n,u),f=nn(e,o,t,u,d);if(f.response)return{response:f.response};let p=y(n.flags);return{admitted:{session:o,commandLabel:s,clickButton:p,resultButtonTag:fe(p),target:u.target,durationMs:t===`longpress`?u.durationMs:void 0,staleRefsWarning:d,refContext:tn(n,u,d)}}}function Qt(e,t,n,r){return L(e,n)||we(t,r)||$t(e,t,n,r)}function $t(e,t,n,r){let i=y(r);if(!Yt.has(t)||i===`primary`)return;let a=pe({commandLabel:n,platform:d(e.device),button:i,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(a)return s(a.code,a.message,a.details)}function en(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return S({session:e,ref:n.target.ref,mintedGeneration:n.refGeneration})}function tn(e,t,n){if(t.target.kind===`ref`&&e.internal?.findResolvedTarget===void 0)return{ref:t.target.ref,mintedGeneration:t.refGeneration,staleRefsWarning:n}}function nn(e,t,n,r,i){let{req:a}=e;if(r.target.kind!==`ref`)return{};let o=e.refSnapshotFlagGuardResponse(n===`click`?`press`:n,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:A({ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i,frame:x({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration})});return s?{response:s}:{}}async function $(e,t){e=N(e);let n=await Xt(e,t);if(`response`in n)return n.response;let{admitted:r}=n,i=await Pt(e,r.session,t,r.target.kind!==`point`);if(!i.ok)return i.response;let{touchExecutor:a}=i,o=r.target.kind===`ref`?await I(e,r.session):void 0,s={...r,androidFreshnessBaseline:o},c=e.req.internal?.replayTargetGuard?null:Gt({session:s.session,commandLabel:s.commandLabel,target:s.target,flags:e.req.flags,tapElementSelectorAvailable:a.tapElementSelector!==void 0});if(c&&a.tapElementSelector){let t=await Vt(e,s.session,c,a.tapElementSelector);if(t)return t}return await Z(e,{...rn(e,t,s),touchExecutor:a})}function rn(e,t,n){let{req:r,sessionName:i}=e,{session:a,target:o,durationMs:s,staleRefsWarning:c,resultButtonTag:l}=n,u=t===`longpress`?{...s===void 0?{}:{durationMs:s},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l;return{androidFreshnessBaseline:n.androidFreshnessBaseline,refContext:n.refContext,iosTapCorroboration:{target:o,extra:u},run:async e=>await an({runtime:e,command:t,target:o,sessionName:i,requestId:r.meta?.requestId,clickButton:n.clickButton,flags:r.flags,durationMs:s,expectedResolvedTarget:r.internal?.replayTargetGuard,preresolvedTarget:r.internal?.findResolvedTarget}),afterRun:async t=>{if(!a.lease?.leaseProvider)return await pt(a,$e(o,t),e.androidObservation)},buildPayloads:async n=>{let i=sn(n);return await ut({params:e,result:n,staleRefsWarning:c,publicData:q({command:t===`longpress`||t===`hover`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l})}}}async function an(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c={session:i,requestId:a,settle:M(o),expectedResolvedTarget:s};switch(n){case`longpress`:return await t.interactions.longPress(r,{...c,durationMs:e.durationMs,readinessTimeoutMs:o?.readinessTimeoutMs});case`hover`:return await t.interactions.hover(r,c);case`click`:return await t.interactions.click(r,on(e,c));case`press`:return await t.interactions.press(r,on(e,c))}}function on(e,t){let{flags:n}=e;return{...t,button:e.clickButton,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap,verify:n?.verify,readinessTimeoutMs:n?.readinessTimeoutMs,preresolvedTarget:e.preresolvedTarget}}function sn(e){return`durationMs`in e?e.durationMs:void 0}function cn(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}function ln(e){return`refused`in e}async function un(e){return e=N(e),await gn(e,`gesture`,async(t,n)=>dn(e,t,n))}async function dn(e,t,n){let r=ie(e.req.input),i=vn(r,t,n);i.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(i.executionProfile=e.req.internal.gestureExecutionProfile);let a=await P({device:t.device,input:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return a.ok?pn(r,i,await fn(hn(e,a.gestures),{session:e.sessionName,requestId:e.req.meta?.requestId},i,e.req.internal),e.req.flags):{refused:a.response}}async function fn(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function pn(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:bn(e,i),flags:Dn(e,r),responseData:cn(n,{executionProfile:_n(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function mn(e){return e=N(e),await gn(e,`swipe`,async t=>{let n=xn(e.req.input),r=await P({device:t.device,input:m(n).gesture,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!r.ok)return{refused:r.response};let i=n.count??1,a=n.pauseMs??0,o=n.pattern??`one-way`,s=await Tn(hn(e,r.gestures),e,n,i,a,o);return{positionals:wn(n),flags:e.req.flags,responseData:cn(s,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:s.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:i,pauseMs:a,pattern:o})}})}function hn(e,t){return k({...e,gestures:t,pairedGestureViewport:e.req.internal?.gestureViewport})}async function gn(e,n,r){let i=e.sessionStore.get(e.sessionName);if(!i)return a();let o=Date.now();try{let t=g(i.device),a=t?{status:`clear`}:await E({session:i,command:n,phase:`before-command`,observation:e.androidObservation}),s=await r(i,a);if(ln(s))return s.refused;t||await E({session:i,command:n,phase:`after-command`,observation:e.androidObservation});let c={...s.responseData};return a.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${a.warning}`),j({ref:e.sessionRef,sessionStore:e.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:o,actionFinishedAt:Date.now()})}catch(e){return{ok:!1,error:t(e)}}}function _n(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function vn(t,n,r){let i=ae(t);if(i.intent!==`drag`)return i;try{return{...i,source:yn(i.source,n),destination:yn(i.destination,n)}}catch(t){if(r.status===`recovered`){let n=e(t),i=typeof n.details?.warning==`string`?n.details.warning+` `:``;throw n.details={...n.details,warning:i+r.warning},n}throw D(t)}}function yn(e,t){if(!e.startsWith(`@`))return e;let i=n(e);if(!i)throw new r(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:o});return De({ref:i.base,mintedGeneration:i.generation,frame:x({session:t,ref:i.base,mintedGeneration:i.generation})}),i.base}function bn(e,t){return e.kind!==`drag`||!t?h(e):h({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function xn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`swipe requires structured object input`);oe(e);let t=e,n=t.pattern;if(n!==void 0&&n!==`one-way`&&n!==`ping-pong`)throw new r(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:Cn(t.from,`swipe from`),to:Cn(t.to,`swipe to`),count:c(t,`count`,{min:1,max:200}),pauseMs:c(t,`pauseMs`,{min:0,max:re}),pattern:n};return Sn(i),i}function Sn(e){let t=e.count??1,n=e.pauseMs??0,i=t*100+Math.max(0,t-1)*n;if(!(i<=6e4))throw new r(`INVALID_ARGS`,`Swipe series must fit within ${ne}ms.`,{count:t,pauseMs:n,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function Cn(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`${t} must be a point`);let n=e;if(typeof n.x!=`number`||!Number.isFinite(n.x))throw new r(`INVALID_ARGS`,`${t} x must be finite`);if(typeof n.y!=`number`||!Number.isFinite(n.y))throw new r(`INVALID_ARGS`,`${t} y must be finite`);return{x:n.x,y:n.y}}function wn(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function Tn(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=m(En(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await ge(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function En(e,t,n){return t!==`ping-pong`||n%2!=1?e:{...e,from:e.to,to:e.from}}function Dn(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function On(e){let t={},n=e.sessionRef,r=await kn({...e,sessionRef:n,refSnapshotFlagGuardResponse:Ae,captureProof:t});return r&&se({response:r,consumedTree:t,captureProof:t})}async function kn(e){switch(e.req.command){case`press`:return await $(e,`press`);case`click`:return await $(e,`click`);case`longpress`:return await $(e,`longpress`);case`hover`:return await $(e,`hover`);case`fill`:return await Ft(e);default:return await An(e)}}async function An(e){switch(e.req.command){case v.gesture:return await un(e);case v.swipe:return await mn(e);case v.type:return await jn(e);case`get`:return await Me(e);case`is`:return await je(e);default:return null}}async function jn(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);if(!r)return a();let i=await Pe({device:r.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!i.ok)return i.response;let o=await Mn(r,e.androidObservation);return o.response?o.response:await Nn(e,r,i.typeText,o.warning)}async function Mn(e,t){if(e.device.platform===`android`&&e.screenRecording){let n=await Se({session:e,observation:t});if(n.status===`failed`)return{response:s(`COMMAND_FAILED`,`Android system dialog blocked the recording session`)};if(n.status===`unknown`)return{warning:n.warning}}return{}}async function Nn(e,n,r,i){let{req:a,sessionStore:o}=e,s=Date.now();try{let t=await E({session:n,command:a.command,phase:`before-command`,observation:e.androidObservation});b(n);let c=await r(a.positionals??[],e.contextFromFlags(a.flags,n.appBundleId,n.trace?.outPath));await E({session:n,command:a.command,phase:`after-command`,observation:e.androidObservation});let l=Date.now(),u={...c};return Pn(u,i,t),j({ref:e.sessionRef,sessionStore:o,command:a.command,positionals:a.positionals??[],flags:a.flags,result:u,responseData:u,actionStartedAt:s,actionFinishedAt:l})}catch(e){return{ok:!1,error:t(e)}}}function Pn(e,t,n){let r=[typeof e.warning==`string`?e.warning:void 0,t];n.status===`recovered`&&r.push(n.warning);let i=r.filter(e=>typeof e==`string`&&e.length>0).join(` `);i.length>0&&(e.warning=i)}export{On as handleInteractionCommands};
|
|
1
|
+
import{I as e,M as t,P as n,Y as r,f as i,h as a,s as o}from"./sdk-contracts.js";import{H as s,Q as c,X as l}from"./tv-remote.js";import{m as u}from"./sdk-batch-runner.js";import{E as d,Z as f,a as p,at as m,et as h,i as ee,nt as g,r as te,tt as ne}from"./back-mode.js";import{r as _}from"./diagnostics.js";import"./diagnostics2.js";import{E as re,g as ie}from"./sdk-device.js";import{g as ae,h as oe,m as se,w as ce}from"./sdk-batch.js";import{r as le,t as ue}from"./interaction-positionals.js";import{i as de}from"./retry.js";import"./retry2.js";import"./gesture-plan.js";import{c as v,s as y}from"./replay-script-selection.js";import{r as fe}from"./request-cancel.js";import"./request.js";import{n as b}from"./provider-device-admission.js";import{Q as pe,Ut as x,X as me,Z as S,it as C,n as w,t as T,tn as he,tt as E}from"./internal/daemon.js";import{n as ge,t as _e}from"./snapshot-quality-verdict.js";import{r as ve,t as D}from"./snapshot-evidence.js";import{l as ye,s as O,u as k}from"./runtime-session.js";import{n as be}from"./capture-disclosure.js";import{a as xe,bindInteractionSession as A,finalizeTouchInteraction as j,i as Se,n as M,r as Ce,readSettleRequest as N,refMutationAdmissionResponse as P,settleFlagGuardResponse as F,t as we}from"./interaction.js";import{n as Te,t as Ee}from"./touch-runtime2.js";import{t as I}from"./gesture-runtime.js";import{d as De,g as L,i as Oe,r as ke,u as Ae}from"./selector-runtime.js";import{n as je}from"./type-text-runtime.js";function Me(e){let t=e.flags?.recordAs;if(t===void 0){Ne(e);return}if(he(t),e.flags?.noRecord)throw new n(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!e.isSessionRecording&&!e.replayPlanStep)throw new n(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}function Ne(e){if(!(e.flags?.textStdin!==!0||e.flags.noRecord)&&e.isSessionRecording)throw new n(`INVALID_ARGS`,`fill --text-stdin needs --record-as <VAR> or --no-record while script recording is armed, so the stdin text is not published in the script.`,{reason:`fill_text_stdin_unparameterized_recording`})}async function R(e,t){if(!me(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(e.sessionRef,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){_({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function z(e,t){return!ie(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:o(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Pe=new Set(ae()),Fe=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function Ie(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Fe.has(e)))}function Le(e){return ze({fields:Re(e.command),input:e.input??{},data:Ie(e.data),controlledFields:Pe})}function Re(e){let t=ce(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function ze(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Be(e){let{ref:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a,observation:o}=e,s=r.resolveCurrent(t);if(!s)return;let c=s.screenRecording;if(!c)return;let l=c.handle,u=e=>{if(!(!e||r.resolveCurrent(t)?.screenRecording!==c))return l.setTouchReferenceFrame(e),e},d=l.inspect().touchReferenceFrame;if(d)return d;if(s.device.platform===`android`&&!s.lease?.leaseProvider&&!b(s.device)){if(!o)throw Error(`Android observation was not injected into the request`);let e=await o.readScreenSize(s.device);return u({referenceWidth:e.width,referenceHeight:e.height})}let f=y(s.snapshot);if(f)return u(f);let p=await a(t,n,r,i,{interactiveOnly:!0});return u(y(p))}async function Ve(e){try{return await Be(e)}catch(t){let n=e.sessionStore.resolveCurrent(e.ref);if(!n)return;_({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:n.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function B(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=Ue(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return He({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...s(o)})}function He(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function Ue(e,t,n){let r=V(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=We(t,n),a=Ge(e);if(a)return qe(a,e??{},i);if(i)return Ke(e,i)}function V(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function We(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ge(e){let t=V(e,`ref`);return t===void 0?V(e,`selector`):`@${t}`}function Ke(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:e?.gesture===`hover`?`Hovered${t}`:`Tapped${t}`}function qe(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:t.gesture===`hover`?`Hovered ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}function H(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function U(e,t){let n=H(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=L(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:o(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Je(e){let t=H(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...et(e[2])};let n=$e(e),r=U(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function W(e){return{ok:!1,response:o(`INVALID_ARGS`,`fill requires text after ${e} (use "" to clear the field)`)}}function Ye(e){let t=Xe(e);if(!t)return{ok:!1,response:o(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)};switch(t.kind){case`ref`:{let n=L(e[0]??``);return n.ok?t.text===void 0?W(`ref`):{ok:!0,target:{kind:`ref`,ref:n.ref},refGeneration:n.generation,text:t.text}:{ok:!1,response:n.response}}case`point`:return t.text===void 0?W(`coordinates`):{ok:!0,target:{kind:`point`,x:t.target.x,y:t.target.y},text:t.text};case`selector`:return t.text===void 0||t.text.length>0&&!t.text.trim()?W(`selector`):{ok:!0,target:{kind:`selector`,selector:t.target.selector},text:t.text}}}function Xe(e){try{return ue(e)}catch{return null}}function Ze(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:le(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Qe(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function $e(e){let t=e.at(-1);return e.length>1&&tt(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function et(e){return e===void 0?{}:{durationMs:Number(e)}}function tt(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}const nt={source:`direct-ios`,kind:`not-observed`};function G(e,t){if(!rt(e))return t;let{resolution:n,...r}=t;return r}function rt(e){return`dispatchPath`in e&&e.dispatchPath===`maestro-non-hittable-fallback`}function K(e){return q({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function q(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...G(t,{resolution:t.kind===`runner-payload`?nt:t.resolution}),...r??{}};return{result:B({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:B({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...G(t,Ze(i)),...ot(i.settle,e.settleRefsGeneration),...r??{}},o=B({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...at(i)}}),s=B({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=st(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),`readiness`in i&&i.readiness&&(s.readiness=i.readiness),{result:o,responseData:s,...it(i)}}function it(e){let t=J(e)?.node??(`node`in e?e.node:void 0),n=`preAction`in e?e.preAction?.nodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function at(e){let t=J(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function J(e){return`recordingTarget`in e?e.recordingTarget:void 0}function ot(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function st(e,t){return t?e?`${e} ${t}`:t:e}async function ct(e){let{params:t,result:n,publicData:r,extra:i}=e,a=n.kind===`point`?await Ve({ref:t.sessionRef,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession,observation:t.androidObservation}):void 0,o=t.sessionStore.resolveCurrent(t.sessionRef),s=o?n.kind===`point`?a:v(o.snapshot?.nodes??[]):void 0,c=o?n:{...n,settle:void 0};return q({source:{kind:`runtime`,result:c,publicData:r},referenceFrame:s,extra:i,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:O(t.sessionRef,t.sessionStore,c.settle)})}function Y(e){return e.command?Le({command:e.command,input:e.flags,data:e.data}):Ie(e.data)}function lt(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function X(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}async function ut(e,t,r){let i=await Ae(e,r);if(i){if(i.permissionDialog)return`press ${t} opened an Android permission dialog (${i.foregroundPackage}) over ${i.expectedPackage}. ${i.hint}`;throw new n(`COMMAND_FAILED`,`press ${t} left ${e.appBundleId} and foregrounded ${i.foregroundPackage}. The tap likely escaped the app.`,i)}}function dt(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}async function Z(e){let t=e.sessionStore.resolveCurrent(e.ref);if(!t||!ft(e,t))return;let n=mt(t.snapshot);if(!n)return;let r=await ht(e,n.snapshot.snapshotQuality,n.presentation);if(!(!r||!gt(n.snapshot,r,e.command)))return yt(n.snapshot,r,e.command)}function ft(t,n){return pt(t.command)&&e(t.error).code===`XCTEST_RECORDED_FAILURE`&&Se(n,{skipPendingPostGestureStabilization:!1})}function pt(e){return e===`click`||e===`press`}function mt(e){if(!Q(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){_({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=bt(e.presentationKey);if(n){if(n.raw){_({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function ht(e,t,n){try{let r=ge(t);return await e.captureSnapshotForSession(e.ref,Tt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:fe(e.requestId)})}catch(t){_({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function gt(e,t,n){let r=_t(e,t);return r===void 0?vt(e,t,n):r?!0:(_({level:`debug`,phase:`ios_tap_failure_corroboration_identity_mismatch`,data:{command:n}}),!1)}function _t(e,t){if(e.comparisonKey!==void 0||t.comparisonKey!==void 0)return e.comparisonKey!==void 0&&e.comparisonKey===t.comparisonKey}function vt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(_({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey||(_({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function yt(e,t,n){if(!Q(t))return;let r=D(e.nodes),i=D(t.nodes);if(r.digest!==i.digest)return _({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function Q(e){return!!(e&&e.nodes.length>0&&!_e(e.snapshotQuality))}function bt(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return xt(t)}function xt(e){let t=St(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!Ct(t.depth)||!wt(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function St(e){return typeof e==`object`&&e?e:void 0}function Ct(e){return e==null||typeof e==`number`}function wt(e){return e==null||typeof e==`string`}function Tt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function Et(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function Dt(e,t,n,r,i){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let a=await S({session:e,command:t,phase:`before-command`,observation:i});if(n.refContext&&a.status===`recovered`){let t=P({ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning,frame:C({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration})});if(t)return{aborted:!0,response:t}}let o=await r();return await S({session:e,command:t,phase:`after-command`,observation:i}),{aborted:!1,readiness:a,runtimeResult:o}}async function Ot(t,n){if(t=A(t),!t.sessionRef)return i();let r=t.sessionStore.requireCurrent(t.sessionRef),a={},o=await M({...t,touchExecutor:n.touchExecutor,consumedCapture:a}),s=Date.now();try{let e,i=await Dt(r,t.req.command,{refContext:n.refContext},async()=>{let t=await n.run(o);return e=await n.afterRun?.(t),t},t.androidObservation);if(i.aborted)return i.response;let{readiness:a,runtimeResult:c}=i,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await n.buildPayloads(c),p=[...a.status===`recovered`?[a.warning]:[],...e?[e]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return j({ref:t.sessionRef,sessionStore:t.sessionStore,command:t.req.command,positionals:t.req.positionals??[],flags:t.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:s,actionFinishedAt:l,androidFreshnessBaseline:n.androidFreshnessBaseline})}catch(i){let o=ye(t.sessionRef,t.sessionStore,e(i),a.state);if(dt(o))throw o;return o.code===`AMBIGUOUS_MATCH`?Mt(o):await kt({error:o,handlerParams:t,session:r,target:n.iosTapCorroboration?.target,extra:n.iosTapCorroboration?.extra,actionStartedAt:s,androidFreshnessBaseline:n.androidFreshnessBaseline})||Mt(o)}}async function kt(e){if(!e.target)return;let t=ve(e.error);if(!t&&x(e.session))return;let n=await Z({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,ref:e.handlerParams.sessionRef,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=At({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:v(e.session.snapshot?.nodes??[]),extra:e.extra});return j({ref:e.handlerParams.sessionRef,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function At(e){return e.resolvedTarget?q({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):K({targetKind:e.target.kind,point:jt(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...Et(e.target),...e.extra??{}}})}function jt(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function Mt(e){return{ok:!1,error:r(e)}}async function Nt(e,t,n,r){let i=await Te({device:t.device,command:n,requiresCapture:r,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return i.ok?{ok:!0,touchExecutor:Ee(i.runtime,e.contextFromFlags(e.req.flags,t.appBundleId,t.trace?.outPath))}:{ok:!1,response:T(i.response)}}async function Pt(e){e=A(e);let t=await Ft(e);if(`response`in t)return t.response;let{parsedTarget:n,touchExecutor:r,staleRefsWarning:i}=t.admitted,{req:a,sessionName:o}=e,s=a.internal?.replayTargetGuard;return await Ot(e,{touchExecutor:r,refContext:n.target.kind===`ref`&&a.internal?.findResolvedTarget===void 0?{ref:n.target.ref,mintedGeneration:n.refGeneration,staleRefsWarning:i}:void 0,run:async e=>await e.interactions.fill(n.target,n.text,{session:o,requestId:a.meta?.requestId,delayMs:a.flags?.delayMs,allowNonHittableCoordinateFallback:a.flags?.maestro?.allowNonHittableCoordinateFallback,verify:a.flags?.verify,settle:N(a.flags),expectedResolvedTarget:s,preresolvedTarget:a.internal?.findResolvedTarget}),buildPayloads:t=>zt({ref:e.sessionRef,sessionStore:e.sessionStore,result:t,text:n.text,flags:a.flags,staleRefsWarning:i})})}async function Ft(e){try{let t=await It(e);return`response`in t?{response:T(t.response)}:t}catch(e){throw w(e)}}async function It(e){let{req:t}=e,n=Lt(e);if(`response`in n)return n;let{session:r,parsedTarget:i}=n,a=await Nt(e,r,`fill`,i.target.kind!==`point`);if(!a.ok)return{response:a.response};Me({flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0,isSessionRecording:x(r)});let o=F(`fill`,t.flags);if(o)return{response:o};let s=await Rt(e,r,i.target,i.refGeneration);return s.response?{response:s.response}:{admitted:{session:r,parsedTarget:i,touchExecutor:a.touchExecutor,staleRefsWarning:s.staleRefsWarning}}}function Lt(e){let t=e.sessionStore.get(e.sessionName);if(!t)return{response:i()};let n=z(t,`fill`);if(n)return{response:n};let r=Ye(e.req.positionals??[]);return r.ok?{session:t,parsedTarget:r}:{response:r.response}}async function Rt(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?k({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:P({ref:n.ref,mintedGeneration:r,staleRefsWarning:i,frame:C({session:t,ref:n.ref,mintedGeneration:r})});return o?{response:o,staleRefsWarning:i}:(await R(e,t),{staleRefsWarning:i})}function zt(e){let{result:t,ref:n,sessionStore:r}=e,i=r.requireCurrent(n),a=X(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,t.backendResult),o=t.kind===`point`?void 0:v(i.snapshot?.nodes??[]);return q({source:{kind:`runtime`,result:t,publicData:Y({command:`fill`,flags:e.flags,data:t.backendResult}),...a.used?{dispatchPath:`maestro-non-hittable-fallback`}:{}},referenceFrame:o,extra:{text:e.text,...a.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:O(n,r,t.settle)})}async function Bt(e,t,n,i){let a=e,o={selector:n.raw},s=Date.now();E(t);try{let e=await i(n)??{},t=Date.now(),r=Ht(e),c=Y({command:lt(a.req.command,`press`),flags:a.req.flags,data:e}),l=X(n.allowNonHittableCoordinateFallback===!0,e),{result:u,responseData:d}=q({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:c,point:r,dispatchPath:l.used?`maestro-non-hittable-fallback`:`maestro-direct-selector`},referenceFrame:Ut(e),extra:{...o,...l.extra}});return j({ref:a.sessionRef,sessionStore:a.sessionStore,command:a.req.command,positionals:a.req.positionals??[],flags:a.req.flags,result:u,responseData:d,actionStartedAt:s,actionFinishedAt:t})}catch(e){return await Vt({error:e,handlerParams:a,extra:o,positionals:[],actionStartedAt:s})||(Ce(e,{delegateSemanticFailures:n.allowNonHittableCoordinateFallback!==!0})?(_({level:`debug`,phase:`ios_direct_selector_tap_fallback`,data:{selector:n.raw,error:e instanceof Error?e.message:String(e)}}),null):{ok:!1,error:r(e)})}}async function Vt(e){let{error:t,handlerParams:n,extra:r,positionals:i,actionStartedAt:a}=e,o=await Z({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,ref:n.sessionRef,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!o)return;let{result:s,responseData:c}=K({targetKind:`selector`,warning:o.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:r});return j({ref:n.sessionRef,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??i,flags:n.req.flags,result:s,responseData:c,actionStartedAt:a,actionFinishedAt:Date.now()})}function Ht(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Ut(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Wt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return!e.tapElementSelectorAvailable||i?.maestro?.allowNonHittableCoordinateFallback!==!0||n!==`click`||r.kind!==`selector`||x(t)||qt(i)||oe(n)&&i?.verify===!0||se(n)&&i?.settle===!0?null:Gt(t,r.selector,i)}function Gt(e,t,n){let r=xe({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const Kt=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function qt(e){return Kt.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}const Jt=new Set([`press`,`click`]);async function Yt(e,t){let n=await Xt(e,t);return`response`in n?{response:T(n.response)}:n}async function Xt(e,t){let{req:n,sessionStore:r,sessionName:a}=e,o=r.get(a);if(!o)return{response:i()};let s=t===`click`?`click`:t,c=Zt(o,t,s,n.flags);if(c)return{response:c};let l=n.positionals??[],u=t===`longpress`?Je(l):U(l,s);if(!u.ok)return{response:u.response};let d=$t(o,n,u),f=tn(e,o,t,u,d);if(f.response)return{response:f.response};let m=p(n.flags);return{admitted:{session:o,commandLabel:s,clickButton:m,resultButtonTag:te(m),target:u.target,durationMs:t===`longpress`?u.durationMs:void 0,staleRefsWarning:d,refContext:en(n,u,d)}}}function Zt(e,t,n,r){return z(e,n)||F(t,r)||Qt(e,t,n,r)}function Qt(e,t,n,r){let i=p(r);if(!Jt.has(t)||i===`primary`)return;let a=ee({commandLabel:n,platform:re(e.device),button:i,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(a)return o(a.code,a.message,a.details)}function $t(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return k({session:e,ref:n.target.ref,mintedGeneration:n.refGeneration})}function en(e,t,n){if(t.target.kind===`ref`&&e.internal?.findResolvedTarget===void 0)return{ref:t.target.ref,mintedGeneration:t.refGeneration,staleRefsWarning:n}}function tn(e,t,n,r,i){let{req:a}=e;if(r.target.kind!==`ref`)return{};let o=e.refSnapshotFlagGuardResponse(n===`click`?`press`:n,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:P({ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i,frame:C({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration})});return s?{response:s}:{}}async function $(e,t){e=A(e);let n=await Yt(e,t);if(`response`in n)return n.response;let{admitted:r}=n,i=await Nt(e,r.session,t,r.target.kind!==`point`);if(!i.ok)return i.response;let{touchExecutor:a}=i,o=r.target.kind===`ref`?await R(e,r.session):void 0,s={...r,androidFreshnessBaseline:o},c=e.req.internal?.replayTargetGuard?null:Wt({session:s.session,commandLabel:s.commandLabel,target:s.target,flags:e.req.flags,tapElementSelectorAvailable:a.tapElementSelector!==void 0});if(c&&a.tapElementSelector){let t=await Bt(e,s.session,c,a.tapElementSelector);if(t)return t}return await Ot(e,{...nn(e,t,s),touchExecutor:a})}function nn(e,t,n){let{req:r,sessionName:i}=e,{session:a,target:o,durationMs:s,staleRefsWarning:c,resultButtonTag:l}=n,u=t===`longpress`?{...s===void 0?{}:{durationMs:s},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l;return{androidFreshnessBaseline:n.androidFreshnessBaseline,refContext:n.refContext,iosTapCorroboration:{target:o,extra:u},run:async e=>await rn({runtime:e,command:t,target:o,sessionName:i,requestId:r.meta?.requestId,clickButton:n.clickButton,flags:r.flags,durationMs:s,expectedResolvedTarget:r.internal?.replayTargetGuard,preresolvedTarget:r.internal?.findResolvedTarget}),afterRun:async t=>{if(!a.lease?.leaseProvider)return await ut(a,Qe(o,t),e.androidObservation)},buildPayloads:async n=>{let i=on(n);return await ct({params:e,result:n,staleRefsWarning:c,publicData:Y({command:t===`longpress`||t===`hover`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l})}}}async function rn(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c={session:i,requestId:a,settle:N(o),expectedResolvedTarget:s};switch(n){case`longpress`:return await t.interactions.longPress(r,{...c,durationMs:e.durationMs,readinessTimeoutMs:o?.readinessTimeoutMs});case`hover`:return await t.interactions.hover(r,c);case`click`:return await t.interactions.click(r,an(e,c));case`press`:return await t.interactions.press(r,an(e,c))}}function an(e,t){let{flags:n}=e;return{...t,button:e.clickButton,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap,verify:n?.verify,readinessTimeoutMs:n?.readinessTimeoutMs,preresolvedTarget:e.preresolvedTarget}}function on(e){return`durationMs`in e?e.durationMs:void 0}function sn(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}function cn(e){return`refused`in e}async function ln(e){return e=A(e),await hn(e,`gesture`,async(t,n)=>un(e,t,n))}async function un(e,t,n){let r=m(e.req.input),i=_n(r,t,n);i.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(i.executionProfile=e.req.internal.gestureExecutionProfile);let a=await I({device:t.device,input:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return a.ok?fn(r,i,await dn(await mn(e,a.gestures),{session:e.sessionName,requestId:e.req.meta?.requestId},i,e.req.internal),e.req.flags):{refused:a.response}}async function dn(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function fn(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:yn(e,i),flags:En(e,r),responseData:sn(n,{executionProfile:gn(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function pn(e){return e=A(e),await hn(e,`swipe`,async t=>{let n=bn(e.req.input),r=await I({device:t.device,input:g(n).gesture,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(!r.ok)return{refused:r.response};let i=n.count??1,a=n.pauseMs??0,o=n.pattern??`one-way`,s=await wn(await mn(e,r.gestures),e,n,i,a,o);return{positionals:Cn(n),flags:e.req.flags,responseData:sn(s,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:s.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:i,pauseMs:a,pattern:o})}})}function mn(e,t){return M({...e,gestures:t,pairedGestureViewport:e.req.internal?.gestureViewport})}async function hn(e,t,n){let a=e.sessionStore.get(e.sessionName);if(!a)return i();let o=Date.now();try{let r=b(a.device),i=r?{status:`clear`}:await S({session:a,command:t,phase:`before-command`,observation:e.androidObservation}),s=await n(a,i);if(cn(s))return s.refused;r||await S({session:a,command:t,phase:`after-command`,observation:e.androidObservation});let c={...s.responseData};return i.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${i.warning}`),j({ref:e.sessionRef,sessionStore:e.sessionStore,command:t,actionCommand:t,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:o,actionFinishedAt:Date.now()})}catch(e){return{ok:!1,error:r(e)}}}function gn(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function _n(t,n,r){let i=ne(t);if(i.intent!==`drag`)return i;try{return{...i,source:vn(i.source,n),destination:vn(i.destination,n)}}catch(t){if(r.status===`recovered`){let n=e(t),i=typeof n.details?.warning==`string`?n.details.warning+` `:``;throw n.details={...n.details,warning:i+r.warning},n}throw w(t)}}function vn(e,r){if(!e.startsWith(`@`))return e;let i=t(e);if(!i)throw new n(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a});return we({ref:i.base,mintedGeneration:i.generation,frame:C({session:r,ref:i.base,mintedGeneration:i.generation})}),i.base}function yn(e,t){return e.kind!==`drag`||!t?h(e):h({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function bn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`swipe requires structured object input`);f(e);let t=e,r=t.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new n(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:Sn(t.from,`swipe from`),to:Sn(t.to,`swipe to`),count:u(t,`count`,{min:1,max:200}),pauseMs:u(t,`pauseMs`,{min:0,max:l}),pattern:r};return xn(i),i}function xn(e){let t=e.count??1,r=e.pauseMs??0,i=t*100+Math.max(0,t-1)*r;if(!(i<=6e4))throw new n(`INVALID_ARGS`,`Swipe series must fit within ${c}ms.`,{count:t,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function Sn(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`${t} must be a point`);let r=e;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new n(`INVALID_ARGS`,`${t} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new n(`INVALID_ARGS`,`${t} y must be finite`);return{x:r.x,y:r.y}}function Cn(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function wn(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=g(Tn(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await de(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function Tn(e,t,n){return t!==`ping-pong`||n%2!=1?e:{...e,from:e.to,to:e.from}}function En(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function Dn(e){let t={},n=e.sessionRef,r=await On({...e,sessionRef:n,refSnapshotFlagGuardResponse:De,captureProof:t});return r&&be({response:r,consumedTree:t,captureProof:t})}async function On(e){switch(e.req.command){case`press`:return await $(e,`press`);case`click`:return await $(e,`click`);case`longpress`:return await $(e,`longpress`);case`hover`:return await $(e,`hover`);case`fill`:return await Pt(e);default:return await kn(e)}}async function kn(e){switch(e.req.command){case d.gesture:return await ln(e);case d.swipe:return await pn(e);case d.type:return await An(e);case`get`:return await ke(e);case`is`:return await Oe(e);default:return null}}async function An(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);if(!r)return i();let a=await je({device:r.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(!a.ok)return a.response;let o=await jn(r,e.androidObservation);return o.response?o.response:await Mn(e,r,a.typeText,o.warning)}async function jn(e,t){if(e.device.platform===`android`&&e.screenRecording){let n=await pe({session:e,observation:t});if(n.status===`failed`)return{response:o(`COMMAND_FAILED`,`Android system dialog blocked the recording session`)};if(n.status===`unknown`)return{warning:n.warning}}return{}}async function Mn(e,t,n,i){let{req:a,sessionStore:o}=e,s=Date.now();try{let r=await S({session:t,command:a.command,phase:`before-command`,observation:e.androidObservation});E(t);let c=await n(a.positionals??[],e.contextFromFlags(a.flags,t.appBundleId,t.trace?.outPath));await S({session:t,command:a.command,phase:`after-command`,observation:e.androidObservation});let l=Date.now(),u={...c};return Nn(u,i,r),j({ref:e.sessionRef,sessionStore:o,command:a.command,positionals:a.positionals??[],flags:a.flags,result:u,responseData:u,actionStartedAt:s,actionFinishedAt:l})}catch(e){return{ok:!1,error:r(e)}}}function Nn(e,t,n){let r=[typeof e.warning==`string`?e.warning:void 0,t];n.status===`recovered`&&r.push(n.warning);let i=r.filter(e=>typeof e==`string`&&e.length>0).join(` `);i.length>0&&(e.warning=i)}export{Dn as handleInteractionCommands};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{D as e,S as t,a as n,d as r,f as i,g as a,h as o,m as s,o as c,r as l,s as u,u as d,v as f,w as p,x as m,y as h}from"./perf-runtime.js";import{o as g,s as _}from"./touch-runtime.js";const v=[{operation:`back`,label:`back`,bind:e},{operation:`home`,label:r.home,bind:(e,t)=>i(`home`,e,t)},{operation:`setOrientation`,label:`orientation`,bind:p},{operation:`tvRemote`,label:m,bind:t},{operation:`keyboardStatus`,label:f.keyboardStatus,bind:(e,t)=>h(`keyboardStatus`,e,t)},{operation:`keyboardDismiss`,label:f.keyboardDismiss,bind:(e,t)=>h(`keyboardDismiss`,e,t)},{operation:`keyboardEnter`,label:f.keyboardEnter,bind:(e,t)=>h(`keyboardEnter`,e,t)},{operation:`readClipboard`,label:s.readClipboard,bind:o},{operation:`writeClipboard`,label:s.writeClipboard,bind:a},{operation:`appSwitcher`,label:r.appSwitcher,bind:(e,t)=>i(`appSwitcher`,e,t)},{operation:`actionButton`,label:r.actionButton,bind:(e,t)=>i(`actionButton`,e,t)},{operation:`triggerAppEvent`,label:`trigger-app-event`,bind:d},{operation:`setSetting`,label:`settings`,bind:u},{operation:`readSetting`,label:`settings read`,bind:c},{operation:`readAlert`,label:l.readAlert,bind:(e,t)=>n(`readAlert`,e,t)},{operation:`awaitAlert`,label:l.awaitAlert,bind:(e,t)=>n(`awaitAlert`,e,t)},{operation:`acceptAlert`,label:l.acceptAlert,bind:(e,t)=>n(`acceptAlert`,e,t)},{operation:`dismissAlert`,label:l.dismissAlert,bind:(e,t)=>n(`dismissAlert`,e,t)}];function y(e,t){let n={};for(let r of v)e.facts[r.operation]?.available&&Object.assign(n,r.bind(e.signal,t(r)));return n}function b(e){return y(e,()=>g(e))}function x(e){return y(e,t=>_({...e,operation:t.label}))}export{x as n,b as t};
|
package/dist/src/interactor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as e,T as t,et as n,nt as r,w as i}from"./sdk-contracts.js";import{$ as a,A as o,I as s,J as c,a as l,c as u,ft as ee,k as te,tt as ne}from"./tv-remote.js";import{r as re}from"./snapshot-capture-annotations.js";import{O as ie,v as d}from"./sdk-batch-runner.js";import{c as ae,r as f}from"./diagnostics.js";import"./diagnostics2.js";import{A as oe,g as p,h as se,j as m,m as ce,x as h}from"./sdk-device.js";import{Hr as le,ei as ue}from"./sdk-batch.js";import{n as g}from"./session.js";import{C as de,D as _,S as fe,h as v,n as pe,r as me,w as he,x as ge,y as _e}from"./settings.js";import{o as y}from"./exec.js";import{r as ve,t as ye}from"./retry.js";import"./command.js";import"./retry2.js";import{a as b}from"./gesture-plan.js";import{n as be}from"./scoped-provider.js";import{n as xe,r as Se}from"./ios-snapshot-planning.js";import{i as Ce,n as we,r as x}from"./ios-snapshot-engine.js";import{n as Te,r as Ee}from"./ios-system-surface.js";import{C as De,g as Oe,o as ke,r as Ae}from"./host-file.js";import{c as je,f as Me,h as Ne,m as Pe,p as Fe}from"./config.js";import{o as Ie}from"./tool-provider.js";import{n as Le,r as S,t as Re}from"./physical-device-control.js";import{C as ze,E as Be,S as Ve,n as He,x as Ue}from"./runner.js";import{x as We}from"./apple-runner-platform.js";import{n as C,o as w,r as T}from"./simctl.js";import{c as E}from"./runner-client.js";import"./runner-error-classification.js";import{n as Ge,r as Ke,t as qe}from"./app-launch.js";import{r as D,t as O}from"./simulator.js";import{c as Je,d as Ye,l as Xe,o as Ze,s as Qe,t as $e,u as et}from"./helper.js";import{a as tt,f as nt,m as rt,p as it}from"./app-resolution.js";import{i as at,t as ot}from"./display-inventory.js";import{t as st}from"./simctl-settings.js";import{n as ct}from"./png-resize.js";import{t as lt}from"./png-size.js";import{n as ut}from"./screenshot-density.js";import{n as dt}from"./interactor-types.js";import{r as ft,t as pt}from"./app-backend.js";import{i as mt,r as ht,t as gt}from"./alert.js";import{t as _t}from"./surface-snapshot.js";import{r as vt}from"./ios-snapshot-acquisition.js";import{n as yt}from"./quality-warnings.js";import{r as bt,t as xt}from"./snapshot-quality-verdict.js";import{t as St}from"./ios-target-activation.js";import k from"node:path";async function Ct(e){return p(e)?await nt():(D(e,`clipboard`),await O(e),y(await w(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replaceAll(`\r
|
|
2
2
|
`,`
|
|
3
|
-
`).replace(/\n$/,``))}async function
|
|
4
|
-
`).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let
|
|
5
|
-
`).map(e=>e.trim().split(/\s+/)).find(e=>e[0]===
|
|
6
|
-
`?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await k(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await On(k,e,t,n,r,i),performGesture:async r=>await En(e,t,n,r),gestureViewport:async()=>Tn(await k(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function vn(e,t,n,r,i){let a=d(e)?p(i.surface,`xctest`):void 0;return a?await yn(t,r,i,a):i.button===`primary`?i.count===1?await xn(e,t,n,r,i):await Ve(e,r,i,t.appBundleId,async t=>await k(e,t,n)):await bn(e,t,n,r,i.button)}async function yn(e,n,r,i){if(r.button!==`primary`)throw new t(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${i} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.n),o=await a(n.x,n.y,{bundleId:e.appBundleId,surface:i,holdMs:r.holdMs,clicks:r.count,doubleClick:r.doubleTap,intervalMs:r.intervalMs,signal:e.signal});return o.holdMs===void 0?{}:{holdMs:o.holdMs}}async function bn(e,t,n,r,i){return await k(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function xn(e,t,n,r,i){if(i.doubleTap){let i=await k(e,T([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return E(i),i}return i.holdMs>0?await k(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await k(e,q(e,t,r.x,r.y),n)}function Sn(e){let t=e.textEntryRoute;return wn(t)?{textEntryRoute:t}:{}}function Cn(e){let t=e.applicationState;return i(t)?{applicationState:t}:{}}function wn(e){return typeof e==`string`&&st.includes(e)}function Tn(e){let n=K(e.x),r=K(e.y),i=K(e.x2),a=K(e.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new t(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function K(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function En(e,t,n,r){if(r.topology===`two`&&ct(e,r.intent),r.topology===`single`&&d(e)){let{start:i,end:a}=h(r);return await k(e,{command:`drag`,x:i.x,y:i.y,x2:a.x,y2:a.y,durationMs:r.durationMs,appBundleId:t.appBundleId},n)}if(r.topology===`single`&&f(e)){let{start:i,end:a}=h(r);return await k(e,{command:`swipe`,direction:Dn(i,a),appBundleId:t.appBundleId},n)}return await k(e,{command:`gesture`,gesturePlan:r,appBundleId:t.appBundleId},n)}function Dn(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function q(e,t,n,r){return{command:`tap`,x:n,y:r,...u(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}async function On(e,t,n,r,i,a){if(he(a?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ge}`}),f(t))return W(await e(t,G(i,n.appBundleId,a?.durationMs),r),{amount:a?.amount,durationMs:a?.durationMs});if(oe(a??{}),d(t))return await hn(e,t,n,r,i,a);let o=dn(a),s;try{s=await e(t,{command:`scroll`,direction:i,...fn(o),appBundleId:n.appBundleId},r)}catch(e){throw un(e)}return H(s,i,o)}const kn=p(`app`,`native`),An=`The native macOS app backend acts through accessibility actions only. Unset AGENT_DEVICE_MACOS_APP_BACKEND to drive this app with XCTest.`,jn=new Set(Qe);function Mn(e,t){let n=()=>{if(t.appBundleId)return t.appBundleId;throw J(`an action on a session that names no app`)},r=async(e,r={})=>Nn(await Y(qe(e.x,e.y,{surface:kn,bundleId:n(),clicks:r.count,intervalMs:r.intervalMs,signal:t.signal})));return{open:e.open,openDevice:e.openDevice,close:e.close,screenshot:e.screenshot,snapshot:e.snapshot,readTextAtPoint:e.readTextAtPoint,readClipboard:e.readClipboard,writeClipboard:e.writeClipboard,setSetting:e.setSetting,readAlert:e.readAlert,awaitAlert:e.awaitAlert,acceptAlert:e.acceptAlert,dismissAlert:e.dismissAlert,tap:async(e,t)=>await r({x:e,y:t}),pressPoint:async(t,n)=>{if(n.surface!==void 0&&n.surface!==`app`)return await e.pressPoint(t,n);if(n.button!==`primary`)throw J(`${n.button} click`);if(n.doubleTap)throw J(`double-click`);if(n.holdMs>0)throw J(`press and hold`);return await r(t,n)},longPress:async()=>{throw J(`press and hold`)},focus:async(e,t)=>await r({x:e,y:t}),type:async(e,r)=>{await Y(Je(e,{bundleId:n(),delayMs:r,signal:t.signal}))},fill:async(e,r,i)=>Nn(await Y(Xe(e,r,i,{bundleId:n(),signal:t.signal}))),scroll:async(e,r)=>{oe(r??{});let i=await Y($e(e,{bundleId:n(),amount:r?.amount,pixels:r?.pixels,signal:t.signal}));return{...H(i,e,r,{includeDuration:!1}),mechanism:i.mechanism}},back:async()=>{throw J(`back`)},setOrientation:async()=>{throw J(`orientation`)}}}function Nn(e){return{mechanism:e.mechanism,...e.windowTitle===void 0?{}:{windowTitle:e.windowTitle}}}function J(e){return new t(`UNSUPPORTED_OPERATION`,`${e} is not supported by the native macOS app backend.`,{reason:`unsupported-device-backend`,hint:An})}async function Y(e){try{return await e}catch(e){if(!(e instanceof t))throw e;let n=e.details?.reason;throw typeof n!=`string`||!jn.has(n)?e:new t(`UNSUPPORTED_OPERATION`,e.message,{...e.details,reason:`unsupported-device-backend`,helperReason:n,hint:An},e)}}const Pn={0:`unknown`,1:`notRunning`,2:`runningBackgroundSuspended`,3:`runningBackground`};function Fn(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return;let r={...e},i=r.reason;if(!n(i))return;let a=r.priorState;if(typeof a!=`number`||!Number.isInteger(a))return;let o=Pn[a];o===void 0&&t?.({reason:i,rawPriorState:a});let s=r.otherActiveApplicationPid;return{reason:i,priorState:o??`unknown`,...typeof s==`number`&&Number.isInteger(s)&&s>0?{otherActiveApplicationPid:s}:{}}}function In(e){let t=Ln(e.systemSurface),n=o(e.keyboard),r=Fn(e.targetActivation,e=>Ue({level:`debug`,phase:`ios_runner_target_activation_prior_state_unmapped`,data:e}));return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:Oe(e.snapshotQuality),qualityPayload:Vn(e.qualityPayload,t),runnerFatal:e.runnerFatal===!0,...n?{keyboard:n}:{},...t?{systemSurface:t}:{},...r?{targetActivation:r}:{},message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function Ln(e){if(!X(e)||typeof e.bundleId!=`string`)return;let t=Ee(e.bundleId);return t&&{bundleId:t.bundleId,kind:t.kind}}function Rn(e,t,n){let r=n.nodes??[],i=Hn(r,n.qualityPayload?.nodes);if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return{nodes:r};let a=we({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),o={stage:`presented`,presentation:{producer:`apple-runner`,intent:`full`,payload:{nodes:r,truncated:n.truncated??!1,...n.quality?.effectiveDepth===void 0?{}:{effectiveDepth:n.quality.effectiveDepth}},...n.qualityPayload?{qualityPayload:n.qualityPayload}:{}},validation:{presentationKey:Ce(a),viewport:i,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{let e=Ne(o,a),t=re(e.validatedViewport);return{nodes:e.nodes,...t?{viewport:t}:{}}}catch(e){zn(e,n)}}function zn(e,n){let r=n.quality;if(e instanceof v&&Ae(r))throw new t(`COMMAND_FAILED`,e.message,{..._(e),...n.systemSurface?{systemSurface:n.systemSurface}:{},snapshotQuality:{state:r.state,backend:r.backend,...r.reason?{reason:r.reason}:{},...r.reasonCode?{reasonCode:r.reasonCode}:{}},hint:Bn(n.systemSurface,r)},e);Z(e,n.systemSurface)}function Bn(e,t){return[e?`${e.bundleId} hosts the surface presented over the app, and this capture targeted that surface.`:void 0,...ke(t,[])].filter(e=>e!==void 0).join(` `)}function Vn(e,t){if(e!==void 0)return(!X(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new v(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`),t),e.scope!==void 0&&e.scope!==null&&Z(new v(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`}),t),{nodes:e.nodes,truncated:e.truncated,scope:null}}function Hn(e,t){return g(Un(t),{fallbackToLargestRoot:!0})??g(Un(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function Un(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function X(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(e,n){throw e instanceof v?new t(`COMMAND_FAILED`,e.message,{..._(e),...n?{systemSurface:n}:{}},e):e}function Wn(e,n,r){if(e.appleOs===`watchos`)throw new t(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:i,runnerOpts:a}=_n(e,n),o=d(e)?lt():`xctest`,s=t=>d(e)?p(t,o):void 0,c={open:(t,n)=>Ge(e,t,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:a}),openDevice:()=>Ke(e),close:t=>A(e,t,a),screenshot:(t,n)=>tr(e,t,n,a,s(n?.surface)),snapshot:async t=>await Gn(e,t,a,s(t?.surface)),readTextAtPoint:async(t,n)=>{let r=s(n?.surface);return r?await nr(t,r,n?.appBundleId,n?.signal):await rr(e,t,n,a)},findText:async(t,n)=>({found:(await k(e,{command:`findText`,text:t,appBundleId:n?.appBundleId},n?.signal?{...a,signal:n.signal}:a))?.found===!0}),back:async t=>{if(f(e)){await k(e,G(`menu`,n.appBundleId),a);return}await k(e,{command:gn(t),appBundleId:n.appBundleId},a)},home:async()=>{if(f(e)){await k(e,G(`home`,n.appBundleId),a);return}await k(e,{command:`home`,appBundleId:n.appBundleId},a)},setOrientation:async r=>{let i=$n(await k(e,{command:`rotate`,orientation:r,appBundleId:n.appBundleId},a));if(i!==r)throw new t(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${r}`,{requestedOrientation:r,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await k(e,{command:`appSwitcher`,appBundleId:n.appBundleId},a)},actionButton:async()=>{await k(e,{command:`actionButton`,appBundleId:n.appBundleId},a)},tvRemote:async(t,r)=>{await k(e,G(ye(t),n.appBundleId,r),a)},keyboardDismiss:async()=>{let t=await k(e,{command:`keyboardDismiss`,appBundleId:n.appBundleId},a);return{kind:`mechanism`,wasVisible:Q(t,`wasVisible`),dismissed:Q(t,`dismissed`),visible:Q(t,`visible`),mechanism:Qn(t,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let t=await k(e,{command:`keyboardReturn`,appBundleId:n.appBundleId},a);return{kind:`visibility-echo`,visible:Q(t,`visible`),wasVisible:Q(t,`wasVisible`)}},readClipboard:()=>ht(e),writeClipboard:t=>gt(e,t,a),setSetting:(t,n,r,i)=>Pt(e,t,n,r,i),readSetting:t=>It(e,t),readAlert:t=>ut(e,a,t),awaitAlert:t=>dt(e,a,t),acceptAlert:t=>ft(e,a,`accept`,t),dismissAlert:t=>ft(e,a,`dismiss`,t),...i},l=o===`native`?Mn(c,n):c;return r?er(e,n,l,r):l}async function Gn(e,t,n,r){return r?await pt({...t,surface:r},t?.signal):await Kn(e,t,n)}async function Kn(e,t,n){let r=In(await s(`snapshot_capture`,async()=>await k(e,{command:`snapshot`,appBundleId:t?.appBundleId,interactiveOnly:t?.interactiveOnly,preferredBackend:t?.preferredBackend,customActions:t?.customActions,depth:t?.depth,scope:t?.scope,raw:t?.raw},Zn(n,t?.signal)),{backend:`xctest`}));qn(e,t,r);let i=Jn(r),a=Yn(e,t,r);return{nodes:a.nodes,truncated:r.truncated??!1,backend:`xctest`,producer:`apple-runner`,...a.viewport?{viewport:a.viewport}:{},...r.quality?{quality:r.quality}:{},...r.systemSurface?{systemSurface:r.systemSurface}:{},...r.keyboard?{keyboard:r.keyboard}:{},...r.targetActivation?{targetActivation:r.targetActivation}:{},...i.length>0?{warnings:i}:{}}}function qn(e,n,r){if(!((r.nodes?.length??0)>0)&&!Xn(n,r.quality)&&e.kind===`simulator`)throw new t(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`)}function Jn(e){let t=[];return!e.quality&&e.message&&t.push(e.message),e.systemSurface&&t.push(Te(e.systemSurface.bundleId)),e.targetActivation&&t.push(mt(e.targetActivation)),t}function Yn(e,t,n){return d(e)?{nodes:n.nodes??[]}:Rn(e.id,t,n)}function Xn(e,t){return ne(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function Zn(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Q(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function Qn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function $n(e){let n=e.orientation;if(typeof n==`string`&&ve.includes(n))return n;throw new t(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function er(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),setSetting:async()=>$(`setSetting`),readSetting:async()=>$(`readSetting`)};return Se(i,n=>He(r,{deviceId:e.id,requestId:t.requestId},n))}function $(e){throw new t(`UNSUPPORTED_OPERATION`,`${e} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${e} implementation.`)}async function tr(e,n,r={},i,o){if(o){if(r.fullscreen)throw new t(`INVALID_ARGS`,`screenshot --fullscreen is not accepted on the macOS ${o} surface: its capture frame is fixed`,{reason:a.macOsHelperSurfaceFixedFrame,surface:o});return await Ye(n,{surface:o,...o===`app`?{bundleId:r.appBundleId}:{},signal:i.signal}),{}}return r.captureBackend===`runner`?(await V(e,n,r.appBundleId,r.fullscreen,i),{}):await Xt(e,n,{appBundleId:r.appBundleId,pixelDensity:r.pixelDensity,fullscreen:r.fullscreen,runnerOptions:i,normalizeStatusBar:r.normalizeStatusBar,skipIosSimulatorBootCheck:r.skipIosSimulatorBootCheck})}async function nr(e,t,n,r){let{runMacOsReadTextAction:i}=await import(`./helper.js`).then(e=>e.n);return(await i(e.x,e.y,{bundleId:n,surface:t,signal:r})).text}async function rr(e,t,n,r){let i=await k(e,{command:`readText`,x:t.x,y:t.y,appBundleId:n?.appBundleId},n?.signal?{...r,signal:n.signal}:r);return typeof i.text==`string`?i.text:typeof i.message==`string`?i.message:void 0}export{Wn as createAppleInteractor};
|
|
3
|
+
`).replace(/\n$/,``))}async function wt(e,t,n){if(p(e)){await rt(t);return}if(D(e,`clipboard`),h(e)){let r=n?.signal;await O(e,{signal:r}),y(await w(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t,signal:r}),`Failed to write tvOS simulator clipboard`);return}await E(e,{command:`pasteboardWrite`,text:t},n)}function A(t,n){if(!ce(t))throw new e(`UNSUPPORTED_OPERATION`,n.message,{deviceId:t.id,appleOs:oe(t),deviceKind:t.kind,reason:n.reason,hint:n.hint})}async function Tt(e,t){A(e,me);let n=fe(t);return await w(e,[`ui`,e.id,`content_size`,n]),_(n,n)}async function Et(t){A(t,me),await O(t);let n=y(await w(t,[`ui`,t.id,`content_size`],{allowFailure:!0}),`Failed to read iOS content size category`),r=n.stdout.trim(),i=de(r);if(i===void 0)throw new e(`COMMAND_FAILED`,`iOS simulator reported an unknown text size: ${r||`(empty)`}`,{deviceId:t.id,stdout:n.stdout,stderr:n.stderr,hint:"Boot the simulator, or run `xcrun simctl ui <device> content_size` to see what it reports."});return _(i,r)}const Dt=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],Ot={0:`hide`,1:`wifi`,6:`3g`,7:`4g`,8:`lte`,9:`lte-a`,10:`lte+`,11:`5g`,12:`5g+`,13:`5g-uwb`,14:`5g-uc`},kt={1:`searching`,2:`failed`,3:`active`},At={0:`notSupported`,1:`searching`,2:`failed`,3:`active`},j=new Set;async function jt(e){let t=null,n=!1;if(Nt(e))n=!0;else try{t=await Pt(e),n=!0}catch(t){L(e,`snapshot_failed`,t)}try{(!n||t)&&await F(e),await I(e,Dt)}catch(t){L(e,`prepare_failed`,t)}return async()=>{await Mt(e,n?t:null)}}async function Mt(e,t){if(await F(e),!t){N(e);return}await I(e,It(t)),M(e)}function M(e){j.delete(P(e))}function N(e){j.add(P(e))}function Nt(e){return j.has(P(e))}function P(e){return`${e.platform}:${e.kind}:${e.id}`}async function Pt(e){return Ft(y(await w(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function F(e){await w(e,[`status_bar`,e.id,`clear`])}async function I(e,t){t.length!==0&&await w(e,[`status_bar`,e.id,`override`,...t])}function Ft(t){let n={},r=t.split(`
|
|
4
|
+
`).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let t of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(t);if(r){let t=Number(r[1]),i=Ot[t];if(!i)throw new e(`COMMAND_FAILED`,`Unsupported simulator data network type: ${t}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(t);if(i){let e=kt[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(t);if(a){let t=Number(a[1]),r=At[t];if(!r)throw new e(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${t}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(t);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function It(e){let t=[];return e.dataNetwork&&t.push(`--dataNetwork`,e.dataNetwork),e.wifiMode&&t.push(`--wifiMode`,e.wifiMode),e.wifiBars!==void 0&&(e.dataNetwork===`wifi`||e.wifiMode)&&t.push(`--wifiBars`,e.wifiBars),e.cellularMode&&t.push(`--cellularMode`,e.cellularMode),e.cellularBars!==void 0&&(e.cellularMode||Lt(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function Lt(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function L(e,t,n){f({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...S(n)}})}async function Rt(t,r,i,a,o){if(p(t)){let t=r.toLowerCase();if(t===`appearance`){await it(i);return}if(t===`permission`){let t=_e(i);if(t===`deny`)throw new e(`INVALID_ARGS`,v(`permission`));let n=Wt(o?.permissionTarget);return await Qe(t,n)}throw new e(`INVALID_ARGS`,v(r))}D(t,`settings`),await O(t);let s=r.toLowerCase();switch(s){case`clear-app-state`:{if(i.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`,n());let r=await Ut(t,a);return{bundleId:r.bundleId,containerPath:r.containerPath,cleared:!0}}case`reset-keychain`:if(i.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings reset-keychain only supports clear.`);return await w(t,[`keychain`,t.id,`reset`]),{scope:`simulator`,cleared:!0,message:`Reset the whole iOS simulator keychain. This clears keychain-backed credentials for every installed app, not just the app under test.`};case`wifi`:{let e=ge(i)?`active`:`failed`;await w(t,[`status_bar`,t.id,`override`,`--wifiMode`,e]),M(t);return}case`airplane`:ge(i)?(await w(t,[`status_bar`,t.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),M(t)):(await w(t,[`status_bar`,t.id,`clear`]),N(t));return;case`faceid`:case`touchid`:{A(t,pe);let e=s,n=Gt[e];await qt(t,Kt(i,e),{settingName:e,notificationModality:n.notificationModality});return}case`text-size`:return await Tt(t,i);case`appearance`:case`permission`:case`location`:return await st({runSimctl:e=>w(t,e),udid:t.id,deviceId:t.id,setting:s,state:i,appBundleId:a,resolveApp:e=>R(t,e),options:o});default:throw new e(`INVALID_ARGS`,`Unsupported setting: ${r}`)}}const zt={"text-size":Et};async function Bt(e,t){return await zt[t](e)}const Vt=[`Documents`,`Library/Caches`,`Library/Preferences`,`SystemData`,`tmp`];function Ht(e){return`${e} has no data container to clear. Apps shipped in the simulator runtime, such as system apps, own no data container, so there is no app state here to remove.`}async function R(e,t){return await he(t,t=>tt(e,t,{installedOnly:!0}))}async function Ut(t,n){if(!se(t)||t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let r=await R(t,n);await O(t),await qe(t,r);let i=y(await w(t,[`get_app_container`,t.id,r,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${r}`),a=T(i.stdout);if(a===void 0)throw new e(`UNSUPPORTED_OPERATION`,Ht(r),{reason:`app-no-data-container`,appBundleId:r,deviceId:t.id,hint:`Clear the app under test instead. A runtime-shipped app keeps no data container, so this command has no app state to remove; to reset it, erase or recreate the simulator device, or uninstall and reinstall the app if you installed it yourself.`});let o=await Oe(a);return await Promise.all(o.filter(e=>e!==`.com.apple.mobile_container_manager.metadata.plist`).map(e=>De(k.join(a,e)))),await Promise.all(Vt.map(e=>ke(k.join(a,e)))),{bundleId:r,containerPath:a}}function Wt(t){let n=t?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new e(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}const Gt={faceid:{notificationModality:`pearl`},touchid:{notificationModality:`fingerTouch`}};function Kt(t,n){let r=t.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new e(`INVALID_ARGS`,`Invalid ${n} state: ${t}. Use match|nonmatch|enroll|unenroll.`)}async function qt(t,n,i){let a=C(t,Xt(t.id,n,i.notificationModality)),o=await Ie(a,{allowFailure:!0}),s=[];if(o.exitCode!==0)s.push({args:a,stderr:o.stderr,stdout:o.stdout,exitCode:o.exitCode});else{let e=Jt(n);if(e!==void 0){let n=await Yt(t);if(n.state===e)return;s.push({args:n.args,stderr:n.stderr,stdout:n.stdout,exitCode:n.exitCode})}else return}throw new e(`COMMAND_FAILED`,`Failed to simulate ${i.settingName}.`,{deviceId:t.id,action:n,setting:i.settingName,attempts:r(s)})}const z=`com.apple.BiometricKit.enrollmentChanged`;function Jt(e){if(e===`enroll`)return`1`;if(e===`unenroll`)return`0`}async function Yt(e){let t=C(e,[`spawn`,e.id,`notifyutil`,`-g`,z]),n=await Ie(t,{allowFailure:!0}),r=n.stdout.split(`
|
|
5
|
+
`).map(e=>e.trim().split(/\s+/)).find(e=>e[0]===z)?.[1];return{args:t,stderr:n.stderr,stdout:n.stdout,exitCode:n.exitCode,state:n.exitCode===0?r:void 0}}function Xt(e,t,n){let r=[`spawn`,e,`notifyutil`];switch(t){case`match`:return[...r,`-p`,`com.apple.BiometricKit_Sim.${n}.match`];case`nonmatch`:return[...r,`-p`,`com.apple.BiometricKit_Sim.${n}.nomatch`];case`enroll`:return[...r,`-s`,z,`1`,`-p`,z];case`unenroll`:return[...r,`-s`,z,`0`,`-p`,z]}}function Zt(e){let t=e.screenshotMetadata;if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t,r=B(n.displayID),i=B(n.pixelWidth),a=B(n.pixelHeight),o=Qt(n.pixelsPerPoint);if(r!==void 0&&i!==void 0&&a!==void 0&&o!==void 0)return Object.freeze({displayID:r,pixelWidth:i,pixelHeight:a,pixelsPerPoint:o})}function B(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}function Qt(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}const $t={ensureBooted:O,prepareStatusBarForScreenshot:jt,resolveCaptureTarget:at,captureWithRetry:rn,normalizeDensity:pn,captureWithRunner:H,shouldFallbackToRunner:dn},en=new Map,V=new Map;async function tn(e,t,n={}){return p(e)?(await H(e,t,n.appBundleId,n.fullscreen,n.runnerOptions),{}):e.kind===`simulator`?await nn(e,t,n):(await Re(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:E}),{})}async function nn(t,n,r={}){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...$t,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(t);let{display:a,displayRotation:o}=await i.resolveCaptureTarget(t),s=o?{displayRotation:o}:{},c=async()=>{await i.captureWithRetry(t,n,a),await i.normalizeDensity(t,n,r.pixelDensity,a?.pointScale)},l=async()=>{};if(r.normalizeStatusBar===!0)try{l=await i.prepareStatusBarForScreenshot(t)}catch(e){ln(t,`prepare_failed`,e)}try{try{return await c(),s}catch(e){let n=e;if(r.skipIosSimulatorBootCheck&&fn(e)){await i.ensureBooted(t);try{return await c(),s}catch(e){n=e}}if(!i.shouldFallbackToRunner(n))throw n;cn(t,`simctl_screenshot`,n)}let e=await i.captureWithRunner(t,n,r.appBundleId,r.fullscreen,r.runnerOptions);return await i.normalizeDensity(t,n,r.pixelDensity,e?.pixelsPerPoint),s}finally{await l().catch(e=>ln(t,`restore_failed`,e))}}async function rn(e,t,n){let r=ye.fromTimeoutMs(Ne),i=[`io`,e.id,`screenshot`,...ot(n),t];await ve(async({deadline:t})=>{await w(e,i,{timeoutMs:Math.max(1e3,t?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Me,maxDelayMs:Fe,jitter:.2,shouldRetry:e=>dn(e)},{deadline:r,phase:`ios_simulator_screenshot`})}async function H(t,n,r,i,a){if(t.kind===`device`&&!p(t)){await Re(t).captureScreenshot(t,n,{appBundleId:r,fullscreen:i,runnerOptions:a,preferRunner:!0,runRunnerCommand:E});return}let o=await E(t,{command:`screenshot`,appBundleId:r,fullscreen:i,inlineScreenshot:!1},a),s=o.message;if(!s)throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);let c=Zt(o);if(p(t))return await Ae(s,n),c;if(t.kind===`simulator`)return await an(t,s,n),c;throw new e(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function an(t,n,r){let i=ye.fromTimeoutMs(je),a=`Unable to locate runner container for simulator screenshot`,o=V.get(t.id);if(o){let e=await on(o,n,r);if(e.copied)return;a=e.error,V.delete(t.id)}for(let e of He){let o=await w(t,[`get_app_container`,t.id,e,`data`],{allowFailure:!0,timeoutMs:sn(i,je,`runner screenshot container lookup`)});if(o.exitCode!==0){let e=o.stderr.trim();e&&(a=e);continue}let s=T(o.stdout);if(s===void 0){a=`simctl get_app_container returned no data container path`;continue}let c=await on(s,n,r);if(c.copied){V.set(t.id,s);return}a=c.error}throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function on(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of un(e,t))try{return await Ae(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function sn(t,n,r){let i=t.remainingMs();if(i>0)return i;throw new e(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function cn(e,t,n){let r=S(n);f({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function ln(e,t,n){f({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...S(n)}})}function un(e,t){let n=k.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=k.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(k.join(n,s)),k.isAbsolute(r)&&o(k.normalize(r)),c.startsWith(`tmp/`))o(k.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(k.join(n,t))}}let l=k.basename(r);return l&&o(k.join(n,`tmp`,l)),i}function dn(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Le(t);return n.includes(`timeout waiting for screen surfaces`)||n.includes(`nsposixerrordomain`)&&n.includes(`code=60`)&&n.includes(`screenshot`)||n.includes(`timed out`)&&n.includes(`screenshot`)}function fn(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Le(t);return n.includes(`not booted`)||n.includes(`current state: shutdown`)||n.includes(`current state is shutdown`)||n.includes(`current state=shutdown`)||n.includes(`state: shutdown`)||n.includes(`state=shutdown`)}async function pn(e,t,n,r){let i=r??await mn(e),a=ut(await lt(t),i,n);a&&await ct(t,a.width,a.height)}async function mn(t){let n=en.get(t.id);if(n!==void 0)return n;let r=await w(t,[`getenv`,t.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:Pe}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new e(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return en.set(t.id,i),i}function hn(t){return!(t instanceof e)||t.details?.runnerErrorCode!==`SCROLL_KEYBOARD_OCCLUDES_SURFACE`?t:new e(t.code,t.message,{...t.details,...c})}function gn(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:te},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function U(e,t,n,r={includeDuration:!0}){let i=W(e.referenceWidth),a=W(e.referenceHeight);if(i===void 0||a===void 0)return G(e,{amount:n?.amount});let o=ne({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return G(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function _n(e,t={}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t.includeDuration!==!1&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{},...t.includeReleaseBehavior!==!1&&e?.releaseBehavior!==void 0?{scrollReleaseBehavior:e.releaseBehavior}:{}}}function W(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function G(e,t){let{x1:n,y1:r,x2:i,y2:a}=yn(e),o=W(e.referenceWidth),s=W(e.referenceHeight),c=vn(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0),l=W(e.keyboardMinY);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...e.keyboardAvoided===!0?{keyboardAvoided:!0}:{},...l===void 0?{}:{keyboardMinY:l},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function vn(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function yn(e){let t=W(e.x),n=W(e.y),r=W(e.x2),i=W(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function bn(e,t,n,r,i,a){return U(await e(t,{command:`desktopScroll`,direction:i,..._n(a,{includeDuration:!0,includeReleaseBehavior:!1}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function K(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function xn(e){return e===`system`?`backSystem`:`backInApp`}function Sn(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await E(e,J(e,t,r,i),n),pressPoint:async(r,i)=>await Cn(e,t,n,r,i),tapElementSelector:async r=>await E(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...m(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await E(e,Ue([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return Ve(a),a},appState:async()=>On(await E(e,{command:`appState`,appBundleId:t.appBundleId},n)),longPress:async(r,i,a)=>await E(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await E(e,J(e,t,r,i),n),type:async(r,i)=>Dn(await E(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
|
|
6
|
+
`?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await E(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await Nn(E,e,t,n,r,i),performGesture:async r=>await jn(e,t,n,r),gestureViewport:async()=>An(await E(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function Cn(e,t,n,r,i){let a=p(e)?g(i.surface,`xctest`):void 0;return a?await wn(t,r,i,a):i.button===`primary`?i.count===1?await En(e,t,n,r,i):await ze(e,r,i,t.appBundleId,async t=>await E(e,t,n)):await Tn(e,t,n,r,i.button)}async function wn(t,n,r,i){if(r.button!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${i} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.n),o=await a(n.x,n.y,{bundleId:t.appBundleId,surface:i,holdMs:r.holdMs,clicks:r.count,doubleClick:r.doubleTap,intervalMs:r.intervalMs,signal:t.signal});return o.holdMs===void 0?{}:{holdMs:o.holdMs}}async function Tn(e,t,n,r,i){return await E(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function En(e,t,n,r,i){if(i.doubleTap){let i=await E(e,Ue([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return Ve(i),i}return i.holdMs>0?await E(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await E(e,J(e,t,r.x,r.y),n)}function Dn(e){let t=e.textEntryRoute;return kn(t)?{textEntryRoute:t}:{}}function On(e){let t=e.applicationState;return i(t)?{applicationState:t}:{}}function kn(e){return typeof e==`string`&&dt.includes(e)}function An(t){let n=q(t.x),r=q(t.y),i=q(t.x2),a=q(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function jn(e,t,n,r){if(r.topology===`two`&&ft(e,r.intent),r.topology===`single`&&p(e)){let{start:i,end:a}=b(r);return await E(e,{command:`drag`,x:i.x,y:i.y,x2:a.x,y2:a.y,durationMs:r.durationMs,appBundleId:t.appBundleId},n)}if(r.topology===`single`&&h(e)){let{start:i,end:a}=b(r);return await E(e,{command:`swipe`,direction:Mn(i,a),appBundleId:t.appBundleId},n)}return await E(e,{command:`gesture`,gesturePlan:r,appBundleId:t.appBundleId},n)}function Mn(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function J(e,t,n,r){return{command:`tap`,x:n,y:r,...m(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}async function Nn(e,t,n,r,i,c){if(s(c?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${o}`}),h(t))return G(await e(t,K(i,n.appBundleId,c?.durationMs),r),{amount:c?.amount,durationMs:c?.durationMs});if(a(c??{}),p(t))return await bn(e,t,n,r,i,c);let l=gn(c),u;try{u=await e(t,{command:`scroll`,direction:i,..._n(l),appBundleId:n.appBundleId},r)}catch(e){throw hn(e)}return U(u,i,l)}const Pn=g(`app`,`native`),Fn=`The native macOS app backend acts through accessibility actions only. Unset AGENT_DEVICE_MACOS_APP_BACKEND to drive this app with XCTest.`,In=new Set($e);function Ln(e,t){let n=()=>{if(t.appBundleId)return t.appBundleId;throw Y(`an action on a session that names no app`)},r=async(e,r={})=>Rn(await X(Je(e.x,e.y,{surface:Pn,bundleId:n(),clicks:r.count,intervalMs:r.intervalMs,signal:t.signal})));return{open:e.open,openDevice:e.openDevice,close:e.close,screenshot:e.screenshot,snapshot:e.snapshot,readTextAtPoint:e.readTextAtPoint,readClipboard:e.readClipboard,writeClipboard:e.writeClipboard,setSetting:e.setSetting,readAlert:e.readAlert,awaitAlert:e.awaitAlert,acceptAlert:e.acceptAlert,dismissAlert:e.dismissAlert,tap:async(e,t)=>await r({x:e,y:t}),pressPoint:async(t,n)=>{if(n.surface!==void 0&&n.surface!==`app`)return await e.pressPoint(t,n);if(n.button!==`primary`)throw Y(`${n.button} click`);if(n.doubleTap)throw Y(`double-click`);if(n.holdMs>0)throw Y(`press and hold`);return await r(t,n)},longPress:async()=>{throw Y(`press and hold`)},focus:async(e,t)=>await r({x:e,y:t}),type:async(e,r)=>{await X(Ye(e,{bundleId:n(),delayMs:r,signal:t.signal}))},fill:async(e,r,i)=>Rn(await X(Ze(e,r,i,{bundleId:n(),signal:t.signal}))),scroll:async(e,r)=>{a(r??{});let i=await X(et(e,{bundleId:n(),amount:r?.amount,pixels:r?.pixels,signal:t.signal}));return{...U(i,e,r,{includeDuration:!1}),mechanism:i.mechanism}},back:async()=>{throw Y(`back`)},setOrientation:async()=>{throw Y(`orientation`)}}}function Rn(e){return{mechanism:e.mechanism,...e.windowTitle===void 0?{}:{windowTitle:e.windowTitle}}}function Y(t){return new e(`UNSUPPORTED_OPERATION`,`${t} is not supported by the native macOS app backend.`,{reason:`unsupported-device-backend`,hint:Fn})}async function X(t){try{return await t}catch(t){if(!(t instanceof e))throw t;let n=t.details?.reason;throw typeof n!=`string`||!In.has(n)?t:new e(`UNSUPPORTED_OPERATION`,t.message,{...t.details,reason:`unsupported-device-backend`,helperReason:n,hint:Fn},t)}}const zn={0:`unknown`,1:`notRunning`,2:`runningBackgroundSuspended`,3:`runningBackground`};function Bn(e,n){if(typeof e!=`object`||!e||Array.isArray(e))return;let r={...e},i=r.reason;if(!t(i))return;let a=r.priorState;if(typeof a!=`number`||!Number.isInteger(a))return;let o=zn[a];o===void 0&&n?.({reason:i,rawPriorState:a});let s=r.otherActiveApplicationPid;return{reason:i,priorState:o??`unknown`,...typeof s==`number`&&Number.isInteger(s)&&s>0?{otherActiveApplicationPid:s}:{}}}function Vn(e){let t=Hn(e.systemSurface),n=ie(e.keyboard),r=re(e.observation),i=Bn(e.targetActivation,e=>We({level:`debug`,phase:`ios_runner_target_activation_prior_state_unmapped`,data:e}));return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:bt(e.snapshotQuality),qualityPayload:Kn(e.qualityPayload,t),runnerFatal:e.runnerFatal===!0,...n?{keyboard:n}:{},...t?{systemSurface:t}:{},...i?{targetActivation:i}:{},...r?{observation:r}:{},message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function Hn(e){if(!d(e)||typeof e.bundleId!=`string`)return;let t=Ee(e.bundleId);return t&&{bundleId:t.bundleId,kind:t.kind}}function Un(e,t,n){let r=n.nodes??[],i=qn(r,n.qualityPayload?.nodes);if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return{nodes:r};let a=Se({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),o={stage:`presented`,presentation:{producer:`apple-runner`,intent:`full`,payload:{nodes:r,truncated:n.truncated??!1,...n.quality?.effectiveDepth===void 0?{}:{effectiveDepth:n.quality.effectiveDepth}},...n.qualityPayload?{qualityPayload:n.qualityPayload}:{}},validation:{presentationKey:xe(a),viewport:i,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{let e=we(o,a),t=ue(e.validatedViewport);return{nodes:e.nodes,...t?{viewport:t}:{}}}catch(e){Wn(e,n)}}function Wn(t,n){let r=n.quality;if(t instanceof x&&xt(r))throw new e(`COMMAND_FAILED`,t.message,{...Ce(t),...n.systemSurface?{systemSurface:n.systemSurface}:{},snapshotQuality:{state:r.state,backend:r.backend,...r.reason?{reason:r.reason}:{},...r.reasonCode?{reasonCode:r.reasonCode}:{}},hint:Gn(n.systemSurface,r)},t);Z(t,n.systemSurface)}function Gn(e,t){return[e?`${e.bundleId} hosts the surface presented over the app, and this capture targeted that surface.`:void 0,...yt(t,[])].filter(e=>e!==void 0).join(` `)}function Kn(e,t){if(e!==void 0)return(!d(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new x(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`),t),e.scope!==void 0&&e.scope!==null&&Z(new x(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`}),t),{nodes:e.nodes,truncated:e.truncated,scope:null}}function qn(e,t){return vt(Jn(t),{fallbackToLargestRoot:!0})??vt(Jn(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function Jn(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function Z(t,n){throw t instanceof x?new e(`COMMAND_FAILED`,t.message,{...Ce(t),...n?{systemSurface:n}:{}},t):t}function Yn(t,n,r){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:i,runnerOpts:a}=Sn(t,n),o=p(t)?pt():`xctest`,s=e=>p(t)?g(e,o):void 0,c={open:(e,n)=>Ge(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:a}),openDevice:()=>Ke(t),close:e=>qe(t,e,a),screenshot:(e,n)=>cr(t,e,n,a,s(n?.surface)),snapshot:async e=>await Xn(t,e,a,s(e?.surface)),readTextAtPoint:async(e,n)=>{let r=s(n?.surface);return r?await lr(e,r,n?.appBundleId,n?.signal):await ur(t,e,n,a)},findText:async(e,n)=>({found:(await E(t,{command:`findText`,text:e,appBundleId:n?.appBundleId},n?.signal?{...a,signal:n.signal}:a))?.found===!0}),back:async e=>{if(h(t)){await E(t,K(`menu`,n.appBundleId),a);return}await E(t,{command:xn(e),appBundleId:n.appBundleId},a)},home:async()=>{if(h(t)){await E(t,K(`home`,n.appBundleId),a);return}await E(t,{command:`home`,appBundleId:n.appBundleId},a)},setOrientation:async r=>{let i=or(await E(t,{command:`rotate`,orientation:r,appBundleId:n.appBundleId},a));if(i!==r)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${r}`,{requestedOrientation:r,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await E(t,{command:`appSwitcher`,appBundleId:n.appBundleId},a)},actionButton:async()=>{await E(t,{command:`actionButton`,appBundleId:n.appBundleId},a)},tvRemote:async(e,r)=>{await E(t,K(l(e),n.appBundleId,r),a)},keyboardDismiss:async()=>{let e=await E(t,{command:`keyboardDismiss`,appBundleId:n.appBundleId},a);return{kind:`mechanism`,wasVisible:Q(e,`wasVisible`),dismissed:Q(e,`dismissed`),visible:Q(e,`visible`),mechanism:ar(e,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let e=await E(t,{command:`keyboardReturn`,appBundleId:n.appBundleId},a);return{kind:`visibility-echo`,visible:Q(e,`visible`),wasVisible:Q(e,`wasVisible`)}},readClipboard:()=>Ct(t),writeClipboard:e=>wt(t,e,a),setSetting:(e,n,r,i)=>Rt(t,e,n,r,i),readSetting:e=>Bt(t,e),readAlert:e=>mt(t,a,e),awaitAlert:e=>ht(t,a,e),acceptAlert:e=>gt(t,a,`accept`,e),dismissAlert:e=>gt(t,a,`dismiss`,e),...i},u=o===`native`?Ln(c,n):c;return r?sr(t,n,u,r):u}async function Xn(e,t,n,r){return r?await _t({...t,surface:r},t?.signal):await Zn(e,t,n)}async function Zn(e,t,n){let r=Vn(await ae(`snapshot_capture`,async()=>await E(e,Qn(t),ir(n,t?.signal)),{backend:`xctest`}));$n(t,r),er(e,t,r);let i=tr(r),a=nr(e,t,r);return{nodes:a.nodes,truncated:r.truncated??!1,backend:`xctest`,producer:`apple-runner`,...a.viewport?{viewport:a.viewport}:{},...r.quality?{quality:r.quality}:{},...r.systemSurface?{systemSurface:r.systemSurface}:{},...r.keyboard?{keyboard:r.keyboard}:{},...r.targetActivation?{targetActivation:r.targetActivation}:{},...r.observation?{observation:r.observation}:{},...i.length>0?{warnings:i}:{}}}function Qn(e){let{appBundleId:t,interactiveOnly:n,preferredBackend:r,customActions:i,depth:a,scope:o,raw:s}=e??{};return{command:`snapshot`,appBundleId:t,interactiveOnly:n,preferredBackend:r,customActions:i,...e?.observeOnly===!0?{observeOnly:!0}:{},depth:a,scope:o,raw:s}}function $n(t,n){if(t?.observeOnly===!0&&!(n.observation&&!n.targetActivation))throw new e(`COMMAND_FAILED`,`Runner did not return an observe-only snapshot.`,{reason:`observation-unavailable`})}function er(t,n,r){if(!((r.nodes?.length??0)>0)&&!rr(n,r.quality)&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`)}function tr(e){let t=[];return!e.quality&&e.message&&t.push(e.message),e.systemSurface&&t.push(Te(e.systemSurface.bundleId)),e.targetActivation&&t.push(St(e.targetActivation)),t}function nr(e,t,n){return p(e)?{nodes:n.nodes??[]}:Un(e.id,t,n)}function rr(e,t){return le(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function ir(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Q(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function ar(e,t){let n=e[t];return typeof n==`string`?n:void 0}function or(t){let n=t.orientation;if(typeof n==`string`&&u.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function sr(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),setSetting:async()=>$(`setSetting`),readSetting:async()=>$(`readSetting`)};return be(i,n=>Be(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function cr(t,n,r={},i,a){if(a){if(r.fullscreen)throw new e(`INVALID_ARGS`,`screenshot --fullscreen is not accepted on the macOS ${a} surface: its capture frame is fixed`,{reason:ee.macOsHelperSurfaceFixedFrame,surface:a});return await Xe(n,{surface:a,...a===`app`?{bundleId:r.appBundleId}:{},signal:i.signal}),{}}return r.captureBackend===`runner`?(await H(t,n,r.appBundleId,r.fullscreen,i),{}):await tn(t,n,{appBundleId:r.appBundleId,pixelDensity:r.pixelDensity,fullscreen:r.fullscreen,runnerOptions:i,normalizeStatusBar:r.normalizeStatusBar,skipIosSimulatorBootCheck:r.skipIosSimulatorBootCheck})}async function lr(e,t,n,r){let{runMacOsReadTextAction:i}=await import(`./helper.js`).then(e=>e.n);return(await i(e.x,e.y,{bundleId:n,surface:t,signal:r})).text}async function ur(e,t,n,r){let i=await E(e,{command:`readText`,x:t.x,y:t.y,appBundleId:n?.appBundleId},n?.signal?{...r,signal:n.signal}:r);return typeof i.text==`string`?i.text:typeof i.message==`string`?i.message:void 0}export{Yn as createAppleInteractor};
|
package/dist/src/interactor2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{o as t}from"./tv-remote.js";import{i as n}from"./sdk-batch-runner.js";import{o as r}from"./exec.js";import"./command.js";import{t as i}from"./tool-provider3.js";function a(t){let n=async n=>{throw new e(`UNSUPPORTED_OPERATION`,`${n} is not supported on ${t}`)};return{open:()=>n(`open`),openDevice:()=>n(`openDevice`),close:()=>n(`close`),tap:()=>n(`tap`),longPress:()=>n(`longPress`),focus:()=>n(`focus`),type:()=>n(`type`),fill:()=>n(`fill`),scroll:()=>n(`scroll`),screenshot:()=>n(`screenshot`),snapshot:()=>n(`snapshot`),back:()=>n(`back`),setOrientation:()=>n(`setOrientation`),setSetting:()=>n(`setSetting`)}}const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){r(await i().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){r(await i().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){r(await i().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,n,a){let o=t(n);r(await i().pressRemote(e.id,o,a,{allowFailure:!0,timeoutMs:1e4+(a??0)}),`Failed to press Vega TV remote ${n}`,{button:n,deviceId:e.id})}const d=[{matches:(e,t)=>n(e)||!!t?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...a(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
|
package/dist/src/interactors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{E as n}from"./sdk-device.js";import{n as r,t as i}from"./register-builtins.js";import{AsyncLocalStorage as a}from"node:async_hooks";let o=[];const s=new a;async function c(e,t){return await s.run([...e],t)}function l(e,t){for(let n of d()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function u(e){return d().some(t=>t.ownsDevice(e))}function d(){return s.getStore()??o}function f(e,t={}){C(e);let n=e.map(e=>e.provider);return{providerRuntimes:Object.freeze([...e]),providerRuntimeIds:n,providerRuntimeRequiredIds:v([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:y(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:_(e),cloudArtifactProvider:b(e),providerAppCatalog:x(e),deviceInventorySource:S(e),appleRunnerProvider:m(e),appleRunnerScreenRecordingTransport:p(e),providerDeviceRuntimeScope:async t=>await c(e,t)}}function p(e){if(e.some(g))return t=>{for(let n of e){if(!g(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerScreenRecordingTransport(t.device);if(e)return e}}}function m(e){if(e.some(h))return t=>{for(let n of e){if(!h(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider(t.device);if(e)return e}}}function h(e){return`getAppleRunnerProvider`in e&&typeof e.getAppleRunnerProvider==`function`}function g(e){return`getAppleRunnerScreenRecordingTransport`in e&&typeof e.getAppleRunnerScreenRecordingTransport==`function`}function _(e){if(e.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=e.find(e=>E(e,n.leaseProvider));if(!r?.recoverExpiredLease)throw new t(`UNSUPPORTED_OPERATION`,`Provider ${n.leaseProvider??`unknown`} cannot recover an expired lease.`,{provider:n.leaseProvider,leaseId:n.leaseId});await r.recoverExpiredLease(n)}}function v(e){return[...new Set(e)]}function y(e){if(e.length!==0)return{allocate:async(t,n)=>await T(e,`allocate`,t,n),heartbeat:async(t,n)=>await T(e,`heartbeat`,t,n),release:async(t,n)=>await T(e,`release`,t,n)}}function b(e){if(e.length!==0)return{listCloudArtifacts:async t=>await w(e,t)}}function x(e){let n=e.filter(e=>e.appCatalog!==void 0);if(n.length!==0)return{supports:e=>n.some(t=>E(t,e)),list:async(e,r)=>{let i=n.find(t=>E(t,e.provider));if(!i?.appCatalog)throw new t(`UNSUPPORTED_OPERATION`,`Provider ${e.provider} does not expose an app catalog.`,{provider:e.provider});return await i.appCatalog(e,r)}}}function S(e){if(e.length!==0)return{discover:async(t,n)=>{n.throwIfAborted();for(let r of e){if(!E(r,t.leaseProvider))continue;let e=await r.deviceInventoryProvider(t,n);if(n.throwIfAborted(),e!=null)return{kind:`inventory`,devices:e}}return{kind:`declined`}}}}function C(e){let t=new Set;for(let n of e){if(t.has(n.provider))throw TypeError(`Duplicate provider device runtime: ${n.provider}`);t.add(n.provider)}}async function w(e,t){for(let n of e){if(!E(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function T(e,t,n,r){for(let i of e){if(!E(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function E(e,t){return e.provider===t}var D=e({getInteractor:()=>O,getLocalInteractor:()=>k});i();async function O(e,r){if(u(e)){let i=l(e,r);if(i)return i;throw new t(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:e.id,platform:n(e)})}return await k(e,r)}async function k(e,t){return await r(e.platform).createInteractor(e,t)}export{u as i,D as n,f as r,O as t};
|
package/dist/src/internal/bin.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
async function e(e,n,r){try{await t(e,n,r)}catch(e){r.stderr(`${e instanceof Error?e.message:String(e)}\n`),await(await n.processExit()).exitAfterFlush(1)}}async function t(e,t,l){if(e.length===0)return await n(t,l);if(o(e))return await r(t,l);let u=c(e);if(u!==void 0)return await i(u,e,t,l);if(s(e))return await(await t.mcp()).runAgentDeviceMcpServer();await a(e,t)}async function n(e,t){t.stdout(`${(await e.help()).buildUsageText()}\n`),await(await e.processExit()).exitAfterFlush(1)}async function r(e,t){t.stdout(`${t.bundledVersion??(await e.version()).readVersion()}\n`)}async function i(e,t,n,r){let i=await n.help(),o=e===null?`${i.buildUsageText()}\n`:i.resolveHelpTargetUsageText(e);if(o===null)return await a(t,n);r.stdout(o)}async function a(e,t){await(await t.cli()).runCliProcess(e)}function o(e){return e.length===1&&(e[0]===`--version`||e[0]===`-V`)}function s(e){return e[0]===`mcp`&&!e.some(l)}function c(e){let[t,n]=e;if(e.length===1)return t===`help`||l(t)?null:void 0;if(e.length===2)return t===`help`?n:l(n)?t:void 0}function l(e){return e===`--help`||e===`-h`}e(process.argv.slice(2),{help:()=>import(`../cli-help.js`).then(e=>e.n),cli:()=>import(`../process-entry.js`),mcp:()=>import(`../server.js`),version:()=>import(`../version.js`).then(e=>e.t),processExit:()=>import(`../process-exit.js`)},{bundledVersion:`0.21.
|
|
1
|
+
async function e(e,n,r){try{await t(e,n,r)}catch(e){r.stderr(`${e instanceof Error?e.message:String(e)}\n`),await(await n.processExit()).exitAfterFlush(1)}}async function t(e,t,l){if(e.length===0)return await n(t,l);if(o(e))return await r(t,l);let u=c(e);if(u!==void 0)return await i(u,e,t,l);if(s(e))return await(await t.mcp()).runAgentDeviceMcpServer();await a(e,t)}async function n(e,t){t.stdout(`${(await e.help()).buildUsageText()}\n`),await(await e.processExit()).exitAfterFlush(1)}async function r(e,t){t.stdout(`${t.bundledVersion??(await e.version()).readVersion()}\n`)}async function i(e,t,n,r){let i=await n.help(),o=e===null?`${i.buildUsageText()}\n`:i.resolveHelpTargetUsageText(e);if(o===null)return await a(t,n);r.stdout(o)}async function a(e,t){await(await t.cli()).runCliProcess(e)}function o(e){return e.length===1&&(e[0]===`--version`||e[0]===`-V`)}function s(e){return e[0]===`mcp`&&!e.some(l)}function c(e){let[t,n]=e;if(e.length===1)return t===`help`||l(t)?null:void 0;if(e.length===2)return t===`help`?n:l(n)?t:void 0}function l(e){return e===`--help`||e===`-h`}e(process.argv.slice(2),{help:()=>import(`../cli-help.js`).then(e=>e.n),cli:()=>import(`../process-entry.js`),mcp:()=>import(`../server.js`),version:()=>import(`../version.js`).then(e=>e.t),processExit:()=>import(`../process-exit.js`)},{bundledVersion:`0.21.25`,stdout:e=>{process.stdout.write(e)},stderr:e=>{process.stderr.write(e)}}).catch(()=>process.exit(1));export{};
|