agent-device 0.20.10 → 0.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.apk → agent-device-android-ime-helper-0.21.1.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.manifest.json → agent-device-android-ime-helper-0.21.1.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.10.manifest.json → agent-device-android-snapshot-helper-0.21.1.manifest.json} +6 -6
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
- package/apple/snapshot-bridge/LICENSE.idb +23 -0
- package/apple/snapshot-bridge/README.md +106 -0
- package/apple/snapshot-bridge/SnapshotBridge.m +286 -0
- package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
- package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +34 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +411 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +677 -83
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +35 -92
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1058 -213
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +296 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +309 -149
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +24 -17
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +124 -199
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +211 -78
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +30 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +254 -24
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +465 -494
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +168 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +802 -247
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +185 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +83 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +156 -34
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +5 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -318
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +56 -23
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +56 -27
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +30 -24
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +126 -80
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +47 -86
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +32 -79
- package/dist/apple/snapshot-presentation/Package.swift +21 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
- package/dist/src/adapter.js +1 -0
- package/dist/src/adb-executor.js +2 -0
- package/dist/src/adb-failure.js +1 -0
- package/dist/src/adb-host.js +1 -0
- package/dist/src/adb.js +1 -0
- package/dist/src/agent-browser-lifecycle.js +1 -0
- package/dist/src/agent-browser-process-record.js +1 -0
- package/dist/src/agent-browser-provider.js +1 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.d.ts +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-contract.js +1 -0
- package/dist/src/alert-runtime.js +1 -0
- package/dist/src/android-adb.d.ts +27 -19
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -0
- package/dist/src/android-system-chrome.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/api.js +11 -0
- package/dist/src/app-catalog.js +1 -0
- package/dist/src/app-deployment-resolution.js +2 -0
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory-contract.js +1 -0
- package/dist/src/app-inventory.js +1 -0
- package/dist/src/app-launch.js +2 -0
- package/dist/src/app-lifecycle-facade.js +1 -0
- package/dist/src/app-lifecycle.js +3 -6
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-lifecycle3.js +1 -0
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime.js +1 -4
- package/dist/src/app-log-runtime2.js +4 -0
- package/dist/src/app-parsers.js +4 -0
- package/dist/src/app-resolution-cache.js +1 -0
- package/dist/src/app-resolution-facade.js +1 -0
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +1 -2
- package/dist/src/apple-runner-platform.js +1 -0
- package/dist/src/application-lifecycle-interaction.js +1 -0
- package/dist/src/application-lifecycle-runtime.js +1 -0
- package/dist/src/apps-simctl.js +1 -0
- package/dist/src/archive.js +4 -0
- package/dist/src/artifact-download.js +1 -0
- package/dist/src/artifacts.d.ts +6 -2
- package/dist/src/artifacts.js +1 -1
- package/dist/src/async-lifecycle.js +1 -0
- package/dist/src/audio-probe-result.js +1 -0
- package/dist/src/audio-probe-runtime.js +1 -0
- package/dist/src/audio-probe-support.js +1 -0
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/{url.js → base-url.js} +1 -1
- package/dist/src/boot-diagnostics.js +2 -2
- package/dist/src/byte-limit-stream.js +1 -1
- package/dist/src/capabilities.js +1 -0
- package/dist/src/capture.js +1 -0
- package/dist/src/catalog.js +1 -0
- package/dist/src/cli-command-aliases.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +74 -51
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +4 -6
- package/dist/src/click-button.js +1 -0
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +280 -242
- package/dist/src/clipboard.js +1 -0
- package/dist/src/code-signature-cache.js +1 -0
- package/dist/src/code-signature.js +1 -0
- package/dist/src/color.js +1 -0
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/command.js +1 -0
- package/dist/src/compatibility-policy.js +1 -0
- package/dist/src/config.js +1 -1
- package/dist/src/config2.js +1 -0
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -0
- package/dist/src/daemon-process.js +1 -0
- package/dist/src/daemon-registration.js +1 -0
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +2 -2
- package/dist/src/debug-symbols-facade.js +5 -0
- package/dist/src/deploy-result-target.js +1 -0
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -0
- package/dist/src/device-input-state.d.ts +190 -3
- package/dist/src/device-inventory-context.js +1 -0
- package/dist/src/device-isolation.js +1 -0
- package/dist/src/device-release.js +1 -0
- package/dist/src/device-rotation.js +1 -0
- package/dist/src/device-selection-resolver.js +1 -0
- package/dist/src/device-session.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +3 -2
- package/dist/src/diagnostics.js +3 -0
- package/dist/src/diagnostics2.js +1 -0
- package/dist/src/dispatch-resolve.js +1 -0
- package/dist/src/doctor-facade.js +1 -0
- package/dist/src/doctor-output.js +1 -0
- package/dist/src/doctor.js +1 -0
- package/dist/src/doctor2.js +1 -0
- package/dist/src/doctor3.js +1 -0
- package/dist/src/durable-resource.js +1 -0
- package/dist/src/entities.js +1 -1
- package/dist/src/error.js +2 -0
- package/dist/src/exec.js +1 -0
- package/dist/src/file.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/gesture-admission.js +1 -0
- package/dist/src/gesture-plan-types.js +1 -0
- package/dist/src/gesture-plan.js +1 -0
- package/dist/src/gesture-runtime.js +1 -0
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/host-file.js +1 -0
- package/dist/src/human-control-contract.js +1 -0
- package/dist/src/human-control.js +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -4
- package/dist/src/input-actions2.js +2 -1
- package/dist/src/install-artifact-facade.js +1 -0
- package/dist/src/install-source-network-transport.js +1 -0
- package/dist/src/install-source.d.ts +3 -10
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -0
- package/dist/src/interaction-ref-policy.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -0
- package/dist/src/interactor-types.js +1 -0
- package/dist/src/interactor.js +6 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +1 -2
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +2 -4
- package/dist/src/internal/png-worker.d.ts +4 -4
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.d.ts +4 -0
- package/dist/src/internal/run-script-http-child.js +1 -0
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/inventory.js +4 -4
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/inventory6.js +1 -1
- package/dist/src/ios-client.js +16 -0
- package/dist/src/ios-snapshot-acquisition.js +1 -0
- package/dist/src/ios-snapshot-adapter.js +1 -0
- package/dist/src/ios-snapshot-planning.js +1 -0
- package/dist/src/ios-snapshot-runtime.js +1 -0
- package/dist/src/ios-system-surface.js +1 -0
- package/dist/src/json.js +1 -0
- package/dist/src/keyboard-actions.js +1 -0
- package/dist/src/launch-console.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-scope.js +1 -0
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +1610 -7
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -0
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/macos-facade.js +1 -0
- package/dist/src/managed-device-scope.js +1 -0
- package/dist/src/mechanics.js +19 -0
- package/dist/src/metro.d.ts +4 -2
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/multitouch-support.js +1 -0
- package/dist/src/numeric.js +1 -0
- package/dist/src/observability.js +1 -1
- package/dist/src/observation.js +2 -0
- package/dist/src/open-target-resolution.js +1 -0
- package/dist/src/output-path.js +1 -1
- package/dist/src/owner-identity.js +3 -1
- package/dist/src/parameterized-recorded-fill.js +1 -0
- package/dist/src/parser.js +1 -1
- package/dist/src/perf-facade.js +2 -0
- package/dist/src/perf-process-identity.js +1 -0
- package/dist/src/perf-runtime-operation-builder.js +1 -0
- package/dist/src/perf-runtime-plan.js +1 -0
- package/dist/src/perf-runtime.js +1 -0
- package/dist/src/perf.js +1 -4
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/physical-device-facade.js +1 -0
- package/dist/src/platform-request-scope.js +1 -0
- package/dist/src/platform-runtime-android-adb-host.js +1 -0
- package/dist/src/platform-runtime-android-mechanics.js +1 -0
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -0
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -0
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/plist.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/prepare-kind.js +1 -0
- package/dist/src/process-exit.js +1 -1
- package/dist/src/process.js +1 -0
- package/dist/src/provider-device-runtime.js +1 -0
- package/dist/src/provider-session-ownership.js +2 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/proxy.js +2 -2
- package/dist/src/react-native-overlay.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/rect-center.js +1 -0
- package/dist/src/register-builtins.js +1 -0
- package/dist/src/registry.js +40 -28
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +2 -0
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +8 -7
- package/dist/src/request-admission.js +1 -0
- package/dist/src/request-cancel.js +1 -0
- package/dist/src/request-cancellation.js +1 -0
- package/dist/src/request-progress-protocol.js +1 -0
- package/dist/src/request-providers.js +1 -0
- package/dist/src/request-runtime-binding.js +1 -0
- package/dist/src/request.js +1 -0
- package/dist/src/result-serialization.js +1 -0
- package/dist/src/retry.js +1 -0
- package/dist/src/rolldown-runtime.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -0
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -0
- package/dist/src/runner-owner-facade.js +1 -0
- package/dist/src/runner-owner-state.js +1 -0
- package/dist/src/runner-presentation.js +1 -0
- package/dist/src/runner.js +1 -0
- package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -3
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/scoped-provider.js +1 -1
- package/dist/src/screen-recording-completion.js +1 -0
- package/dist/src/screen-recording-live-handle.js +1 -0
- package/dist/src/screen-recording-options.js +1 -0
- package/dist/src/screen-recording-resource-recovery.js +1 -0
- package/dist/src/screen-recording-runtime.js +1 -0
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-result.js +1 -6
- package/dist/src/screenshot-runtime.js +1 -0
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot2.js +1 -0
- package/dist/src/screenshot3.js +5 -0
- package/dist/src/script.js +1 -0
- package/dist/src/scroll-command.js +1 -0
- package/dist/src/scroll-gesture.js +1 -0
- package/dist/src/scroll-indicator.js +1 -0
- package/dist/src/sdk-batch-runner.d.ts +23 -6
- package/dist/src/sdk-batch-runner.js +2 -3
- package/dist/src/sdk-batch.js +2 -0
- package/dist/src/sdk-contracts.d.ts +170 -41
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.d.ts +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +524 -140
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -0
- package/dist/src/server.js +4 -4
- package/dist/src/session-allocation.js +1 -0
- package/dist/src/session-artifact-paths.js +1 -0
- package/dist/src/session-observation.js +1 -0
- package/dist/src/session-paths.js +1 -0
- package/dist/src/session-repair-tombstone.js +1 -0
- package/dist/src/session-routing.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -0
- package/dist/src/session-snapshot.js +1 -0
- package/dist/src/session-store.js +4 -0
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session2.js +5 -27
- package/dist/src/settings.js +1 -0
- package/dist/src/shared.js +2 -2
- package/dist/src/simctl-facade.js +1 -0
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-facade.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -0
- package/dist/src/snapshot-diagnostics.js +1 -0
- package/dist/src/snapshot-process.js +1 -0
- package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -0
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-scope.js +1 -1
- package/dist/src/snapshot-state.js +1 -0
- package/dist/src/snapshot.js +1 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -0
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +1 -2
- package/dist/src/src4.js +1 -1
- package/dist/src/src5.js +1 -0
- package/dist/src/src6.js +1 -0
- package/dist/src/src7.js +2 -0
- package/dist/src/src8.js +115 -0
- package/dist/src/startup-recovery-fence.js +1 -0
- package/dist/src/status-markers.js +1 -0
- package/dist/src/string-enum.js +1 -1
- package/dist/src/success-text.js +1 -0
- package/dist/src/surface-snapshot.js +1 -0
- package/dist/src/surface-snapshot2.js +1 -0
- package/dist/src/takeover.js +5 -0
- package/dist/src/tool-provider-facade.js +1 -0
- package/dist/src/tool-provider.js +4 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/toolchain-probe.js +2 -0
- package/dist/src/touch-reference-frame.js +1 -0
- package/dist/src/touch-runtime.js +1 -0
- package/dist/src/transport.js +3 -0
- package/dist/src/tree.js +1 -0
- package/dist/src/ttl-memo.js +1 -0
- package/dist/src/tv-remote.js +1 -0
- package/dist/src/type-text-runtime.js +1 -0
- package/dist/src/undici.js +99 -0
- package/dist/src/update-check.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/web.js +2 -1
- package/dist/src/web2.js +1 -0
- package/dist/src/webdriver-ios-snapshot.js +1 -0
- package/dist/src/webdriver-source.js +1 -0
- package/dist/src/window-state.js +1 -0
- package/linux/atspi-dump.py +54 -9
- package/package.json +58 -35
- package/server.json +9 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
- package/dist/src/appearance.js +0 -1
- package/dist/src/apps.js +0 -5
- package/dist/src/audio-probe.js +0 -1
- package/dist/src/cli-grammar.js +0 -1
- package/dist/src/command-catalog.js +0 -1
- package/dist/src/debug-symbols.js +0 -5
- package/dist/src/device-input-state.js +0 -2
- package/dist/src/device-ready.js +0 -1
- package/dist/src/dispatch.js +0 -1
- package/dist/src/handler-utils.js +0 -1
- package/dist/src/helper-package-install.js +0 -1
- package/dist/src/host-process.js +0 -3
- package/dist/src/ime-lifecycle.js +0 -2
- package/dist/src/ime-recovery-marker.js +0 -1
- package/dist/src/input-actions3.js +0 -1
- package/dist/src/install-artifact.js +0 -1
- package/dist/src/install-artifact2.js +0 -1
- package/dist/src/interaction-common.js +0 -1
- package/dist/src/interaction-runtime.js +0 -1
- package/dist/src/interaction-snapshot.js +0 -1
- package/dist/src/manifest.js +0 -1
- package/dist/src/method-scope.js +0 -1
- package/dist/src/png-resize.js +0 -1
- package/dist/src/process-lock.js +0 -1
- package/dist/src/runner-lease.js +0 -1
- package/dist/src/runner-sequence.js +0 -1
- package/dist/src/script-source-bundle.js +0 -16
- package/dist/src/sdk-android-adb.d.ts +0 -245
- package/dist/src/sdk-android-adb.js +0 -4
- package/dist/src/sdk.js +0 -1
- package/dist/src/setting-state.js +0 -1
- package/dist/src/shell-quote.js +0 -1
- package/dist/src/snapshot-session.js +0 -1
- package/dist/src/timing-safe-equal.js +0 -1
- package/dist/src/unsupported-interactor.js +0 -1
- package/dist/src/verdict.js +0 -1
- /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import CoreGraphics
|
|
3
|
+
|
|
4
|
+
public struct SnapshotRect: Codable, Equatable {
|
|
5
|
+
public let x: Double
|
|
6
|
+
public let y: Double
|
|
7
|
+
public let width: Double
|
|
8
|
+
public let height: Double
|
|
9
|
+
|
|
10
|
+
public init(x: Double, y: Double, width: Double, height: Double) {
|
|
11
|
+
self.x = x
|
|
12
|
+
self.y = y
|
|
13
|
+
self.width = width
|
|
14
|
+
self.height = height
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public var cgRect: CGRect {
|
|
18
|
+
CGRect(x: x, y: y, width: width, height: height)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public struct RawAXNode: Equatable {
|
|
23
|
+
public let index: Int
|
|
24
|
+
public let type: String
|
|
25
|
+
public let label: String?
|
|
26
|
+
public let identifier: String?
|
|
27
|
+
public let value: String?
|
|
28
|
+
public let rect: SnapshotRect
|
|
29
|
+
public let enabled: Bool
|
|
30
|
+
public let focused: Bool?
|
|
31
|
+
public let selected: Bool?
|
|
32
|
+
public let hittable: Bool
|
|
33
|
+
public let depth: Int
|
|
34
|
+
public let parentIndex: Int?
|
|
35
|
+
public let hiddenContentAbove: Bool?
|
|
36
|
+
public let hiddenContentBelow: Bool?
|
|
37
|
+
public var actions: [String]?
|
|
38
|
+
|
|
39
|
+
public init(
|
|
40
|
+
index: Int,
|
|
41
|
+
type: String,
|
|
42
|
+
label: String?,
|
|
43
|
+
identifier: String?,
|
|
44
|
+
value: String?,
|
|
45
|
+
rect: SnapshotRect,
|
|
46
|
+
enabled: Bool,
|
|
47
|
+
focused: Bool?,
|
|
48
|
+
selected: Bool?,
|
|
49
|
+
hittable: Bool,
|
|
50
|
+
depth: Int,
|
|
51
|
+
parentIndex: Int?,
|
|
52
|
+
hiddenContentAbove: Bool?,
|
|
53
|
+
hiddenContentBelow: Bool?,
|
|
54
|
+
actions: [String]? = nil
|
|
55
|
+
) {
|
|
56
|
+
self.index = index
|
|
57
|
+
self.type = type
|
|
58
|
+
self.label = label
|
|
59
|
+
self.identifier = identifier
|
|
60
|
+
self.value = value
|
|
61
|
+
self.rect = rect
|
|
62
|
+
self.enabled = enabled
|
|
63
|
+
self.focused = focused
|
|
64
|
+
self.selected = selected
|
|
65
|
+
self.hittable = hittable
|
|
66
|
+
self.depth = depth
|
|
67
|
+
self.parentIndex = parentIndex
|
|
68
|
+
self.hiddenContentAbove = hiddenContentAbove
|
|
69
|
+
self.hiddenContentBelow = hiddenContentBelow
|
|
70
|
+
self.actions = actions
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public var hasSemanticContent: Bool {
|
|
74
|
+
[label, identifier, value].contains {
|
|
75
|
+
!($0?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ?? true)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public struct CaptureHint: Equatable {
|
|
81
|
+
public enum Projection: String {
|
|
82
|
+
case regular
|
|
83
|
+
case raw
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public let projection: Projection
|
|
87
|
+
public let depth: Int?
|
|
88
|
+
public let regularPresentedDepth: Int?
|
|
89
|
+
public let interactiveOnly: Bool
|
|
90
|
+
public let customActions: Bool
|
|
91
|
+
|
|
92
|
+
public init(
|
|
93
|
+
projection: Projection,
|
|
94
|
+
depth: Int?,
|
|
95
|
+
regularPresentedDepth: Int?,
|
|
96
|
+
interactiveOnly: Bool,
|
|
97
|
+
customActions: Bool
|
|
98
|
+
) {
|
|
99
|
+
self.projection = projection
|
|
100
|
+
self.depth = depth
|
|
101
|
+
self.regularPresentedDepth = regularPresentedDepth
|
|
102
|
+
self.interactiveOnly = interactiveOnly
|
|
103
|
+
self.customActions = customActions
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public var rawTraversalDepth: Int? {
|
|
107
|
+
projection == .raw ? depth : nil
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public var isRaw: Bool {
|
|
111
|
+
projection == .raw
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public struct PresentationOptions: Equatable {
|
|
116
|
+
public let interactiveOnly: Bool
|
|
117
|
+
public let depth: Int?
|
|
118
|
+
public let scope: String?
|
|
119
|
+
public let raw: Bool
|
|
120
|
+
public var preferredBackend: String?
|
|
121
|
+
public var customActions: Bool
|
|
122
|
+
|
|
123
|
+
public init(
|
|
124
|
+
interactiveOnly: Bool,
|
|
125
|
+
depth: Int?,
|
|
126
|
+
scope: String?,
|
|
127
|
+
raw: Bool,
|
|
128
|
+
preferredBackend: String? = nil,
|
|
129
|
+
customActions: Bool = false
|
|
130
|
+
) {
|
|
131
|
+
self.interactiveOnly = interactiveOnly
|
|
132
|
+
self.depth = depth
|
|
133
|
+
self.scope = scope
|
|
134
|
+
self.raw = raw
|
|
135
|
+
self.preferredBackend = preferredBackend
|
|
136
|
+
self.customActions = customActions
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public struct SnapshotAcquisition {
|
|
141
|
+
public let hint: CaptureHint
|
|
142
|
+
public let nodes: [RawAXNode]
|
|
143
|
+
public let truncated: Bool
|
|
144
|
+
public let effectiveDepth: Int?
|
|
145
|
+
public var customActions: SnapshotCustomActionCoverage?
|
|
146
|
+
public let viewport: CGRect
|
|
147
|
+
|
|
148
|
+
public init(
|
|
149
|
+
hint: CaptureHint,
|
|
150
|
+
nodes: [RawAXNode],
|
|
151
|
+
truncated: Bool,
|
|
152
|
+
effectiveDepth: Int?,
|
|
153
|
+
customActions: SnapshotCustomActionCoverage? = nil,
|
|
154
|
+
viewport: CGRect
|
|
155
|
+
) {
|
|
156
|
+
self.hint = hint
|
|
157
|
+
self.nodes = nodes
|
|
158
|
+
self.truncated = truncated
|
|
159
|
+
self.effectiveDepth = effectiveDepth
|
|
160
|
+
self.customActions = customActions
|
|
161
|
+
self.viewport = viewport
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
public struct SnapshotCustomActionCoverage: Codable, Equatable {
|
|
166
|
+
public let read: Int
|
|
167
|
+
public let candidates: Int
|
|
168
|
+
public let truncated: Int
|
|
169
|
+
public let blocked: Bool
|
|
170
|
+
|
|
171
|
+
public init(read: Int, candidates: Int, truncated: Int, blocked: Bool) {
|
|
172
|
+
self.read = read
|
|
173
|
+
self.candidates = candidates
|
|
174
|
+
self.truncated = truncated
|
|
175
|
+
self.blocked = blocked
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
public struct SnapshotPresentationNode {
|
|
180
|
+
public let raw: RawAXNode
|
|
181
|
+
public let effectiveRect: SnapshotRect
|
|
182
|
+
|
|
183
|
+
public init(raw: RawAXNode, effectiveRect: SnapshotRect) {
|
|
184
|
+
self.raw = raw
|
|
185
|
+
self.effectiveRect = effectiveRect
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public static func reported(_ raw: RawAXNode) -> Self {
|
|
189
|
+
Self(raw: raw, effectiveRect: raw.rect)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
public struct PresentedNode: Codable, Equatable {
|
|
194
|
+
public let index: Int
|
|
195
|
+
public let type: String
|
|
196
|
+
public let label: String?
|
|
197
|
+
public let identifier: String?
|
|
198
|
+
public let value: String?
|
|
199
|
+
public let rect: SnapshotRect
|
|
200
|
+
public let enabled: Bool
|
|
201
|
+
public let focused: Bool?
|
|
202
|
+
public let selected: Bool?
|
|
203
|
+
public let hittable: Bool
|
|
204
|
+
public let depth: Int
|
|
205
|
+
public let parentIndex: Int?
|
|
206
|
+
public let hiddenContentAbove: Bool?
|
|
207
|
+
public let hiddenContentBelow: Bool?
|
|
208
|
+
public let actions: [String]?
|
|
209
|
+
|
|
210
|
+
internal init(
|
|
211
|
+
presenting raw: RawAXNode,
|
|
212
|
+
rect: SnapshotRect? = nil,
|
|
213
|
+
index: Int? = nil,
|
|
214
|
+
depth: Int? = nil,
|
|
215
|
+
parentIndex: Int?? = nil
|
|
216
|
+
) {
|
|
217
|
+
self.index = index ?? raw.index
|
|
218
|
+
self.type = raw.type
|
|
219
|
+
self.label = raw.label
|
|
220
|
+
self.identifier = raw.identifier
|
|
221
|
+
self.value = raw.value
|
|
222
|
+
self.rect = rect ?? raw.rect
|
|
223
|
+
self.enabled = raw.enabled
|
|
224
|
+
self.focused = raw.focused
|
|
225
|
+
self.selected = raw.selected
|
|
226
|
+
self.hittable = raw.hittable
|
|
227
|
+
self.depth = depth ?? raw.depth
|
|
228
|
+
self.parentIndex = parentIndex ?? raw.parentIndex
|
|
229
|
+
self.hiddenContentAbove = raw.hiddenContentAbove
|
|
230
|
+
self.hiddenContentBelow = raw.hiddenContentBelow
|
|
231
|
+
self.actions = raw.actions
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
internal init(presenting node: SnapshotPresentationNode) {
|
|
235
|
+
self.init(presenting: node.raw, rect: node.effectiveRect)
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
public struct SnapshotPresentationResult {
|
|
240
|
+
public let nodes: [PresentedNode]
|
|
241
|
+
public let truncated: Bool
|
|
242
|
+
public let effectiveDepth: Int?
|
|
243
|
+
public let customActions: SnapshotCustomActionCoverage?
|
|
244
|
+
public let qualityNodes: [PresentedNode]?
|
|
245
|
+
|
|
246
|
+
public init(
|
|
247
|
+
nodes: [PresentedNode],
|
|
248
|
+
truncated: Bool,
|
|
249
|
+
effectiveDepth: Int?,
|
|
250
|
+
customActions: SnapshotCustomActionCoverage?,
|
|
251
|
+
qualityNodes: [PresentedNode]?
|
|
252
|
+
) {
|
|
253
|
+
self.nodes = nodes
|
|
254
|
+
self.truncated = truncated
|
|
255
|
+
self.effectiveDepth = effectiveDepth
|
|
256
|
+
self.customActions = customActions
|
|
257
|
+
self.qualityNodes = qualityNodes
|
|
258
|
+
}
|
|
259
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import CoreGraphics
|
|
3
|
+
|
|
4
|
+
public enum SnapshotPresentation {
|
|
5
|
+
public static func present(
|
|
6
|
+
_ acquisition: SnapshotAcquisition,
|
|
7
|
+
options: PresentationOptions
|
|
8
|
+
) throws -> SnapshotPresentationResult? {
|
|
9
|
+
let requested = captureHint(for: options)
|
|
10
|
+
guard acquisition.hint.projection == requested.projection else {
|
|
11
|
+
return nil
|
|
12
|
+
}
|
|
13
|
+
switch requested.projection {
|
|
14
|
+
case .regular:
|
|
15
|
+
return try presentRegular(acquisition, options: options)
|
|
16
|
+
case .raw:
|
|
17
|
+
return presentRaw(acquisition, options: options)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public static func presentRegular(
|
|
22
|
+
_ acquisition: SnapshotAcquisition,
|
|
23
|
+
options: PresentationOptions,
|
|
24
|
+
policy: SnapshotVisibilityFold.Policy = .platformDefault
|
|
25
|
+
) throws -> SnapshotPresentationResult {
|
|
26
|
+
let folded = SnapshotVisibilityFold.fold(
|
|
27
|
+
acquisition.nodes,
|
|
28
|
+
viewport: acquisition.viewport,
|
|
29
|
+
interactiveOnly: options.interactiveOnly,
|
|
30
|
+
policy: policy
|
|
31
|
+
)
|
|
32
|
+
try SnapshotPresentationInvariant.validateRegular(
|
|
33
|
+
folded,
|
|
34
|
+
viewport: acquisition.viewport,
|
|
35
|
+
policy: policy
|
|
36
|
+
)
|
|
37
|
+
return project(
|
|
38
|
+
folded,
|
|
39
|
+
acquisition: acquisition,
|
|
40
|
+
options: options,
|
|
41
|
+
projection: .regular
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public static func presentRaw(
|
|
46
|
+
_ acquisition: SnapshotAcquisition,
|
|
47
|
+
options: PresentationOptions
|
|
48
|
+
) -> SnapshotPresentationResult {
|
|
49
|
+
project(
|
|
50
|
+
acquisition.nodes.map(SnapshotPresentationNode.reported),
|
|
51
|
+
acquisition: acquisition,
|
|
52
|
+
options: options,
|
|
53
|
+
projection: .raw
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public static func captureHint(for options: PresentationOptions) -> CaptureHint {
|
|
58
|
+
let scoped = SnapshotScopePolicy.isActive(options.scope)
|
|
59
|
+
let projection: CaptureHint.Projection = options.raw ? .raw : .regular
|
|
60
|
+
return CaptureHint(
|
|
61
|
+
projection: projection,
|
|
62
|
+
depth: scoped || projection == .regular ? nil : options.depth,
|
|
63
|
+
regularPresentedDepth: scoped || projection == .raw ? nil : options.depth,
|
|
64
|
+
interactiveOnly: projection == .raw ? false : options.interactiveOnly,
|
|
65
|
+
customActions: options.customActions
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public static func shouldAcquireChildren(
|
|
70
|
+
for hint: CaptureHint,
|
|
71
|
+
rawDepth: Int,
|
|
72
|
+
regularPresentedDepth: Int
|
|
73
|
+
) -> Bool {
|
|
74
|
+
if let rawLimit = hint.rawTraversalDepth {
|
|
75
|
+
return rawDepth < rawLimit
|
|
76
|
+
}
|
|
77
|
+
if let presentedLimit = hint.regularPresentedDepth {
|
|
78
|
+
return regularPresentedDepth < presentedLimit
|
|
79
|
+
}
|
|
80
|
+
return true
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public static func regularTraversalTransition(
|
|
84
|
+
for raw: RawAXNode,
|
|
85
|
+
parentPresentedDepth: Int,
|
|
86
|
+
parentTraversal: SnapshotVisibilityFold.TraversalState,
|
|
87
|
+
hint: CaptureHint,
|
|
88
|
+
rawDepth: Int,
|
|
89
|
+
viewport: CGRect,
|
|
90
|
+
hasChildren: Bool,
|
|
91
|
+
isDuplicate: Bool,
|
|
92
|
+
policy: SnapshotVisibilityFold.Policy = .platformDefault
|
|
93
|
+
) -> (
|
|
94
|
+
presentedDepth: Int,
|
|
95
|
+
traversal: SnapshotVisibilityFold.TraversalState,
|
|
96
|
+
shouldVisitChildren: Bool
|
|
97
|
+
) {
|
|
98
|
+
guard hint.regularPresentedDepth != nil else {
|
|
99
|
+
return (
|
|
100
|
+
parentPresentedDepth,
|
|
101
|
+
parentTraversal,
|
|
102
|
+
shouldAcquireChildren(
|
|
103
|
+
for: hint,
|
|
104
|
+
rawDepth: rawDepth,
|
|
105
|
+
regularPresentedDepth: parentPresentedDepth
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
let visibility = SnapshotVisibilityFold.traversalDecision(
|
|
111
|
+
for: raw,
|
|
112
|
+
parent: parentTraversal,
|
|
113
|
+
viewport: viewport,
|
|
114
|
+
interactiveOnly: hint.interactiveOnly,
|
|
115
|
+
hasChildren: hasChildren,
|
|
116
|
+
policy: policy
|
|
117
|
+
)
|
|
118
|
+
let presentedDepth = regularPresentedDepth(
|
|
119
|
+
for: raw,
|
|
120
|
+
parentPresentedDepth: parentPresentedDepth,
|
|
121
|
+
visibility: visibility
|
|
122
|
+
)
|
|
123
|
+
let nextPresentedDepth = isDuplicate ? parentPresentedDepth : presentedDepth
|
|
124
|
+
let nextTraversal = isDuplicate ? parentTraversal : visibility.descendants
|
|
125
|
+
let descendantsMayBeVisible = isDuplicate
|
|
126
|
+
? parentTraversal.descendantsMayBeVisible
|
|
127
|
+
: visibility.descendantsMayBeVisible
|
|
128
|
+
return (
|
|
129
|
+
nextPresentedDepth,
|
|
130
|
+
nextTraversal,
|
|
131
|
+
shouldAcquireChildren(
|
|
132
|
+
for: hint,
|
|
133
|
+
rawDepth: rawDepth,
|
|
134
|
+
regularPresentedDepth: nextPresentedDepth
|
|
135
|
+
) && descendantsMayBeVisible
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public static func regularPresentedDepth(
|
|
140
|
+
for raw: RawAXNode,
|
|
141
|
+
parentPresentedDepth: Int,
|
|
142
|
+
visibility: SnapshotVisibilityFold.TraversalDecision
|
|
143
|
+
) -> Int {
|
|
144
|
+
guard raw.parentIndex != nil else { return 0 }
|
|
145
|
+
return visibility.isIncluded && isEligibleForRegularPresentation(raw)
|
|
146
|
+
? parentPresentedDepth + 1
|
|
147
|
+
: parentPresentedDepth
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public static func singleElementRead(_ node: RawAXNode) -> PresentedNode {
|
|
151
|
+
PresentedNode(presenting: node)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
public enum SnapshotPresentationFailure: Error {
|
|
4
|
+
case regularNodeOutsideCumulativeClip(index: Int, frame: SnapshotRect, clip: SnapshotRect)
|
|
5
|
+
case regularDegenerateNodeIsActionable(index: Int, frame: SnapshotRect)
|
|
6
|
+
|
|
7
|
+
public var code: String {
|
|
8
|
+
"IOS_SNAPSHOT_PRESENTATION_FAILED"
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public var qualityReasonCode: String {
|
|
12
|
+
"presentation-failed"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public var message: String {
|
|
16
|
+
switch self {
|
|
17
|
+
case .regularNodeOutsideCumulativeClip(let index, _, _):
|
|
18
|
+
return "regular snapshot node \(index) escaped its cumulative clip"
|
|
19
|
+
case .regularDegenerateNodeIsActionable(let index, _):
|
|
20
|
+
return "regular snapshot node \(index) with a frameless or degenerate frame was marked hittable"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public var hint: String {
|
|
25
|
+
"This is a runner presentation bug: report it with the failing command and the app under test."
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import CoreGraphics
|
|
3
|
+
|
|
4
|
+
public enum SnapshotPresentationInvariant {
|
|
5
|
+
struct ValidationStats: Equatable {
|
|
6
|
+
let parentClipLookups: Int
|
|
7
|
+
|
|
8
|
+
init(parentClipLookups: Int) {
|
|
9
|
+
self.parentClipLookups = parentClipLookups
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public static func validateRegular(
|
|
14
|
+
_ nodes: [SnapshotPresentationNode],
|
|
15
|
+
viewport: CGRect,
|
|
16
|
+
policy: SnapshotVisibilityFold.Policy
|
|
17
|
+
) throws {
|
|
18
|
+
_ = try validateRegularWithStats(nodes, viewport: viewport, policy: policy)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static func validateRegularWithStats(
|
|
22
|
+
_ nodes: [SnapshotPresentationNode],
|
|
23
|
+
viewport: CGRect,
|
|
24
|
+
policy: SnapshotVisibilityFold.Policy
|
|
25
|
+
) throws -> ValidationStats {
|
|
26
|
+
var parentClipLookups = 0
|
|
27
|
+
var clipIncludingNodeByIndex: [Int: CGRect] = [:]
|
|
28
|
+
clipIncludingNodeByIndex.reserveCapacity(nodes.count)
|
|
29
|
+
|
|
30
|
+
for node in nodes {
|
|
31
|
+
let ancestorClip: CGRect
|
|
32
|
+
if let parentIndex = node.raw.parentIndex {
|
|
33
|
+
parentClipLookups += 1
|
|
34
|
+
ancestorClip = clipIncludingNodeByIndex[parentIndex] ?? viewport
|
|
35
|
+
} else {
|
|
36
|
+
ancestorClip = viewport
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let frame = node.effectiveRect.cgRect
|
|
40
|
+
let clipIncludingNode: CGRect
|
|
41
|
+
if policy == .cursorProjected,
|
|
42
|
+
SnapshotVisibilityFold.scrollContainerTypeNames.contains(node.raw.type),
|
|
43
|
+
!frame.isNull,
|
|
44
|
+
!frame.isEmpty
|
|
45
|
+
{
|
|
46
|
+
clipIncludingNode = frame
|
|
47
|
+
} else {
|
|
48
|
+
clipIncludingNode = ancestorClip
|
|
49
|
+
}
|
|
50
|
+
clipIncludingNodeByIndex[node.raw.index] = clipIncludingNode
|
|
51
|
+
|
|
52
|
+
guard !frame.isNull, !frame.isEmpty else {
|
|
53
|
+
if node.raw.hittable {
|
|
54
|
+
throw SnapshotPresentationFailure.regularDegenerateNodeIsActionable(
|
|
55
|
+
index: node.raw.index,
|
|
56
|
+
frame: node.effectiveRect
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
continue
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
guard contains(frame, in: ancestorClip) else {
|
|
63
|
+
throw SnapshotPresentationFailure.regularNodeOutsideCumulativeClip(
|
|
64
|
+
index: node.raw.index,
|
|
65
|
+
frame: node.effectiveRect,
|
|
66
|
+
clip: snapshotRect(from: ancestorClip)
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return ValidationStats(parentClipLookups: parentClipLookups)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private static func contains(_ frame: CGRect, in clip: CGRect) -> Bool {
|
|
75
|
+
guard !clip.isNull, !clip.isEmpty else { return false }
|
|
76
|
+
let tolerance = 0.0001
|
|
77
|
+
return frame.minX >= clip.minX - tolerance
|
|
78
|
+
&& frame.minY >= clip.minY - tolerance
|
|
79
|
+
&& frame.maxX <= clip.maxX + tolerance
|
|
80
|
+
&& frame.maxY <= clip.maxY + tolerance
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private static func snapshotRect(from rect: CGRect) -> SnapshotRect {
|
|
84
|
+
SnapshotRect(
|
|
85
|
+
x: Double(rect.minX),
|
|
86
|
+
y: Double(rect.minY),
|
|
87
|
+
width: Double(rect.width),
|
|
88
|
+
height: Double(rect.height)
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
extension SnapshotPresentation {
|
|
4
|
+
static let eligibleInteractiveTypes: Set<String> = [
|
|
5
|
+
"Button",
|
|
6
|
+
"Cell",
|
|
7
|
+
"CheckBox",
|
|
8
|
+
"CollectionView",
|
|
9
|
+
"Link",
|
|
10
|
+
"MenuItem",
|
|
11
|
+
"Picker",
|
|
12
|
+
"SearchField",
|
|
13
|
+
"SecureTextField",
|
|
14
|
+
"SegmentedControl",
|
|
15
|
+
"Slider",
|
|
16
|
+
"ScrollView",
|
|
17
|
+
"Stepper",
|
|
18
|
+
"Switch",
|
|
19
|
+
"TabBar",
|
|
20
|
+
"Table",
|
|
21
|
+
"TextField",
|
|
22
|
+
"TextView",
|
|
23
|
+
"WebView",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
static func project(
|
|
27
|
+
_ projectionNodes: [SnapshotPresentationNode],
|
|
28
|
+
acquisition: SnapshotAcquisition,
|
|
29
|
+
options: PresentationOptions,
|
|
30
|
+
projection: CaptureHint.Projection
|
|
31
|
+
) -> SnapshotPresentationResult {
|
|
32
|
+
let scopedRawNodes = applyScope(to: projectionNodes, options: options, projection: projection)
|
|
33
|
+
let nodes = presentedNodes(
|
|
34
|
+
from: scopedRawNodes,
|
|
35
|
+
projection: projection,
|
|
36
|
+
maximumDepth: projection == .regular ? options.depth : nil
|
|
37
|
+
)
|
|
38
|
+
let qualityNodes: [PresentedNode]? = SnapshotScopePolicy.isActive(options.scope)
|
|
39
|
+
? presentedNodes(from: projectionNodes, projection: projection, maximumDepth: nil)
|
|
40
|
+
: nil
|
|
41
|
+
return SnapshotPresentationResult(
|
|
42
|
+
nodes: nodes,
|
|
43
|
+
truncated: acquisition.truncated,
|
|
44
|
+
effectiveDepth: acquisition.effectiveDepth,
|
|
45
|
+
customActions: acquisition.customActions,
|
|
46
|
+
qualityNodes: qualityNodes
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static func presentedNodes(
|
|
51
|
+
from rawNodes: [SnapshotPresentationNode],
|
|
52
|
+
projection: CaptureHint.Projection,
|
|
53
|
+
maximumDepth: Int? = nil
|
|
54
|
+
) -> [PresentedNode] {
|
|
55
|
+
if projection == .raw {
|
|
56
|
+
return rawNodes.map { PresentedNode(presenting: $0) }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
var nodes: [PresentedNode] = []
|
|
60
|
+
var nearestPresentedNodeByRawIndex: [Int: (index: Int, depth: Int)] = [:]
|
|
61
|
+
for node in rawNodes {
|
|
62
|
+
let raw = node.raw
|
|
63
|
+
let presentedParent = raw.parentIndex.flatMap { nearestPresentedNodeByRawIndex[$0] }
|
|
64
|
+
guard isEligibleForRegularPresentation(raw) else {
|
|
65
|
+
if let presentedParent {
|
|
66
|
+
nearestPresentedNodeByRawIndex[raw.index] = presentedParent
|
|
67
|
+
}
|
|
68
|
+
continue
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let presentedIndex = nodes.count
|
|
72
|
+
let presentedDepth = presentedParent.map { $0.depth + 1 } ?? 0
|
|
73
|
+
if let maximumDepth, presentedDepth > maximumDepth {
|
|
74
|
+
if let presentedParent {
|
|
75
|
+
nearestPresentedNodeByRawIndex[raw.index] = presentedParent
|
|
76
|
+
}
|
|
77
|
+
continue
|
|
78
|
+
}
|
|
79
|
+
nearestPresentedNodeByRawIndex[raw.index] = (presentedIndex, presentedDepth)
|
|
80
|
+
nodes.append(
|
|
81
|
+
PresentedNode(
|
|
82
|
+
presenting: raw,
|
|
83
|
+
rect: node.effectiveRect,
|
|
84
|
+
index: presentedIndex,
|
|
85
|
+
depth: presentedDepth,
|
|
86
|
+
parentIndex: presentedParent?.index
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
return nodes
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static func applyScope(
|
|
94
|
+
to rawNodes: [SnapshotPresentationNode],
|
|
95
|
+
options: PresentationOptions,
|
|
96
|
+
projection: CaptureHint.Projection
|
|
97
|
+
) -> [SnapshotPresentationNode] {
|
|
98
|
+
switch SnapshotScopePolicy.select(
|
|
99
|
+
fromPreorder: rawNodes,
|
|
100
|
+
scope: options.scope,
|
|
101
|
+
depth: { $0.raw.depth },
|
|
102
|
+
semanticValues: { [$0.raw.label, $0.raw.identifier, $0.raw.value] },
|
|
103
|
+
subtreeContributes: { range in
|
|
104
|
+
projection == .raw || rawNodes[range].contains { isEligibleForRegularPresentation($0.raw) }
|
|
105
|
+
}
|
|
106
|
+
) {
|
|
107
|
+
case .unscoped:
|
|
108
|
+
return rawNodes
|
|
109
|
+
case .missing:
|
|
110
|
+
return []
|
|
111
|
+
case .matched(let startIndex):
|
|
112
|
+
let startDepth = rawNodes[startIndex].raw.depth
|
|
113
|
+
let range = SnapshotScopePolicy.subtreeRange(
|
|
114
|
+
from: startIndex,
|
|
115
|
+
in: rawNodes,
|
|
116
|
+
depth: { $0.raw.depth }
|
|
117
|
+
)
|
|
118
|
+
let maxDepth = options.depth ?? Int.max
|
|
119
|
+
let scopedNodes = projection == .raw
|
|
120
|
+
? Array(rawNodes[range]).filter { $0.raw.depth - startDepth <= maxDepth }
|
|
121
|
+
: Array(rawNodes[range])
|
|
122
|
+
return reindex(scopedNodes, depthOffset: startDepth)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
static func reindex(
|
|
127
|
+
_ nodes: [SnapshotPresentationNode],
|
|
128
|
+
depthOffset: Int
|
|
129
|
+
) -> [SnapshotPresentationNode] {
|
|
130
|
+
let indexMap = Dictionary(
|
|
131
|
+
uniqueKeysWithValues: nodes.enumerated().map { ($0.element.raw.index, $0.offset) })
|
|
132
|
+
return nodes.enumerated().map { offset, node in
|
|
133
|
+
let raw = node.raw
|
|
134
|
+
return SnapshotPresentationNode(
|
|
135
|
+
raw: RawAXNode(
|
|
136
|
+
index: offset,
|
|
137
|
+
type: raw.type,
|
|
138
|
+
label: raw.label,
|
|
139
|
+
identifier: raw.identifier,
|
|
140
|
+
value: raw.value,
|
|
141
|
+
rect: raw.rect,
|
|
142
|
+
enabled: raw.enabled,
|
|
143
|
+
focused: raw.focused,
|
|
144
|
+
selected: raw.selected,
|
|
145
|
+
hittable: raw.hittable,
|
|
146
|
+
depth: max(0, raw.depth - depthOffset),
|
|
147
|
+
parentIndex: raw.parentIndex.flatMap { indexMap[$0] },
|
|
148
|
+
hiddenContentAbove: raw.hiddenContentAbove,
|
|
149
|
+
hiddenContentBelow: raw.hiddenContentBelow,
|
|
150
|
+
actions: raw.actions
|
|
151
|
+
),
|
|
152
|
+
effectiveRect: node.effectiveRect
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static func isEligibleForRegularPresentation(_ node: RawAXNode) -> Bool {
|
|
158
|
+
if node.parentIndex == nil { return true }
|
|
159
|
+
return eligibleInteractiveTypes.contains(node.type) || node.hasSemanticContent
|
|
160
|
+
}
|
|
161
|
+
}
|